統計應用|單元 3:機率與常見分配——用數字描述不確定性

SuhsiungAI學習教室 授課教師:蘇志雄
適用對象:大學部・統計初學者 實作工具:Python(numpy、scipy.stats、pandas、matplotlib)
預估學習時間:講義閱讀 80 分鐘+實作 80 分鐘
← 上一單元:單元 2:敘述統計——用數字與圖表說清楚資料


本單元學習目標

完成本單元後,你將能夠:

  1. 說明試驗、樣本空間、事件的意義,並區分機率的三種觀點:古典機率、相對次數機率、主觀機率。
  2. 運用加法規則、餘事件、條件機率、乘法規則計算機率,並判斷兩個事件是否獨立。
  3. 用貝氏定理解釋「快篩陽性不一定真的有病」這類反直覺的結果。
  4. 區分離散與連續隨機變數,會寫出機率分配表,並計算期望值、變異數與標準差。
  5. 判斷什麼情境適用二項分配與卜瓦松分配,並計算相關機率。
  6. 理解常態分配的性質與 68–95–99.7 法則,會用 z 分數把任何常態分配轉換成標準常態分配。
  7. 使用 scipy.stats 的 pmf()、cdf()、sf()、ppf() 計算機率與分位數,並用 numpy 的 default_rng() 做隨機模擬來驗證理論。

一、為什麼要學機率?

單元 2 的敘述統計是在描述「已經發生」的資料;但統計更重要的任務,是根據樣本推論母體、對「還沒發生」的事做出合理判斷。而只要談到「推論」,就一定有不確定性——機率就是用來衡量不確定性的語言。

生活中我們每天都在用機率思考:

  • 📰 統一發票:每兩個月對一次獎,一張發票到底「值」多少錢?
  • 🌀 颱風假:颱風警報一發布,大家就開始猜「明天會不會放假?」
  • 🚇 捷運誤點:一個月通勤 20 天,遇到 2 次以上誤點算不算倒楣?
  • ☔ 降雨機率:氣象署說「降雨機率 70%」,要不要帶傘?

💡 重點觀念:機率是「敘述統計」通往「推論統計」的橋樑。後面的抽樣分配、信賴區間、假設檢定,全部都建立在本單元的機率分配之上。


二、機率的基本概念

1. 試驗、樣本空間與事件

名詞 意義 例子:擲一顆骰子
隨機試驗(Random Experiment) 結果無法事先確定、但所有可能結果已知的過程 擲一顆公正骰子
樣本空間(Sample Space, S) 所有可能結果的集合 S = {1, 2, 3, 4, 5, 6}
事件(Event) 樣本空間的子集合 A =「擲出偶數」= {2, 4, 6}
餘事件(Complement, Aᶜ) A 沒有發生 Aᶜ =「擲出奇數」= {1, 3, 5}

2. 機率的三種觀點

觀點 定義 台灣生活例子
古典機率 每個結果出現機會相等時,P(A) = A 包含的結果數 / 全部結果數 統一發票末三碼和六獎號碼相同的機率:1/1,000
相對次數機率 重複試驗很多次,事件發生的長期比例 某捷運路線過去 1,000 個班次中有 50 班誤點 → 誤點機率約 0.05
主觀機率 依個人經驗與資訊判斷的信心程度 「我覺得這個颱風明天放假的機率有八成」

相對次數觀點背後有一個重要定理——大數法則(Law of Large Numbers):試驗次數越多,事件發生的相對次數會越接近真正的機率。擲 10 次骰子可能出現 4 次 6 點,但擲 10 萬次,6 點的比例一定非常接近 1/6。這也是我們可以用電腦模擬來估計機率的理論基礎(儲存格 4 會實際示範)。

3. 機率的基本性質

  • 任何事件的機率介於 0 與 1 之間:0 ≤ P(A) ≤ 1。
  • 樣本空間的機率為 1:P(S) = 1;不可能事件的機率為 0。
  • 餘事件規則:P(Aᶜ) = 1 − P(A)。

💡 「至少一次」的問題,先算「一次都沒有」最快! 例如:P(一個月至少誤點一次) = 1 − P(一次都沒誤點)。


三、機率的運算規則

1. 加法規則(Addition Rule)

  • 一般情況:P(A ∪ B) = P(A) + P(B) − P(A ∩ B)(減掉重複算的交集)
  • 若 A、B 互斥(不可能同時發生,P(A ∩ B) = 0):P(A ∪ B) = P(A) + P(B)

例:一張發票不可能同時中「二獎」和「六獎」(獎項不重複領取),所以「中二獎或六獎」的機率直接相加即可。

2. 條件機率(Conditional Probability)

「在 B 已經發生的條件下,A 發生的機率」:

P(A | B) = P(A ∩ B) / P(B),其中 P(B) > 0

條件機率的關鍵是「分母變了」:不再是全部的人,而是只看 B 這一群。例如:「全班同學搭捷運的機率」和「女生中搭捷運的機率」是不同的問題——儲存格 2 會用 students.csv 實際計算。

3. 乘法規則與獨立性

  • 乘法規則:P(A ∩ B) = P(B) × P(A | B)
  • 獨立(Independent):若 P(A | B) = P(A),也就是「知道 B 發生,對 A 的機率沒有任何影響」,則 A 與 B 獨立,此時 P(A ∩ B) = P(A) × P(B)。
例子 是否獨立? 理由
連續兩期統一發票是否中獎 獨立 每期開獎號碼重新產生,上一期結果不影響下一期
今天下大雨 與 今天捷運誤點 不獨立 下雨時搭乘人數增加、上下車變慢,誤點機率通常變高
颱風強度 與 是否放颱風假 不獨立 地方政府依風雨預測決定,強颱放假機率高很多

⚠️ 互斥 ≠ 獨立! 互斥是「不能同時發生」(P(A ∩ B) = 0);獨立是「互不影響」。兩個機率都大於 0 的互斥事件一定不獨立——因為知道 A 發生,就確定 B 不會發生了。

4. 貝氏定理(Bayes’ Theorem)簡介

貝氏定理讓我們「倒過來」算條件機率:已知 P(B | A),求 P(A | B)。

P(A | B) = P(B | A) × P(A) / P(B)

經典例子:快篩陽性,真的確診了嗎?(以下數字為教學用假設)

  • 某疾病在社區的盛行率 2%:P(患病) = 0.02
  • 快篩的敏感度 90%:P(陽性 | 患病) = 0.90
  • 快篩的特異度 95%:P(陰性 | 沒病) = 0.95,所以 P(陽性 | 沒病) = 0.05

想像社區有 10,000 人:

快篩陽性 快篩陰性 合計
患病 180 20 200
沒病 490 9,310 9,800
合計 670 9,330 10,000

P(患病 | 陽性) = 180 / 670 ≈ 0.269。快篩陽性的人當中,只有約 27% 真的患病!原因是沒病的人太多,5% 的「假陽性」累積起來(490 人)反而比真陽性(180 人)還多。

