【プログラマーのための統計学】ローレンツ曲線とジニ係数

## 目次
[プログラマーのための統計学 - 目次](http://qiita.com/Esfahan/items/bd9e52837bbaeb168b9f)

## 概要
既に以下の記事を読んでいることを前提とします。
[【プログラマーのための統計学】 度数分布とヒストグラム](http://qiita.com/Esfahan/items/93550dab4fd60adb34ee)

## ローレンツ曲線とは
所得や、人口の偏りなどを調べるために作成するグラフのことです。

例として、ある地域の村の人口の偏りを調査します。
村の数は全部で100とします。
各村の人口は以下のようになりました。
見辛いですが、全ての村の全人口をlistにしてあります。

```py
population = [
124, 151, 102, 189, 160, 145, 120, 132, 135, 159, 114, 175, 171, 124, 154,
177, 152, 120, 144, 121, 113, 163, 186, 196, 183, 105, 130, 149, 130, 123, 
175, 143, 186, 182, 184, 174, 134, 158, 196, 109,
216, 285, 209, 288, 276, 281, 283, 200, 262, 
267, 235, 206, 245, 232, 299, 249, 295, 232, 206, 237,
369,
487, 450, 487,
597, 548,
682,
712, 706, 755, 700, 709, 747, 773, 796, 739, 716, 756, 767, 752, 728, 750,
829, 875, 845, 881, 865, 804, 845, 890, 872, 833, 874, 845, 859, 837, 847, 811, 893, 807
]
```

## ローレンツ曲線を求めるには
ローレンツ曲線は、X軸、Y軸に、それぞれ２種類の累積相対度数が必要になります。

1. 各階級の度数の累積相対度数
2. 各階級に属する値の合計の累積相対度数

それぞれ説明をしていきます。

## 1. 各階級の度数の累積相対度数
まず1つ目は、階級を人口、度数を村の数とした、累積相対度数を算出します。

こちらの記事に書いた内容と同じ要領で、計算をします。
[【プログラマーのための統計学】 度数分布とヒストグラム](http://qiita.com/Esfahan/items/93550dab4fd60adb34ee)

| 階級 | 階級値 | 度数 | 相対度数 | 累積相対度数 |
| --- | --: | --: | --: | --: |
| 100人以上 - 200人未満 | 150 | 40 | 0.40 | 0.40 |
| 200人以上 - 300人未満 | 250 | 20 | 0.20 | 0.60 |
| 300人以上 - 400人未満 | 350 | 1 | 0.01 | 0.61 |
| 400人以上 - 500人未満 | 450 | 3 | 0.03 | 0.64 |
| 500人以上 - 600人未満 | 550 | 2 | 0.02 | 0.66 |
| 600人以上 - 700人未満 | 650 | 1 | 0.01 | 0.67 |
| 700人以上 - 800人未満 | 750 | 15 | 0.15 | 0.82 |
| 800人以上 - 900人未満 | 850 | 18 | 0.18 | 1.00 |

## 2. 各階級に属する値の合計の累積相対度数
2つ目は、階級を人口、度数を各階級ごとの村の合計人数とした、累積相対度数を算出します。

各階級ごとの村の合計人数を出すために、前述のpopulationという名前の変数のlistの値を元に計算します。
例えば、「400人以上 - 500人未満」の合計人数は、下記のように、1424人になります。

```math
1424 = 487 + 450 + 487
```

また、全ての村の人口の合計は41029人になるので(populationの値を全て足した値)、相対度数は、
「400人以上 - 500人未満」の場合は、0.03(小数点第3位以下切り捨て)となります。

```math
0.03 = \frac{1424}{41029}
```

このような形で各階級を計算し、人数の累積相対度数を算出します。


## 度数分布表
前述の１つ目、２つ目をまとめた度数分布表です。
（相対度数、累積相対度数は、小数点第3位以下は切り捨てています)

| 階級 | 階級値 | 度数 | 相対度数 | 度数の累積相対度数 | 合計人数（度数） | 人数の相対度数 | 人数の累積相対度数 |
| --- | --: | --: | --: | --: | --: | --: | --: |
| 100人以上 - 200人未満 | 150 | 40 | 0.40 | 0.40 | 5988 | 0.14 | 0.15  |
| 200人以上 - 300人未満 | 250 | 20 | 0.20 | 0.60 | 5003 | 0.12 | 0.27 | 
| 300人以上 - 400人未満 | 350 | 1 | 0.01 | 0.61 | 369 | 0.01 | 0.28 |
| 400人以上 - 500人未満 | 450 | 3 | 0.03 | 0.64 | 1424 | 0.03 | 0.31 |
| 500人以上 - 600人未満 | 550 | 2 | 0.02 | 0.66 | 1145 | 0.02 | 0.34 |
| 600人以上 - 700人未満 | 650 | 1 | 0.01 | 0.67 | 682 | 0.01 | 0.36 |
| 700人以上 - 800人未満 | 750 | 15 | 0.15 | 0.82 | 11106 | 0.27 | 0.63 |
| 800人以上 - 900人未満 | 850 | 18 | 0.18 | 1.00 | 15312 | 0.37 | 1.00 |

この表の「度数の累積相対度数」をx軸、「人数の累積相対度数」をy軸にしたグラフが、ローレンツ曲線になります。

## ローレンツ曲線を描く
前述のデータを、matplotlibを使って、グラフにします。

参考：[jupyter(ipython notebook) + matplotlib + vagrantでグラフ描画](http://qiita.com/Esfahan/items/bbb2e9d593faa8b45861)

```py3
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# 横座標, 度数の累積相対度数
left = np.array([
  0,
  0.40,
  0.60,
  0.61,
  0.64,
  0.66,
  0.67,
  0.82,
  1.00,
])
# 縦座標, 人数の累積相対度数
height = np.array([
  0,
  0.15,
  0.27,
  0.28,
  0.31,
  0.34,
  0.36,
  0.63,
  1.00
])
ax.plot(left, height, marker='o')
# グラフのタイトル
plt.title('Lorenz Curve')
# X軸のタイトル
plt.xlabel('villages')
# Y軸のタイトル
plt.ylabel('population')

left = np.array([0, 0.2, 0.4, 0.6, 0.8, 1.0])
height = np.array([0, 0.2, 0.4, 0.6, 0.8, 1.0])
ax.plot(left, height, linestyle='dashed', color='black')

# X軸のラベル
label = [0, 0.2, 0.4, 0.6, 0.8, 1.0] 

# ラベルを打つX軸の場所
ax.set_xticks(label)
# X軸にラベルをセット
ax.set_xticklabels(label)

# ラベルを打つY軸の場所
ax.set_yticks(label)
# Y軸にラベルをセット
ax.set_yticklabels(label)

# 描画
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/105936/0748fb98-9294-9cde-e368-806895052e46.png)

この青い曲線が、ローレンツ曲線です。

## ローレンツ曲線を見て分かること
上記で作成したローレンツ曲線を、どのように見ればよいのかを説明します。

![download2.png](https://qiita-image-store.s3.amazonaws.com/0/105936/64dceeda-1ee8-89a1-8d59-defbf93c0271.png)

赤線を引いた部分の座標を見てみます。
この点からわかることは、約65%の村が、全人口の36%くらいしかいないということです。
つまり、残り64%の人口は、他のどこかの村に偏っているということになります。
また、曲線の膨らみが大きいほど、偏りがあるということになります。

## ジニ係数
この偏りを数値で表したものを、ジニ係数といいます。
ジニ係数の出し方ですが、まず、上記グラフの破線を「完全平等線」といいます。
この「完全平等線」と、ローレンツ曲線の間の面積を２倍したものが、ジニ係数になります。

ジニ係数は0から1までの値をとなり、1に近くほど偏りが大きく、0に近くほど偏りが少ないということになります。

ちなみに、ジニ係数が0の場合は、ローレンツ曲線は、完全平等線と重なります。

## ジニ係数を算出する
実際にジニ係数を計算します。
ここでは、計算をしやすいように、前述の例ではなく、以下の値を使って計算します。

```
X軸
0, 0.4, 0.8, 1

Y軸
0, 0.2, 0.6, 1.0
```

この値から、以下のようなローレンツ曲線が出来上がります。

![download (1).png](https://qiita-image-store.s3.amazonaws.com/0/105936/4e29e3bb-64bf-ef67-13cd-74e03df958d6.png)

このグラフを、以下のように分割して、完全平等線を斜辺とした三角形から、図の、１、２、３の部分の面積を引いて２倍すれば、ジニ係数が求められます。

![download (1).png](https://qiita-image-store.s3.amazonaws.com/0/105936/1f82acc5-c391-2618-d80e-29a945379818.png)



まず、完全平等線を斜辺とした三角形の面積を求めます。

```math
0.5 = 1\times1\div2
```

1の部分の面積を求めます。
底辺が0.4、高さが0.2の直角三角形なので、以下で求められます。

```math
0.04 = 0.4\times0.2\div2
```

2の部分の面積を求めます。
右に回転させると、上底0.2, 下底0.6, 高さ0.4の台形となるので、以下で求められます。

```math
0.16 = (0.2+0.6)\times0.4\div2
```

3の部分の面積を求めます。
こちらも右に回転させると、上底0.6, 下底1, 高さ0.2の台形となるので、以下で求められます。

```math
0.16 = (0.6+1)\times0.2\div2
```

これらを3つの値を、完全平等線を斜辺とした三角形の面積から引いて、２倍すればジニ係数が出るので、下記の式のとおり、0.28がジニ係数となります。

```math
0.28 = (0.5 - 0.04 - 0.16 - 0.16)\times2
```

以上


## 参考
- [統計WEB - ローレンツ曲線](https://bellcurve.jp/statistics/course/1664.html)
- [ローレンツ曲線とジニ係数 - 具体例で学ぶ数学](http://mathwords.net/ginikeisu)
- [Pythonでジニ係数を計算してみる](http://surolog.hatenablog.com/entry/2014/12/20/010037)