めちゃくちゃ簡単なしょうもない内容ですが、あとで個人的に使うので、ジニ係数を出す簡単な関数をメモしておきます。
ここでは例として、都道府県の人口データのジニ係数を出してみます。
データを小さい順に並べて、都道府県数の累積(これは単順番を表す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)
斜め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") + )