はじめに
大数の法則や中心極限定理はいろいろなところに説明があり、たぶん以下のサイトがとてもわかり易いのですが、やっぱり一度は自分で体感しないとわからないので、試してみました。
Pythonでのコード付きです。
説明
大数の法則
代数の法則はWikipediaによると
独立同分布に従う可積分な確率変数列の標本平均は平均に収束する
ということで、何がなんだかよくわかりませんが、結局はたくさんやればやるほど、真の期待値(平均値)に近づいていく→期待値(平均値)は一定に収束するということみたいです。
サンプル
ここでは例えば、サイコロの1が出る確率について考えてみます。
サイコロの出目をとすると、一般的には
となります。
ただ、本当に1が出る確率はなのでしょうか。
直感的にサイコロを1回出ると1が出る確率はですが、実際に1回しか振らないと1~6のいずれかが出るだけで、1が出れば確率は1ですし、それ以外が出れば確率は0です。
本当に確率がなのか、代数の法則を使って確認してみましょう。
大数の法則: Pythonコード
始める前に乱数のシードを固定します。そうすることで何度実験しても同じ乱数が取り出せるため、結果を再現して何度でも眺めることができます。
本当にランダムにしたいときはこれは外してください。
np.random.seed(5)
まずは、1000回サイコロを振ったことを想定し、1~6の一様乱数を1000回分得て、1なら1、それ以外なら0の配列を作成します。
N = 1000 d = [1 if d == 1 else 0 for d in [np.random.randint(1, high=7) for i in range(N)]]
その上で、1回目、2回目、3回目、...、1000回目時の1の確率を計算します。
prob = [0] * N for i in range(1, N+1): prob[i-1] = np.sum(d[0:i]) / i
そして、最後に描画します。1行目が実際の結果で、2行目が想定される確率のです。
plt.plot(np.arange(0,N), prob) plt.plot([0, N], [1/6, 1/6], color="red")
描画されたグラフがこれになります。回数が進むに連れ、概ねに収束していくことが見て取れるかと思います。
大数の法則: まとめ
大数の法則はその事象が発生する真の期待値と、実際に得られる確率の差=誤差は実際に多く試せば試すほど極限まで小さくなるというものです。
中心極限定理
中心極限定理はざっくりいうと、母集団がなんであれ、抽出するサンプルサイズnが大きくなるに連れ、標本平均の分布は母平均, 分散
(
は母分散)の正規分布に近づくと言う定理です。
また、Pythonで実行しながら試していきましょう。
中心極限定理: Pythonコード
最終的に、各確率値の頻度を出したいですが、確率は連続値であるためそのままだと各点に入る要素は1つしかなく、薄っぺらい分布になりかねません。
まずは区間[0~1]を101分割して1%単位の確率に離散化します。
p = np.round(prob, 2)
そして、1%単位でビン化します。
y = [0] * 101 for pi in p: y[int(pi*100)] += 1
こうすることで、各確率値相当の配列番号にその頻度が入るようになります。
最後に可視化します。1行目が実際の頻度、2行目が最頻値に引く線です。*2
plt.plot(np.arange(0,101), y) plt.bar([16], [np.max(y)], color="red")
この通りのグラフとなります。
中心極限定理: まとめ
中心極限定理によると、得られる期待値の分布は試行を増やせ正規分布として扱えます。
またその正規分布の分散はなのでより先鋭化していく、ということを表していると考えられます。
全体のまとめ
なんか大数の法則と中心極限定理似ていますね。混乱します。
まとめると、大数の法則はあくまで期待値(平均値)の収束についてのみ扱っており、中心極限定理はその期待値(平均値)の分布を表現している、と考えると良さそうです。
ちなににNを10000などにすると、大数の法則側の図は十分収束してしまっているためわかりにくいですが、中心極限定理はより分布が先鋭化するのがわかると思うので、私と同じように興味を持った人は是非試してみてください。
*1:https://ja.wikipedia.org/wiki/%E5%A4%A7%E6%95%B0%E3%81%AE%E6%B3%95%E5%89%87
*2:最頻値は16はざっくりです。17な気がしてきた。