DB/R/統計/データサイエンス/投資話についてつらつらと

世のため自分のためのアウトプット

R 統計学(statistics) 解説記事

【R言語と統計の備忘録】ローレンツ曲線とジニ係数(ジニの集中係数)の概要と計算方法

投稿日:

ローレンツ曲線(Lorenz_curve)とジニ係数(ジニの集中係数/Gini coefficient)について備忘録をかねてまとめました。
求め方自体は難しくないので、概要と合わせて覚えれば、理解できるかと思います。

~目次~

1. ローレンツ曲線とは

2. ローレンツ曲線の描き方

3. ジニ係数とは

4. ジニ係数の求め方

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章で記載したグラフになります。

> create_L(hists, values)

3. ジニ係数とは

ジニ係数は、上記のグラフの赤線と黒線で囲まれた部分をさし、値は0-1となります。
ジニ係数は不平等指数とも呼ばれ、この値が大きいほど所得の格差が大きいことを示します。
一般に、0.4を越えると暴動などが発生する可能性が高まると言われています。

以下にグラフを再掲します。面積が大きい=所得の少ない世帯の総計が少なく、所得の大きい世帯の総計が大きくなることがイメージできるかと思います。

4. ジニ係数(ジニの集中係数)の定義と求め方

ジニ係数の定義

ジニ係数は、以下のように求めることができます。

GI=\dfrac{\sum_{i}\sum_{j}|\bf{x}_i-\bf{x}_j|}{2\bar{\bf{x}}*n^2}
\bf{x}: 全ての世帯の収入が入ったベクトル

ここで、xは先ほどのhistsやvaluesとは異なることに注意してください。
なお、上記のGI=\sum_{i}\sum_{j}|\bf{x}_i-\bf{x}_j|/n^2の部分を平均差と言います。

例えば、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 #ジニ係数を戻す
}

結果は以下になります。

> real_value <- c(1,1,2,3,4,4,5)
> create_gini_num(real_value)
[1] 0.2857143

以上となります。

-R, 統計学(statistics), 解説記事

Copyright© 世のため自分のためのアウトプット , 2020 All Rights Reserved Powered by STINGER.