💡 貝氏思維:新證據(快篩結果)要和原本的機率(盛行率,稱為「事前機率」)一起考慮,得到更新後的「事後機率」。這也是為什麼醫師常會要求「再做一次 PCR 確認」。


四、隨機變數、期望值與變異數

1. 隨機變數(Random Variable)

隨機變數是把試驗結果「對應成數字」的規則,通常用大寫 X 表示。

類型 可能的值 例子
離散隨機變數 可以一個一個數出來(0, 1, 2, …) 一個月捷運誤點次數、一年侵台颱風數、一張發票的獎金
連續隨機變數 某個區間內的任何實數 身高、等公車的時間、颱風的最大風速

2. 機率分配與期望值

離散隨機變數的機率分配列出每個可能值 x 與其機率 P(X = x),所有機率加總必須等於 1。

  • 期望值(Expected Value,長期平均):E(X) = μ = Σ x · P(X = x)
  • 變異數:Var(X) = σ² = Σ (x − μ)² · P(X = x),標準差 σ = √σ²

例:一張統一發票「值」多少錢?依財政部現行獎項(不含雲端發票專屬獎),一期有 1 組特別獎、1 組特獎、3 組頭獎號碼(8 位數),二獎~六獎是和頭獎號碼的末 7~末 3 碼相同:

獎項 中獎條件 獎金(元) 一張發票的中獎機率
特別獎 8 碼與特別獎號碼相同 10,000,000 1/10⁸
特獎 8 碼與特獎號碼相同 2,000,000 1/10⁸
頭獎 8 碼與任一組頭獎號碼相同 200,000 3/10⁸
二獎 末 7 碼相同(但非頭獎) 40,000 27/10⁸
三獎 末 6 碼相同 10,000 270/10⁸
四獎 末 5 碼相同 4,000 2,700/10⁸
五獎 末 4 碼相同 1,000 27,000/10⁸
六獎 末 3 碼相同 200 270,000/10⁸

以六獎為例:末 3 碼和某一組頭獎相同的機率是 1/1,000,但要扣掉「末 4 碼也相同」(那就是五獎以上)的情形,所以是 3 ×(1/10³ − 1/10⁴)= 27/10⁴ = 0.0027。儲存格 3 會算出:一張發票的期望獎金只有大約 1.08 元,而且中任何獎的機率約 0.3%。

⚠️ 期望值不是「一定會得到」的值,而是「長期平均」。沒有人會剛好中 1.08 元;但如果你對了 100 萬張發票,平均每張大約就是這個數字。獎金實際領取時還須扣稅、印花稅;實際獎項規則請以財政部公告為準。


五、二項分配與卜瓦松分配

1. 二項分配(Binomial Distribution)

符合下列四個條件時,「n 次試驗中成功的次數 X」服從二項分配,記作 X ~ B(n, p):

  1. 試驗次數 n 固定;
  2. 每次只有兩種結果:「成功」或「失敗」;
  3. 每次成功的機率 p 都相同;
  4. 每次試驗互相獨立。

機率公式:P(X = k) = C(n, k) · pᵏ · (1 − p)ⁿ⁻ᵏ,k = 0, 1, …, n

期望值與變異數:E(X) = np,Var(X) = np(1 − p)

例:捷運誤點(教學用假設)。小美每天搭捷運上學,假設每天遇到「誤點 5 分鐘以上」的機率 p = 0.05,各天互相獨立。一個月上學 n = 20 天,誤點天數 X ~ B(20, 0.05):

  • P(整個月都沒遇到誤點) = 0.95²⁰ ≈ 0.358
  • 平均每月誤點 E(X) = 20 × 0.05 = 1 天

💡 「成功」只是統計術語,不一定是好事:在這個例子中,「成功」指的是「遇到誤點」。

2. 卜瓦松分配(Poisson Distribution)

計算「一段固定時間(或空間)內,某事件發生的次數」,且事件隨機、獨立地發生、平均發生率固定時,可用卜瓦松分配,記作 X ~ Poisson(λ):

機率公式:P(X = k) = λᵏ e^(−λ) / k!,k = 0, 1, 2, …

E(X) = Var(X) = λ(期望值和變異數相等,是卜瓦松分配的招牌特徵)

情境 λ 的意義
一年侵台颱風個數 平均每年侵台颱風數
某捷運站一小時內的旅客遺失物件數 平均每小時件數
一個路口一個月的交通事故件數 平均每月件數
一頁講義的錯字數 平均每頁錯字數

例:颱風。依中央氣象署長期統計,台灣平均每年約有 3~4 個颱風侵台。本單元以 λ = 3.5 作為教學假設,則 P(一年完全沒有颱風侵台) = e^(−3.5) ≈ 0.030,大約 33 年才遇到一次。

💡 二項 ↔ 卜瓦松:當 n 很大、p 很小(例如 n ≥ 20 且 p ≤ 0.05),B(n, p) 可以用 Poisson(λ = np) 近似。例如收集 200 張發票,中六獎的張數 ≈ Poisson(200 × 0.0027 = 0.54),儲存格 7 會驗證。


六、常態分配、標準常態與 z 分數

1. 連續分配:面積就是機率

連續隨機變數用機率密度函數(PDF)描述,曲線下的面積代表機率,總面積 = 1。因此:

  • P(a ≤ X ≤ b) = 曲線在 a 到 b 之間的面積
  • 連續變數「剛好等於某一個值」的機率是 0,例如 P(身高剛好 = 165.000… 公分) = 0;所以 P(X ≤ b) 和 P(X < b) 相同。

2. 常態分配(Normal Distribution)

常態分配是統計學中最重要的分配,記作 X ~ N(μ, σ²),由平均數 μ 決定中心位置、標準差 σ 決定胖瘦。它的性質:

  • 呈鐘形、左右對稱,平均數 = 中位數 = 眾數;
  • 兩側尾巴無限延伸,但越往外機率越小;
  • 很多自然與社會現象近似常態:身高、測量誤差、大型考試成績……(單元 4 的中央極限定理會解釋為什麼常態分配這麼常見)。

68–95–99.7 法則(經驗法則):

範圍 落在範圍內的機率
μ ± 1σ 約 68%
μ ± 2σ 約 95%
μ ± 3σ 約 99.7%

例:若大一男生身高 ~ N(172, 6²),大約 95% 的人身高落在 172 ± 12,也就是 160~184 公分之間。

3. 標準常態分配與 z 分數

標準常態分配是 μ = 0、σ = 1 的常態分配,記作 Z ~ N(0, 1)。任何常態分配都可以用 z 分數轉換過去:

z = (x − μ) / σ

z 分數就是單元 2 學過的「離平均數幾個標準差」。轉換之後,所有常態分配的問題都變成同一張標準常態表(或一行 scipy.stats.norm.cdf())就能解決。

