多項分布は、3つ以上の結果がありうる試行を繰り返したとき、各結果の出現回数が従う確率分布である。コインの表裏(2通り)ではなく、サイコロの目(6通り)やアンケートの選択肢(複数通り)のような状況をモデル化する。
二項分布が「成功か失敗か」の2択を扱うのに対し、多項分布は K 個の選択肢を扱う。K = 2 のとき、多項分布は二項分布と一致する。つまり多項分布は二項分布の一般化である。
定義
K 個の結果 1, 2, \ldots, K のいずれか1つが起こる試行を考える。結果 j が起こる確率を p_j とする(p_j > 0、p_1 + p_2 + \cdots + p_K = 1)。
この試行を独立に n 回行ったとき、結果 j が起こる回数を Y^{(j)} とする。確率変数のベクトル \mathbf{Y} = (Y^{(1)}, Y^{(2)}, \ldots, Y^{(K)}) が従う分布を多項分布(multinomial distribution)といい、M(n; p_1, \ldots, p_K) と表す。
常に Y^{(1)} + Y^{(2)} + \cdots + Y^{(K)} = n が成り立つことに注意する。
ただし y_j \in \{0, 1, \ldots, n\}、y_1 + \cdots + y_K = n
係数 \dfrac{n!}{y_1! \cdots y_K!} は多項係数と呼ばれ、\binom{n}{y_1, \ldots, y_K} とも書かれる。
確率関数の導出
n 回の試行で各結果が y_1, y_2, \ldots, y_K 回ずつ起こるとする。
- 特定の順序で結果が並ぶ確率:p_1^{y_1} p_2^{y_2} \cdots p_K^{y_K}
- その順序の並べ方の総数:\dfrac{n!}{y_1! y_2! \cdots y_K!}
並べ方の総数は、n 個の場所から結果1が入る y_1 個を選び、残りから結果2が入る y_2 個を選び、と順に選んでいくことで
と求められる。
K = 2 のとき、Y^{(1)} + Y^{(2)} = n より Y^{(2)} = n - Y^{(1)} と決まる。このとき Y^{(1)} \sim \text{Bin}(n, p_1) となり、多項分布は二項分布に帰着する。
確率分布の可視化
多項分布は多次元の分布なので、2次元や3次元でのグラフ化が難しい。ここでは K = 3、n = 10、(p_1, p_2, p_3) = (0.3, 0.5, 0.2) の場合に、Y^{(3)} = n - Y^{(1)} - Y^{(2)} として (Y^{(1)}, Y^{(2)}) の同時確率をヒートマップで表す。
確率が最も高いのは期待値 (E[Y^{(1)}], E[Y^{(2)}]) = (3, 5) 付近であり、そこから離れるほど確率は低くなる。
確率母関数
多項分布の確率母関数は多変数関数となる。
導出
n = 1 の場合、ちょうど1つの Y^{(j)} だけが1で他は0となるので
一般の n の場合、\mathbf{Y} = \mathbf{X}_1 + \cdots + \mathbf{X}_n(各 \mathbf{X}_i \sim M(1; p_1, \ldots, p_K) が独立)と表せるので
期待値・分散・共分散
多項分布の各成分の期待値、分散、および異なる成分間の共分散は次のようになる。
これは各 Y^{(j)} が「結果 j か、それ以外か」という二項分布 \text{Bin}(n, p_j) に従うことから理解できる。
j \neq j' のとき
共分散が常に負であることに注目したい。これは Y^{(1)} + \cdots + Y^{(K)} = n という制約があるため、ある結果の回数が増えれば他の結果の回数は減るという関係を反映している。
共分散の導出
n = 1 のとき、j \neq j' に対して「Y^{(j)} = 1 かつ Y^{(j')} = 1」は起こりえないので
したがって
一般の n の場合は、独立な n 回の試行の和として
多項分布 M(n; p_1, \ldots, p_K) では
- 各成分 Y^{(j)} は周辺分布として \text{Bin}(n, p_j) に従う
- 異なる成分間の共分散は常に負(トレードオフの関係)
- 相関係数は \rho_{jj'} = -\sqrt{\dfrac{p_j p_{j'}}{(1-p_j)(1-p_{j'})}}
計算例
例1:サイコロ
公正なサイコロを6回振ったとき、各目がちょうど1回ずつ出る確率を求めよ。
【解答】
K = 6、n = 6、p_1 = \cdots = p_6 = \dfrac{1}{6}、y_1 = \cdots = y_6 = 1
例2:3色のボール
袋の中に赤30%、青50%、緑20%の割合でボールが大量に入っている。10個を復元抽出するとき、赤3個、青5個、緑2個となる確率を求めよ。
【解答】
M(10; 0.3, 0.5, 0.2) に従う。
練習問題
M(10; 0.25, 0.25, 0.25, 0.25) に従う。
K = 2 のとき y_2 = n - y_1、p_2 = 1 - p_1 より
これは \text{Bin}(n, p_1) の確率関数である。
まとめ
| 項目 | 内容 |
|---|---|
| 分布名 | 多項分布(multinomial distribution) |
| 記法 | M(n; p_1, \ldots, p_K) |
| 確率変数 | K 種類の結果の出現回数 (Y^{(1)}, \ldots, Y^{(K)}) |
| 確率関数 | P(\mathbf{Y} = \mathbf{y}) = \dfrac{n!}{y_1! \cdots y_K!} p_1^{y_1} \cdots p_K^{y_K} |
| 期待値 | E[Y^{(j)}] = np_j |
| 分散 | V[Y^{(j)}] = np_j(1-p_j) |
| 共分散 | \text{Cov}[Y^{(j)}, Y^{(j')}] = -np_j p_{j'} (j \neq j') |
| 確率母関数 | G(s_1, \ldots, s_K) = (p_1 s_1 + \cdots + p_K s_K)^n |
| 二項分布との関係 | K = 2 のとき Y^{(1)} \sim \text{Bin}(n, p_1) |
Pythonで実装する
Pythonを使って多項分布の計算やシミュレーションを行う。
import numpy as np
from scipy.stats import multinomial
import math
# パラメータ設定
n = 10
p = [0.3, 0.5, 0.2] # 赤, 青, 緑
K = len(p)
print(f"=== 多項分布 M({n}; {p}) ===")
# 期待値・分散・共分散
print("\n期待値 E[Y^(j)] = n × p_j:")
for j, pj in enumerate(p):
print(f" E[Y^({j+1})] = {n*pj}")
print("\n分散 V[Y^(j)] = n × p_j × (1-p_j):")
for j, pj in enumerate(p):
print(f" V[Y^({j+1})] = {n*pj*(1-pj):.2f}")
print("\n共分散 Cov[Y^(j), Y^(j')] = -n × p_j × p_j':")
for j in range(K):
for jp in range(j+1, K):
print(f" Cov[Y^({j+1}), Y^({jp+1})] = {-n*p[j]*p[jp]:.2f}")
# 確率計算
y = [3, 5, 2]
dist = multinomial(n, p)
print(f"\nP(Y=(3,5,2)) = {dist.pmf(y):.6f}")
# 多項係数の計算
coef = math.factorial(n) // np.prod([math.factorial(yi) for yi in y])
print(f" 多項係数 = {coef}")
print(f" = {coef} × 0.3^3 × 0.5^5 × 0.2^2")
# シミュレーション
np.random.seed(42)
samples = np.random.multinomial(n, p, size=10000)
print(f"\nシミュレーション(10000回):")
print(f"標本平均: {np.mean(samples, axis=0)}")
print(f"理論値 : {np.array(p) * n}")
共分散が負であること、各成分の標本平均が期待値に近いことが確認できる。