1  Chapter 1: 總論 (general overview)

生物醫學統計的地圖、羅盤與第一個資料故事

1.1 本章學習目標

歡迎來到生物醫學統計學。請先放心,這門課不是要把你變成會在咖啡裡加 p 值的人,而是要讓你能讀懂醫學研究、判斷臨床證據、避免被漂亮圖表迷惑,並在需要時自己做出可靠的分析。

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

  1. 說明生物統計學 (biostatistics) 在臨床醫學與公共衛生中的角色。
  2. 區分母群體 (population)、樣本 (sample)、參數 (parameter) 與統計量 (statistic)。
  3. 辨認常見的資料型態:類別資料 (categorical data)、連續資料 (continuous data)、離散資料 (discrete data) 與時間到事件資料 (time-to-event data)。
  4. 說明描述統計 (descriptive statistics) 與推論統計 (inferential statistics) 的差異。
  5. 使用 Python 建立簡單的醫療資料表、摘要表與視覺化圖形。

1.2 為什麼醫學與公衛需要統計?

臨床現場每天都在面對不確定性:這位病人的胸痛有多可能是急性冠心症?某新藥真的能降低死亡率,還是剛好試驗中的病人比較健康?一個疫苗政策能不能保護整個社區?這些問題都有共同特色:我們無法觀察所有人、所有時間、所有可能情境。因此,我們需要用有限資料做出合理判斷。

生物統計學 (biostatistics) 是統計學應用在生命科學、醫學與公共衛生問題上的學科。它不只是計算公式,而是一套處理資料、誤差與不確定性的語言。若把醫學研究比喻成偵探故事,統計就是那位會提醒大家「這個線索可能只是巧合」的冷靜朋友。

在醫學研究中,統計常協助我們回答下列問題:

  • 疾病發生率是否隨年齡上升?
  • 某治療組的平均血壓下降是否大於安慰劑組?
  • 篩檢工具的敏感度與特異度是否足以用於社區?
  • 暴露於空氣污染與氣喘急診之間是否有關聯?
  • 某癌症病人的存活時間是否受到基因變異影響?

這些問題的答案不應只靠直覺。直覺在臨床很重要,但如果沒有資料與方法支撐,它有時候會像沒有校正過的血壓計:看起來很專業,數字卻可能讓人走錯方向。

1.3 一個統計問題的基本結構

任何生物醫學統計問題,通常可以拆成四個部分:

  1. 研究問題:你真正想知道什麼?
  2. 研究設計:資料如何產生?是臨床試驗、世代研究、病例對照研究,還是橫斷性調查?
  3. 資料與變項:你測量了什麼?血壓、年齡、診斷、死亡、住院天數?
  4. 統計方法與解釋:你如何摘要資料、估計效果、量化不確定性,並回到臨床語境中解釋?

例如,假設我們想知道「高血壓病人接受藥師共同照護後,血壓控制率是否改善?」這不是只丟進軟體按一個神秘按鈕就會有答案。你至少需要界定:

  • 目標族群是哪些病人?
  • 血壓控制如何定義?
  • 介入前後測量間隔多久?
  • 有沒有比較組?
  • 失訪病人如何處理?
  • 改善幅度在臨床上是否有意義?

統計學讓我們把這些問題整理成可檢驗的形式。

1.4 母群體、樣本、參數與統計量

母群體 (population) 是我們真正關心的全部對象。例如「台灣 40 歲以上第二型糖尿病病人」。樣本 (sample) 是我們實際觀察到的一部分對象,例如某醫學中心 2026 年門診追蹤的 800 位第二型糖尿病病人。

參數 (parameter) 是母群體中的真實數值,例如全台糖尿病病人的平均 HbA1c。統計量 (statistic) 則是由樣本計算出來的數值,例如那 800 位病人的平均 HbA1c。

這四個詞很重要,因為醫學研究幾乎永遠是在用樣本統計量推論母群體參數。也就是說,我們拿手上的小拼圖,試著推測整幅圖長什麼樣子。拼圖越完整、抽樣越合理、測量越可靠,推論就越可信。

