経験比率と確率
ゲームのシミュレーション
ゲームの経験的勝率がゲームを多数回行っていくと確率に近付くことをSpiegelhalter(2019)はシミュレーションで示している。ゲーム1とゲーム2の2つのゲームが扱われている。
ゲーム1:
サイコロを4回投げて、6の目が1回以上出たら勝ち。1回も出なかったら負け。
ゲーム2:
2個のサイコロを24回投げて、2個のサイコロの目が2つとも6の目であるということが1回以上あれば勝ち。2個のサイコロの目が6であるということが1回も起こらなかったら負け。
ゲーム1において勝つ確率は次式で与えられる。
ゲーム2において勝つ確率は次式で与えられる。
ゲーム数を増やしていくと、経験的勝率がどのように変化していくかを見るシミュレーションプログラムを、Spiegelhalter(2019), p. xviに記載されているウェブサイトからダウンロードしたファイル(Rスクリプト)を参考にして、リスト1に示すもの(Pythonスクリプト)を書いてみた。
ゲーム1のシミュレーションは、確率のベルヌーイ分布(試行数1の2項分布)で表している。
play1 = rng.binomial(1, 1.0 -
(5/6)**4, n_games)
ゲーム2のシミュレーションは確率のベルヌーイ分布によるシミュレーションである。
play2 = rng.binomial(1, 1.0 - (35 /
36)**24, n_games)
リスト1のプログラムを実行すると、図1のグラフが表示される。
図1
上のグラフが、100回目までのグラフで、下のグラフは10000までのグラフである。100回目までの勝率を示す上のグラフは変動がかなり認められるが、10000回目までの勝率を示す下のグラフでは、2000回を超えると、それぞれの経験勝率が確率の近くで安定しているように見える。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng()
n_games = 10000
play1 = rng.binomial(1, 1.0 -
(5/6)**4, n_games)
cum_play1 = np.cumsum(play1)
cum_n = np.arange(1, n_games+1)
prop1 = cum_play1 / cum_n
play2 = rng.binomial(1, 1.0 - (35 /
36)**24, n_games)
cum_play2 = np.cumsum(play2)
prop2 = cum_play2 / cum_n
plt.figure(figsize=(7,7))
#
#
ゲーム数200までの描画
#
plt.subplot(211)
plt.plot(cum_n[:101], prop1[:101],
c='b', label='Game 1')
plt.plot(cum_n[:101], prop2[:101],
c='r', label='Game 2')
plt.hlines(0.5, 0, 100, ls='--',
color='k', label='0.5')
plt.xticks([0]+[v for v in
np.arange(19,101,20)],
[1]+[v for v in np.arange(20,101,20)])
plt.xlabel('Number of games')
plt.ylabel('Proportion of wins')
plt.legend()
#
#
ゲーム数2000までの描画
#
plt.subplot(212)
plt.plot(cum_n, prop1, c='b',
label='Game 1')
plt.plot(cum_n, prop2, c='r',
label='Game 2')
plt.hlines(0.5, 0, 10000, ls='--',
color='k', label='0.5')
plt.xticks([0]+[v for v in
np.arange(1999, 11000, 2000)],
[1]+[v for v in np.arange(2000, 11000, 2000)])
plt.xlabel('Number of games')
plt.ylabel('Proportion of wins')
plt.legend()
plt.tight_layout()
plt.show()
岡本安晴(2019) いまさら聞けないPythonでデータ分析.丸善出版
Spiegelhalter, D. (2019). The art of statistics: Learning from data.
Pelican