4  Chapter 4: 離散機率分布 (discrete probability distributions)

會數數的隨機變項:從副作用到急診到院數

4.1 本章學習目標

上一章我們學到機率是描述不確定性的語言。這一章要進一步問:如果隨機結果可以被「數出來」,它會遵守什麼樣的機率規律?例如 10 位病人中有幾位發生副作用、每小時急診來幾位發燒兒童、抽查 10 份病歷會抓到幾份用藥紀錄錯誤。這些問題都牽涉離散機率分布 (discrete probability distribution)。

讀完本章後,你應該能夠:

  1. 說明隨機變項 (random variable)、離散隨機變項 (discrete random variable)、機率質量函數 (probability mass function, PMF) 與累積分布函數 (cumulative distribution function, CDF)。
  2. 判斷二項分布 (binomial distribution) 的適用條件,並計算其平均值與變異數。
  3. 使用卜瓦松分布 (Poisson distribution) 描述單位時間或單位空間內的事件計數。
  4. 使用超幾何分布 (hypergeometric distribution) 描述有限母群體、不放回抽樣的成功次數。
  5. 使用幾何分布 (geometric distribution) 描述第一次成功前需要的試驗次數。
  6. 用 Python 3.14 與 scipy.stats 計算並視覺化離散機率分布。

4.2 從機率到機率分布

隨機變項 (random variable) 是把隨機結果轉成數值的規則。若某藥物可能造成噁心,我們可以定義 \(X\) 為「10 位用藥病人中發生噁心的人數」。\(X\) 可能是 0、1、2,一直到 10。因為 \(X\) 的可能值可以一個一個列出來,所以它是離散隨機變項。

離散機率分布描述每個可能值對應的機率。例如 \(P(X = 2)\) 表示 10 位病人中剛好 2 位發生噁心的機率。所有可能值的機率必須介於 0 與 1 之間,而且總和必須等於 1。這就像醫院排班:每個班別都要有人接,但總人力不能憑空多出來。

機率質量函數 (probability mass function, PMF) 給出離散隨機變項取特定值的機率:

\[ P(X = x) \]

累積分布函數 (cumulative distribution function, CDF) 則給出隨機變項小於或等於某值的機率:

\[ F(x) = P(X \le x) \]

在臨床研究中,PMF 適合問「剛好幾人發生事件」,CDF 適合問「至多幾人發生事件」或「至少幾人發生事件」。

4.3 二項分布:固定人數中的成功次數

二項分布 (binomial distribution) 描述固定次數、每次只有成功或失敗、且每次成功機率相同的情況。若 \(X\) 服從參數為 \(n\)\(p\) 的二項分布,記作:

\[ X \sim \text{Binomial}(n, p) \]

其中 \(n\) 是試驗次數,\(p\) 是每次成功機率。其 PMF 為:

\[ P(X = k) = {n \choose k}p^k(1-p)^{n-k}, \quad k = 0, 1, \ldots, n \]

二項分布的平均值與變異數為:

\[ E(X) = np \]

\[ \operatorname{Var}(X) = np(1-p) \]

這裡的「成功」不一定是好事。在副作用研究中,成功可以代表「發生副作用」。統計的成功有時候很冷酷,像值班電話響起來一樣,不一定令人開心。

4.4 範例 1:10 位病人中有幾位發生副作用?

假設某藥物造成皮疹的機率為 20%。若門診連續追蹤 10 位使用此藥的病人,令 \(X\) 為發生皮疹的人數,則:

\[ X \sim \text{Binomial}(10, 0.20) \]

n_patients = 10
p_rash = 0.20
binom_df = pd.DataFrame({"k": np.arange(0, n_patients + 1)})
binom_df["probability"] = binom.pmf(binom_df["k"], n=n_patients, p=p_rash)
binom_df["cumulative_probability"] = binom.cdf(binom_df["k"], n=n_patients, p=p_rash)

binom_df.round(4)
k probability cumulative_probability
0 0 0.1074 0.1074
1 1 0.2684 0.3758
2 2 0.3020 0.6778
3 3 0.2013 0.8791
4 4 0.0881 0.9672
5 5 0.0264 0.9936
6 6 0.0055 0.9991
7 7 0.0008 0.9999
8 8 0.0001 1.0000
9 9 0.0000 1.0000
10 10 0.0000 1.0000
plt.figure(figsize=(7, 4.5))
sns.barplot(data=binom_df, x="k", y="probability", color="#2a9d8f")
plt.xlabel("10 位病人中發生副作用的人數")
plt.ylabel("機率")
plt.title("二項分布:n = 10, p = 0.20")
plt.tight_layout()
plt.savefig(FIG_DIR / "ch04_binomial_adverse_events.png", dpi=300)
plt.show()
Figure 4.1: 二項分布:10 位病人中發生皮疹的人數,假設每位病人機率為 0.20。