常用 z 值 左側面積 P(Z ≤ z) 用途
1.282 0.90 前 10% 的門檻
1.645 0.95 前 5% 的門檻;單尾 5%
1.960 0.975 中間 95%(雙尾各 2.5%),單元 5 信賴區間會用到
2.576 0.995 中間 99%

例:期中考成績。某科期中考成績近似 N(62, 10²),你考 78 分:z = (78 − 62) / 10 = 1.6,查表 P(Z ≤ 1.6) ≈ 0.945,代表你大約贏過 94.5% 的同學(PR 約 94)。

4. scipy.stats 常用函數

函數 意義 例子
pmf(k) 離散:P(X = k) stats.binom.pmf(0, 20, 0.05)
pdf(x) 連續:密度曲線的高度(不是機率) stats.norm.pdf(0)
cdf(x) 累積機率 P(X ≤ x) stats.norm.cdf(1.6)
sf(x) 右尾機率 P(X > x) = 1 − cdf(x) stats.binom.sf(1, 20, 0.05) = P(X ≥ 2)
ppf(q) cdf 的反函數:找出左側面積為 q 的切點 stats.norm.ppf(0.975) ≈ 1.96
rvs(size=) 產生隨機樣本 stats.poisson.rvs(3.5, size=10)

⚠️ 離散分配用 sf() 要特別小心「≥」與「>」:binom.sf(1, n, p) 是 P(X > 1),也就是 P(X ≥ 2)。連續分配則沒有這個問題。


七、Python 實作:用 numpy 與 scipy.stats 計算與模擬

範例資料說明

本單元繼續使用單元 1、2 的 students.csv:30 位學生的「虛構」問卷資料(由程式隨機產生,非真實個資,人物與數值皆為虛構)。我們會用 gender(性別)、commute(通勤方式)計算條件機率與二項分配,用 height_cm(身高)檢驗常態模型;其他例子(發票、颱風、捷運誤點)則用理論分配與 numpy 模擬。

📥 下載範例資料:students.csv | 📥 完整程式碼:unit03.py

環境準備

本單元新增 numpy(數值運算與隨機模擬)與 scipy(scipy.stats 提供各種機率分配)。Google Colab 已內建這些套件;若在自己電腦執行,請先安裝:

pip install numpy scipy pandas matplotlib

把 students.csv 和程式放在同一個資料夾(使用 Colab 的同學,請先點左側📁圖示上傳 students.csv)。下面每一個程式區塊可以當成 Notebook 的一個儲存格(cell),請依序執行。

儲存格 1:匯入套件、設定中文字型與亂數產生器

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

# 讓圖表可以顯示繁體中文(依序嘗試 Windows / macOS / Linux 的字型)
plt.rcParams["font.sans-serif"] = [
    "Microsoft JhengHei", "PingFang TC", "Noto Sans CJK TC",
    "Noto Serif CJK TC", "Arial Unicode MS", "DejaVu Sans",
]
plt.rcParams["axes.unicode_minus"] = False  # 讓負號正常顯示

pd.set_option("display.unicode.east_asian_width", True)
pd.set_option("display.width", 160)

# 建立亂數產生器;固定種子(seed)讓每次執行的模擬結果都一樣
rng = np.random.default_rng(2026)
print("numpy 隨機整數示範:", rng.integers(1, 7, size=10))

執行結果:

numpy 隨機整數示範: [6 2 1 4 3 3 1 3 4 3]

說明:

  • from scipy import stats 之後,就能用 stats.binom(二項)、stats.poisson(卜瓦松)、stats.norm(常態)等分配。
  • np.random.default_rng(2026) 建立一個亂數產生器,2026 是種子(seed)。同一個種子會產生同一串「隨機」數字,方便別人重現你的結果。若拿掉種子,每次執行結果都會不同。
  • rng.integers(1, 7, size=10) 模擬擲 10 次骰子:產生 1~6 的整數(不含 7,和 Python 的 range() 一樣是左閉右開)。

儲存格 2:用 students.csv 計算加法規則、條件機率與獨立性

df = pd.read_csv("students.csv", encoding="utf-8-sig")
n = len(df)

# 交叉表:性別 × 通勤方式(加上合計)
print(pd.crosstab(df["gender"], df["commute"], margins=True, margins_name="合計"))

female = df["gender"] == "女"
mrt = df["commute"] == "捷運"

p_f = female.mean()                    # P(女)
p_m = mrt.mean()                       # P(捷運)
p_f_and_m = (female & mrt).mean()      # P(女 ∩ 捷運)
p_f_or_m = (female | mrt).mean()       # P(女 ∪ 捷運),直接數
print(f"\nP(女) = {p_f:.4f},P(捷運) = {p_m:.4f},P(女 ∩ 捷運) = {p_f_and_m:.4f}")
print(f"P(女 ∪ 捷運) 直接數      = {p_f_or_m:.4f}")
print(f"P(女 ∪ 捷運) 用加法規則  = {p_f + p_m - p_f_and_m:.4f}")

# 條件機率:分母只看「女生」或「男生」
p_m_given_f = (female & mrt).sum() / female.sum()
p_m_given_male = (~female & mrt).sum() / (~female).sum()
print(f"\nP(捷運 | 女) = {p_m_given_f:.4f}")
print(f"P(捷運 | 男) = {p_m_given_male:.4f}")
print(f"P(女) × P(捷運) = {p_f * p_m:.4f}  vs.  P(女 ∩ 捷運) = {p_f_and_m:.4f}")

執行結果:

commute  公車  捷運  機車  步行  自行車  合計
gender                                       
女          4     6     4     2       1    17
男          3     2     7     1       0    13
合計        7     8    11     3       1    30

P(女) = 0.5667,P(捷運) = 0.2667,P(女 ∩ 捷運) = 0.2000
P(女 ∪ 捷運) 直接數      = 0.6333
P(女 ∪ 捷運) 用加法規則  = 0.6333

P(捷運 | 女) = 0.3529
P(捷運 | 男) = 0.1538
P(女) × P(捷運) = 0.1511  vs.  P(女 ∩ 捷運) = 0.2000

說明:

  • 布林值(True/False)取 .mean() 就是「True 所占的比例」,也就是相對次數機率。& 是「且」(交集)、| 是「或」(聯集)、~ 是「非」(餘事件)。
  • 直接數出來的 P(女 ∪ 捷運) 和用加法規則算的完全相同(19/30),驗證了「要減掉交集」:6 位搭捷運的女生如果不扣掉,會被算兩次。
  • 在這 30 人中,P(捷運 | 女) ≈ 0.35,明顯高於 P(捷運 | 男) ≈ 0.15,也不等於 P(捷運) ≈ 0.27;P(女) × P(捷運) ≈ 0.151 也不等於 P(女 ∩ 捷運) = 0.2。所以在這份資料中,性別與是否搭捷運不獨立。
  • ⚠️ 不過樣本只有 30 人,這個差異可能只是隨機波動;要推論到全校,需要後面單元的卡方獨立性檢定。