概念 英文 醫學例子
母群體 population 台灣所有 40 歲以上第二型糖尿病病人
樣本 sample 某醫學中心收案的 800 位第二型糖尿病病人
參數 parameter 全台糖尿病病人的真實平均 HbA1c
統計量 statistic 樣本中 800 位病人的平均 HbA1c

1.5 資料型態:先認識你的資料朋友

在選擇統計方法前,先判斷變項 (variable) 的型態。這一步很像問診:還沒問清楚症狀就開藥,風險很高。

類別資料 (categorical data) 表示分類,例如性別、血型、是否有糖尿病、癌症分期。類別資料又可分成名目資料 (nominal data) 與次序資料 (ordinal data)。名目資料沒有自然順序,例如血型 A、B、AB、O;次序資料有順序,例如疼痛程度輕、中、重。

數值資料 (numerical data) 表示數量。離散資料 (discrete data) 通常是計數,例如急診次數、住院天數、家庭成員人數。連續資料 (continuous data) 則可在某範圍內取許多數值,例如身高、體重、血壓、血清膽固醇。

時間到事件資料 (time-to-event data) 在醫學中特別常見,例如從癌症診斷到復發的時間、從加護病房入住到死亡的時間。這類資料的麻煩處在於追蹤結束時,有些人還沒有發生事件,這稱為設限 (censoring)。設限不是資料壞掉,而是資料在跟你說:「我目前只知道到這裡。」

資料型態 英文 例子 常見摘要
名目資料 nominal data 血型、診斷類別 人數、百分比
次序資料 ordinal data 疼痛程度、癌症分期 中位數、分布百分比
離散資料 discrete data 住院次數、子女數 平均值、變異數、百分位數
連續資料 continuous data 血壓、BMI、LDL-C 平均值、標準差、中位數、四分位距
時間到事件資料 time-to-event data 存活時間、復發時間 存活率、中位存活時間

1.6 範例 1:門診篩檢資料的第一眼

下面是一個假想但貼近臨床的門診篩檢資料。每列代表一位受檢者,每欄是一個變項。我們先建立資料,再看前幾列。

screening = pd.DataFrame(
    {
        "id": range(1, 21),
        "sex": [
            "女", "男", "女", "男", "女",
            "女", "男", "男", "女", "男",
            "女", "女", "男", "女", "男",
            "女", "男", "女", "男", "女",
        ],
        "age": [52, 64, 47, 71, 58, 39, 66, 55, 44, 73, 61, 49, 57, 69, 42, 63, 50, 76, 45, 59],
        "sbp": [128, 151, 116, 166, 137, 112, 149, 134, 121, 172, 145, 119, 132, 158, 123, 141, 130, 176, 118, 139],
        "ldl": [112, 148, 96, 161, 133, 88, 152, 124, 105, 168, 140, 101, 120, 155, 97, 136, 118, 174, 99, 129],
        "diabetes": [
            "否", "是", "否", "是", "否",
            "否", "是", "否", "否", "是",
            "是", "否", "否", "是", "否",
            "是", "否", "是", "否", "否",
        ],
    }
)

screening.head()
id sex age sbp ldl diabetes
0 1 52 128 112
1 2 64 151 148
2 3 47 116 96
3 4 71 166 161
4 5 58 137 133

這份資料中,sexdiabetes 是類別資料,agesbpldl 是數值資料。sbp 是收縮壓,ldl 是低密度脂蛋白膽固醇 (low-density lipoprotein cholesterol, LDL-C)。

我們可以快速產生摘要表:

summary_table = (
    screening[["age", "sbp", "ldl"]]
    .agg(["mean", "median", "std", "min", "max"])
    .round(1)
)

summary_table
age sbp ldl
mean 57.0 138.4 127.8
median 57.5 135.5 126.5
std 10.9 18.9 26.0
min 39.0 112.0 88.0
max 76.0 176.0 174.0

這張表同時給出平均值 (mean)、中位數 (median)、標準差 (standard deviation)、最小值與最大值。初學者常想問:「我到底該看平均值還是中位數?」答案是:先看資料長相。統計沒有通靈,只有檢查。

1.7 描述統計與推論統計

描述統計 (descriptive statistics) 用來整理目前手上的資料,例如平均收縮壓是多少、男女比例如何、LDL-C 分布是否偏高。推論統計 (inferential statistics) 則試著從樣本推論母群體,例如「這個社區的平均收縮壓是否高於全國平均?」或「介入治療是否真的改善血壓,而不是抽樣誤差造成?」

