LoginSignup
21
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-21

目次

プログラマーのための統計学 - 目次

概要

既に以下の記事を読んでいることを前提とします。
【プログラマーのための統計学】 度数分布とヒストグラム

ローレンツ曲線とは

所得や、人口の偏りなどを調べるために作成するグラフのことです。

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

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軸に、それぞれ2種類の累積相対度数が必要になります。

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

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

1. 各階級の度数の累積相対度数

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

こちらの記事に書いた内容と同じ要領で、計算をします。
【プログラマーのための統計学】 度数分布とヒストグラム

階級 階級値 度数 相対度数 累積相対度数
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人になります。

1424 = 487 + 450 + 487

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

0.03 = \frac{1424}{41029}

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

度数分布表

前述の1つ目、2つ目をまとめた度数分布表です。
(相対度数、累積相対度数は、小数点第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でグラフ描画

%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

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

ローレンツ曲線を見て分かること

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

download2.png

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

ジニ係数

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

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

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

ジニ係数を算出する

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

X軸
0, 0.4, 0.8, 1

Y軸
0, 0.2, 0.6, 1.0

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

download (1).png

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

download (1).png

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

0.5 = 1\times1\div2

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

0.04 = 0.4\times0.2\div2

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

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

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

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

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

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

以上

参考

21
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
18