見出し画像

#5 反復試行と確率密度関数を使って確率を求めてみるってばよ

反復試行のプログラムを作成し、確率計算をします。
高校で習う反復試行をプログラムで実装する方法とそこから確率密度関数を描いて、確立を求めることをします。

反復試行とは

わかりやすいイメージで言うとコイントスですね。
コイントスを繰り返し行った時の表の出る確率など、繰り返し行った時の確率を求める時に使います。

$$
{}_n \mathrm{C}_k p^k (1-p)^{(n-k)}
$$

プログラムコード

今回のシミュレーションのコードはこちらです。

probは確率を格納リストです。
xはコイントスの表が出る回数を格納するリストです。
反復試行の計算は関数で実装し、for文で1000回のループを実行して、probに1000回のコイントスの内k回表が出る時の確率を1000回まで格納します。
xにはコイントスで表が出た回数を格納していきます。
この格納したリストをplt.plot(x,prob)でグラフを作成し、plt.show()で描画します。

import math as m
import matplotlib.pyplot as plt

def rep_trial_prob(n,k,prob):
	if prob > 1:
		print('probability should be less than 1.')
	else:
		return m.comb(n,k) * prob ** k * (1-prob) ** (n-k)
	
if __name__=='__main__':
	#コイントスで表が6回出る確率。
	print(rep_trial_prob(10,6,1/2))
	prob=[]
	x=[]
	for i in range(0,1001):
		prob.append(rep_trial_prob(1000,i,1/2))
		x.append(i)
		
	plt.plot(x,prob)
	plt.show()
	
	print(sum(prob))
	print(prob[500])
	print(sum(prob[400:600]))
	print(sum(prob[600:700]))
	

反復試行の確率を求めるメソッド

反復試行の確率を求めるメソッド(関数は数学の関数と被るためメソッドと記載します。)はmath関数の組み合わせ計算を使用して実装します。nを試行回数、kはある事象が起こる回数、probは確率を引数に式に代入して計算をリターンで返します。
確率が1より大きいことはないので、おかしい値が入った時はif文でエラー処理をしています。
もっと他の例外処理を入れとけよと思ったら自分で実装してくださいw

def rep_trial_prob(n,k,prob):
	if prob > 1:
		print('probability should be less than 1.')
	else:
		return m.comb(n,k) * prob ** k * (1-prob) ** (n-k)

コイントス1000回行った時の確率密度関数を描いてみる

ここではコイントス1000回行った時の確率密度関数を描きます。

コイントスの反復試行の確率を求める関数を用いてデータを取得します。

コイントス1000回だからn=1000、コイントスの表が出る確率はイカサマがない限り0.5ですのでp=0.5。
そして、コイン表になる回数が0回から1000回までの確率を求めます。
コードにすると反復試行の確率を求めるメソッドに引数p=1/2(0.5)、n=1000としてコイントスで表の出る回数kを0から1000までfor文で繰り返して求められます。

求めた値はリストにappendで格納すれば完了です。

グラフにするとこちら。

コイントス1000回行った時の表が出る確率の確率密度関数

確率密度関数は全て積分すると1になるので、
sum(prob)は1になります。

確率密度関数を使って確率を求めてみる。

確率密度関数のを積分すると確率が求められます。
つまり先ほどの描いた確率密度関数のグラフの面積が確率です。
まず1000回のコイントスをした時にちょうど500回表が出る確率密度関数をもとめてみます。

プログラムで求めた確率密度関数のn=500の値を見れば良いです。

print(prob[500])

P(500)=0.0252250181783608

2.5%程度です。
意外と低く感じたでしょうか?
コイントスはイカサマがない限り真の確率は1/2ですので、何回かコイントスする場合はだいたい半分が表、もう半分が裏になると普通は考えるので、ほとんど500回くらいになるはずです。

次に400回から600回の範囲で表になる確率を求めてみましょう。

P(400≦X≦600)=0.999999999773493

99.9999....%とほぼ100%です。
統計的にみてもコイントスの確率は1/2でだいたい投げた回数の半分が表になるとわかったのではないでしょうか。

最後にコイントス1000回のうち600回から700回の範囲で表が出る確率を求めてみます。
偶然結果が偏ってコイントスの表が600回から700回出る場合はどれくらいの確率になるかです。
P(600≦X≦700)=1.3642320780330092e-10

ほぼ0%です。※0%ではありません。
イカサマのコインでない限り、奇跡レベルの確率です。

まとめ

反復試行の確率のコードを作って、コイントスのシミュレーションをしました。
1000回のコイントスで何回表が出るかの確率を確率密度関数から求めてみました。
統計的にもコイントスの表の出る確率が真の確率に近い事を体験できたではないでしょうか。

反復試行が行われるケースはコイントスの他にもサイコロでも同様です。
サイコロを何回か投げた時の出る目の回数もシミュレーションできますので作って試してみると良い学習になります。

コードファイル

今回の記事で用いたコードのpythonファイルはここで販売しております。
(記事内のコードは記載されています。)

ここから先は

0字 / 1ファイル

¥ 100

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。