抽樣誤差 (sampling error) 是樣本統計量與母群體參數之間的自然差異。即使研究設計完美,不同樣本仍會得到稍微不同的結果。這不代表研究失敗;這代表資料是活的,不是雕像。

在後續章節,我們會學到信賴區間 (confidence interval) 與假設檢定 (hypothesis testing),用來量化這種不確定性。本章先建立直覺:描述統計回答「我們看到什麼」,推論統計回答「這能代表更大的世界嗎」。

1.8 範例 2:收縮壓分布圖

圖形是統計溝通的重要工具。好的圖能讓人立刻看出分布、離群值與可能的臨床訊號;壞的圖則像把病歷寫成猜謎遊戲。

plt.figure(figsize=(7, 4.5))
sns.histplot(data=screening, x="sbp", bins=8, kde=True, color="#2a9d8f")
plt.axvline(
    screening["sbp"].mean(),
    color="#d62828",
    linestyle="--",
    label=f"平均值 {screening['sbp'].mean():.1f}",
)
plt.xlabel("收縮壓 (mmHg)")
plt.ylabel("人數")
plt.title("門診篩檢個案的收縮壓分布")
plt.legend()
plt.tight_layout()
plt.savefig(FIG_DIR / "ch01_sbp_distribution.png", dpi=300)
plt.show()
Figure 1.1: 門診篩檢個案的收縮壓分布。虛線為樣本平均值。

這張直方圖 (histogram) 顯示收縮壓大約集中在 120 到 160 mmHg,少數個案接近或超過 170 mmHg。直方圖適合呈現連續資料的分布,但分箱數不同,圖形印象也可能改變。因此視覺化很有用,但也需要透明呈現做法。

1.9 關聯不等於因果

醫學研究中最容易讓人滑倒的一句話是:「A 跟 B 有關,所以 A 造成 B。」請小心,這句話穿白袍也一樣危險。

關聯 (association) 表示兩個變項在資料中一起變動。例如年齡較高的人 LDL-C 較高。因果關係 (causation) 則表示改變某因素會導致結果改變。從關聯走到因果,需要研究設計、時間順序、生物合理性、干擾因子 (confounder) 控制等證據。

干擾因子是同時與暴露和結果有關、可能扭曲兩者關係的變項。例如研究咖啡與心肌梗塞,如果吸菸者也更常喝咖啡,而吸菸本身會增加心肌梗塞風險,吸菸就可能是干擾因子。統計方法可以幫忙調整,但不能魔法般拯救糟糕的研究設計。

1.10 範例 3:年齡與 LDL-C 的散布圖

我們用散布圖 (scatter plot) 檢查年齡與 LDL-C 的關係,並用顏色標示是否有糖尿病。

plt.figure(figsize=(7, 4.5))
sns.scatterplot(
    data=screening,
    x="age",
    y="ldl",
    hue="diabetes",
    s=90,
    palette=["#457b9d", "#e76f51"],
)
sns.regplot(
    data=screening,
    x="age",
    y="ldl",
    scatter=False,
    color="#264653",
    line_kws={"linewidth": 2},
)
plt.xlabel("年齡 (歲)")
plt.ylabel("LDL-C (mg/dL)")
plt.title("年齡與 LDL-C 的關係")
plt.tight_layout()
plt.savefig(FIG_DIR / "ch01_age_ldl_scatter.png", dpi=300)
plt.show()
Figure 1.2: 年齡與 LDL-C 的散布圖。點的顏色代表是否有糖尿病。

在這個小資料集中,年齡與 LDL-C 看起來呈現正向關係,也就是年齡越高,LDL-C 越高。不過,請忍住立刻下結論的衝動。樣本只有 20 人,且資料可能受到飲食、用藥、共病、抽樣方式等因素影響。這張圖適合提出問題,不適合單獨宣布真理。

1.11 研究設計的鳥瞰

