ローレンツ曲線(Lorenz_curve)とジニ係数(ジニの集中係数/Gini coefficient)について備忘録をかねてまとめました。
求め方自体は難しくないので、概要と合わせて覚えれば、理解できるかと思います。
~目次~
1. ローレンツ曲線とは
ローレンツ曲線とは、値とその値を持つ要素数の二つのデータについて、累積相対度数をグラフ化したものです。
主に所得格差や富の集中について調べるときに利用されます。
具体例として、以下のように世帯の所得分布や、事業所の大きさ(人数)と従業員の数の分布等を描画する。
世帯を所得の低い順番に並べ、横軸に世帯の累積比をとり、縦軸に所得の累積比をとって、世帯間の所得分布をグラフ化したものです。
wikipedia-ローレンツ曲線-より
例えば以下の赤線のようなグラフです。
横軸が人の割合、縦軸がある所得世帯の各グループの人の給与の合計を示します。(例えば200万円の人が10人いたら、2000万円)
もし、全ての人が同じ所得で完全に平等の場合は、下記の黒線のように45度のグラフになります。
2. Rでのローレンツ曲線の描き方(サンプルコード)
以下にサンプル関数を記載します。
用意する変数はhists, valuesの二つになります。
histsは各階級の要素数を、valuesは各階級の値を格納しておきます。
##ローレンツ曲線の作成 create_L <- function(hists, values){ #初期値の代入 hist_value <- 0 #y軸の累計を格納 hists_p <- 0 #x軸の累計を格納 value_elements <- length(hists) for (i in 1:value_elements){ hist_value[i+1] <- hist_value[i]+hists[i]*values[i] #hists[i]*values[i]で階級の所得総計を算出 hists_p[i+1] <- hists_p[i]+hists[i] } #描画 plot(c(0,1), c(0,1), type="l", xlab="", ylab="") #斜め45度 par(new=T) plot(hists_p/sum(hists), hist_value/hist_value[length(hist_value)], type="l", xlim=c(0,1), xlab="Number of People(%)", ylab="income", col=2) #ローレンツ曲線 }
histsとvaluesについては、例えば以下のようになります。
以下では、所得が10万円の世帯は120世帯、30万円の世帯は150世帯..., 5000万円の世帯は2世帯、というイメージです。
> hists [1] 120 150 140 100 40 10 5 2 > values [1] 10 30 50 100 500 1000 2000 5000
実際に上記のhistsとvaluesで描画すると、1章で記載したグラフになります。
3. ジニ係数とは
ジニ係数は、上記のグラフの赤線と黒線で囲まれた部分をさし、値は0-1となります。
ジニ係数は不平等指数とも呼ばれ、この値が大きいほど所得の格差が大きいことを示します。
一般に、0.4を越えると暴動などが発生する可能性が高まると言われています。
以下にグラフを再掲します。面積が大きい=所得の少ない世帯の総計が少なく、所得の大きい世帯の総計が大きくなることがイメージできるかと思います。
4. ジニ係数(ジニの集中係数)の定義と求め方
ジニ係数の定義
ジニ係数は、以下のように求めることができます。
: 全ての世帯の収入が入ったベクトル
ここで、xは先ほどのhistsやvaluesとは異なることに注意してください。
なお、上記のの部分を平均差と言います。
例えば、xは以下のような値をとります。
x=c(1,1,2,3,4,4,5)
上記のxで、GIの分子[latex]GI=\sum_{i}\sum_{j}|\bf{x}_i-\bf{x}_j|を視覚化すると、以下になります。
|xi-xj| | 1 | 1 | 2 | 3 | 4 | 4 | 5 |
1 | 0 | 0 | 1 | 2 | 3 | 3 | 4 |
1 | 0 | 0 | 1 | 2 | 3 | 3 | 4 |
2 | 1 | 1 | 0 | 1 | 2 | 2 | 3 |
3 | 2 | 2 | 1 | 0 | 1 | 1 | 2 |
4 | 3 | 3 | 2 | 1 | 0 | 0 | 1 |
4 | 3 | 3 | 2 | 1 | 0 | 0 | 1 |
5 | 4 | 4 | 3 | 2 | 1 | 1 | 0 |
Rでのジニ係数の導出方法
実際にRで求めてみます。
サンプル関数は以下となります。
上記のxに該当するのがreal_valueとなります。
##ジニ係数を算出 #real_valueにデータの配列を格納。例:c(1,1,2,3,,4,4,5) create_gini_num <- function(real_value){ real_value_elements <- length(real_value) #データの標本数 ave_diff_tmp <- 0 ave_diff <- 0 #平均差を初期化 gini_num <- 0 #ジニ係数を初期化 for (i in 1:real_value_elements){ for (j in 1:real_value_elements){ #real_valueの全ての要素間(同じ値を含む)の差の絶対値の総和を求める ave_diff_tmp <- abs(real_value[i] - real_value[j]) + ave_diff_tmp } } ave_diff <- ave_diff_tmp/real_value_elements^2 #平均差 gini_num <- ave_diff/(mean(real_value)*2); gini_num #ジニ係数を戻す }
結果は以下になります。
> create_gini_num(real_value)
[1] 0.2857143
以上となります。