2020年5月16日土曜日

ローレンツ曲線とジニ係数

講義で使える統計素材」シリーズ. 今回はローレンツ曲線とジニ係数.この2つは,経済格差を表す指標として良く使用されます. ここでは,厚生労働省の「所得金額階級別にみた世帯数の相対度数分布」のデータから累積相対度数を計算して, ローレンツ曲線を描くコードとジニ係数の算出方法の説明によく用いられるグラフの面積を示す図を描画するコードを掲載しています.

In [1]:
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st

相対度数分布

In [2]:
# 所得の階級 
x = np.array([0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100])

# 相対度数
y = np.array([0, 6.6, 12.7, 13.9, 13.3, 10.0, 8.9, 7.1, 6.2, 5.1, 3.9, 3.0, 2.1, 1.7, 1.3, 0.9, 0.9, 0.5, 0.4, 0.2, 0.2, 1.2])

# データはここのものを用いた
# https://www.mhlw.go.jp/toukei/saikin/hw/k-tyosa/k-tyosa09/2-2.html

plt.ylim(0, 20)
plt.xlim(0, 2000)
plt.bar(x, y, width=90)

plt.savefig('plot_out.svg')

Lorenz曲線

In [3]:
#富の総和なので人数も掛ける
x_ = x*y/np.sum(x*y)
y_ = y/np.sum(y)
y__ = np.cumsum(y_)
x__ = np.cumsum(x_)
plt.xlim(0, 1.0)
plt.ylim(0, 1.0)
plt.gca().set_aspect('equal', adjustable='box')
plt.fill_between(x__, x__)
plt.fill_between(y__, x__)
plt.plot(y__, x__)
plt.plot(y__, x__)

plt.savefig('plot_out.svg', transparent=True)

ジニ係数計算用の図形

In [4]:
#枠線を消す
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['left'].set_visible(False)
plt.gca().spines['bottom'].set_visible(False)

#数字を消す
plt.tick_params(labelbottom=False,
                labelleft=False,
                labelright=False,
                labeltop=False)

#目盛りを消す
plt.tick_params(bottom=False,
                left=False,
                right=False,
                top=False)

plt.gca().set_aspect('equal', adjustable='box')

plt.xlim(0, 1.0)
plt.ylim(0, 1.0)
plt.fill_between(y__, x__, y__)

plt.savefig('plot_out.svg', transparent=True)
In [5]:
#枠線を消す
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['left'].set_visible(False)
plt.gca().spines['bottom'].set_visible(False)

#数字を消す
plt.tick_params(labelbottom=False,
                labelleft=False,
                labelright=False,
                labeltop=False)

#目盛りを消す
plt.tick_params(bottom=False,
                left=False,
                right=False,
                top=False)

plt.gca().set_aspect('equal', adjustable='box')
cmap = plt.get_cmap("tab10")

plt.xlim(0, 1.0)
plt.ylim(0, 1.0)
plt.fill_between(x__, x__, color=cmap(0))

plt.savefig('plot_out.svg', transparent=True)