跳轉到

2.3 條件機率與乘法法則#

本節目標#

  • 掌握條件機率的定義,理解「縮小樣本空間」的直覺
  • 推導並使用乘法法則,處理多階段的隨機過程
  • 學會判斷資訊如何改變機率——這是 2.4 節貝氏定理的地基
  • 先埋一個伏筆:醫療篩檢的驚人答案,下一節揭曉

問題:知道了一點資訊,機率就變了#

丟一顆公平骰子,「出現 6」的機率是 \(1/6\) 。但如果有人看過結果後告訴你「出現的是偶數」,你對「出現 6」的判斷立刻變成 \(1/3\) ——偶數只有 2、4、6 三種,其中一種是 6。

機率不是世界本身的屬性,而是「你對世界的認識」。資訊一變,機率就變。 這句話是理解條件機率、也是理解下一節貝氏定理的鑰匙。


條件機率:縮小樣本空間#

定義#

已知事件 \(B\) 發生,事件 \(A\) 的條件機率定義為:

$$ P(A \mid B) = \frac{P(A \cap B)}{P(B)}, \qquad P(B) > 0

$$

直覺:樣本空間被砍了一刀#

原本樣本空間是 \(S\) ;得知 \(B\) 發生後,所有不在 \(B\) 裡的樣本點被排除,新的樣本空間就是 \(B\) 本身。在新世界裡要數「 \(A\) 的部分」,就是 \(A \cap B\) ;分母從 \(P(S) = 1\) 換成 \(P(B)\) ,因為新世界被整體重新歸一化為 1。

用 2.1 節的骰子例子走一遍。 \(S\) 是 36 點, \(B = {}\) 「至少一顆為 6」(11 點), \(A = {}\) 「和為 7」(6 點,其中 \((1,6)\) 、 \((6,1)\) 兩點也在 \(B\) 裡):

$$ P(A \mid B) = \frac{P(AB)}{P(B)} = \frac{2/36}{11/36} = \frac{2}{11} \approx 0.1818

$$ 比較無條件的 \(P(A) = 1/6 \approx 0.1667\) :知道「有一顆是 6」之後,和為 7 的機會反而變大了——因為 11 個含 6 的點裡有 2 個湊成 7,比例高於平均。資訊改變了判斷。

條件機率定義反過來寫就是乘法法則:

$$ P(A \cap B) = P(B)\, P(A \mid B) = P(A)\, P(B \mid A)

$$ 「 \(A\) 、 \(B\) 都發生」的機率 = 先 \(B\) 發生,再在 \(B\) 發生的條件下 \(A\) 也發生。多個事件連乘:

$$ P(A_1 \cap A_2 \cap \cdots \cap A_n) = P(A_1)\, P(A_2 \mid A_1) \cdots P(A_n \mid A_1 \cdots A_{n-1})

$$

直覺檢查:不回復抽牌#

袋中 4 張 A 與 48 張其他牌,不回復地抽兩張,兩張都是 A 的機率:

$$ P(\text{兩A}) = P(\text{第一張A}) \times P(\text{第二張A} \mid \text{第一張A}) = \frac{4}{52} \times \frac{3}{51} = \frac{1}{221} \approx 0.00452

$$ 第二個因子不是 \(4/52\) 而是 \(3/51\) ——第一張抽走一張 A 後,世界變了。這正是 2.2 節生日問題中 \(\frac{365}{365} \cdot \frac{364}{365} \cdots\) 的邏輯:乘法法則是多階段隨機過程的通用工具。


動手:模擬驗證乘法法則#

import rstatistics as r

# 乘法法則模擬:不回復抽牌,連抽兩張都是 A
g = r.set_seed(11)
N = 1_000_000
deck = ['A']*4 + ['notA']*48

hits_first = 0
hits_both = 0
for _ in range(N):
    c1, c2 = g.sample_from(deck, size=2, replace=False)
    if c1 == 'A':
        hits_first += 1
        if c2 == 'A':
            hits_both += 1

p_first = hits_first / N
p_both = hits_both / N
p_second_given_first = hits_both / hits_first
print(f"P(第一張A)           模擬 = {p_first:.5f}  理論 = {4/52:.5f}")
print(f"P(兩張都A)           模擬 = {p_both:.5f}  理論 = {4/52 * 3/51:.5f}")
print(f"P(第二張A | 第一張A) 模擬 = {p_second_given_first:.5f}  理論 = {3/51:.5f}")
print(f"乘法法則檢查: {p_first:.5f} x {p_second_given_first:.5f} = {p_first*p_second_given_first:.5f}")

輸出:

P(第一張A)           模擬 = 0.07702  理論 = 0.07692
P(兩張都A)           模擬 = 0.00448  理論 = 0.00452
P(第二張A | 第一張A) 模擬 = 0.05821  理論 = 0.05882

條件機率是用模擬直接算出來的:hits_both / hits_first——在「第一張是 A」的子樣本(約 77,000 次)裡數「第二張也是 A」的比例,這正是「縮小樣本空間」的程式版。末行的乘積還原回 \(P(\text{兩A})\) ,與直接統計吻合(差異在 \(1/\sqrt{N} \approx 0.001\) 量級內)。


全機率法則:把複雜問題拆成互斥的分支#

有時 \(P(A)\) 難算,但「如果知道是哪種情形就好算」。若 \(B_1, B_2, \ldots, B_n\) 互斥且聯集為 \(S\) (一個分割),則