這張圖顯示最可能的結果大約落在 1 到 3 人。平均發生人數為 \(np = 10 \times 0.20 = 2\)。但請注意,平均值是長期平均,不代表每 10 位病人都剛好 2 位發生皮疹。

若想知道「至少 3 位發生皮疹」的機率,可用:

\[ P(X \ge 3) = 1 - P(X \le 2) \]

p_at_least_3 = 1 - binom.cdf(2, n=n_patients, p=p_rash)
p_exactly_2 = binom.pmf(2, n=n_patients, p=p_rash)

pd.DataFrame(
    {
        "問題": ["剛好 2 位發生皮疹", "至少 3 位發生皮疹"],
        "機率": [p_exactly_2, p_at_least_3],
    }
).round(4)
問題 機率
0 剛好 2 位發生皮疹 0.3020
1 至少 3 位發生皮疹 0.3222

4.5 二項分布的適用條件

使用二項分布前,請檢查四個條件:

  1. 試驗次數固定。
  2. 每次試驗只有兩種結果,例如發生或未發生。
  3. 每次成功機率相同。
  4. 各次試驗相互獨立。

醫療資料常常會挑戰這些條件。例如同一病房病人可能接受相似照護流程,副作用並不完全獨立;不同年齡或共病病人的副作用機率也未必相同。模型是地圖,不是地形本身。先問條件合不合理,再讓分布上場。

4.6 卜瓦松分布:單位時間內的事件數

卜瓦松分布 (Poisson distribution) 常用於描述某段時間、某個空間或某個族群中事件發生的次數。例如每小時急診到院人數、每月院內跌倒事件數、每 1000 導管日的感染數。

\(X\) 服從平均事件數為 \(\lambda\) 的卜瓦松分布,記作:

\[ X \sim \text{Poisson}(\lambda) \]

其 PMF 為:

\[ P(X = k) = \frac{e^{-\lambda}\lambda^k}{k!}, \quad k = 0, 1, 2, \ldots \]

卜瓦松分布有一個很有特色的性質:

\[ E(X) = \lambda,\quad \operatorname{Var}(X) = \lambda \]

也就是平均值等於變異數。真實醫療資料若變異數遠大於平均值,稱為過度離散 (overdispersion),可能需要其他模型,例如負二項分布;這部分後面談迴歸時會再遇到。

4.7 範例 2:每小時急診到院人數

假設某兒科急診在夜班時段,平均每小時有 4 位發燒兒童到院。令 \(X\) 為某一小時內到院人數,則:

\[ X \sim \text{Poisson}(4) \]

lambda_ed = 4
poisson_df = pd.DataFrame({"k": np.arange(0, 16)})
poisson_df["probability"] = poisson.pmf(poisson_df["k"], mu=lambda_ed)
poisson_df["cumulative_probability"] = poisson.cdf(poisson_df["k"], mu=lambda_ed)

poisson_df.round(4)
k probability cumulative_probability
0 0 0.0183 0.0183
1 1 0.0733 0.0916
2 2 0.1465 0.2381
3 3 0.1954 0.4335
4 4 0.1954 0.6288
5 5 0.1563 0.7851
6 6 0.1042 0.8893
7 7 0.0595 0.9489
8 8 0.0298 0.9786
9 9 0.0132 0.9919
10 10 0.0053 0.9972
11 11 0.0019 0.9991
12 12 0.0006 0.9997
13 13 0.0002 0.9999
14 14 0.0001 1.0000
15 15 0.0000 1.0000
plt.figure(figsize=(7, 4.5))
sns.barplot(data=poisson_df, x="k", y="probability", color="#8ab17d")
plt.xlabel("每小時急診到院人數")
plt.ylabel("機率")
plt.title("卜瓦松分布:lambda = 4")
plt.tight_layout()
plt.savefig(FIG_DIR / "ch04_poisson_ed_arrivals.png", dpi=300)
plt.show()
Figure 4.2: 卜瓦松分布:平均每小時 4 位發燒兒童到院時,每小時到院人數的機率分布。

