ローレンツ曲線とPythonで日本人の年収の偏りを示そう!
このページでは統計初学者向けにローレンツ曲線とその意味、使い所について説明し、Pythonを使って実際にデータ解析を行ってみます。
ローレンツ曲線とは¶
ローレンツ曲線とは、横軸にも縦軸にも累積相対度数を使って、描いたグラフのことです。何かの偏りを示したいときに利用されることが多いです。
ローレンツ曲線の使用法¶
何か「これには偏りがあるのではないか?」と思ったら試しに書いてみるといいでしょう。
今回は日本人の年収に偏りがあるのかローレンツ曲線を使って見てみたいと思います。
厚生労働省のHPからから、世帯別年収データをダウンロードして、jupyter labで作業をするディレクトリに置きます。私はnumbersで一度開いて、csvに変換しました。データはこちらにあります。コードを動かす際にはデータをダウンロードしてdata/income.csv
のように配置してください。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.pyplot as plt
とりあえず、データを読み込んで中をのぞいてみましょう。
df = pd.read_csv('data/income.csv')
df
今回は全世帯の累積度数分布、相対度数分布の50万円未満〜1000万円以上のデータが必要なので、下のように適宜データを抜き出し、columnsとindexの名前をつけ直します。また、データがstringになっているので、floatに直します。
df.columns = df.loc[2]
df.index = df.iloc[0:24,1]
df = df.iloc[5:21,2:4]
df.iloc[:,0:2] = df.iloc[:,0:2].astype('float')
df
年収500万円までは50万円刻み、500万円からは100万円刻みで階級が分けられています。そこで、一つの階級の集団の年収が平均を仮定して、(平均年収×世帯数)の相対度数を求めます。
例えば、200~250の階級の平均年収は225万円、600~700の階級の平均年収は650万円としています。 1000万円以上の階級の平均年収はだいたい2000万円というデータがありましたので、今回は2000万円として計算します。
計算できたらDataFrameを結合します。
arr1 = np.array([])
# 年収0~500万円までの階級をarr1にappendしていく。
for i in range(0,10):
arr1 = np.append(arr1, df.iloc[i,1]/100 * (50 * i + 25))
# 年収500~1000万円までの階級をarr1にappendしていく。
for i in range(0,5):
arr1 = np.append(arr1, df.iloc[i,1]/100 * (100 * i + 550))
arr1 = np.append(arr1, df.iloc[15,1]/100 * 2000)
sum = np.sum(arr1)
arr1 = arr1/sum * 100
df1 = pd.DataFrame(arr1)
df1.index = df.index
df1 = df1.rename(columns={0:'(平均年収 × 世帯数)の相対度数'})
df = pd.concat([df, df1], axis=1)
続いて、(平均年収×世帯数)の累積相対度数を求めて、DataFrameを結合します。
arr2 = np.array([])
x = 0
for i in range(0,len(df.index)):
x += df.iloc[i,2]
arr2 = np.append(arr2, x)
df2 = pd.DataFrame(arr2)
df2.index = df.index
df2 = df2.rename(columns={0:'(平均年収×世帯数)の累積相対度数'})
df = pd.concat([df, df2], axis=1)
完成したDataFrameは下の通りです。
df
これではよくわからないので、視覚的に捉えられるようにmatplotlibでグラフを作りましょう。
x = df.iloc[:,0]
y = df.iloc[:,3]
a = np.arange(0,110,10)
b = a
plt.figure(figsize=(10, 10))
plt.plot(x, y)
plt.title('日本人の年収のローレンツ曲線', fontname="MS Gothic")
plt.xlabel('世帯数累積度', fontname="MS Gothic")
plt.ylabel('(平均年収*世帯数)の累積相対度数', fontname="MS Gothic")
plt.grid()
plt.show()
青色の曲線が今回書くことができた、ローレンツ曲線です。 両軸ともに累積相対度数を通っているので最終的に値が100%になることは直感的に理解できると思います。 ところで、$y = x$ のグラフに比べて、下の方を伝っていることがわかると思います。 これこそが、年収の分布に不均一性が存在していることを示しています。
例えば、(平均年収*世帯数)の累積相対度数 = 20%のところで、だいたい、世帯数累積度 = 50%となっていますね。これは、日本人の年収の合計20%を年収の低い50%の人が受け取っているという意味になります。
また、平均年収*世帯数)の累積相対度数 = 40%、世帯数累積度 = 80%となっているところもありますね、これは高級どり上位20%の人が、日本人の年収合計の60%を所有しているということになります。うーん、年収の不均等は確かに存在していそうですね。
ちなみに $y = x$ の直線をローレンツ曲線のグラフでは均等配分線と呼ばれ、直線のように分布していれば、年収の偏りは存在しないよいうことになります。逆に 均等配分線とローレンツ曲線で作られる三日月型の面積が多ければ大きいほど偏りが大きいということになります。
- 前の記事 : VELOCYTO
- 次の記事 : NTT corevoチャレンジ: 話者の性別・年代識別
- 関連記事 :