儲存格 3:隨機變數的期望值——一張統一發票值多少錢?

invoice = pd.DataFrame({
    "獎項": ["特別獎", "特獎", "頭獎", "二獎", "三獎", "四獎", "五獎", "六獎"],
    "獎金": [10_000_000, 2_000_000, 200_000, 40_000, 10_000, 4_000, 1_000, 200],
    "機率": np.array([1, 1, 3, 27, 270, 2_700, 27_000, 270_000]) / 1e8,
})
invoice["獎金×機率"] = invoice["獎金"] * invoice["機率"]
print(invoice.to_string(index=False))

p_win = invoice["機率"].sum()
x = np.append(invoice["獎金"].to_numpy(), 0)          # 加上「沒中獎」0 元
p = np.append(invoice["機率"].to_numpy(), 1 - p_win)
ev = (x * p).sum()                                    # E(X) = Σ x·P(x)
sd = np.sqrt(((x - ev) ** 2 * p).sum())               # σ = √Σ(x−μ)²·P(x)
print(f"\n機率總和 = {p.sum():.6f}")
print(f"一張發票中任何獎的機率 = {p_win:.6f}(約每 {1 / p_win:.0f} 張中 1 張)")
print(f"期望值 E(X) = {ev:.4f} 元,標準差 σ = {sd:,.1f} 元")
print(f"期望值中,六獎就貢獻了 {invoice['獎金×機率'].iloc[-1] / ev:.1%}")

執行結果:

  獎項     獎金         機率  獎金×機率
特別獎 10000000 1.000000e-08     0.1000
  特獎  2000000 1.000000e-08     0.0200
  頭獎   200000 3.000000e-08     0.0060
  二獎    40000 2.700000e-07     0.0108
  三獎    10000 2.700000e-06     0.0270
  四獎     4000 2.700000e-05     0.1080
  五獎     1000 2.700000e-04     0.2700
  六獎      200 2.700000e-03     0.5400

機率總和 = 1.000000
一張發票中任何獎的機率 = 0.003000(約每 333 張中 1 張)
期望值 E(X) = 1.0818 元,標準差 σ = 1,021.1 元
期望值中,六獎就貢獻了 49.9%

說明:

  • 機率總和為 1,代表這是一個合法的機率分配。中任何獎的機率約 0.3%,大約每 333 張發票才中 1 張(而且幾乎都是 200 元的六獎)。
  • 期望值約 1.08 元:長期來看,平均一張發票只值 1 元多一點。其中光是六獎(200 元 × 0.0027 = 0.54 元)就貢獻了一半。
  • 標準差高達一千多元,遠大於期望值:因為絕大多數發票是 0 元,極少數是千萬元,分配極度右偏——這和單元 2 的薪資資料一樣,平均數會被極端值拉走。

儲存格 4:大數法則——用 numpy 模擬擲骰子與對發票

# (a) 擲骰子:擲越多次,6 點的比例越接近 1/6 ≈ 0.1667
rolls = rng.integers(1, 7, size=100_000)
for k in [10, 100, 1_000, 10_000, 100_000]:
    first_k = rolls[:k]
    print(f"擲 {k:>7,} 次:6 點比例 = {(first_k == 6).mean():.4f},平均點數 = {first_k.mean():.4f}")
print("理論值:      6 點機率 = 0.1667,期望點數 = 3.5000")

# (b) 模擬對 100 萬張發票
sim = rng.choice(x, size=1_000_000, p=p)
print(f"\n模擬 1,000,000 張發票:中獎比例 = {(sim > 0).mean():.6f},平均每張獎金 = {sim.mean():.4f} 元")
print(pd.Series(sim[sim > 0]).value_counts().sort_index(ascending=False))

執行結果:

擲      10 次:6 點比例 = 0.2000,平均點數 = 4.1000
擲     100 次:6 點比例 = 0.1400,平均點數 = 3.4700
擲   1,000 次:6 點比例 = 0.1680,平均點數 = 3.4630
擲  10,000 次:6 點比例 = 0.1697,平均點數 = 3.5061
擲 100,000 次:6 點比例 = 0.1656,平均點數 = 3.4942
理論值:      6 點機率 = 0.1667,期望點數 = 3.5000

模擬 1,000,000 張發票:中獎比例 = 0.002991,平均每張獎金 = 1.0644 元
40000       2
10000       3
4000       38
1000      266
200      2682
Name: count, dtype: int64

說明:

  • (a) 只擲 10 次時,6 點的比例是 0.20、平均 4.1 點,和理論值有明顯落差;擲到 10 萬次,6 點比例 0.1656、平均 3.49 點,都非常接近理論值——這就是大數法則,也是「相對次數機率」的基礎。注意中間(1,000 → 10,000 次)的數字不一定「每次都更接近」,大數法則說的是長期趨勢。
  • (b) rng.choice(x, size=..., p=p) 依照機率分配 p 從 x 中抽樣,模擬「對 100 萬張發票」。中獎比例 0.002991 和儲存格 3 的理論值 0.0030 非常接近;六獎 2,682 張、五獎 266 張,也接近期望張數 2,700 與 270。
  • 這次模擬的平均獎金 1.06 元看起來很接近理論值 1.08 元,但其實有點「幸運」:100 萬張中特別獎、特獎、頭獎一張都沒抽到(期望張數只有 0.01、0.01、0.03 張),卻抽到 2 張二獎(期望只有 0.27 張),兩者剛好互相抵銷。換一個種子,平均數可能差很多——只要多抽中一張頭獎,平均就會增加 0.2 元。極度右偏的分配,需要非常多次模擬,平均數才會穩定。

儲存格 5:貝氏定理——快篩陽性的真實意義

prev, sens, spec = 0.02, 0.90, 0.95       # 盛行率、敏感度、特異度(教學假設)

# 公式:P(病|陽) = P(陽|病)P(病) / P(陽)
p_pos = sens * prev + (1 - spec) * (1 - prev)  # 全機率:真陽性 + 假陽性
post = sens * prev / p_pos
print(f"P(陽性) = {p_pos:.4f}")
print(f"P(患病 | 陽性) = {post:.4f}")

# 模擬 100,000 人驗證
N = 100_000
sick = rng.random(N) < prev
positive = np.where(sick, rng.random(N) < sens, rng.random(N) < 1 - spec)
print(f"\n模擬:陽性 {positive.sum():,} 人,其中真的患病 {(sick & positive).sum():,} 人")
print(f"模擬的 P(患病 | 陽性) = {(sick & positive).sum() / positive.sum():.4f}")

# 如果連續兩次快篩都陽性(假設兩次結果在給定病況下獨立)
p_pos2 = sens**2 * prev + (1 - spec)**2 * (1 - prev)
print(f"兩次都陽性時 P(患病 | 陽,陽) = {sens**2 * prev / p_pos2:.4f}")