如果急診護理長想知道「某小時來 8 位以上發燒兒童」的機率,可以計算:

\[ P(X \ge 8) = 1 - P(X \le 7) \]

p_eight_or_more = 1 - poisson.cdf(7, mu=lambda_ed)
p_zero = poisson.pmf(0, mu=lambda_ed)

pd.DataFrame(
    {
        "問題": ["某小時沒有發燒兒童到院", "某小時 8 位以上發燒兒童到院"],
        "機率": [p_zero, p_eight_or_more],
    }
).round(4)
問題 機率
0 某小時沒有發燒兒童到院 0.0183
1 某小時 8 位以上發燒兒童到院 0.0511

卜瓦松分布常被用於醫療品質監測,但要注意事件率是否穩定。流感季、連假、天氣變化與醫院周邊診所休診,都可能讓到院率改變。統計模型很勤勞,但它不會自動知道今天是除夕夜。

4.8 二項分布與卜瓦松近似

當二項分布的 \(n\) 很大、\(p\) 很小,且 \(np = \lambda\) 適中時,卜瓦松分布可近似二項分布。這在罕見事件研究中很常見,例如某疫苗嚴重不良事件發生率很低,但接種人數很多。

假設嚴重不良事件機率為 0.001,追蹤 2000 位接種者,則 \(np = 2\)。二項分布可用 \(\text{Poisson}(2)\) 近似。

k_values = np.arange(0, 9)
approx_df = pd.DataFrame(
    {
        "k": k_values,
        "二項分布": binom.pmf(k_values, n=2000, p=0.001),
        "卜瓦松近似": poisson.pmf(k_values, mu=2),
    }
)

approx_df.round(5)
k 二項分布 卜瓦松近似
0 0 0.13520 0.13534
1 1 0.27067 0.27067
2 2 0.27081 0.27067
3 3 0.18054 0.18045
4 4 0.09022 0.09022
5 5 0.03605 0.03609
6 6 0.01200 0.01203
7 7 0.00342 0.00344
8 8 0.00085 0.00086

近似不是魔法,是在特定條件下很方便的工具。現代電腦計算力強,多數時候直接使用正確分布即可;但理解近似能幫助你讀懂傳統流行病學與生物統計文獻。

4.9 超幾何分布:不放回抽樣

超幾何分布 (hypergeometric distribution) 用於有限母群體中不放回抽樣的成功次數。例如病歷稽核時,50 份病歷中有 8 份用藥紀錄錯誤,稽核人員抽查 10 份,抽到幾份錯誤?

二項分布假設每次試驗成功機率固定且獨立;但不放回抽樣時,每抽走一份病歷,剩下母群體組成就改變,因此試驗不獨立。這時超幾何分布比較合適。

若母群體大小為 \(N\),其中有 \(K\) 個成功,抽樣數為 \(n\),則抽到 \(k\) 個成功的機率為:

\[ P(X = k) = \frac{{K \choose k}{N-K \choose n-k}}{{N \choose n}} \]

4.10 範例 3:病歷用藥紀錄稽核

population_size = 50
error_records = 8
sample_size = 10

hypergeom_df = pd.DataFrame({"k": np.arange(0, 6)})
hypergeom_df["probability"] = hypergeom.pmf(
    hypergeom_df["k"],
    M=population_size,
    n=error_records,
    N=sample_size,
)
hypergeom_df["cumulative_probability"] = hypergeom.cdf(
    hypergeom_df["k"],
    M=population_size,
    n=error_records,
    N=sample_size,
)

hypergeom_df.round(4)
k probability cumulative_probability
0 0 0.1432 0.1432
1 1 0.3473 0.4905
2 2 0.3217 0.8122
3 3 0.1471 0.9593
4 4 0.0357 0.9950
5 5 0.0046 0.9997
plt.figure(figsize=(7, 4.5))
sns.barplot(data=hypergeom_df, x="k", y="probability", color="#e9c46a")
plt.xlabel("抽到用藥紀錄錯誤的病歷數")
plt.ylabel("機率")
plt.title("超幾何分布:50 份病歷中 8 份有錯,抽查 10 份")
plt.tight_layout()
plt.savefig(FIG_DIR / "ch04_hypergeometric_chart_audit.png", dpi=300)
plt.show()
Figure 4.3: 超幾何分布:50 份病歷中 8 份有用藥紀錄錯誤,抽查 10 份時抽到錯誤病歷數的機率分布。

若想知道「至少抽到 2 份錯誤病歷」的機率:

p_at_least_2_errors = 1 - hypergeom.cdf(
    1,
    M=population_size,
    n=error_records,
    N=sample_size,
)

pd.DataFrame(
    {
        "問題": ["至少抽到 2 份錯誤病歷"],
        "機率": [p_at_least_2_errors],
    }
).round(4)
問題 機率
0 至少抽到 2 份錯誤病歷 0.5095

這類計算可以協助品質管理者設計抽查策略。若抽查太少,可能很難發現問題;若抽查太多,行政負擔又會增加。統計在這裡扮演一種務實的平衡工具。

4.11 幾何分布:等到第一次成功

幾何分布 (geometric distribution) 描述重複獨立試驗中,第一次成功出現在第幾次。若每次成功機率為 \(p\),令 \(X\) 為第一次成功所需試驗次數,則:

\[ P(X = k) = (1-p)^{k-1}p,\quad k = 1, 2, 3, \ldots \]

其平均值為:

\[ E(X) = \frac{1}{p} \]

幾何分布有一個重要特性,稱為無記憶性 (memoryless property):若前面幾次都沒成功,未來等待時間的分布不會因為已經等過而改變。這個概念很有趣,但現實醫療情境中「每次機率都一樣」未必成立,因此仍要小心使用。

4.12 範例 4:第幾位病人首次發現副作用?

假設某罕見但需追蹤的副作用,每位病人發生機率為 12%。門診連續追蹤新使用藥物的病人,令 \(X\) 為第一次觀察到此副作用時的病人序號。

p_event = 0.12
geom_df = pd.DataFrame({"trial": np.arange(1, 16)})
geom_df["probability"] = geom.pmf(geom_df["trial"], p=p_event)
geom_df["cumulative_probability"] = geom.cdf(geom_df["trial"], p=p_event)

geom_df.round(4)
trial probability cumulative_probability
0 1 0.1200 0.1200
1 2 0.1056 0.2256
2 3 0.0929 0.3185
3 4 0.0818 0.4003
4 5 0.0720 0.4723
5 6 0.0633 0.5356
6 7 0.0557 0.5913
7 8 0.0490 0.6404
8 9 0.0432 0.6835
9 10 0.0380 0.7215
10 11 0.0334 0.7549
11 12 0.0294 0.7843
12 13 0.0259 0.8102
13 14 0.0228 0.8330
14 15 0.0200 0.8530
plt.figure(figsize=(7, 4.5))
sns.barplot(data=geom_df, x="trial", y="probability", color="#457b9d")
plt.xlabel("第幾位病人首次發現特定副作用")
plt.ylabel("機率")
plt.title("幾何分布:p = 0.12")
plt.tight_layout()
plt.savefig(FIG_DIR / "ch04_geometric_first_event.png", dpi=300)
plt.show()
Figure 4.4: 幾何分布:每位病人副作用機率為 0.12 時,首次發現副作用出現在第幾位病人的機率分布。

平均等待病人數為 \(1 / 0.12 \approx 8.33\)。但平均不代表第 8 位一定會發生;有時候第 1 位就遇到,有時候等很久都沒有。臨床監測需要耐心,也需要別把運氣誤認成趨勢。

p_within_5 = geom.cdf(5, p=p_event)
p_after_10 = 1 - geom.cdf(10, p=p_event)

pd.DataFrame(
    {
        "問題": ["前 5 位病人內首次發現副作用", "超過 10 位病人才首次發現副作用"],
        "機率": [p_within_5, p_after_10],
    }
).round(4)
問題 機率
0 前 5 位病人內首次發現副作用 0.4723
1 超過 10 位病人才首次發現副作用 0.2785

4.13 如何選擇離散分布?

選擇分布時,先問資料生成機制,而不是先問軟體有哪些按鈕。

研究情境 常見分布 關鍵條件
固定人數中有幾人發生事件 二項分布 固定 \(n\)、二元結果、相同 \(p\)、獨立
單位時間或空間內事件數 卜瓦松分布 事件率穩定、事件可視為獨立
有限母群體不放回抽樣 超幾何分布 母群體大小固定、抽樣不放回
等到第一次事件發生 幾何分布 重複獨立試驗、相同成功機率

如果資料不符合條件,不代表不能分析,而是要選擇更合適的模型或調整研究設計。例如病人群聚在同一醫師或同一病房下,獨立性可能被破壞;若事件率隨時間改變,單一卜瓦松率可能太簡化。

