統計学の勉強をしていて、「大数の法則」が出てきました。法則の内容的には、「まぁ多分そうなんだろうね」って感じだったんですが、一応シミュレーションしてみるかってことで、やったことをまとめてみようと思います。
大数の法則とは?
互いに独立な確率変数$X_1,X_2,...,X_n$が母平均$\mu$であるとき、標本平均$\frac{X_1+X_2+...+X_n}{n}$はnが大きくなるほど母平均に近づくいうもの。
\lim_{n \to \infty}\frac{X_1+X_2+...+X_n}{n} \rightarrow \mu
この式は数学的に厳密ではないのかもしれないですが、イメージはこれで大丈夫だと思います。直感的には理解できるのですが、実世界で大量に試行する(nを増やす)というのもなかなか根気がいりますよね?ということで、サイコロを例にして「大数の法則」が本当かどうかシミュレーションしていきます。
サイコロシミュレーション
1~6までが同じ確率($\frac{1}{6}$)で出るサイコロで、サイコロを振る回数を1~10000回まで増やしていき、試行回数が標本平均に与える影響をグラフで確認できるようにします。
シミュレーションコード
import matplotlib.pyplot as plt
%matplotlib inline
import random
from collections import Counter
# 試行回数リスト
numTrials = list(range(1,10001))
meanlist = []
for numTrial in numTrials:
resultData = [ random.randrange(1,7) for _ in range(numTrial)]
countResult = Counter(resultData)
sumCountResult = 0
for num in (countResult.keys()):
sumCountResult += num * countResult[num]
mean = sumCountResult / numTrial
meanlist.append(mean)
plt.plot(numTrials,meanlist)
plt.xlabel("Trials")
plt.ylabel("mean")
plt.axhline(3.5, ls="--", color="magenta")
plt.savefig("verification_lawOfLargeNumber.png")
plt.show()
シミュレーション結果
以下がシミュレーション結果です。横軸はサイコロを振った回数、縦軸はサイコロをn回振ったときの出た目の平均値です。
ピンクの点線が、平均値3.5のラインで回数を重ねるごとに収束していることが分かります。「大数の法則」ってやっぱり正しそうですね。まぁ当たり前か・・・(笑)
あと、今回サイコロの出目を乱数を使ってシミュレーションをしていますが、シートを固定していないので、同じプログラムを実行しても、同じグラフを書くことはできませんので、ご了承ください。ただし、平均値が3.5に収束するという点は何度実行しても変わりません
最後に
今回はただの確認だったので、特に面白い話ではなかったですね。もっと面白いお話ができるように勉強頑張ります。