case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

Pythonで学ぶ二項分布とは

代表的確率分布の1つである二項分布について、実際にPythonで例題を解きながら理解したいと思います。

この記事の目的

・二項分布の概要や活用用途を理解すること
・二項分布を活用した例題を実際に解くことで理解を深めること

二項分布とは

結果が2つの試行を何回も繰り返すことによって起こる分布です。
難しくいうと、成功確率がpであるN回の独立したベルヌーイ試行が行われた時に、成功した回数mが従う離散型の確率分布です。
二項分布の確率密度関数は下記で表すことができます。
f:id:casekblog:20181009102719p:plain:w400
実際のユースケースでいうと、コインの結果は表と裏の2つです。
このようなケースの場合は二項分布に従うので、例えば20人いて5人が表をだす確率を求めることが可能です。

ベルヌーイ試行とは

2種類の結果のうちどちらかを発生させる試行のことです。
コインを1回投げて表か裏がでるか記録する試行はベルヌーイ試行と言えます。ガンの検査を受けて良性か悪性か記録する試行もベルヌーイ試行と言えます。
もしある事象XがX = 0 or X = 1の2通りの結果しか起こり得ない場合、P(X=1) = p[成功確率]だとすると確率変数Xはベルヌーイ分布に従います。

ベルヌーイ分布に従う場合の確率・期待値・分散

ベルヌーイ分布に従う場合、以下の条件に従います。

# 成功確率
P(X = 1) = p
# 失敗確率
P(X = 0) = 1 - p
# 期待値
E(X) = p 
# 分散
Var(X) = p(1 - p) 
活用用途

実際に以下のような場合に二項分布を活用することができます。
・n回のページビュー数のうち、確率pで広告がクリックされる回数 [クリックされる・クリックされない]
・n人のユーザーのうち、確率Pで解約する人数 [解約する・解約しない]
・n人の社員のうち、確率pで解約する人数
・禁煙者がタバコを吸うことで癌の発癌率[良性:悪性]がどのように変わるかなどです。
・値段を変えることで商品の購入率[買う・買わない]がどのように変わるか
・勉強時間を変えることでテストの合格率[合格・不合格]が変化するか

例題

実際にPythonで二項分布の例題を解きながら理解を深めていきたいと思います。

例題 (1)

従業員が20人いる会社があったとする。1年間で1律15%の確率で従業員が辞めるとすると、1年後に5人辞める確率は何%か?
P(X = 5) = 20C5 *0.15^5 * (1-0.15)^(20-5) = 10.3%

n = 20
x = 5
p = 0.15
bp = comb(n,x)*p**x*(1-p)**(n-x)
print(bp)

# out put
0.10284517954557212
binomial = sp.stats.binom(n=20, p=0.15)
np.random.seed(1)
data_binom = binomial.rvs(size=1000)
# 確率質量関数
m = np.arange(0,21,1)
pmf_binomial = binomial.pmf(k=m)
# 乱数のヒストグラムと確率質量関数を重ねる
sns.distplot(data_binom, bins = m, kde = False,
            norm_hist = True, color = 'gray')
plt.plot(m,pmf_binomial, color = 'black')
plt.ylabel("binomial probability")
plt.xlabel("random variable")

f:id:casekblog:20180714172836p:plain:w300

例題 (2)

30%の確率で表がでる特殊なコインを 4 回投げたときに、表が 3回でる確率の分布

n = 4
x = 3
p = 0.3
bp = comb(n,x)*p**x*(1-p)**(n-x)
print("binomial prob:{:.3f}".format(bp))

# out put
binomial prob:0.076
binomial = sp.stats.binom(n=n, p=p)
np.random.seed(1)
data_binom = binomial.rvs(size=1000)
# 確率質量関数
m = np.arange(0,10,1)
pmf_binomial = binomial.pmf(k=m)
# 乱数のヒストグラムと確率質量関数を重ねる
sns.distplot(data_binom, bins = m, kde = False,
            norm_hist = True, color = 'gray')
plt.plot(m,pmf_binomial, color = 'black')
plt.ylabel("binomial probability")
plt.xlabel("random variable")

f:id:casekblog:20180714173212p:plain:w300

例題 (3)

表が出る確率Pが0.5のコインがあるとする。コインを10回(n)投げて表が3回出る確率(p)を求めよ。
表が出る確率がp=0.5であることから、次のように計算できます。
P(x=3) = 10C3 * 0.5^3 * (1-0.5)^(10-3) = 0.117

n = 10
x = 3 
p = 1/2
bp = comb(n,x)*p**x*(1-p)**(n-x)
print("binomial prob:{:.3f}".format(bp))

# out put 
binomial prob:0.117
binomial = sp.stats.binom(n=n, p=p)
np.random.seed(1)
data_binom = binomial.rvs(size=1000)
# 確率質量関数
m = np.arange(0,11,1)
pmf_binomial = binomial.pmf(k=m)
# 乱数のヒストグラムと確率質量関数を重ねる
sns.distplot(data_binom, bins = m, kde = False,
            norm_hist = True, color = 'gray')
plt.plot(m,pmf_binomial, color = 'black')
plt.ylabel("binomial probability")
plt.xlabel("random variable")

f:id:casekblog:20180714173456p:plain:w300

次は二項分布と正規分布の関係について説明したいと思います。
case-k.hatenablog.com