pythonで2項分布の確率の計算をする


統計検定 2級に、2項分布の確率を求める問題が出題されます。
手計算がたいへんなので、python で、2項分布の計算方法を調べてみました。
結果を記載します。


numpy.random.binomial を使う

実際に試行する

numpy.random.binomial で、2項分布を実際に試行することができます。
以下、36回 コインを投げるのを1000セット実行し、表の出る回数を出力します。

import numpy as np
n, p = 36, .5 
# 36回 コインを投げた場合、表or裏が出る回数 。 1000セット実行する 。
s = np.random.binomial(n, p, 1000)
print(s)
[22 16 20 16 16 19 16 24 19 17 16 22 12 17 19 23 17 14 16 17 21 19 15 22 21
 21 21 14 19 16 11 18 18 16 20 17 21 18 16 17 14 14 21 14 15 23 19 16 18 19
 18 20 16 19 16 13 23 17 16 19 16 16 17 16 15 26 19 14 17 20 22 14 11 20 19
 17 20 17 14 19 20 17 21 18 18 18 25 15 13 20 20 24 17 18 16 20 16 18 22 20
 20 20 21 14 28 19 17 15 21 16 19 14 25 13 17 16 15 16 13 19 16 20 22 17 21
 15 18 19 14 18 21 19 19 15 20 13 20 16 16 16 20 19 21 16 22 24 17 21 23 12
 18 17 17 18 18 18 13 20 12 18 18 17 18 20 13 21 16 19 21 21 16 15 18 11 18
 19 19 17 10 19 15 18 16 17 18 17 20 21 21 17 11 16 20 17 21 20 20 13 19 17
 19 16 15 17 21 21 17 14 18 14 17 20 17 19 16 13 18 16 20 22 22 14 15 21 15
 13 18 17 21 14 17 14 17 19 17 16 17 17 15 16 14 18 15 16 20 14 11 15 13 22
 17 20 14 23 17 18 17 21 20 23 16 27 21 16 20 21 14 14 18 19 19 16 16 15 19
 18 18 20 23 20 21 17 12 22 15 23 20 20 13 15 20 18 23 18 15 17 20 18 19 16
 16 18 20 18 19 17 19 18 19 19 15 18 17 13 19 15 11 18 19 17 19 16 15 18 18
 23 20 13 17 10 17 15 20 17 17 15 17 14 18 20 17 18 17 18 19 16 16 21 16 19
 20 21 21 15 18 19 17 21 18 17 16 19 15 21 16 18 17 21 19 19 15 19 20 11 20
 17 17 15 17 19 17 17 20 18 23 13 11 17 16 15 25 14 16 20 22 18 18 17 19 19
 14 19 20 17 16 20 16 17 17 14 18 24 17 17 21 13 16 22 24 18 19 16 18 18 18
 21 20 20 20 16 22 16 17 18 13 16 18 19 21 13 19 21 16 22 24 15 21 15 18 19
 19 22 19 17 23 12 16 20 20 20 19 15 27 17 14 17 20 18 16 20 15 15 23 15 14
 19 20 19 18 19 22 17 19 18 18 24 15 17 12 17 16 15 16 12 13 16 17 17 16 17
 23 20 18 16 22 18 21 14 16 17 24 18 17 22 18 19 17 16 19 23 13 21 18 19 18
 20 17 21 19 19 20 18 18 14 16 17 21 21 12 18 20 20 20 20 17 19 16 21 14 22
 13 20 18 21 20 15 22 24 17 18 20 16 16 18 16 14 16 14 20 21 18 23 16 22 17
 22 21 18 20 13 15 13 17 24 17 18 22 16 19 16 16 20 20 15 19 23 20 16 18 21
 20 19 17 15 19 14 19 15 19 15 19 19 18 18 16 23 21 12 19 16 10 21 20 17 18
 19 22 26 19 20 14 17 18 19 16 17 16 15 19 16 15 17 18 17 25 17 26 16 21 17
  9 18 15 20 24 16 19 25 16 26 16 18 16 21 20 14 18 23 20 14 16 26 14 16 18
 17 21 12 22 12 18 23 19 15 17 17 19 20 18 23 19 21 23 17 14 21 17 21 15 15
 20 19 20 20 16 21 17 13 16 19 18 15 16 18 12 23 15 17 20 15 16 16 17 17 17
 23 17 15 11 17 15 17 20 17 18 20 13 17 18 21 15 11 15 17 12 20 16 12 17 13
 16 15 19 18 13 13 20 18 20 14 23  9 19 19 18 20 21 20 12 16 16 17 15 14 18
 20 19 18 17 16 18 18 19 18 19 22 17 22 14 26 12 14 20 19 21 15 18 21 19 15
 20 18 18 14 13 14 19 20 20 13 19 13 14 14 20 12 20 17 17 19 14 21 20 16 21
 18 15 15 19 18 16 17 20 17 20 17 19 19 16 20 16 18 19 24 14 17 19 21 16 18
 22 20 23 18 16 20 18 18 14 16 18 17 15 20 17 15 20 22 20 18 23 18 20 16 18
 13 20 27 22 23 12 19 19 17 19 17 13 21 16 18 18 17 19 21 18 16 17 19 21 23
 16 16 22 17 17 16 17 11 15 20 17 23 18 20 18 18 18 21 14 17 19 19 12 26 19
 16 22 21 22 19 18 17 16 17 12 15 15 16 20 14 21 17 16 13 19 13 17 25 14 19
 20 22 16 25 17 23 22 15 14 22 18 21 15 17 14 16 15 21 23 20 23 14 14 18 14
 17 19 18 18 20 20 18 15 15 19 22 16 16 18 16 21 13 18 14 15 19 21 17 15 17]

