二項分布は、「成功」か「失敗」の試行を複数回繰り返したときの成功回数の分布を表す、離散型確率分布の代表格である。
コイン投げで表が出る回数、製品検査で不良品が見つかる個数、アンケートで「はい」と答える人数など、二項分布が適用できる場面は非常に多い。機械学習の分類問題における精度評価や、A/Bテストの統計的検定にも用いられる。
二項分布はベルヌーイ分布を一般化したものであり、n = 1 の場合がベルヌーイ分布に相当する。また、試行回数が増えると正規分布に近似できるという重要な性質(中心極限定理)をもつ。
定義
成功確率 p(0 < p < 1)のベルヌーイ試行を n 回独立に行うとき、成功回数を Y とする。このとき Y の従う分布を二項分布(binomial distribution)といい、\text{Bin}(n, p) と表す。
ここで {}_n C_y = \dfrac{n!}{y!(n-y)!} は二項係数である。q = 1 - p とおくと
と書ける。この確率関数は、n 回の試行のうち y 回成功する組合せの数 {}_n C_y と、その特定の組合せが起きる確率 p^y q^{n-y} の積として理解できる。
確率分布のグラフ
二項分布のグラフは、パラメータ n と p によって形が変わる。以下は n = 10、p = 0.3 の場合である。
p = 0.3 のように p < 0.5 の場合は左に偏った形になり、p > 0.5 の場合は右に偏る。p = 0.5 のとき、分布は左右対称になる。
期待値と分散
二項分布の期待値と分散は、ベルヌーイ分布の性質から導ける。Y \sim \text{Bin}(n, p) のとき
と表せる。ここで X_i は i 回目の試行の結果(成功なら1、失敗なら0)であり、各 X_i は独立にベルヌーイ分布 \text{Bin}(1, p) に従う。
期待値
期待値の加法性より
分散
X_1, \ldots, X_n は独立なので、分散も加法性が成り立つ。
二項分布 \text{Bin}(n, p) では
- 期待値:E[Y] = np
- 分散:V[Y] = np(1-p)
- 標準偏差:\sigma = \sqrt{np(1-p)}
確率母関数
確率母関数も同様に、ベルヌーイ分布の性質から導ける。X_1, \ldots, X_n が独立なので
再生性
二項分布には再生性という重要な性質がある。
Y_1 \sim \text{Bin}(n_1, p)、Y_2 \sim \text{Bin}(n_2, p) で、Y_1 と Y_2 が独立ならば
これは確率母関数を用いて証明できる。
これは \text{Bin}(n_1 + n_2, p) の確率母関数に一致する。
再生性の直感的な意味は明快である。成功確率 p の試行を n_1 回行った成功回数と、同じ試行を n_2 回行った成功回数を合計すれば、n_1 + n_2 回の試行における成功回数になる。
計算例
例1:コイン投げ
公平なコインを5回投げるとき、表が出る回数 Y は二項分布 \text{Bin}(5, 0.5) に従う。
期待値と分散を求める。
表がちょうど3回出る確率は
例2:品質検査
ある工場の不良品率は5%である。20個の製品を検査するとき、不良品の個数 Y は \text{Bin}(20, 0.05) に従う。
不良品が1個も含まれない確率は
不良品が1個以上含まれる確率は
練習問題
Y \sim \text{Bin}(10, 0.8) である。
1の目が出る確率は p = \dfrac{1}{6} なので、Y \sim \text{Bin}\left(12, \dfrac{1}{6}\right) である。
再生性より Y_1 + Y_2 \sim \text{Bin}(20, 0.4) である。
まとめ
| 項目 | 内容 |
|---|---|
| 分布名 | 二項分布(binomial distribution) |
| 記法 | \text{Bin}(n, p) |
| 確率関数 | P(Y = y) = {}_n C_y \, p^y (1-p)^{n-y} (y = 0, 1, \ldots, n) |
| 期待値 | E[Y] = np |
| 分散 | V[Y] = np(1-p) |
| 確率母関数 | G(s) = (ps + 1 - p)^n |
| 再生性 | \text{Bin}(n_1, p) + \text{Bin}(n_2, p) = \text{Bin}(n_1 + n_2, p)(独立の場合) |
Pythonで実装する
Pythonを使って二項分布の計算やシミュレーションを行う。
import numpy as np
from scipy import stats
from scipy.special import comb
# パラメータ設定
n, p = 10, 0.3
q = 1 - p
# 期待値と分散(理論値)
E_Y = n * p
V_Y = n * p * q
print(f"=== 二項分布 Bin({n}, {p}) ===")
print(f"期待値(理論値): E[Y] = {E_Y}")
print(f"分散(理論値) : V[Y] = {V_Y}")
print(f"標準偏差 : σ = {np.sqrt(V_Y):.4f}")
# scipy.statsを使用した計算
dist = stats.binom(n, p)
print(f"\nscipy.statsによる確認:")
print(f"期待値: {dist.mean()}")
print(f"分散 : {dist.var()}")
# 確率関数
print(f"\n確率関数 P(Y=y):")
for y in range(n + 1):
prob = dist.pmf(y)
bar = "█" * int(prob * 50)
print(f" P(Y={y:2d}) = {prob:.4f} {bar}")
# 累積分布関数
print(f"\nP(Y ≤ 3) = {dist.cdf(3):.4f}")
print(f"P(Y ≥ 5) = {1 - dist.cdf(4):.4f}")
# シミュレーション
np.random.seed(42)
samples = stats.binom.rvs(n, p, size=10000)
print(f"\nシミュレーション(10000回):")
print(f"標本平均: {np.mean(samples):.4f}")
print(f"標本分散: {np.var(samples, ddof=0):.4f}")
シミュレーション結果が理論値(期待値3.0、分散2.1)に近い値を示している。確率関数のバーチャートからも、y = 3 付近で最大になる様子が確認できる。