統計分析的可信度,往往從研究設計就已經決定一大半。常見設計包括:

  • 隨機分派臨床試驗 (randomized clinical trial):研究者將受試者隨機分配到治療組與對照組,是評估治療因果效果的重要設計。
  • 世代研究 (cohort study):依暴露狀態追蹤一群人,觀察未來是否發生疾病或事件。
  • 病例對照研究 (case-control study):從有病與無病的人出發,回頭比較過去暴露。
  • 橫斷性研究 (cross-sectional study):在同一時間點測量暴露與結果,適合估計盛行率。
  • 診斷研究 (diagnostic study):評估檢查工具的敏感度、特異度、陽性預測值與陰性預測值。

不同設計回答不同問題。橫斷性研究很適合問「現在有多少人高血壓」,但通常不適合單獨回答「高鹽飲食是否造成高血壓」。臨床試驗較能支持因果推論,但成本高、倫理限制多,也不一定能代表所有真實世界病人。

1.12 範例 4:高血壓控制率的比較

假設某縣市衛生局想初步了解四間基層診所的高血壓控制率。控制定義為最近一次門診血壓低於 140/90 mmHg。

clinic = pd.DataFrame(
    {
        "clinic": ["A 診所", "B 診所", "C 診所", "D 診所"],
        "n": [120, 95, 150, 80],
        "controlled": [78, 48, 105, 50],
    }
)
clinic["control_rate"] = clinic["controlled"] / clinic["n"]
clinic["percent"] = (clinic["control_rate"] * 100).round(1)

clinic
clinic n controlled control_rate percent
0 A 診所 120 78 0.650000 65.0
1 B 診所 95 48 0.505263 50.5
2 C 診所 150 105 0.700000 70.0
3 D 診所 80 50 0.625000 62.5
plt.figure(figsize=(7, 4.5))
sns.barplot(data=clinic, x="clinic", y="percent", color="#8ab17d")
plt.ylim(0, 100)
plt.xlabel("基層診所")
plt.ylabel("血壓控制率 (%)")
plt.title("四間診所的高血壓控制率")
for index, row in clinic.iterrows():
    plt.text(index, row["percent"] + 2, f"{row['percent']}%", ha="center", va="bottom")
plt.tight_layout()
plt.savefig(FIG_DIR / "ch01_bp_control_rate.png", dpi=300)
plt.show()
Figure 1.3: 四間基層診所的高血壓控制率。

這裡 C 診所控制率最高,B 診所較低。但下一步不應急著貼標籤說哪間「比較好」。也許 C 診所病人較年輕、病程較短、社經條件較佳;也許 B 診所照顧較多腎臟病或中風後病人。公平比較需要更多資料與適當調整。

1.13 常見統計工作流程

在實務上,一個統計分析常依下列流程進行:

  1. 定義研究問題:先問清楚臨床或公衛問題。
  2. 確認資料來源:了解資料如何收集、誰被納入、誰被排除。
  3. 資料清理:處理錯誤值、遺漏值、重複紀錄與單位不一致。
  4. 探索性資料分析:用表格與圖形了解資料分布。
  5. 選擇統計方法:依研究問題、資料型態與設計選擇方法。
  6. 估計與檢定:產生效果量、信賴區間與 p 值。
  7. 臨床解釋:把統計結果翻譯回醫學意義。
  8. 透明報告:說明資料、方法、假設、限制與不確定性。

這個流程的重點是:統計分析不是最後一刻才出現的「論文附錄製造機」。它應該從研究問題形成時就參與。

1.14 統計倫理與可重現性

醫學統計牽涉真實病人與公共資源,因此倫理很重要。常見原則包括:

  • 不任意刪除不喜歡的資料點。
  • 不在看到結果後才改主要研究問題。
  • 不只報告顯著的結果,也要報告不確定與限制。
  • 保護個人資料與隱私。
  • 保存分析程式碼,使研究可重現 (reproducible)。

可重現性不是學術潔癖,而是保護病人與研究者的安全帶。當你的分析可以被自己三個月後重新執行,而且結果一致,你會少掉許多半夜驚醒的時刻。

本書使用 Python 3.14 作為主要工具,並優先使用 pandasseaborn 與相關科學運算套件。每個實作範例會盡量提供完整程式碼,讓你能從資料建立、整理、繪圖到解釋一路走完。

