跳轉到

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、累積、分位數。

練習#

  1. 一副 52 張牌抽 5 張(如同撲克發牌),求恰好 2 張 A 的機率,用 r.dhyper(2, 4, 48, 5) 驗證。提示: \(\binom{4}{2}\binom{48}{3} / \binom{52}{5}\) 。
  2. 承上,至少 1 張 A?比一比 1 - r.phyper(0, 4, 48, 5) 與放回版本 1 - r.pbinom(0, 5, 4/52) 哪個大,並用有限母體校正因子解釋。提示:不放回時「全部不是 A」的機率較小。
  3. 批次 500 件、不良率 5%(25 件不良品),抽 10 件,全數良品的機率?若不良率升到 10% 呢?提示:r.dhyper(0, 25, 475, 10)。
  4. 固定 \(K/N = 0.1\) 、 \(n = 5\) ,掃描 \(N = 20, 100, 1000\) ,計算超幾何變異數與二項變異數的比值,驗證它趨近 1。提示:比值就是 \((N-n)/(N-1)\) 。
  5. 用 g.rhyper 模擬 50000 次第 1 題的發牌,畫 pmf 對照長條圖,並用 \(\sqrt{p(1-p)/n}\) 說明 \(k=2\) 那一格模擬偏差的可接受範圍。提示:沿用 3.1 節 barplot + rect 疊圖法。