3.4 超幾何分配#
本節目標#
- 理解不放回抽樣與二項(放回抽樣)的本質差異
- 會推導超幾何 pmf,並用在樂透、品管抽檢等場景
- 用程式驗證:母體夠大時,超幾何 → 二項
- 會用
r.dhyper/r.phyper/r.qhyper與g.rhyper對照模擬
問題場景:不放回的世界#
3.1 節的二項分配有一個隱藏前提:每次試驗互相獨立、成功機率不變。這等同於「抽了放回」。但現實中很多抽樣是不放回的:
- 樂透:42 顆球抽 6 顆,抽出第 2 顆時第 1 顆已經不在池子裡
- 品管:從 1000 件產品中抽 20 件檢驗,不良品不會「補回去」再抽
- 生態調查:從湖裡抓了 50 條魚做記號,標記魚的比例會影響下一網的機率
不放回讓機率互相牽動:池子裡壞的抽掉一個,下一抽的壞品機率就下降。這種「有限母體、不放回」的次數分配就是超幾何分配。
名字的由來(17 世紀)#
「超幾何」一詞來自一條古典級數:歐拉時代研究的多項式超幾何級數 \(_2F_1\) 的係數,恰好包含這個分配的組合式,故得此名。它的實際應用遠早於這個名字——惠更斯與雅各布・伯努利在 17 世紀末就計算過「從 30 張牌抽 4 張、求特定花色數」這類問題(《推測術》第 14、15 章)。今日它是無母數檢定(Fisher 精確檢定,第 13 章)與抽樣調查理論的數學基礎。
理論推導#
pmf:兩種組合數相除#
設母體有 \(N\) 個個體,其中 \(K\) 個屬於「目標類」(例如不良品),不放回地抽 \(n\) 個, \(X\) = 抽到的目標類個數。
\(X = k\) 意味著:從 \(K\) 個目標類中抓到 \(k\) 個、從 \(N-K\) 個非目標中抓到 \(n-k\) 個。抽法總數是 \(\binom{N}{n}\) (假設每組合等可能):
$$ P(X = k) = \frac{\dbinom{K}{k} \dbinom{N-K}{n-k}}{\dbinom{N}{n}}, \qquad \max(0,\, n-(N-K)) \le k \le \min(n, K)
$$ 與二項 pmf 對照著看:
| 抽法 | 每次成功機率 | |
|---|---|---|
| 二項 \(\mathrm{Bin}(n, p)\) | \(\binom{n}{k} p^k (1-p)^{n-k}\) | 固定 \(p = K/N\) (放回) |
| 超幾何 \((N, K, n)\) | 兩個組合數相除 | 逐抽改變(不放回) |
期望值與變異數:多了一個「有限母體校正」#
$$ E[X] = n \frac{K}{N}, \qquad \mathrm{Var}(X) = n \frac{K}{N}\left(1-\frac{K}{N}\right) \frac{N-n}{N-1}
$$ 均值與二項一樣( \(np\) , \(p = K/N\) ),但變異數多乘了因子 \(\dfrac{N-n}{N-1}\) :不放回抽樣把母體「抽薄」,反而讓結果更集中。 \(N\) 很大時這個因子趨近 1,變異數也趨近二項——這正是下面要驗證的收斂。
動手做:用 rstatistics 計算與模擬#
例子一:樂透#
42 顆球(20 顆紅、22 顆白)抽 6 顆,問抽到幾顆紅球。機率全表:
import rstatistics as r
for k in range(4):
print(k, round(r.dhyper(k, m=20, n=22, k=6), 6))
print("至少一顆紅:", 1 - r.phyper(0, 20, 22, 6))
print("95% 分位數:", r.qhyper(0.95, 20, 22, 6))
0 0.014223
1 0.100401
2 0.264946
3 0.334669
至少一顆紅: 0.9857765833375586
95% 分位數: 5.0
峰在 \(k=3\) ( \(np = 6 \times 20/42 \approx 2.857\) );「至少一顆紅」機率 98.6%。參數命名提醒:r.dhyper(x, m, n, k) 中 m 是目標類個數 \(K\) 、n 是非目標類個數 \(N-K\) 、k 是抽樣數 \(n\) ——與 R 的 dhyper(x, m, n, k) 完全一致。
例子二:品管抽檢#
生產線 1000 件中混入 40 件不良品( \(p = 4\%\) ),抽 20 件檢驗。若「抽到 2 件以上不良品就退批」,退批機率多少?
import rstatistics as r
N, K, n = 1000, 40, 20
print(1 - r.phyper(1, K, N - K, n)) # 不放回(真實)
print(1 - r.pbinom(1, n, K / N)) # 放回(二項近似)
print(n * K / N * (1 - K / N) * (N - n) / (N - 1)) # 超幾何變異數
print(n * K / N * (1 - K / N)) # 二項變異數
0.1887600592519032
0.1896622045544193
0.7533933933933934
0.768
兩者只差 0.0009——因為 \(N=1000\) 夠大、抽樣比例僅 2%,有限母體校正因子 \((N-n)/(N-1) \approx 0.981\) 幾乎等於 1。
收斂驗證:母體變大,超幾何 → 二項#
固定抽樣比例 \(p = 0.4\) 、抽 \(n = 6\) ,讓母體 \(N\) 變大:
import rstatistics as r
for N in [50, 500, 5000, 50000]:
m = round(N * 0.4)
diffs = [abs(r.dhyper(k, m, N - m, 6) - r.dbinom(k, 6, 0.4)) for k in range(7)]
print(f"N={N:<6} max|dhyper - dbinom| = {max(diffs):.2e}")
N=50 max|dhyper - dbinom| = 1.66e-03
N=500 max|dhyper - dbinom| = 1.63e-04
N=5000 max|dhyper - dbinom| = 1.63e-05
N=50000 max|dhyper - dbinom| = 1.63e-06
\(N\) 每放大 10 倍、誤差縮小 10 倍,收斂速度與 3.2 節二項→卜松完全同型。實務結論:抽樣比例 \(n/N \le 10\%\) 時,用二項近似超幾何,誤差已在小數第 3 位以後。這是抽樣調查課本裡「 \(n/N < 5\%\) 可忽略校正因子」法則的來源。
模擬對照:g.rhyper#
回到 42 顆球的樂透,模擬 100000 次:
g = r.set_seed(42)
xs = g.rhyper(100000, 20, 22, 6)
cnt = {}
for x in xs:
cnt[int(x)] = cnt.get(int(x), 0) + 1
for k in range(4):
print(k, round(r.dhyper(k, 20, 22, 6), 5), round(cnt.get(k, 0) / 100000, 5))
fx = list(map(float, xs))
print(r.mean(fx), r.var(fx))
print(6 * 20 / 42, 6 * (20/42) * (1 - 20/42) * (36/41)) # 理論 E、Var
0 0.01422 0.01429
1 0.1004 0.10109
2 0.26495 0.26211
3 0.33467 0.33493
2.8617300000000014 1.3226646337460428
2.857142857142857 1.3140866102538575
模擬均值 2.8617(理論 2.8571)、變異數 1.3227(理論 1.3141)。 \(n=10^5\) 時每格標準誤約 \(\sqrt{0.33 \times 0.67/10^5} \approx 0.0015\) , \(k=2\) 的偏差 0.0028 約 2 個標準誤,屬正常波動;變異數估計的相對誤差約 \(\sqrt{2/n} \approx 0.0045\) ,偏差 0.0065 亦在此量級。
與 R 對照#
dhyper(0:3, 20, 22, 6)
# [1] 0.01422342 0.10040059 0.26494600 0.33466863
1 - phyper(0, 20, 22, 6) # [1] 0.9857766
qhyper(0.95, 20, 22, 6) # [1] 5
set.seed(42)
xs <- rhyper(100000, 20, 22, 6)
mean(xs); var(xs)
# [1] 2.86173
# [1] 1.322665
(本節 R 輸出以 Rscript 實際執行驗證。)dhyper / phyper / qhyper / rhyper 與參數順序完全照搬 R;模擬結果兩邊一致到小數第 3 位。
小結#
- 超幾何分配描述「不放回抽 \(n\) 個、其中目標類有幾個」,pmf 是兩個組合數相除。
- 均值與二項相同( \(nK/N\) ),變異數多了有限母體校正因子 \((N-n)/(N-1)\) ——不放回反而更集中。
- 母體夠大( \(n/N \le 10\%\) )時超幾何 → 二項,誤差以 \(1/N\) 速度衰減。
- d / p / q 的用途與前面各節完全平行:pmf、累積、分位數。
練習#
- 一副 52 張牌抽 5 張(如同撲克發牌),求恰好 2 張 A 的機率,用
r.dhyper(2, 4, 48, 5)驗證。提示: \(\binom{4}{2}\binom{48}{3} / \binom{52}{5}\) 。 - 承上,至少 1 張 A?比一比
1 - r.phyper(0, 4, 48, 5)與放回版本1 - r.pbinom(0, 5, 4/52)哪個大,並用有限母體校正因子解釋。提示:不放回時「全部不是 A」的機率較小。 - 批次 500 件、不良率 5%(25 件不良品),抽 10 件,全數良品的機率?若不良率升到 10% 呢?提示:
r.dhyper(0, 25, 475, 10)。 - 固定 \(K/N = 0.1\) 、 \(n = 5\) ,掃描 \(N = 20, 100, 1000\) ,計算超幾何變異數與二項變異數的比值,驗證它趨近 1。提示:比值就是 \((N-n)/(N-1)\) 。
- 用
g.rhyper模擬 50000 次第 1 題的發牌,畫 pmf 對照長條圖,並用 \(\sqrt{p(1-p)/n}\) 說明 \(k=2\) 那一格模擬偏差的可接受範圍。提示:沿用 3.1 節barplot+rect疊圖法。