1. はじめに
この記事では、大数の法則の説明と Python での可視化を行う。
2. 大数の法則とは
母集団の性質を推定するための手法として、標本調査がある。これは、母集団の一部を無作為抽出(ランダムサンプリング)して、分析を行うことで、母集団全体の性質を推測するものである。
例えば、政党ごとの支持率について調査をする際、有権者全員に支持政党を聞くことができれば($=$ 全数調査)、真に正しい値を得られるが、これは現実的ではない。
そこで実際には、母集団から無作為に抽出した一部の標本に対して調査を行い、その結果をもとに母集団の性質を推定する標本調査が用いられる。
この時得られた値は、実際の真の値と一致することは非常にまれであり、ズレが生じる。このズレを標本誤差という。これは、一部を抽出して調べる以上避けられないものである。
しかし、サンプルサイズを増やすことで、この標本誤差を限りなく小さくできることを数学的に保証した定理が、大数の法則である。
大数の法則とは、サンプルサイズを大きくしていくと、標本平均が母集団平均 $\mu$ に限りなく近づく(収束する)というものである。
3. Python による実装
ここでは、Python による大数の法則の可視化を行う。
今回はさいころを振るシミュレーションを想定し、Python の numpy.random を用いて1から6の範囲で乱数を生成する。この試行回数を増やしたときに、標本平均がどのように理論上の平均値(期待値)へ収束していくのかを可視化する。
なお、さいころの目の期待値 $\mu$ は、以下のように $3.5$ となる。
$$
\mu = \dfrac{1+2+3+4+5+6}{6} = 3.5
$$
使用した Python コードを次に示す。
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib
np.random.seed(11)
THEORETICAL_AVE = 3.5
N_SAMPLES = 5000
fig, ax = plt.subplots()
# 1から6の乱数を生成
dice = np.random.randint(1, 7, N_SAMPLES)
# 累積平均を計算(ベクトル演算)
dice_cum_mean = np.cumsum(dice) / np.arange(1, N_SAMPLES + 1)
ax.plot(
np.arange(1, N_SAMPLES + 1),
dice_cum_mean,
color="black",
label="標本平均 (Sample Mean)"
)
ax.hlines(
THEORETICAL_AVE,
xmin=1,
xmax=N_SAMPLES,
colors="red",
linestyles="dashed",
label="理論上の平均値 (Theoretical Mean)"
)
ax.set_title("大数の法則のシミュレーション")
ax.set_xlabel("試行回数 (n)")
ax.set_ylabel("平均値")
ax.grid(True, alpha=0.5)
ax.legend()
plt.show()
実行結果は次のようになる。
図1より、試行回数を増やしていくと、母集団平均である3.5に近づくことがわかる。
4. さいごに
今回は大数の法則の説明と可視化を行った。
サンプリングの数を増やせば、標本平均は真の値へと近づき、推定の精度が高まる。その一方で、調査対象が増えることで、時間や費用といったコストも増大する。
実際の標本調査においては、この精度とコストの兼ね合い(トレードオフ)を十分に考慮し、目的に応じた適切なサンプルサイズを決定することが重要である。
5. 参考資料
書籍
- [1]. データ分析に必須の知識・考え方 統計学入門
- [2]. Pythonで学ぶ暗号理論