実際に試行した結果の確率を求める。

np.random.binomial の実行結果と、sum関数の組み合わせで、試行した際の確率を計算することができます。
ここでは、コインを36回投げた場合に、表が24回以上でる確率を求めます。

import numpy as np
n, p = 36, .5 
# 36回コインを投げた場合、表が24回以上出る確率を出力    
s = sum(np.random.binomial(n, p, 1000) >= 24)/1000.
print(s)
0.036

発生確率は、およそ 0.03 前後であることがわかります。

scipy.stats.binom を使う

確率密度関数のグラフを描画する

scipy.stats.binom を使って、2項分布の確率密度関数のグラフを描画することができます。

%matplotlib inline 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import binom

# matplotlib の設定を調整   
plt.rcParams['font.family'] = 'IPAPGothic' #全体のフォントを設定
plt.rcParams["figure.figsize"] = [12, 6]
plt.rcParams['font.size'] = 20 #フォントサイズを設定 default : 12
plt.rcParams['xtick.labelsize'] = 15 # 横軸のフォントサイズ
plt.rcParams['ytick.labelsize'] = 15

# 確率
p = 0.5
# 試行回数
N = 36
# 試行回数中の発生回数 (配列)   
k = np.arange(N+1)

# グラフにプロット
fig, ax = plt.subplots(1,1)
ax.plot(k, binom.pmf(k, N, p), 'bo', ms=8)
ax.vlines(k, 0, binom.pmf(k, N, p), colors='b', lw=1, alpha=0.2)
ax.set_xlabel('回数')
ax.set_ylabel('確率')
ax.set_title('coin toss')
ax.set_ylim((0,0.15))
(0, 0.15)

png

実際に試行した結果の確率を求める。

コインを36回投げた場合に、表が24回以上でる確率を求めます。

%matplotlib inline 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import binom

# 確率
p = 0.5
# 試行回数
N = 36
# 試行回数中の発生回数 (配列)   
k = np.arange(24, N + 1)

# binom.pmf の結果の配列の合計を算出    
# コイントスの試行は、離散型の確率密度関数になるので、この計算方法で問題ないと思う    
print("probability:" , sum(binom.pmf(k, N, p)))      
probability: 0.0326226676116

参考

以下、参考にしたページです。

以上です。

コメント