所得の分布は対数正規分布に従っているのか?
日本の世帯ごとの所得をヒストグラムにすると↓こんな感じになります。
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)
う~ん、割合の数字がけっこう違いますね。ピークの位置も微妙に違うし、尖り具合も違うし。
「まあ、そんなうまくはいかないよな」な例でした。
発生させた乱数でも分かるように、ちょっと低所得者層が多めに出ているようですね。
でも、当たらずといえども遠からずな感じだと思いません?
![]() | |||
所得金額階級別にみた世帯数の相対度数分布(平成21年調査) |
右側に裾が長く延びているので、正規分布ではないようです。
よく、所得は対数正規分布に従う、なんて聞いたりします。所得額の対数をとってそれで度数分布表を作るような感じですね。
実際に試してみましょう。
グラフで示されていた値を、データ化します。
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)
![]() |
対数正規分布に従う乱数のプロット(割合を表示) |
う~ん、割合の数字がけっこう違いますね。ピークの位置も微妙に違うし、尖り具合も違うし。
「まあ、そんなうまくはいかないよな」な例でした。
発生させた乱数でも分かるように、ちょっと低所得者層が多めに出ているようですね。
でも、当たらずといえども遠からずな感じだと思いません?
コメント
コメントを投稿