執行結果:

P(陽性) = 0.0670
P(患病 | 陽性) = 0.2687

模擬:陽性 6,736 人,其中真的患病 1,822 人
模擬的 P(患病 | 陽性) = 0.2705
兩次都陽性時 P(患病 | 陽,陽) = 0.8686

說明:

  • 公式算出 P(患病 | 陽性) ≈ 0.2687,和第三節的 10,000 人表格一致;模擬 10 萬人得到 0.2705,也非常接近。
  • rng.random(N) 產生 N 個 0~1 之間的均勻亂數,< prev 就會有約 2% 為 True,這是模擬「機率為 p 的事件」最常用的技巧。np.where(條件, A, B) 則依每個人是否患病,套用不同的陽性機率。
  • 若連續兩次快篩都陽性,患病機率大幅提高到約 0.87:第一次的事後機率,成為第二次的事前機率——這就是貝氏更新。

儲存格 6:二項分配——捷運誤點與「隨機抽同學」

# (a) 捷運誤點:X ~ B(20, 0.05)
n_days, p_late = 20, 0.05
X = stats.binom(n_days, p_late)
k = np.arange(0, 6)
table = pd.DataFrame({"誤點天數 k": k,
                      "P(X = k)": X.pmf(k).round(4),
                      "P(X ≤ k)": X.cdf(k).round(4)})
print(table.to_string(index=False))
print(f"P(X = 0) = {X.pmf(0):.4f},P(X ≥ 2) = P(X > 1) = {X.sf(1):.4f}")
print(f"E(X) = {X.mean():.2f},Var(X) = {X.var():.2f},SD = {X.std():.4f}")

# 用 numpy 模擬 10 萬個月驗證
months = rng.binomial(n_days, p_late, size=100_000)
print(f"模擬 10 萬個月:P(X ≥ 2) ≈ {(months >= 2).mean():.4f},平均 = {months.mean():.4f}")

# (b) students.csv:搭捷運的比例 p,隨機抽 5 位同學(取後放回)
p_mrt = (df["commute"] == "捷運").mean()
Y = stats.binom(5, p_mrt)
print(f"\np(捷運) = {p_mrt:.4f};抽 5 人中搭捷運人數 Y ~ B(5, {p_mrt:.4f})")
print(f"P(Y = 0) = {Y.pmf(0):.4f},P(Y ≥ 3) = {Y.sf(2):.4f},E(Y) = {Y.mean():.4f}")

# 真的從資料中抽樣 20,000 次(每次抽 5 人、取後放回)
draws = rng.choice(df["commute"].to_numpy(), size=(20_000, 5), replace=True)
y_sim = (draws == "捷運").sum(axis=1)
print(f"實際抽樣模擬:P(Y = 0) ≈ {(y_sim == 0).mean():.4f},P(Y ≥ 3) ≈ {(y_sim >= 3).mean():.4f}")

執行結果:

 誤點天數 k  P(X = k)  P(X ≤ k)
          0    0.3585    0.3585
          1    0.3774    0.7358
          2    0.1887    0.9245
          3    0.0596    0.9841
          4    0.0133    0.9974
          5    0.0022    0.9997
P(X = 0) = 0.3585,P(X ≥ 2) = P(X > 1) = 0.2642
E(X) = 1.00,Var(X) = 0.95,SD = 0.9747
模擬 10 萬個月:P(X ≥ 2) ≈ 0.2631,平均 = 0.9963

p(捷運) = 0.2667;抽 5 人中搭捷運人數 Y ~ B(5, 0.2667)
P(Y = 0) = 0.2121,P(Y ≥ 3) = 0.1219,E(Y) = 1.3333
實際抽樣模擬:P(Y = 0) ≈ 0.2081,P(Y ≥ 3) ≈ 0.1175

說明:

  • stats.binom(n, p) 先建立一個分配物件,之後用 .pmf()、.cdf()、.sf()、.mean()、.var() 就不必每次重打參數。
  • 一整個月都沒遇到誤點的機率只有約 36%;遇到 2 天以上的機率約 26%,所以「一個月誤點 2 次」其實沒有想像中倒楣,大約每 4 個月就會發生一次。
  • rng.binomial(n, p, size=...) 直接產生二項分配的亂數,模擬結果和理論值幾乎一樣。
  • (b) 從 students.csv 用 rng.choice(..., replace=True) 每次抽 5 人,正好符合二項分配的條件(取後放回 → 每次 p 相同、互相獨立),模擬結果與 B(5, 8/30) 的理論值吻合。若取後不放回,p 會隨抽取而改變,嚴格來說要用「超幾何分配」;當母體遠大於樣本時,兩者差異很小。

儲存格 7:卜瓦松分配——颱風個數,以及發票的二項 vs. 卜瓦松近似

# (a) 一年侵台颱風數 X ~ Poisson(3.5)(教學假設)
lam = 3.5
T = stats.poisson(lam)
k = np.arange(0, 9)
print(pd.DataFrame({"颱風數 k": k,
                    "P(X = k)": T.pmf(k).round(4),
                    "P(X ≤ k)": T.cdf(k).round(4)}).to_string(index=False))
print(f"P(X = 0) = {T.pmf(0):.4f},P(X ≥ 5) = P(X > 4) = {T.sf(4):.4f}")
print(f"E(X) = {T.mean()},Var(X) = {T.var()}")

years = rng.poisson(lam, size=100_000)
print(f"模擬 10 萬年:平均 = {years.mean():.4f},變異數 = {years.var():.4f}")

# (b) 收集 200 張發票,中六獎的張數:二項 vs. 卜瓦松近似
n_inv, p6 = 200, 0.0027
B = stats.binom(n_inv, p6)
P = stats.poisson(n_inv * p6)
print(f"\n200 張發票中六獎張數(λ = np = {n_inv * p6:.2f})")
for kk in range(4):
    print(f"k = {kk}:二項 {B.pmf(kk):.5f} 卜瓦松 {P.pmf(kk):.5f}")
print(f"至少中一張:二項 {B.sf(0):.5f} 卜瓦松 {P.sf(0):.5f}")

執行結果:

 颱風數 k  P(X = k)  P(X ≤ k)
        0    0.0302    0.0302
        1    0.1057    0.1359
        2    0.1850    0.3208
        3    0.2158    0.5366
        4    0.1888    0.7254
        5    0.1322    0.8576
        6    0.0771    0.9347
        7    0.0385    0.9733
        8    0.0169    0.9901
P(X = 0) = 0.0302,P(X ≥ 5) = P(X > 4) = 0.2746
E(X) = 3.5,Var(X) = 3.5
模擬 10 萬年:平均 = 3.5104,變異數 = 3.5094

