超幾何分布は、有限の母集団から非復元抽出(取り出した要素を戻さない抽出)を行うときに現れる離散型確率分布である。
たとえば、52枚のトランプから5枚を引いたときにハートが何枚含まれるか、20人のクラスから5人を選んだときに女子が何人いるか、といった問題が超幾何分布に従う。品質管理における抜き取り検査や、統計学におけるフィッシャーの正確検定でも重要な役割を果たす。
二項分布との違いは復元するかどうかにある。復元抽出なら二項分布、非復元抽出なら超幾何分布となる。母集団が十分大きいとき、両者の差は小さくなり、超幾何分布は二項分布に近似できる。
定義
N 個の要素からなる母集団があり、そのうち M 個が「当たり」、残り N - M 個が「はずれ」であるとする。この母集団から n 個を非復元抽出したとき、当たりの個数 Y が従う分布を超幾何分布(hypergeometric distribution)といい、\text{HG}(N, M, n) と表す。
ただし \max\{0, n-(N-M)\} \le y \le \min\{n, M\}
この確率関数は次のように理解できる。
- 分母 {}_N C_n:N 個から n 個を選ぶ組合せの総数
- 分子 {}_M C_y \times {}_{N-M} C_{n-y}:当たり M 個から y 個、はずれ N-M 個から n-y 個を選ぶ組合せの数
確率分布のグラフ
以下は \text{HG}(20, 8, 5)(20個中8個が当たり、5個引く)の確率関数のグラフである。
期待値と分散
超幾何分布の期待値と分散を導出する。非復元抽出で1つずつ取り出すとき、i 回目に取り出した要素が当たりなら X_i = 1、はずれなら X_i = 0 とする確率変数を定義すると
と表せる。
期待値の導出
まず各 X_i の期待値を求める。i 回目に当たりを引く確率は、順番に関係なく
である。これは「非復元でも、特定の1回に着目すれば当たりを引く確率は一定」という対称性による。したがって
期待値の線形性より
この期待値は復元抽出の場合(二項分布 \text{Bin}\left(n, \dfrac{M}{N}\right))と同じである。
分散の導出
分散の計算では、X_i と X_j(i \neq j)が独立でないことに注意が必要である。
まず各 X_i の分散を求める。X_i^2 = X_i(X_i は0または1)なので
次に共分散を求める。i \neq j のとき、i 回目と j 回目の両方で当たりを引く確率は
したがって共分散は
共分散が負であることは、1つ当たりを引くと残りで当たりを引きにくくなることを反映している。
i < j となる組の数は {}_n C_2 = \dfrac{n(n-1)}{2} なので
これを整理すると
または p = \dfrac{M}{N} とおくと
と書ける。これは二項分布の分散 np(1-p) に有限母集団修正(finite population correction)\dfrac{N-n}{N-1} を掛けた形である。
n \geq 2 のとき \dfrac{N-n}{N-1} < 1 なので、超幾何分布の分散は二項分布の分散より小さい。これは非復元抽出では「すでに引いたもの」の情報があるため、不確実性が減少することを反映している。
超幾何分布 \text{HG}(N, M, n) では
- 期待値:E[Y] = \dfrac{nM}{N}(二項分布と同じ)
- 分散:V[Y] = \dfrac{nM(N-M)(N-n)}{N^2(N-1)}
- 有限母集団修正 \dfrac{N-n}{N-1} により、分散は二項分布より小さくなる
確率母関数
超幾何分布の確率母関数を導出する。定義より
この和はガウスの超幾何関数(Gauss hypergeometric function){}_2F_1 を用いて表すことができる。超幾何関数は次のように定義される。
ここで (a)_k はポッホハマー記号(上昇階乗)と呼ばれ
と定義される((a)_0 = 1)。特に a が負の整数 -n のとき
となり、k > n のとき (-n)_k = 0 となるため、級数は有限項で打ち切られる。
超幾何分布の確率関数を超幾何関数と結びつけるため、二項係数を階乗で書き直す。
ポッホハマー記号を用いると
これらを用いて計算すると、確率母関数は次の形になる。
前の係数 \dfrac{{}_{N-M}C_n}{{}_N C_n} は P(Y=0) に対応する。a = -n、b = -M がともに負の整数なので、級数は y = 0, 1, \ldots, \min(n, M) の有限和となる。
「超幾何分布」という名前は、この確率母関数が超幾何関数で表されることに由来する。
超幾何関数は非常に一般的な特殊関数であり、多くの初等関数や直交多項式を特殊な場合として含む。超幾何分布から期待値や分散を確率母関数の微分で求めることは可能だが、計算が複雑になるため、前節で示した指示変数を用いる方法が実用的である。
二項分布との関係
超幾何分布と二項分布の違いは「復元するかどうか」にある。
| 抽出方法 | 復元抽出 | 非復元抽出 |
|---|---|---|
| 分布 | 二項分布 \text{Bin}\left(n, \dfrac{M}{N}\right) | 超幾何分布 \text{HG}(N, M, n) |
| 期待値 | \dfrac{nM}{N} | \dfrac{nM}{N}(同じ) |
| 分散 | \dfrac{nM(N-M)}{N^2} | 左の値 × \dfrac{N-n}{N-1} |
母集団サイズ N が十分大きいとき(N \to \infty)、有限母集団修正 \dfrac{N-n}{N-1} \to 1 となり、超幾何分布は二項分布に近似できる。実務上は、\dfrac{n}{N} < 0.05(抽出率が5%未満)のとき、二項分布で近似することが多い。
計算例
例1:くじ引き
20本のくじのうち8本が当たりである。5本を一度に引くとき、当たりの本数 Y の期待値と分散を求めよ。
【解答】
Y \sim \text{HG}(20, 8, 5) である。
ちょうど2本当たる確率は
例2:トランプのハート
52枚のトランプから5枚を引くとき、ハートの枚数 Y の期待値を求めよ。また、ハートが1枚もない確率を求めよ。
【解答】
ハートは13枚なので、Y \sim \text{HG}(52, 13, 5) である。
ハートが1枚もない確率は
練習問題
Y \sim \text{HG}(30, 12, 5) である。
Y \sim \text{HG}(100, 10, 5) として、P(Y \geq 1) = 1 - P(Y = 0) を計算する。
よって
Y \sim \text{HG}(10, 5, 5) として計算する。
よって
この計算はフィッシャーの正確検定で使われる。
まとめ
| 項目 | 内容 |
|---|---|
| 分布名 | 超幾何分布(hypergeometric distribution) |
| 記法 | \text{HG}(N, M, n) |
| 設定 | N 個中 M 個が当たり、n 個を非復元抽出 |
| 確率関数 | P(Y=y) = \dfrac{{}_M C_y \cdot {}_{N-M} C_{n-y}}{{}_N C_n} |
| 期待値 | E[Y] = \dfrac{nM}{N} |
| 分散 | V[Y] = \dfrac{nM(N-M)(N-n)}{N^2(N-1)} |
| 確率母関数 | G(s) = \dfrac{{}_{N-M}C_n}{{}_N C_n} \cdot {}_2F_1(-n, -M; N-M-n+1; s) |
| 二項分布との関係 | N \to \infty で \text{Bin}\left(n, \dfrac{M}{N}\right) に近似 |
Pythonで実装する
Pythonを使って超幾何分布の計算やシミュレーションを行う。
import numpy as np
from scipy import stats
# パラメータ設定
N = 20 # 母集団のサイズ
M = 8 # 当たりの数
n = 5 # 抽出する数
# 期待値と分散(理論値)
E_Y = n * M / N
V_binom = n * (M/N) * (1 - M/N) # 二項分布なら
fpc = (N - n) / (N - 1) # 有限母集団修正
V_Y = V_binom * fpc
print(f"=== 超幾何分布 HG({N}, {M}, {n}) ===")
print(f"期待値: E[Y] = nM/N = {n}×{M}/{N} = {E_Y}")
print(f"分散(二項分布なら): {V_binom:.4f}")
print(f"有限母集団修正: (N-n)/(N-1) = {fpc:.4f}")
print(f"分散: V[Y] = {V_Y:.4f}")
# scipy.statsを使用
dist = stats.hypergeom(N, M, n)
print(f"\nscipy.statsによる確認:")
print(f"期待値: {dist.mean()}")
print(f"分散 : {dist.var():.4f}")
# 確率関数
print(f"\n確率関数 P(Y=y):")
y_min = max(0, n - (N - M))
y_max = min(n, M)
for y in range(y_min, y_max + 1):
prob = dist.pmf(y)
bar = "█" * int(prob * 40)
print(f" P(Y={y}) = {prob:.4f} {bar}")
# シミュレーション
np.random.seed(42)
samples = stats.hypergeom.rvs(N, M, n, size=10000)
print(f"\nシミュレーション(10000回):")
print(f"標本平均: {np.mean(samples):.4f}")
print(f"標本分散: {np.var(samples, ddof=0):.4f}")
有限母集団修正により、超幾何分布の分散(0.9474)が二項分布の分散(1.2)より小さくなっていることが確認できる。