ジニ係数について

ジニ係数ってなに?

ジニ係数は「データの不均等さを表す統計値」として、
例えば国ごとに貧富の格差をあらわす時などに使用されます。
「1」に近いほど「不平等」で、「0」に近いほど「平等」に近いとされており
wikipediaからの引用ではありますが、世界全体のジニ係数の経年推移は下記のようになっています。

1820年-2005年の世界全体のジニ係数

Year Gini.index
1820年 0.43
1850年 0.53
1870年 0.56
1913年 0.61
1929年 0.62
1950年 0.64
1960年 0.64
1980年 0.66
2002年 0.71
2005年 0.68

これが「0」に近いほど「平等」ということであれば、1820年代に比べ、
現代に近いほど、やや「不平等さ」が増加していると言えます。


可視化してみる

ジニ係数は、ローレンツ曲線と呼ばれる曲線と、均等分配線と呼ばれる直線の間の領域と、
それ以外の比率から計算されます。

わかりにくいのでとりあえず可視化します。

上図の肌色の部分が「多い」ほど「不平等」となり「1」に近づきます。
例えばとある従業員10名の企業で1,000万の利益が出たとします。
これを従業員全員でボーナスとして分配しようとなったときを考えます。
従業員が10名のため、1人あたり100万円ですね。

ベクトルは[100,100,100,100,100,100,100,100,100,100]といったかたちです。

肌色の部分がなくなり、ジニ係数は「0」となりました。
これは平等⇒0という定義と合致します。

逆に、とある従業員が特別頑張ったので、それ以外の従業員を1万円、頑張った従業員を991万円とします。

ベクトルは[1,1,1,1,1,1,1,1,1,991]といったかたちです。

全体の面積を肌色が占めるかたちになりました。
もうちょっと極端にするには従業員10名では難しいので
1000名の従業員のうち、1人だけ1,000万総取りとしてみましょう。

ベクトルは[0,0,・・・,0,1000]といったかたちです。

無事不平等な結果を得ることができました。


どうやって計算する?

まずは、記録が容易な離散的な数値について考えます
離散値であれば、計算に際しては大きく分けて2つのアプローチがあります。
1つは、面積で計算する、という方法、そしてもう1つが数列計算で算出する、です。


面積で計算する

こちらは非常に丁寧に紹介されている記事がありますのでそちらを参考ください。

ローレンツ曲線・ジニ係数のベーシクスと、Excelを使った描画・計算の方法。
https://hitorimarketing.net/tools/lorenz-curve-and-gini-coefficient.html

掻い摘んで説明をしますと
・ローレンツ曲線が実際のデータから得られるのであれば
・特定の点と次の点との間は台形として面積が計算できる
・下側(図では青色)が計算できれば、均等分配線の面積は直角三角形0.5となるので
・引き算して上側(図では肌色)を算出、比率を計算してジニ係数。
といった流れです。

つまり

この線で囲まれた青い空間それぞれの面積が計算できれば
均等分配線の面積は直角三角形0.5となるので、そこから引いた肌色が算出できるということです。
ポイントは台形の面積は上底+下底のかたちにするため、
各面積は縦線を横に倒した状態で計算をする点でしょうか。

Rで処理するなら下記のような手順でしょうか。

set.seed(1)
val = runif(n = 20)
num = val[order(val,decreasing = FALSE)]
num = cumsum(num)/sum(num)
mat = cbind(c(0,num[-length(num)]),num)
print((0.5 - sum({mat[,1] + mat[,2]} * (1/length(val)) * 0.5))/0.5)
## [1] 0.2880375

上図と同じ結果が得られました。


数列計算で算出する

式を掲載。

\[ G= \frac { \sum _{i=1}^{n} \sum _{j=1}^{n} |x_{i} – x_{j} |} {2n^2\bar {x} } = \frac { \sum _{i=1}^{n} \sum _{j=1}^{n} |x_{i} – x_{j} |} {2n \sum _{i=1}^{n} x_{i}} \]

これは\(2n^2\bar {x}\)でも\(2n \sum _{i=1}^{n} x_{i}\)でも結果は同じというところが留意点となりますが
重要なところは分子の\(\sum _{i=1}^{n} \sum _{j=1}^{n} |x_{i} – x_{j} |\)です。

要は「総当たり」で各値ごとの差分(絶対値)を算出して、その合計を
値の合計の\(2n\)倍したもので割る、という計算手順です。

例えば下記の3つの値で計算をしてみます。

\[ Val = [123,456,789] \]

まずは割り算の上部(分子)の計算