$$ P(A) = \sum_{i=1}^{n} P(B_i)\, P(A \mid B_i)

$$ 這叫全機率法則(law of total probability):把樣本空間按 \(B_i\) 切成互斥的幾塊,各塊內算 \(A\) 的機率再加權。它是乘法法則+加法法則的組合,也是貝氏定理推導的第一步。

例:兩個袋子#

袋一有 3 紅 2 白,袋二有 1 紅 4 白。擲公平銅板決定從哪袋抽一球(正面抽袋一),求抽到紅球:

$$ P(\text{紅}) = \frac{1}{2} \cdot \frac{3}{5} + \frac{1}{2} \cdot \frac{1}{5} = \frac{4}{10} = 0.4

$$

import rstatistics as r

g = r.set_seed(21)
N = 1_000_000
bag1 = ['R']*3 + ['W']*2
bag2 = ['R']*1 + ['W']*4

red = 0
for _ in range(N):
    coin = g.sample_from(['1', '2'], size=1, replace=True)[0]
    bag = bag1 if coin == '1' else bag2
    if g.sample_from(bag, size=1, replace=True)[0] == 'R':
        red += 1
print(f"P(紅) 模擬 = {red/N:.5f}   理論 = 0.40000")

輸出:

P(紅) 模擬 = 0.40049   理論 = 0.40000

伏筆:陽性就一定患病嗎?#

考慮這個場景,下一節我們會全程處理它:

某疾病盛行率為 1/1000(每千人有一人患病)。有一種篩檢:靈敏度 99%(患者 99% 呈陽性)、特異度 99%(健康者只有 1% 誤報陽性)。某人篩檢結果是陽性,他真正患病的機率是多少?

憑直覺,多數人(包括不少醫學生,這是文獻上著名的調查結果)會答「99% 左右」。先用全機率法則算出正確答案的骨架:

  • 患病且陽性: \(0.001 \times 0.99 = 0.00099\)
  • 健康但陽性(假陽性): \(0.999 \times 0.01 = 0.00999\)

陽性總機率 \(= 0.00099 + 0.00999 = 0.01098\) ,其中真正的患者只占

$$ \frac{0.00099}{0.01098} \approx 0.0902 \quad (\approx 9\%)

$$ 約 9%,不是 99%。 為什麼差這麼多?因為健康人數是患者的一千倍,即使假陽性率只有 1%,假陽性的絕對數量仍壓倒真陽性。這個現象叫基率謬誤(base rate fallacy),完整的故事——Bayes 的遺稿、定理的推導、百萬人的模擬驗證——留給 2.4 節。


與 R 對照#

set.seed(11)
N <- 1000000
deck <- c(rep("A", 4), rep("notA", 48))
first <- logical(N); both <- logical(N)
for (i in 1:N) {
  two <- sample(deck, 2)
  first[i] <- two[1] == "A"
  both[i] <- all(two == "A")
}
mean(first)                      # P(第一張A)
mean(both)                       # P(兩張都A)
mean(both) / mean(first)         # P(第二張A | 第一張A)

輸出:

[1] 0.077326
[1] 0.00455
[1] 0.05884179

(R 版每輪重新呼叫 sample(deck, 2),亂數消耗方式與 Python 版不同,數值有小差異,但都貼著理論值 \(4/52\) 、 \(1/221\) 、 \(3/51\) 。)


小結#

  1. 條件機率 \(P(A \mid B) = P(AB)/P(B)\) :得知 \(B\) 後,樣本空間縮成 \(B\) 並重新歸一化;機率是「認識」,資訊改變機率。
  2. 乘法法則 \(P(AB) = P(B)P(A \mid B)\) :多階段過程逐階段相乘,每階段用的都是「當下世界」的條件機率。
  3. 全機率法則:按分割 \(B_i\) 加權求 \(P(A)\) ,是「分而治之」。
  4. 醫療篩檢的答案約 9% 而非 99%——記住這個數字,下一節用貝氏定理與模擬把它徹底講清楚。

練習#

  1. 丟兩顆骰子,已知和為 8,求「至少一顆是 3」的條件機率。(提示:和為 8 有 5 個樣本點。)
  2. 家庭有兩個小孩,已知至少一個是女孩,求兩個都是女孩的機率。(提示:新樣本空間有 3 個等可能點;答案 1/3,不是 1/2。)
  3. 用 sample_from(replace=False) 模擬「不回復抽三張,三張都是 A」:理論值 \(\frac{4}{52} \cdot \frac{3}{51} \cdot \frac{2}{50}\) ,與 100 萬次模擬比對。(提示:注意分母要數「前兩張都是 A」的子樣本。)
  4. 蒙提霍爾問題:三扇門後一扇有車。你選門 1,主持人(知道答案)打開門 3 的一隻羊,問換到門 2 的獲勝機率?(提示:用條件機率寫出 \(P(\text{門2有車} \mid \text{主持人開門3}) = 2/3\) ,或模擬兩種策略各 100 萬次。)
  5. 兩袋問題改成:擲到正面抽袋一的機率是 0.7( biased 銅板)。用全機率法則算 \(P({}\) 紅 \()\) ,再修改模擬驗證。(提示: \(0.7 \cdot 0.6 + 0.3 \cdot 0.2 = 0.48\) 。)