見出し画像

【第28回】数撃てば当たるのか? -ポアソン分布編

確率0.0007%の事象は、何回繰り返せば起こることが期待されるか?

情報の授業における生徒とのやりとりから前回は上記のことを考えてみました。よろしければ、前回記事もご覧ください。

ここでは「ある試行を繰り返し行ったとき、ある事象が初めて起こるまでの試行回数」に注目し、幾何分布についてまとめてみました。

個人的に興味深い話題でしたので、もう少し深掘りし、別の視点で記事を書いてみることにしました。
今回は、二項分布$${ B(n, p) }$$において「試行回数$${ n }$$が極めて大きく、成功確率$${ p }$$が極めて低い」場合に注目し、ポアソン分布についてまとめます。

前回記事のまとめ

まずは前回記事をコンパクトにまとめます。

公正なサイコロを100回投げて1の目が35回以上出る確率は、およそ0.0007%(100万分の7)でした。

この「1の目が35回以上出る」という確率が約0.0007%の事象は、何回繰り返せば、少なくとも1回起こるでしょうか。
これをグラフにすると次のようになります。

図2: 幾何分布の累積分布関数

これを見ると、10万回までには50%くらいの確率で成功し、60万回繰り返すと100%に近い確率で成功することが分かります。

ある試行を「1回の試行で確率$${ p }$$で起こる事象」が初めて起こるまで繰り返したときの試行回数$${ X }$$の従う確率分布を、成功確率$${ p }$$の幾何分布と言います。

$${ X }$$の期待値は$${ \frac{1}{p} }$$でした。今回の場合をPythonを使って計算します。

p = 1-stats.binom.cdf(34,100,1/6)
print(1/p)

実行すると142346.99089049711が出力されます。
したがって、およそ142347回繰り返せば「1の目が100回中35以上出る」ことが期待されるということが分かりました。

ここまでが前回の記事の内容です。

後日の私

前回の生徒とのやり取りを振り返りながら、次は下記のようなことを考えてみることにしました。

[例題]
「サイコロを100回投げる」という試行を100万回繰り返す。
そのうち何回の試行で「1の目が100回中35回以上出る」のか?

そんなわけで、まずは下のプログラムを実行し、棒グラフを描いてみることにしました。

k = np.arange(1,31,1)
p = 1 - stats.binom.cdf(34, 100, 1/6)
plt.bar(k, stats.binom.pmf(k, 1000000, p))
plt.grid()
plt.show()
図3: 100万回の試行の結果起こる回数とその確率

成功確率がおよそ100万分の7であることからも予想がつきましたが、7回あたりをピークにしたグラフになります。

ポアソン分布

ここで話をシンプルにするため、以下サイコロの話から離れて、試行回数$${ n=1000000 }$$、成功確率$${ p = 0.000007}$$の二項分布$${ B(1000000,0.000007) }$$を考えることにします。

確率変数$${ X }$$が二項分布$${ B(n, p) }$$に従うときの$${ X }$$の期待値$${ np }$$を$${ \lambda }$$とおきます。
今回の場合は100万回の試行における平均成功回数を表しています。
そして、今回のように、試行回数$${ n }$$が極めて大きく、成功確率$${ p }$$が極めて低いとき、この確率変数$${ X }$$は平均$${ \lambda }$$のポアソン分布$${ Po(\lambda) }$$に従うということが知られています。
これはつまり、一定間隔(一定の試行回数や期間)において、平均$${ \lambda }$$回起こる事象が$${ k }$$回起きる確率$${ P(X=k) }$$が次の式で表されるということです。

$$
P(X=k) = e^{-\lambda} \frac{\lambda^k}{k!} \quad (eは自然対数の底)
$$

今回の例の場合は一定間隔は「100万回の試行」で考えており、

$${ \lambda = 1000000 \times 0.000007 = 7 }$$

です。このポアソン分布を利用して、次の問題を考えてみましょう。

[例題]
確率変数$${ X }$$は平均7のポアソン分布$${ Po(7) }$$に従うとき、$${ X=10 }$$になる確率を求めなさい。

言い換えると、「100万回に7回の割合しか起こらないような事象があるとき、実際に100万回行ったときにその事象が10回起こる確率はどうなるか」という問題です。

計算式は下記のようになります。

$$
P(X=10) = e^{-7} \frac{7^{10} }{10!}
$$

Pythonではscipy.statsモジュールの次のメソッドを利用して求めることができます。

stats.poisson.pmf(10,7)

実行結果:0.07098326865041356

二項分布との比較

それでは、これが最初の二項分布と比較してどれほどよい近似になっているのかを見てみることにしましょう。

確率変数$${ X }$$が二項分布$${ B(1000000,0.000007) }$$に従うときの計算式と、それを計算するPythonのコードおよび実行結果を以下に示します。

$$
P(X=10) = _{1000000} C_{10} \left( \frac{7}{1000000} \right) ^{10}\left( \frac{999993}{1000000} \right) ^{999990}
$$

Pythonではscipy.statsモジュールの次のメソッドを利用して求めることができます。

stats.binom.pmf(10,1000000,0.000007)

実行結果:0.07098330408830139

ポアソン分布で近似:0.07098326865041356
二項分布での真の値:0.07098330408830139

誤差$${ 3.543788783255675 \times 10^{-8} }$$のとても良い近似になっていることが分かります。

PythonやRを使うとサクッと計算できてしまうので二項分布のポアソン分布による近似はあまりありがたみはないのかもしれません。
ただ、手元に一般的な関数電卓しかないときには、二項分布の確率質量関数に従って計算するのは難しい一方、ポアソン分布の計算式ならば容易に計算可能です。

ポアソン分布で近似することの良さは、非常に大きい数と限りなく0に近い数から成るパラメータの組を、比較的分かりやすい1つのパラメータで確率分布を表すことができ、それにより計算がシンプルにできるようになるところだと言えます。

実際、本記事の中で二項分布のパラメータを書いているときに、何度も0がいくつ並んでいるのか分からなくなりましたね。ハイ。

まとめ

情報の授業の中の生徒とのやり取りの中で考えたことを2回にわたって記事にしてみました。

幾何分布ポアソン分布は極限の計算がどうしても出てくるために、高等学校の数学ではなかなか扱いにくい分野ではあります。
ただ、基本的な考え方自体はそれほど難しくはなく、しかも日常の出来事にも関わりが深いことから、今回のように何かのきっかけで生徒に話してみるのも面白いと思っています。

最後はきれいにまとめようと思いましたが、ここまでノリノリで書いてしまったためにうまく着地できずにいます。スミマセン。

次回から再び本編に戻り、情報Iの授業におけるデータの分析・活用について、新たなテーマで記事を書いて参ります。

最後までお読みいただきありがとうございました。
今後もどうぞよろしくお願いいたします。