所得の分布は対数正規分布に従っているのか?

日本の世帯ごとの所得をヒストグラムにすると↓こんな感じになります。

所得金額階級別にみた世帯数の相対度数分布(平成21年調査)
2 所得の分布状況|厚生労働省 より


右側に裾が長く延びているので、正規分布ではないようです。

よく、所得は対数正規分布に従う、なんて聞いたりします。所得額の対数をとってそれで度数分布表を作るような感じですね。

実際に試してみましょう。

グラフで示されていた値を、データ化します。

rate <- 0.01 * c(6.6, 12.7, 13.9, 13.3, 10.0, 8.9, 7.1, 6.2, 5.1, 3.9,
                 3.0,  2.1,  1.7,  1.3,  0.9, 0.9, 0.5, 0.4, 0.2, 0.2)
income <- seq(50, 1950, 100)
df <- data.frame(income, rate)
df
   income  rate
1      50 0.066
2     150 0.127
3     250 0.139
4     350 0.133
5     450 0.100
6     550 0.089
7     650 0.071
8     750 0.062
9     850 0.051
10    950 0.039
11   1050 0.030
12   1150 0.021
13   1250 0.017
14   1350 0.013
15   1450 0.009
16   1550 0.009
17   1650 0.005
18   1750 0.004
19   1850 0.002
20   1950 0.002

「2000万円以上」の階級はオープンエンドになっているので省きました。所得額の中央の値を階級値(単位:万円)として、rateはパーセントでなく割合で表しています。

そのままplotしてみると↓

plot(df$income, df$rate)
所得ごとの度数をプロット

当然、厚労省のページに載ってたような形が出てきます。

データフレームに、対数をとった所得の列を追加してみます↓

df$income_log <- log10(df$income)
df
   income  rate income_log
1      50 0.066   1.698970
2     150 0.127   2.176091
3     250 0.139   2.397940
4     350 0.133   2.544068
5     450 0.100   2.653213
6     550 0.089   2.740363
7     650 0.071   2.812913
8     750 0.062   2.875061
9     850 0.051   2.929419
10    950 0.039   2.977724
11   1050 0.030   3.021189
12   1150 0.021   3.060698
13   1250 0.017   3.096910
14   1350 0.013   3.130334
15   1450 0.009   3.161368
16   1550 0.009   3.190332
17   1650 0.005   3.217484
18   1750 0.004   3.243038
19   1850 0.002   3.267172
20   1950 0.002   3.290035

この対数所得の列でプロットしてみると↓

plot(df$income_log, df$rate)
所得の対数をとって、度数をプロット

なんだか正規分布っぽくなりました。

では、この対数所得に対して、平均と分散を求めてみましょう。度数分布表から平均や分散を求める方法は、高校で習いましたよね?

m <- sum( df$income_log * df$rate)          # 平均
v <- sum( (df$income_log - m)^2 * df$rate ) # 分散

m
[1] 2.560478
v
[1] 0.1332302

対数をとったものは、平均 2.560478、分散 0.1332302 になることが分かりました。

この値を使って100万世帯分の所得データのサンプルを作ってみましょう。

n <- 1000000 # とりあえず100万世帯
r <- rnorm(n, m, sqrt(v))
head(r, 20)
 [1] 2.448054 3.062347 2.342119 2.527496 2.299730
 [6] 3.189821 2.096890 3.187842 2.440127 2.915923
[11] 2.553295 2.497428 2.379083 2.774537 2.668117
[16] 2.475265 2.716102 2.395672 2.960818 2.258748

上記は対数をとった所得になっているので、元に戻すと↓

head(10^r, 20)
 [1]  280.5781 1154.3754  219.8460  336.8965  199.4023
 [6] 1548.1791  124.9941 1541.1390  275.5034  823.9926
[11]  357.5157  314.3603  239.3772  595.0269  465.7116
[16]  298.7205  520.1181  248.6978  913.7295  181.4461

1人目から、280万円、1154万円、219万円、・・・という感じです。

できれば2人目くらいになりたいものです。

ヒストグラムを描いてみましょう↓

hist(10^r, breaks=seq(0, 100000, 100), xlim=c(0,2000), ylim=c(0,200000), col="lightgray")
対数正規分布に従う乱数のプロット

なんだか、っぽい感じですね。

比較できるように割合の数値を書き込んでみます↓

h <- hist(10^r, breaks=seq(0, 100000, 100), xlim=c(0,2000), ylim=c(0,200000), col="lightgray")
text(h$mids, h$counts, round(h$counts / n * 100, 1), pos=3, cex=0.8)
対数正規分布に従う乱数のプロット(割合を表示)

う~ん、割合の数字がけっこう違いますね。ピークの位置も微妙に違うし、尖り具合も違うし。

「まあ、そんなうまくはいかないよな」な例でした。

発生させた乱数でも分かるように、ちょっと低所得者層が多めに出ているようですね。

でも、当たらずといえども遠からずな感じだと思いません?

コメント

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)

reorderを使ってggplotの棒グラフの並び順を降順にする方法