3.1 伯努利試驗與二項分配#
本節目標#
- 認識最簡單的隨機實驗:伯努利試驗(只有成功/失敗兩種結果)
- 推導二項分配的 pmf,理解組合數 \(\binom{n}{k}\) 為什麼會出現
- 會用
r.dbinom/r.pbinom/r.qbinom做分配查詢,用g.rbinom做模擬 - 畫「理論 pmf vs 模擬頻率」的長條圖,體會蒙特卡羅誤差的量級
- 學會「至少一個成功」= \(1-(1-p)^n\) 這個實用公式
問題場景:重複丟一枚不公正的銅板#
假設你丟一枚銅板 10 次,出現正面的機率是 \(p=0.5\) 。問「恰好出現 3 次正面」的機率是多少?
這個問題看起來平凡,但它是整個統計推論的細胞:任何「重複 \(n\) 次、每次成功機率相同且互相獨立」的實驗,都可以化約成這個模型。醫學試驗中 100 位病人痊癒的人數、品管中 500 顆晶圓的不良品數、網路封包傳輸的丟失次數——本質上都是同一個問題。
歷史事件(1713):雅各布・伯努利與《推測術》#
瑞士數學家 雅各布・伯努利(Jacob Bernoulli, 1655–1705) 花了二十多年研究「反覆觀察」中的機率法則,他的遺作 《推測術》(Ars Conjectandi) 於 1713 年出版。書中首次系統性地處理了「 \(n\) 次獨立試驗中成功 \(k\) 次」的計算,並提出著名的大數法則雛形:重複試驗越多,成功頻率就越貼近理論機率。這本書把機率從賭桌上的技巧,變成一門可以推論未知的科學。為了紀念他,單次成功/失敗的試驗就叫伯努利試驗。
二項分配的完整公式後來由棣美弗(Abraham de Moivre)等人在 18 世紀補齊,但概念骨架正是《推測術》立下的。
理論推導#
伯努利分配:一次試驗#
設 \(X\) 表示一次試驗的結果(成功記 1、失敗記 0),成功機率 \(p\) :
$$ P(X = 1) = p, \qquad P(X = 0) = 1-p
$$ 它的期望值與變異數是後面章節的基礎:
\(E[X] = p\) , \(\mathrm{Var}(X) = p(1-p)\) (3.5 節會正式推導)。
二項分配: \(n\) 次試驗中成功 \(k\) 次#
設 \(Y\) = \(n\) 次獨立伯努利試驗中成功的次數。以「丟 10 次、恰好 3 次正面」為例,推導三步走:
- 指定哪 3 次成功:例如「第 1、2、3 次成功,其餘失敗」,機率是 \(p^3 (1-p)^7\) 。
- 這樣的序列有幾種? 從 10 個位置中選 3 個放成功,共 \(\binom{10}{3}\) 種。
- 這些序列互斥,把機率相加:
$$ P(Y = 3) = \binom{10}{3} p^3 (1-p)^7
$$ 一般化為二項 pmf:
$$ P(Y = k) = \binom{n}{k} p^k (1-p)^{n-k}, \qquad k = 0, 1, \ldots, n
$$ 其中組合數
\(\binom{n}{k} = \dfrac{n!}{k!\,(n-k)!}\)
因為 \((p + q)^n\) 展開式的係數恰好就是這些組合數( \(q = 1-p\) ),這個分配被稱為二項(binomial)分配。記作 \(Y \sim \mathrm{Bin}(n, p)\) 。
「至少一個成功」: \(1-(1-p)^n\)#
實務上我們常問的不是「恰好 \(k\) 次」,而是「至少發生一次」:疫苗接種 100 人至少一人出現副作用?系統上線 100 天至少當機一天?
直接把 \(P(Y=1) + P(Y=2) + \cdots + P(Y=n)\) 加起來很麻煩,但反面只有一種情況——全部失敗:
$$ P(Y \ge 1) = 1 - P(Y = 0) = 1 - (1-p)^n
$$ 這條公式是許多工程決策的基礎:單一元件故障率 \(p=0.01\) ,就算只有 100 個獨立環節,至少一處出錯的機率已高達約 63%。
動手做:用 rstatistics 計算與模擬#
d / p / q 三兄弟#
和 R 一致,rstatistics 對每個分配提供三個函數:
r.dbinom(k, size, prob):pmf,即 \(P(Y=k)\) (density)r.pbinom(q, size, prob):CDF,即 \(P(Y \le q)\) (probability)r.qbinom(p, size, prob):分位數,給機率 \(p\) 回傳最小的 \(q\) 使 \(P(Y \le q) \ge p\) (quantile)
import rstatistics as r
# 丟 10 次公正銅板,各種正面次數的機率
pmf = [r.dbinom(k, size=10, prob=0.5) for k in range(11)]
print([round(x, 4) for x in pmf])
[0.001, 0.0098, 0.0439, 0.1172, 0.2051, 0.2461, 0.2051, 0.1172, 0.0439, 0.0098, 0.001]
機率山峰在 \(k=5\) 處( \(np = 10 \times 0.5 = 5\) ),左右對稱——因為 \(p=0.5\) 。
# CDF 與分位數
print(r.pbinom(6, size=10, prob=0.5)) # P(Y <= 6)
print(r.qbinom(0.95, size=10, prob=0.5)) # 95% 分位數
0.8281249999999998
8.0
「最多 6 次正面」的機率約 82.8%;要涵蓋 95% 的結果,正面次數最多到 8 次。
組合數可以直接用 r.choose 驗證 pmf 的第一個因子:
print(r.choose(10, 3)) # C(10,3) = 120
print(r.choose(10, 3) * 0.5**10) # 應等於 dbinom(3, 10, 0.5)
120.0
0.11718750000000001
模擬:g.rbinom 與理論對照#
用 g = r.set_seed(42) 取得與 R 位元等價的 RNG,丟出 100000 次「10 連丟」:
import rstatistics as r
g = r.set_seed(42)
n = 100000
xs = g.rbinom(n, size=10, prob=0.5)
cnt = {}
for x in xs:
cnt[int(x)] = cnt.get(int(x), 0) + 1
ks = list(range(11))
theo = [r.dbinom(k, size=10, prob=0.5) for k in ks]
sim = [cnt.get(k, 0) / n for k in ks]
print(f"{'k':>2} {'理論 pmf':>10} {'模擬頻率':>10} {'差':>10}")
for k, t, s in zip(ks, theo, sim):
print(f"{k:>2} {t:>10.4f} {s:>10.4f} {s - t:>10.4f}")
k 理論 pmf 模擬頻率 差
0 0.0010 0.0011 0.0001
1 0.0098 0.0097 -0.0001
2 0.0439 0.0442 0.0003
3 0.1172 0.1190 0.0018
4 0.2051 0.2011 -0.0040
5 0.2461 0.2470 0.0009
6 0.2051 0.2039 -0.0012
7 0.1172 0.1183 0.0011
8 0.0439 0.0447 0.0008
9 0.0098 0.0101 0.0003
10 0.0010 0.0009 -0.0001
蒙特卡羅誤差有多大? 每格的頻率是 \(n=100000\) 次的估計,標準誤約 \(\sqrt{p(1-p)/n}\) 。以 \(p \approx 0.2\) 計算, \(\sqrt{0.2 \times 0.8 / 100000} \approx 0.0013\) ,所以差異在 \(\pm 0.004\) 內都屬正常波動——上表最大的偏差( \(k=4\) 的 \(-0.004\) )剛好接近 3 個標準誤,在 11 格中偶爾出現一格並不意外。規律:模擬次數增加 100 倍,誤差縮小 10 倍。
畫圖:理論 pmf(灰)疊上模擬頻率(描邊)#
g2 = r.Graphics(width=7.0, height=4.5)
g2.barplot(theo, [str(k) for k in ks]) # 理論值長條
for i, t in enumerate(theo):
g2.rect(i + 0.6, 0, 0.8, sim[i]) # 模擬頻率描邊
g2.save("img/binom_pmf_sim.svg")
輸出 img/binom_pmf_sim.svg:灰色實心長條是理論 pmf,每根長條前緣的黑框是 100000 次模擬的頻率。兩者幾乎重疊——這是對大數法則最直接的視覺驗證,也正是伯努利在《推測術》中想證明的定律。
模擬的均值與變異數#
fx = list(map(float, xs))
print(r.mean(fx)) # 理論 np = 5
print(r.var(fx)) # 理論 np(1-p) = 2.5
圖:理論 pmf 與模擬頻率重疊。
5.003500000000006
2.521452964529575
模擬均值 5.0035 對理論 5、模擬變異數 2.521 對理論 2.5,誤差都在 \(1/\sqrt{n}\) 的量級(詳見 3.5 節)。
「至少一個成功」驗證#
# 100 個環節、單一故障率 1%,至少一處故障
print(1 - (1 - 0.01) ** 100) # 公式
print(r.pbinom(0, 100, 0.01, lower_tail=False)) # P(Y > 0),rstatistics 內建
0.6339676587267709
0.6339676587267584
兩者一致(尾端微小差異是浮點運算順序造成的,第 14 位小數才看得到)。
與 R 對照#
rstatistics 的函數名稱與參數設計完全比照 R,以下 R 腳本可逐行對照:
dbinom(0:10, size = 10, prob = 0.5)
# [1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250
# [6] 0.2460937500 0.2050781250 0.1171875000 0.0439453125 0.0097656250
# [11] 0.0009765625
pbinom(6, 10, 0.5) # [1] 0.828125
qbinom(0.95, 10, 0.5) # [1] 8
set.seed(42)
xs <- rbinom(100000, 10, 0.5)
mean(xs); var(xs)
# [1] 5.00357
# [1] 2.521522
1 - pbinom(0, 100, 0.01) # [1] 0.6339677
(本節 R 輸出以 Rscript 實際執行驗證。)R 是向量式的:dbinom(0:10, ...) 一次吃整個向量;Python 版要自己寫 list comprehension。數值上,r.dbinom 的結果與 R 位元級一致。
小結#
- 伯努利試驗(1713,《推測術》)是機率模型的原子:一次試驗、成功機率 \(p\) 。
- \(n\) 次獨立試驗的成功次數 \(Y \sim \mathrm{Bin}(n,p)\) ,pmf \(= \binom{n}{k} p^k (1-p)^{n-k}\) ;組合數 \(\binom{n}{k}\) 來自「哪 \(k\) 次成功」的排列組合。
- d / p / q 三函數分別回答「這一格的機率」「累積到這裡的機率」「涵蓋 95% 的分界」。
- 模擬頻率圍繞理論值波動,標準誤 \(\approx \sqrt{p(1-p)/n}\) ; \(n\) 大 100 倍、誤差小 10 倍。
- 「至少一個成功」用反面思考: \(1-(1-p)^n\) 。
練習#
- 某試管嬰兒技術單次植入成功率 \(p=0.3\) 。植入 5 次,求恰好 2 次成功的機率,並用
r.dbinom(2, 5, 0.3)驗證。提示: \(\binom{5}{2} \times 0.3^2 \times 0.7^3\) ,搭配r.choose(5,2)。 - 承上,至少 2 次成功的機率?用
1 - r.pbinom(1, 5, 0.3)與手算 \(1 - [P(0) + P(1)]\) 對照。提示:pbinom是累積,注意要減到 \(k \le 1\) 。 - 伺服器每日當機機率 \(0.002\) 。一年 365 天中至少當機一天的機率是多少?先猜再算(多數人嚴重低估)。提示: \(1 - 0.998^{365}\) 。
- 用
g.rbinom模擬 10000 次 \(\mathrm{Bin}(20, 0.3)\) ,畫理論 pmf 與模擬頻率的對照長條圖,並估計每格的標準誤。提示:標準誤用 \(\sqrt{\hat{p}(1-\hat{p})/n}\) 。 - 證明:若 \(X \sim \mathrm{Bin}(n-1, p)\) ,則 \(Y = X + 1 \sim \mathrm{Bin}(n, p)\) 的 pmf 滿足遞迴關係 \(\dfrac{P(Y=k+1)}{P(Y=k)} = \dfrac{n-k}{k+1} \cdot \dfrac{p}{1-p}\) ,並用這個關係解釋為什麼 pmf 的峰在 \(\lfloor (n+1)p \rfloor\) 附近。提示:寫下兩個 pmf 相除,多數項會消掉。