200 張發票中六獎張數(λ = np = 0.54)
k = 0:二項 0.58232 卜瓦松 0.58275
k = 1:二項 0.31531 卜瓦松 0.31468
k = 2:二項 0.08494 卜瓦松 0.08496
k = 3:二項 0.01518 卜瓦松 0.01529
至少中一張:二項 0.41768 卜瓦松 0.41725

說明:

  • 一年完全沒有颱風侵台的機率只有約 3%;一年 5 個以上的機率約 27%。注意 T.sf(4) 才是 P(X ≥ 5)。
  • 模擬 10 萬年的平均數與變異數都接近 3.5,呼應卜瓦松分配「期望值 = 變異數 = λ」的特徵。實務上如果資料的變異數遠大於平均數,就代表卜瓦松模型可能不太適合。
  • (b) n = 200 很大、p = 0.0027 很小,二項與卜瓦松的機率幾乎一模一樣(每個 k 的差異都不到 0.001)。收集 200 張發票,至少中一張六獎的機率約 42%。

儲存格 8:常態分配——用常態模型描述同學身高

h = df["height_cm"]
mu, sigma = h.mean(), h.std()
H = stats.norm(mu, sigma)
print(f"身高:平均 = {mu:.2f} 公分,標準差 = {sigma:.2f} 公分")

# 常態模型的預測 vs. 資料中實際的比例
print(f"P(身高 ≥ 175):常態模型 {H.sf(175):.4f},實際資料 {(h >= 175).mean():.4f}")
print(f"P(155 ≤ 身高 ≤ 170):常態模型 {H.cdf(170) - H.cdf(155):.4f},"
      f"實際資料 {h.between(155, 170).mean():.4f}")

# 68–95–99.7 法則:理論 vs. 資料
for m in [1, 2, 3]:
    theory = stats.norm.cdf(m) - stats.norm.cdf(-m)
    actual = ((h - mu).abs() <= m * sigma).mean()
    print(f"μ ± {m}σ = [{mu - m * sigma:6.2f}, {mu + m * sigma:6.2f}]:"
          f"理論 {theory:.4f},實際 {actual:.4f}")

執行結果:

身高:平均 = 164.21 公分,標準差 = 8.99 公分
P(身高 ≥ 175):常態模型 0.1149,實際資料 0.1333
P(155 ≤ 身高 ≤ 170):常態模型 0.5875,實際資料 0.5333
μ ± 1σ = [155.22, 173.20]:理論 0.6827,實際 0.5000
μ ± 2σ = [146.23, 182.18]:理論 0.9545,實際 1.0000
μ ± 3σ = [137.24, 191.17]:理論 0.9973,實際 1.0000

說明:

  • stats.norm(mu, sigma) 的第二個參數是標準差 σ(不是變異數 σ²),這是初學者最常犯的錯誤之一。
  • 常態模型預測身高 175 公分以上約占 11.5%,資料中實際是 4/30 ≈ 13.3%,相當接近。
  • 以 μ ± 1σ、2σ、3σ 檢查:±2σ、±3σ 內的實際比例都是 100%,與 95%、99.7% 相去不遠;但 ±1σ 內只有 50%,明顯少於理論的 68%。原因是班上混合了男女生:女生多半在 150~165 公分、男生多半在 165~180 公分,資料在中間反而較少、兩側「肩膀」較多。
  • 所以常態模型能抓住這份身高資料的大致範圍與尾端,但不夠精細;若分別對男生、女生各配一個常態分配會更貼切。只有 30 人時本來就會有落差,套用常態模型前,一定要先畫直方圖檢查(儲存格 10)。

儲存格 9:標準常態與 z 分數——cdf 與 ppf

# (a) 期中考 ~ N(62, 10²),你考 78 分
exam_mu, exam_sd, score = 62, 10, 78
z = (score - exam_mu) / exam_sd
print(f"z = ({score} − {exam_mu}) / {exam_sd} = {z:.2f}")
print(f"P(Z ≤ {z:.2f}) = {stats.norm.cdf(z):.4f}(用 z 查標準常態)")
print(f"P(X ≤ {score}) = {stats.norm.cdf(score, exam_mu, exam_sd):.4f}(直接用原始分配,結果相同)")

# (b) 反過來:前 10% 要考幾分?→ ppf(cdf 的反函數)
cut = stats.norm.ppf(0.90, exam_mu, exam_sd)
print(f"前 10% 的門檻 = {cut:.2f} 分(z = {stats.norm.ppf(0.90):.4f})")

# (c) 常用的 z 臨界值
for q in [0.90, 0.95, 0.975, 0.995]:
    print(f"P(Z ≤ z) = {q:<5} → z = {stats.norm.ppf(q):.3f}")

# (d) 用 z 分數比較不同單位:S001 的身高與零用錢,哪一項比較「突出」?
s001 = df.loc[df["student_id"] == "S001"].iloc[0]
for col in ["height_cm", "monthly_allowance"]:
    zc = (s001[col] - df[col].mean()) / df[col].std()
    print(f"S001 {col:<18} = {s001[col]:>8},z = {zc:+.2f}")

執行結果:

z = (78 − 62) / 10 = 1.60
P(Z ≤ 1.60) = 0.9452(用 z 查標準常態)
P(X ≤ 78) = 0.9452(直接用原始分配,結果相同)
前 10% 的門檻 = 74.82 分(z = 1.2816)
P(Z ≤ z) = 0.9   → z = 1.282
P(Z ≤ z) = 0.95  → z = 1.645
P(Z ≤ z) = 0.975 → z = 1.960
P(Z ≤ z) = 0.995 → z = 2.576
S001 height_cm          =    164.8,z = +0.07
S001 monthly_allowance  =    13500,z = +0.90

說明:

  • (a) 先算 z 再用 stats.norm.cdf(z),和直接用 stats.norm.cdf(78, 62, 10) 結果完全相同——z 分數轉換只是換了尺度,機率不變。考 78 分約贏過 94.5% 的同學。
  • (b) ppf() 是「給機率、求切點」:前 10% 等於左側面積 0.90,門檻約 74.8 分。
  • (c) 這四個 z 值(1.282、1.645、1.960、2.576)在後面的信賴區間與假設檢定會一直出現,建議記起來。
  • (d) S001 的身高幾乎就是平均(z ≈ 0.07),但零用錢 z ≈ +0.90,在班上相對偏高——z 分數讓「公分」和「元」可以放在同一把尺上比較。

儲存格 10:畫出四種分配

fig, axes = plt.subplots(2, 2, figsize=(11, 8))

# (a) 二項分配 B(20, 0.05):捷運誤點天數
k = np.arange(0, 7)
axes[0, 0].bar(k, stats.binom.pmf(k, 20, 0.05), color="#4C72B0")
axes[0, 0].set_title("二項分配 B(20, 0.05):每月捷運誤點天數")
axes[0, 0].set_xlabel("誤點天數 k")
axes[0, 0].set_ylabel("P(X = k)")

