StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Rでジニ係数を算出

めちゃくちゃ簡単なしょうもない内容ですが、あとで個人的に使うので、ジニ係数を出す簡単な関数をメモしておきます。
ここでは例として、都道府県の人口データのジニ係数を出してみます。
データを小さい順に並べて、都道府県数の累積(これは単順番を表すindexと同じになる)の累積構成比をx軸、人口の累積構成比をy軸にとったのがローレンツ曲線で、そっから三角形とスイカ形の面積比を求めるわけですね。

> # 北海道から沖縄県までの人口(千人単位)が順番に入ったデータ
> print(pop)
 [1]  5286  1263  1241  2316   981  1090  1864  2877  1946
[10]  1952  7330  6255 13822  9177  2246  1050  1143   774
[19]   817  2063  1997  3659  7537  1791  1412  2591  8813
[28]  5484  1339   935   560   680  1898  2817  1370   736
[37]   962  1352   706  5107   819  1341  1757  1144  1081
[46]  1614  1448
> 
> # ジニ係数を取得する関数
> get_gini <- function(v){
+   v.sorted <- v[order(v, decreasing=F)]
+   x <- 1:length(v)
+   y <- cumsum(v.sorted)/sum(v.sorted)
+   AB <- ((length(v))/2)  # 三角形の高さは1なので2乗しない
+   B <- sum(y)
+   gini <- (AB-B)/AB
+   return(gini)
+ }
> 
> # グラフを描く関数
> plot_gini <- function(v, col="black", lty=1, lwd=1){
+   v.sorted <- v[order(v, decreasing=F)]
+   x <- c(0, (1:length(v))/length(v))
+   y <- c(0, cumsum(v.sorted)/sum(v.sorted))
+   plot(x=x, y=y, type="l", col=col, lty=lty, lwd=lwd)
+   par(new=T)
+   plot(x=x, y=x, type="l", col="black", axes=F, ann = F)
+ }
> 
> # ジニ係数を出す
> get_gini(pop)
[1] 0.4415188
> 
> # 図示する
> plot_gini(pop)


f:id:midnightseminar:20200330184908p:plain


斜め45度の線と赤い弧に囲まれた部分の面積が、三角形に占める割合がジニ係数で、1に近づくほど偏りが大きいことになりますね。


ちなみに、1920年、1980年、2018年を比較すると人口ジニ係数は0.248, 0.396, 0.442とどんどん上がっており、図示すると以下のような感じでした。

> # pop1920, pop1980, pop2018はそれぞれの年の都道府県人口
> plot_gini(pop1920, col="#00CC00", lty="dashed")
> par(new=T)
> plot_gini(pop1980, col="#0000CC", lty="dashed")
> par(new=T)
> plot_gini(pop2018, col="#CC0000", lwd=1.5)
> legend(
+   "bottomright",
+   legend=c("1920年", "1980年", "2018年"),
+   lty=c("dashed", "dashed", "solid"),
+   lwd=c(1,1,1.5),
+   col=c("#00CC00", "#0000CC", "#CC0000")
+   )


f:id:midnightseminar:20200330192507p:plain