簡単な確率の計算をPythonを使ってやってみましょう。
確率は何とも概念がつかみにくいものがあるのですが、実際に計算してみることで概念をつかんでみたいと思います。
とりあえず簡単な問題からやっていきましょう。
サイコロを使った確率の計算
確率の定番、サイコロを使って確率を求めてみたいと思います。
今回のお題は以下の「演習で身につける統計学入門」からの出題です。
公平なサイコロAとBを振って出た目の和が10以上になる事象Dの起きる確率を求めなさい。
Pythonなどを使わずに普通に答えを求めた場合、まずサイコロを2回振って出た数の和が10以上になる組み合わせを見つける必要があります。
その組み合わせは、|4, 6|、|5, 5|、|5, 6|、|6, 4|、|6, 5|、|6, 6| の6通り。
つまり、6つの事象があるということ。
根本事象は 6 X 6 = 36 なので から、
、つまり16%ほどになります。
しかし毎回事象を数えるのは面倒なので、プログラムで簡単に計算できるようにしてみます。
count = 0
# for 文を2回繰り返し、二つのサイコロを振って出た目の和が10以上になる組み合わせを求める。
for i in range (1, 7): # サイコロ Aを振る。1 以上 7 未満、つまり6
for j in range (1, 7): # サイコロBを振る。1 以上 7 未満、つまり6
if i + j >= 10: # もしA と Bの合計が10以上になる場合
count += 1 # countに1を足して代入
print(count/36) # countを根本事象36で割ると
0.16666666666666666
つまり確率は16%ほどとなります。
この計算の仕方だと、根本事象である36がわかっている必要がありました。
しかし根本事象がわからない場合もありますので、わからない場合を前提にしたプログラムを書くと以下。
A = 0
B = 0
# for 文を2回繰り返し、二つのサイコロを振って出た目の和が10以上になる組み合わせを求める。
for i in range (1, 7): # サイコロ Aを振る。1 以上 7 未満、つまり6
for j in range (1, 7): # サイコロBを振る。1 以上 7 未満、つまり6
A += 1 # 根本事象を求める
if i + j >= 10 or j + i >= 10: #もしA と Bの合計が10以上になる場合
B += 1 # B に1を足して代入
print(B/A) # Bを根本事象A で割ると
0.16666666666666666
確率は同じように16%ほどとなります。
コインを使った確率の計算
では次に、これも確率の勉強では定番のコインを使って確率を求めてみます。
例題は同じように「演習で身につける統計学入門」からの出題です。
公平な効果を3回トスしたとき、
- 裏が1回だけ出る確率を求めなさい。
- 裏が1回以上出る確率を求めなさい。
という問題を解いてみましょう。
この問題を解く場合、表か裏かの離散確率分布になるので二項分布を使って確率を計算するのが妥当です。
考え方として表が0裏が1とし、どちらかが出る確率は1/2、つまり0.5で50%になりますね。
表が1回だけ出る確率
この考え方決めたうえで、scipy.statsというモジュールを使って確率を求めてみます。
from scipy.stats import binom # scipy.stats モジュールから binom(二項分布)をインポート win = binom.pmf(1, 3, 0.5) # 3回投げて1回裏が出る確率を求める。 print(win) 0.375
実行すると、裏が一回だけで出る確率は37.5%になります。
裏が一回以上現れる確率
では、裏が1回以上現れる確率を求めます。
考え方としては、裏が一度も出ない確率を求めて100%から引くと、残りは裏が1回以上出る確率になります。
from scipy.stats import binom # scipy.stats モジュールから binom(二項分布)をインポート win2 = binom.pmf(0, 3, 0.5) # 3回投げて裏が一度も出ない確率を求める。 print(1-win2) # 1から裏が一度も出ない確率を引く 0.875
というわけで、コインを3回投げて裏が1回以上出る確率は87.5%になります。
関連記事↓↓↓


コメント