# (b) 卜瓦松分配 Poisson(3.5):一年侵台颱風數,標出 X ≥ 5
k = np.arange(0, 12)
colors = ["#C44E52" if v >= 5 else "#55A868" for v in k]
axes[0, 1].bar(k, stats.poisson.pmf(k, 3.5), color=colors)
axes[0, 1].set_title(f"卜瓦松分配 Poisson(3.5):紅色 P(X ≥ 5) = {stats.poisson.sf(4, 3.5):.3f}")
axes[0, 1].set_xlabel("一年侵台颱風數 k")
axes[0, 1].set_ylabel("P(X = k)")

# (c) 身高直方圖(密度)+常態曲線
h = df["height_cm"]
xs = np.linspace(h.min() - 10, h.max() + 10, 200)
axes[1, 0].hist(h, bins=8, density=True, color="#8DA0CB", edgecolor="white", label="實際資料")
axes[1, 0].plot(xs, stats.norm.pdf(xs, h.mean(), h.std()), color="#C44E52", lw=2,
                label=f"N({h.mean():.1f}, {h.std():.2f}²)")
axes[1, 0].set_title("同學身高 vs. 常態分配")
axes[1, 0].set_xlabel("身高(公分)")
axes[1, 0].set_ylabel("密度")
axes[1, 0].legend()

# (d) 標準常態:中間 95% 與 z = 1.6 左側面積
zs = np.linspace(-4, 4, 400)
axes[1, 1].plot(zs, stats.norm.pdf(zs), color="black")
mid = (zs >= -1.96) & (zs <= 1.96)
axes[1, 1].fill_between(zs[mid], stats.norm.pdf(zs[mid]), color="#FFD966", label="−1.96 ≤ Z ≤ 1.96:95%")
axes[1, 1].axvline(1.6, color="#C44E52", linestyle="--", label=f"z = 1.6,左側面積 {stats.norm.cdf(1.6):.3f}")
axes[1, 1].set_title("標準常態分配 N(0, 1)")
axes[1, 1].set_xlabel("z")
axes[1, 1].set_ylabel("密度")
axes[1, 1].legend(loc="upper left", fontsize=9)

plt.tight_layout()
plt.savefig("unit03_charts.png", dpi=120)
plt.show()

二項分配、卜瓦松分配、同學身高與常態曲線、標準常態分配

說明:

  • 左上二項分配:p 很小,所以分配右偏,最可能的值是 0 或 1 天(兩者機率差不多),2 天以上的長條迅速變矮。
  • 右上卜瓦松分配:λ = 3.5,最可能的颱風數是 3 個;紅色長條(5 個以上)加總約 0.27。卜瓦松分配同樣略微右偏。
  • 左下身高:density=True 讓直方圖的總面積為 1,才能和常態曲線放在同一個尺度比較。長條高低不平,在 152~156 公分與 172~176 公分附近各有一個高峰(大致對應女生與男生),中間反而較低,並不像單一的鐘形——這正是儲存格 8 中 ±1σ 只有 50% 的原因。紅色常態曲線只能描述大致的中心與範圍。
  • 右下標準常態:黃色區域是中間 95%(±1.96),紅色虛線 z = 1.6 左側的面積約 0.945,也就是儲存格 9 期中考 78 分的 PR。

八、本單元重點整理

  • 機率的三種觀點:古典(結果等可能)、相對次數(長期比例,靠大數法則)、主觀(個人信心)。
  • 基本規則:0 ≤ P(A) ≤ 1;P(Aᶜ) = 1 − P(A);「至少一次」先算「一次都沒有」。
  • 加法規則:P(A ∪ B) = P(A) + P(B) − P(A ∩ B);互斥時交集為 0。
  • 條件機率:P(A | B) = P(A ∩ B) / P(B),「分母變成 B 這一群」;獨立代表 P(A | B) = P(A),即 P(A ∩ B) = P(A)P(B)。互斥 ≠ 獨立。
  • 貝氏定理:事前機率很低時,即使檢驗準確,陽性結果的事後機率也可能不高。
  • 期望值 E(X) = Σ x·P(x) 是長期平均;變異數 Var(X) = Σ (x − μ)²·P(x)。一張發票期望值約 1.08 元。
  • 二項分配 B(n, p):n 次獨立試驗的成功次數,E = np、Var = np(1 − p)。
  • 卜瓦松分配 Poisson(λ):固定時間內的事件次數,E = Var = λ;n 大 p 小時可近似二項。
  • 常態分配 N(μ, σ²):對稱鐘形,68–95–99.7 法則;z = (x − μ) / σ 轉成標準常態。
  • scipy.stats:pmf/pdf、cdf(≤)、sf(>,離散要注意 ≥ 的轉換)、ppf(反查切點);numpy 用 default_rng(seed) 的 integers、random、choice、binomial、poisson 做模擬。

九、課後練習

第 1 題|加法規則、條件機率與獨立
某班 40 位同學中,有 25 人訂閱 Netflix、18 人訂閱 Spotify,其中 10 人兩者都有訂閱。隨機選一位同學:
(a) 他至少訂閱其中一種的機率是多少?
(b) 已知他有訂閱 Netflix,他也有訂閱 Spotify 的機率是多少?
(c) 「訂閱 Netflix」與「訂閱 Spotify」是否獨立?請說明理由。

第 2 題|期望值與標準差:夜市射氣球
夜市射氣球一局 100 元,獎品價值的機率分配如下:20% 得到價值 200 元的娃娃、5% 得到價值 500 元的大娃娃,其餘 75% 只有價值 0 元的安慰獎。
(a) 請計算獎品價值的期望值與標準差。
(b) 玩一局的「期望淨收益」(獎品價值 − 100 元)是多少?長期來看對誰有利?

第 3 題|二項分配:選擇題全用猜的
某次小考有 10 題四選一的單選題,小明完全沒準備,每題都用猜的(各題獨立)。令 X 為答對題數。
(a) X 服從什麼分配?期望值與標準差是多少?
(b) 全部答錯的機率是多少?
(c) 答對 6 題以上(及格)的機率是多少?

第 4 題|常態分配與 z 分數
某次全國模擬考數學成績近似常態分配,平均 55 分、標準差 15 分。
(a) 小華考 80 分,他的 z 分數是多少?大約贏過多少比例的考生?
(b) 要進入前 5%,至少要考幾分?
(c) 成績介於 40~70 分的考生大約占多少比例?

第 5 題|numpy 模擬:今年會放颱風假嗎?
假設一年侵台颱風數 X ~ Poisson(3.5),而每個侵台颱風讓你所在縣市放(至少一天)颱風假的機率是 0.4,各颱風互相獨立。請用 np.random.default_rng(3) 模擬 100,000 年,估計:
(a) 一年中「至少放一次颱風假」的機率;
(b) 平均每年放颱風假的「颱風個數」。
(加分題:理論上,放假颱風數服從 Poisson(3.5 × 0.4),請用 scipy.stats 算出 (a) 的理論值並與模擬比較。)