4.14 常見陷阱

  1. 把二項分布用在不固定試驗次數的問題:若觀察時間不同,可能需要事件率或人時概念。
  2. 忽略獨立性:同一家庭、同一病房或同一醫師照護下的病人可能彼此相關。
  3. 把卜瓦松分布套在變異過大的資料上:若變異數遠大於平均值,可能有過度離散。
  4. 忘記不放回抽樣會改變機率:有限母群體抽樣稽核常需超幾何分布。
  5. 只報最可能值,不報尾端機率:臨床風險管理常關心少見但嚴重的尾端事件。

4.15 本章重點整理

  • 離散機率分布描述可數隨機變項的可能值與其機率。
  • PMF 給出 \(P(X = x)\);CDF 給出 \(P(X \le x)\)
  • 二項分布適用於固定試驗次數中的成功次數。
  • 卜瓦松分布適用於單位時間或空間中的事件數。
  • 超幾何分布適用於有限母群體的不放回抽樣。
  • 幾何分布適用於第一次成功所需的試驗次數。
  • 分布選擇應根據資料生成機制,而不是只根據資料長得像什麼。

4.16 小練習

  1. 某藥物副作用機率為 0.15,20 位病人中剛好 4 位發生副作用的機率是多少?
  2. 同一情境下,至少 5 位發生副作用的機率是多少?
  3. 某加護病房平均每天有 2.5 次呼吸器警報,某天超過 5 次的機率是多少?
  4. 80 份病歷中 12 份有缺漏,抽查 15 份,至少抽到 3 份缺漏的機率是多少?
  5. 若每位病人特定副作用機率為 0.08,首次發現副作用出現在第 10 位以前的機率是多少?
practice_exact_4 = binom.pmf(4, n=20, p=0.15)
practice_at_least_5 = 1 - binom.cdf(4, n=20, p=0.15)
practice_alarm_gt_5 = 1 - poisson.cdf(5, mu=2.5)
practice_missing_at_least_3 = 1 - hypergeom.cdf(2, M=80, n=12, N=15)
practice_first_by_10 = geom.cdf(10, p=0.08)

pd.DataFrame(
    {
        "問題": [
            "20 位中剛好 4 位副作用",
            "20 位中至少 5 位副作用",
            "每天呼吸器警報超過 5 次",
            "抽查 15 份至少 3 份缺漏",
            "第 10 位以前首次發現副作用",
        ],
        "機率": [
            practice_exact_4,
            practice_at_least_5,
            practice_alarm_gt_5,
            practice_missing_at_least_3,
            practice_first_by_10,
        ],
    }
).round(4)
問題 機率
0 20 位中剛好 4 位副作用 0.1821
1 20 位中至少 5 位副作用 0.1702
2 每天呼吸器警報超過 5 次 0.0420
3 抽查 15 份至少 3 份缺漏 0.3983
4 第 10 位以前首次發現副作用 0.5656

4.17 Glossary

中文術語 English term 說明
離散機率分布 discrete probability distribution 描述離散隨機變項各可能值與其機率的分布。
隨機變項 random variable 將隨機結果轉換為數值的規則。
離散隨機變項 discrete random variable 可能值可數或可列舉的隨機變項。
機率質量函數 probability mass function, PMF 給出離散隨機變項取特定值機率的函數。
累積分布函數 cumulative distribution function, CDF 給出隨機變項小於或等於某值機率的函數。
二項分布 binomial distribution 描述固定次數獨立二元試驗中成功次數的分布。
試驗次數 number of trials 二項或相關分布中重複試驗的固定次數。
成功機率 success probability 每次試驗中成功事件發生的機率。
期望值 expected value 隨機變項的長期平均值。
變異數 variance 隨機變項分散程度的量化指標。
卜瓦松分布 Poisson distribution 描述固定時間或空間內事件計數的分布。
事件率 event rate 單位時間、空間或人時中事件發生的平均頻率。
過度離散 overdispersion 計數資料變異數大於模型預期變異數的現象。
卜瓦松近似 Poisson approximation 在大樣本、小機率條件下用卜瓦松分布近似二項分布。
超幾何分布 hypergeometric distribution 描述有限母群體中不放回抽樣成功次數的分布。
不放回抽樣 sampling without replacement 抽出的個體不再放回母群體的抽樣方式。
幾何分布 geometric distribution 描述第一次成功所需試驗次數的分布。
無記憶性 memoryless property 已等待時間不改變未來等待分布的性質。
尾端機率 tail probability 分布極端區域事件發生的機率。