1.15 本章重點整理

  • 生物統計學是醫學與公共衛生處理資料、不確定性與證據判讀的核心工具。
  • 樣本是實際觀察到的資料,母群體是我們想推論的對象。
  • 統計量由樣本計算;參數描述母群體真實狀態。
  • 選擇統計方法前,必須先辨認資料型態與研究設計。
  • 描述統計整理手上的資料;推論統計協助從樣本推論母群體。
  • 關聯不等於因果,研究設計與干擾因子控制非常關鍵。
  • 好的統計分析需要透明、可重現,也需要臨床與公衛脈絡。

1.16 小練習

  1. screening 資料計算糖尿病個案比例。
  2. 依糖尿病狀態分組,計算平均 LDL-C。
  3. sbp 改成兩組:小於 140 mmHg 與大於等於 140 mmHg,計算各組人數。
  4. 想一個可能影響年齡與 LDL-C 關係的干擾因子,並說明理由。

下面提供前三題的參考程式碼。第四題請先自己想,因為統計腦需要一點重訓。

diabetes_percent = (screening["diabetes"].eq("是").mean() * 100).round(1)
ldl_by_diabetes = screening.groupby("diabetes")["ldl"].mean().round(1)
sbp_group_counts = pd.cut(
    screening["sbp"],
    bins=[0, 140, np.inf],
    right=False,
    labels=["<140 mmHg", ">=140 mmHg"],
).value_counts().sort_index()

diabetes_percent, ldl_by_diabetes, sbp_group_counts
(np.float64(40.0),
 diabetes
 否    110.2
 是    154.2
 Name: ldl, dtype: float64,
 sbp
 <140 mmHg     12
 >=140 mmHg     8
 Name: count, dtype: int64)

1.17 Glossary

中文術語 English term 說明
生物統計學 biostatistics 將統計方法應用於生命科學、醫學與公共衛生問題的學科。
母群體 population 研究者真正想推論的全部對象。
樣本 sample 實際被觀察或收集資料的一部分對象。
參數 parameter 描述母群體真實特性的數值。
統計量 statistic 由樣本資料計算出的數值。
變項 variable 研究中被測量或記錄的特徵。
類別資料 categorical data 以分類表示的資料。
名目資料 nominal data 沒有自然順序的類別資料。
次序資料 ordinal data 具有自然順序的類別資料。
數值資料 numerical data 以數量表示的資料。
離散資料 discrete data 通常由計數產生、取有限或可數值的資料。
連續資料 continuous data 可在某範圍內取許多可能數值的資料。
時間到事件資料 time-to-event data 記錄從起始點到特定事件發生時間的資料。
設限 censoring 追蹤期間尚未觀察到事件,但仍保留部分時間資訊的情況。
描述統計 descriptive statistics 摘要與呈現手上資料的方法。
推論統計 inferential statistics 用樣本資料推論母群體特性的統計方法。
抽樣誤差 sampling error 樣本統計量與母群體參數之間因抽樣造成的自然差異。
平均值 mean 數值總和除以觀察數。
中位數 median 將資料排序後位於中間位置的數值。
標準差 standard deviation 描述資料分散程度的常用指標。
低密度脂蛋白膽固醇 low-density lipoprotein cholesterol, LDL-C 常用於心血管風險評估的血脂指標。
直方圖 histogram 用於呈現連續資料分布的圖形。
關聯 association 兩個變項在資料中一起變動的現象。
因果關係 causation 改變某因素會導致結果改變的關係。
干擾因子 confounder 同時與暴露和結果有關、可能扭曲兩者關係的變項。
散布圖 scatter plot 用點呈現兩個數值變項關係的圖形。
隨機分派臨床試驗 randomized clinical trial 以隨機方式分派介入的研究設計。
世代研究 cohort study 依暴露狀態追蹤並觀察結果發生的研究設計。
病例對照研究 case-control study 從疾病狀態出發回溯比較暴露的研究設計。
橫斷性研究 cross-sectional study 在同一時間點測量暴露與結果的研究設計。
診斷研究 diagnostic study 評估診斷或篩檢工具表現的研究。
可重現性 reproducible 其他人或未來的自己能用相同資料與程式得到一致結果。
信賴區間 confidence interval 量化估計值不確定性的區間方法。
假設檢定 hypothesis testing 用樣本資料評估研究假設是否與資料相容的方法。