十、練習題參考答案

📝 建議先自己作答,再對照答案喔!

第 1 題
令 N = 訂閱 Netflix,S = 訂閱 Spotify。P(N) = 25/40 = 0.625,P(S) = 18/40 = 0.45,P(N ∩ S) = 10/40 = 0.25。
(a) P(N ∪ S) = 0.625 + 0.45 − 0.25 = 0.825(40 人中有 33 人至少訂閱一種)。
(b) P(S | N) = P(N ∩ S) / P(N) = 0.25 / 0.625 = 0.4(25 位 Netflix 訂戶中有 10 人也訂 Spotify)。
(c) 不獨立:P(S | N) = 0.4 ≠ P(S) = 0.45;或 P(N) × P(S) = 0.28125 ≠ P(N ∩ S) = 0.25。訂閱 Netflix 的人,訂閱 Spotify 的比例反而稍低。(差距不大,若樣本更大,可能接近獨立。)

第 2 題

import numpy as np

value = np.array([200, 500, 0])
prob = np.array([0.20, 0.05, 0.75])
ev = (value * prob).sum()
sd = np.sqrt(((value - ev) ** 2 * prob).sum())
print(f"機率總和 = {prob.sum()}")
print(f"獎品期望值 = {ev:.2f} 元,標準差 = {sd:.2f} 元")
print(f"一局期望淨收益 = {ev - 100:.2f} 元")

執行結果:

機率總和 = 1.0
獎品期望值 = 65.00 元,標準差 = 127.57 元
一局期望淨收益 = -35.00 元

(a) E(X) = 200 × 0.20 + 500 × 0.05 + 0 × 0.75 = 65 元;E(X²) = 200² × 0.2 + 500² × 0.05 = 20,500,Var(X) = 20,500 − 65² = 16,275,σ ≈ 127.57 元。
(b) 期望淨收益 = 65 − 100 = −35 元:平均每玩一局「損失」35 元,長期來看對老闆有利。(當然,玩的樂趣不在期望值裡。)

第 3 題

from scipy import stats

X = stats.binom(10, 0.25)
print(f"E(X) = {X.mean()},SD = {X.std():.4f}")
print(f"P(X = 0)  = {X.pmf(0):.4f}")
print(f"P(X ≥ 6)  = {X.sf(5):.4f}")

執行結果:

E(X) = 2.5,SD = 1.3693
P(X = 0)  = 0.0563
P(X ≥ 6)  = 0.0197

(a) X ~ B(10, 0.25),E(X) = 10 × 0.25 = 2.5 題,SD = √(10 × 0.25 × 0.75) ≈ 1.37 題。
(b) P(X = 0) = 0.75¹⁰ ≈ 0.0563,大約 5.6%。
(c) P(X ≥ 6) = X.sf(5) ≈ 0.0197,不到 2%。用猜的想及格,機會非常渺茫——還是乖乖準備吧!注意要用 sf(5) 而不是 sf(6)。

第 4 題

from scipy import stats

mu, sd = 55, 15
z = (80 - mu) / sd
print(f"(a) z = {z:.4f},P(X ≤ 80) = {stats.norm.cdf(z):.4f}")
print(f"(b) 前 5% 門檻 = {stats.norm.ppf(0.95, mu, sd):.2f} 分")
print(f"(c) P(40 ≤ X ≤ 70) = {stats.norm.cdf(70, mu, sd) - stats.norm.cdf(40, mu, sd):.4f}")

執行結果:

(a) z = 1.6667,P(X ≤ 80) = 0.9522
(b) 前 5% 門檻 = 79.67 分
(c) P(40 ≤ X ≤ 70) = 0.6827

(a) z = (80 − 55) / 15 ≈ 1.67,P(Z ≤ 1.67) ≈ 0.952,大約贏過 95% 的考生(PR 約 95)。
(b) 前 5% 等於左側面積 0.95,z = 1.645,門檻 = 55 + 1.645 × 15 ≈ 79.67 分,也就是至少要考 80 分。
(c) 40 和 70 分別是 μ − 1σ 與 μ + 1σ,依 68–95–99.7 法則約 68%(精確值 0.6827)。

第 5 題

import numpy as np
from scipy import stats

rng5 = np.random.default_rng(3)
n_years = 100_000
typhoons = rng5.poisson(3.5, size=n_years)          # 每年侵台颱風數
holidays = rng5.binomial(typhoons, 0.4)             # 其中放颱風假的颱風數
print(f"(a) 模擬 P(至少放一次颱風假) = {(holidays >= 1).mean():.4f}")
print(f"(b) 模擬 平均每年放假颱風數   = {holidays.mean():.4f}")
print(f"加分:理論值 P(至少一次) = 1 − e^(−1.4) = {stats.poisson.sf(0, 3.5 * 0.4):.4f},"
      f"平均 = {3.5 * 0.4:.1f}")

執行結果:

(a) 模擬 P(至少放一次颱風假) = 0.7537
(b) 模擬 平均每年放假颱風數   = 1.4024
加分:理論值 P(至少一次) = 1 − e^(−1.4) = 0.7534,平均 = 1.4

(a) 模擬結果約 0.75:大約每 4 年中有 3 年會放到颱風假。
(b) 平均每年約 1.4 個颱風讓你放假(= 3.5 × 0.4)。
加分題:理論值 1 − e^(−1.4) ≈ 0.7534,與模擬非常接近。rng5.binomial(typhoons, 0.4) 的 n 可以是一整個陣列——每一年用各自的颱風數當 n,這是 numpy 很方便的「向量化」寫法。

💡 小技巧:遇到公式很難推導的機率問題(例如颱風數和放假機率都隨機),先用模擬算出近似答案,往往是最快、最直覺的方法。這也是現代資料科學中「蒙地卡羅模擬」(Monte Carlo simulation)的精神。


下一單元預告

本單元把常態分配當成描述「單一個體」(例如一位同學的身高)的模型。但如果我們隨機抽 30 位同學、計算「平均身高」,再重複抽很多次,這些「樣本平均數」本身又會形成什麼分配?為什麼就算原始資料像發票獎金那樣極度右偏,樣本平均數的分配還是會越來越像常態?單元 4 將用 numpy 大量模擬,帶你認識抽樣分配與統計學最重要的定理之一——中央極限定理。

← 回到單元 2:敘述統計——用數字與圖表說清楚資料

👉 單元 4:抽樣分配與中央極限定理


© SuhsiungAI學習教室(suhsiung.com)・統計應用課程・授課教師:蘇志雄。本單元範例資料 students.csv 為教學用虛構資料,與任何真實人物無關;統一發票、颱風、捷運誤點、快篩等例子中的數字,除另有說明外,皆為教學用假設或簡化,實際規則與統計請以政府機關公告為準。