こんにちは、ほけきよです!!
こんなニュースが話題になりましたね。
「平均値820万、中央値20万??」
さらに
一人暮らしの平均貯蓄額は822万円だが、中央値はなんと20万円のみ!実に48.1%の単身世帯が貯金ゼロという状況のようです。 - クレジットカードの読みもの
数年後「1人暮らしの貯蓄額は平均値800万円、中央値0円」 - かきのたねとピーナッツ
「貯蓄0の人が48%????」
なかなか非現実的な数値に「どういうことなんだ?」と思う方もいらっしゃるでしょう。*1
私の専門はSocial science/ Complex scienceだったので、このあたりの話題について少し科学的に触れてみたいと思います。
普通の分布
みなさんが普通に思い浮かべる分布ってどんなものでしょうか。 例えば、コインを100回投げたときの表の数って、何回になると思います?
だいたい50回になると予想がつく方が多いのではないでしょうか。50じゃないにしても、その付近に集まるだろうと。 実際にシミュレーションをしてみましょう(読みやすさのために、実験コードは最後につけています。)
このように、直感通り50付近がもっとも多くなります。 これは大数の法則(厳密には中心極限定理)と呼ばれていて、一回コインを投げた結果が他に影響を及ぼさない(独立)である事象ならば、成り立つことが知られています。 世の中のものの多くはこの大数の法則に従うとされています。サイコロを降り続けたら、だいたい平均は3.5になるだろう。とか。
ベキ分布の登場
ところが、こんなルールをつけてみるとどうなるでしょう。
- コインを投げる
- 表が出るたびに、0.05ずつ表が出る確率を増やす
コインは前のコイントスに影響を受け、確率を変える。どんな分布になるか、想像がつきますか? (こちらも実験コードは最後につけています。)
面白い形になりました。当たり前ですが、表が出る回数が多いところに偏っています。 さらに面白いのが、この頻度分布に対して、両対数グラフをとってみます。すると
ほぼほぼ直線が現れました!!このような特徴をもった分布をベキ分布といいます。 実は、人間社会にこのベキ分布は非常に多く現れることが知られています。 年収の分布、 仕事の忙しさと頻度、フェイスブックの友達の数の分布。 このあたりの話は、Albert BarabasiやDuncan Wattsなどの本に詳しく載っています。面白いので興味があればぜひ!
ベキ分布はなぜ現れるのか。
ベキ分布という言葉を聞いたことがなくても、
などの言葉をどこかのポピュラーサイエンスで聞いたことがある人もいるでしょう。 これらは全てベキ分布と関わりが深い言葉なのです。
なぜ起こるのか。これを数理的に考察したのがAlbert BarabasiやDuncan Wattsです。原著
彼らが導き出した理由はかなり単純明快。ざっくりいうと人間の感情がベキ分布を作るのです*2
- フェイスブックでの人気者とは友達になりたいという気持ちが働く
- タスク量の多い仕事は嫌なので後に回す
- お金を持っている人ほど余裕があり、さらに富む
このように、社会の多くは正のフィードバックにより動いているのです。これが根本原因です。
先ほどのコインはこの人間社会の様子を模擬的に表したものです。「富めるものは富む」 その法則から、あのようなベキ分布が生まれるのですね
ベキ分布の平均はあまり意味を持たない。
先ほどのコインのグラフを見ていただけるとわかると思いますが。ベキ分布の平均をとってもあまり意味がないのです。2割8割の法則と呼ばれているように、2割の人間が全体の8割をかっさらっていっているからです。 そのせいで、ほとんどの人が平均未満の収入。。。なんてことが起こるのです。
こういうときに役に立つのが中央値です。 中央値というのは、まさに真ん中の値。1000人いたら、500番目の値です。
正規分布は中央値と平均値がほとんど一緒になります。左右対称のグラフからも想像がつくかと思います。 しかし、ベキ分布では中央値の方がより世相をとらえた量と言えると思います。
本題 今回のニュースにおけるベキ分布は
ここで本題です。今回のニュースにおいて、ベキ分布を作って見て、富裕層と一般庶民の乖離がどの程度まで広がっているか、検証してみましょう。ニュースから抜粋した値はこちら
- 平均値 820万円
- 中央値 20万円
- 最大値 8000万円
これらに大体合うように、ベキ分布のパラメータを調整してみます。
import numpy as np import matplotlib.pyplot as plt np.random.seed(1) N = 30000 # サンプル数 dist = np.zeros(N) for i in range(N): dist[i] = 8000*np.random.power(0.12) #0.12はベキ分布のパラメータ print(dist.mean()) #平均値 855 print(np.median(dist)) #中央値 25 plt.hist(dist,bins=400)
結果はこちら。サンプル数3万人での年収分布です。
もしこの世の年収がベキ分布に従っているならば、ニュースから判断するにこのような分布になります。 実に恐ろしい分布をしていますね。にわかには信じられません。この模擬的な分布を少し分析して見ましょう
48.5%が貯蓄0-20万円
counts, savings = np.histogram(dist,bins=400) print(counts[0]) #14655 print (counts[0]/N*100.0) #48.55%
分布から、どの程度の貯蓄を持っているかの分布がわかります。この模擬データによれば、 14565/30000, 実に48.55%の人が貯金ほぼ0という結果になります。 この結果は、冒頭のcardmicsさんの記事やかきたろーさんの記事で紹介されている値ともほとんど一致しますね。
約半数が貯金0な訳ですね…
上位層15.8%が全体の富の8割を支配
それでは、この分布で2割8割の法則。つまり全体の2割が8割の富を得ているのかについて分析してみます。
## 全体の貯蓄額 total = np.dot(counts,savings[0:-1]) ## 全体の80%を超える頻度分布のライン i = 96 print(np.dot(counts[i:],savings[i:-1])/total) # 0.803 ## その人たちの全体に占める人口 print(counts[i:].sum()/30000) #0.1584
2割より少なくなりました。実に恐ろしい結果です。 2割8割よりももっと貧富の格差は拡大しつつあるのかもしれません。
全体の2割になるための貯蓄額は1200万円
逆に、2割8割の法則の強者側、全体の2割になるにはどの程度の貯蓄額が必要なのでしょうか。
i = 60 print(counts[i:].sum()/30000) #0.2037 print(savings[i]) # 1200
出ました、1200万です! 世の中の勝者になりたければ、とりあえず1000万は貯金しなさいということでしょうか。 なかなか現実と非現実の境目っぽくて、面白いです
まとめ
このデータをとんでもデータだという人もいますが、モデルベース分析してみると、いやはやこのデータなかなか綺麗なデータなのではないか…?とさえ思っちゃいます!
ニュース記事だけをみると、実に反直感的で、にわかには信じられないでしょう。しかし、この非現実的な貧富の分布は、現実に起こっています。というか、分析の結果ここまで現実的な数値がいくつか出てきたのに、私も少し驚いています。初めはなんだ、このトンデモデータはwwwみたいな気分で分析を始めたものですから
まとめると
・ それは人間の感情から引き起こされることが多い
・ ベキ分布に平均値はほぼ無意味。中央値を使うべき
■ 今回のデータがベキ分布に従うと仮定すると
・ 48%が貯蓄0
・ 全体の16%の人が8割の富を寡占している
・ 全体の2割の勝者になるためには、1200万の貯蓄が必要
ということがわかりました。 今回の結果はサンプル数が少ないので、一概に当てはまるとは言えませんが、目安にはなるのではないでしょうか。結果はなかなかシビアですが、たまにはこういうモデルベースの分析も、楽しいものですね。
付録
付録1 コイントス
- コイントスを100回行い、表が出た回数を記録。
- 30000回繰り返して、どのような結果になるかプロット。
import numpy as np import matplotlib.pyplot as plt N = 30000 np.random.seed(1) def cointoss(iteration=100): omote = 0 for i in range(iteration): p = np.random.random() if p< 0.5: #確率は半々 omote +=1 #表ならカウント return omote dist = np.zeros(N) for i in range(N): dist[i] = cointoss() plt.hist(dist,bins=range(0,100,2))
付録2 公平じゃないコイントス
- コインを投げる
- 表が出るたびに、0.05ずつ表が出る確率をあげる
というルールを加えてコイントスを行う
import numpy as np import matplotlib.pyplot as plt N = 30000 np.random.seed(1) def cointoss(iteration=100): omote = 0 omote_prob = 0.5 for i in range(iteration): p = np.random.random() if p < omote_prob: omote +=1 omote_prob += 0.05 #表が出たら確率も増やす return omote dist = np.zeros(N) for i in range(N): dist[i] = cointoss() plt.hist(dist,bins=range(0,100,2))