\[ \begin{array}{rr} |123 – 123| &=& 0\\ |123 – 456| &=& 333\\ |123 – 789| &=& 666\\ \\ |456 – 123| &=& 333\\ |456 – 456| &=& 0\\ |456 – 789| &=& 333\\ \\ |789 – 123| &=& 666\\ |789 – 456| &=& 333\\ |789 – 789| &=& 0\\ \end{array}\\ ~~\\ 0 + 333 + 666 + 333 + 0 + 333 + 666 +333 +0 = 2664 \]

行列っぽく計算を整理するなら下記のようなイメージです。

\[ \begin{array}{r|rr} & 123 & 456 & 789 \\ \hline 123 & 0 & 333 & 666\\ 456 & 333 & 0 & 333\\ 789 & 663 & 333 & 0 \end{array}\\ \]

次は割り算の下部(分母)の計算

\[ 2 \times 3 \times (123 + 456 + 789) = 8208 \] ということで

\[ ジニ係数 = \frac{2664}{8208} = 0.324561404 \]

となります。

比較的少量の値であれば算出は容易ではありますが、
例えばある町の人口10,000人の所得でジニ係数を計算しましょうとなれば
\(10,000 \times 10,000 \rightarrow 100,000,000\)と、一億回の計算が必要となり途端に計算効率が低下します。
一億回の計算くらいであれば、そこそこのPCでちょっと待てば計算を得られますが、
日本国民、ざっくり1.2億人の所得で計算しましょう、みたいな話であれば、スパコンとは言いませんが
そこそこ高額なPCで計算が必要な規模になりそうです。


面積で計算、数列計算、どちらの処理が良いか

これは一概に言えませんが、大量の処理であれば面積で計算したほうが、というよりは
面積で計算するしかないと思います。
前述の通り数列計算は総当たり計算になるからです。
もちろんアルゴリズムの改修で、結果が0になるものは除く、下半分は上半分の結果を引用するなどで
全体の計算量を半分程度に圧縮は可能です。
それでも、組み合わせが増えるほど大量の計算が必要となることが考えられます。

面積で計算するアプローチについては、思いつく限り、強いていうのであれば
・並び替えが面倒
・自然数によるジニ係数の計算であれば、台形の計算過程で微妙に小数点以下が削れていく
といったデメリットが考えられます。
並び替えが面倒、については、図を書くなら必要な処理ですし、
台形の計算過程で微妙に小数点以下が削れていく、という点については、
普通に結果を示す範囲では「まったく懸念する必要がない」くらいに微小な値です。

ただ、ジニ係数を計算するシーンは国別とか都道府県別とか、多くて100~300くらいの組み合わせのため
昨今のPCであれば数列計算でも大した問題にはならないように考えます。


連続的な値はどう扱うか。

連続変量の場合は、取りうる値が細かく、滑らかとなりますので
上述同様、計算組み合わせによっては膨大となります。
となれば、解析なアプローチでジニ係数を推定値として計算することになるわけですが
いくつかの確率分布については、解析的にジニ係数を推定する式が定義されています。

わかりやすいものを紹介します。

指数分布

指数分布の過去記事も参考ください。
こちらは\(\lambda\)の結果に影響を受けず、一律に0.5というのが興味深いです。

\[ G_{exp} = 1/2 \]

連続一様分布

一様分布の過去記事も参考ください。
こちらは最小値と最大値の「差」が小さいほど「0」に近くなり、
大きいほど「1/3」に近づく、といったイメージです。

\[ G_{uniform} = \frac{b-a}{3 (b+a) } \]

\[ a = 1,~~b = 10~~として\\ G_{uniform} = \frac{10-1}{3 (10+1) } = \frac{9}{33}=0.2727273 \]

カイ2乗分布

カイ2乗分布の過去記事も参考ください。
こちらは容易に手計算ができる、といったかたちではありませんが
自由度が大きいほど「0」に近づいていきます。
一般的には自由度は自然数で、「2」を最小で取り扱うことが多いので
感覚的には0.5が最大に思いますが、計算上は0.001のような微小な数値も扱えるため
ジニ係数は「1」に限りなく近づかせることも可能です。

\[ G_{chiq} = \frac{2 \Gamma (\frac{1+k}{2})}{k \Gamma (k/2) \sqrt{\pi}} \]

\[ k = 2~~として\\ G_{chiq} = \frac{2 \Gamma (\frac{1+2}{2})}{2 \Gamma (2/2) \sqrt{\pi}} = \frac{2 \Gamma (\frac{3}{2})}{2 \Gamma (1) \sqrt{\pi}} =0.5 \]

今回は三角形の図ばかりになってしまいました。
他にも様々な確率分布がありますので
ぜひいろいろ調べてみてください。