跳到主要內容

DS 104 · 模組 2

從樣本到判斷:關聯、不確定性與限制

把 Module 1 的探索能力延伸到樣本代表性、關聯與因果的界線、不確定性的直覺,以及「有證據」與「值得行動」之間的差距。

開始第一節
已完成 0 / 5
同步我的進度加入梯次後,進度可跨裝置保存,講師也能看到

資訊

加入後,你已完成的模組編號會連同「學員代碼」傳送給講師,講師可以看到你的進度。請使用講師提供的代碼,不要輸入姓名、公司機密或其他個資。進度資料與該梯次的其他資料一起保存。

學習目標

  • 定義目標母體,判斷樣本代表了誰、漏掉了誰
  • 解讀關聯但不越界到因果,辨識可能混淆變數
  • 以直覺理解區間估計;區分抽樣不確定性與資料品質問題
  • 區分「有證據存在差異」與「差異大小/實務重要性」
  • 交付包含發現、不確定性、替代解釋與後續問題的探索報告

Population、Sample 與 Bias

35 分鐘

Population、Sample 與 Sampling Bias

學習目標:定義目標母體,判斷樣本代表了誰、漏掉了誰。

你手上這份調查資料收集自願意填答的受訪者,主管希望把結論推論到「全校所有學生」。在推論之前,第一個必須回答的問題是:這份樣本實際上代表了誰?漏掉了誰?如果目標母體(全校學生)和實際取得樣本的人有系統性的差異,結論就無法直接套用到目標母體上。

Population(目標母體)

  • 你真正想了解、想推論結論的整體對象
  • 例如:全校所有在學學生
  • 通常無法對每一個人都收集資料

Sample(樣本)

  • 實際收集到資料的那一部分人
  • 本資料集中,一列 observation_id 代表一筆樣本觀測
  • 樣本是否能代表母體,取決於是誰、如何被納入樣本
檢查樣本的分層組成是否均衡
sample_share = df["sampling_stratum"].value_counts(normalize=True).round(3)
print(sample_share)

completion_by_stratum = df.groupby("sampling_stratum")["response_complete"].mean().round(3)
print(completion_by_stratum)
# 樣本占比與目標母體已知比例差很多的分層,可能代表這個分層在樣本中被過度或不足代表
常見的抽樣偏誤來源
來源說明對結論的風險
便利抽樣(convenience sampling)只收集容易接觸到、願意配合的對象結果可能只代表「願意參與的人」,而非目標母體
自我選擇(self-selection)受訪者自己決定要不要填答,通常與結果本身相關有強烈意見或利害關係的人更可能填答,扭曲整體分布
無回覆偏誤(non-response bias)被邀請但未完成回覆的人,系統性地與已完成的人不同只分析已完成回覆的人,可能低估或高估真實情況
樣本數加倍,偏誤沒有變小(模擬情境)

這份調查只透過一個自願加入的線上社團發送,第一輪收到 800 份回覆,B 分層的占比明顯低於它在全校學生中的已知比例。團隊決定「再發一輪,把樣本數加倍」,收到 1600 份回覆後,B 分層的占比幾乎沒有改變,因為新增的回覆仍然來自同一個自我選擇的管道。樣本數變大,但抽樣偏誤完全沒有縮小。

  • 推論到目標母體之前,先寫下這個母體的定義,以及樣本的招募或收集方式
  • 比較樣本中各分層、各群組的占比,和這些群組在目標母體中已知或估計的占比
  • 只因為樣本數夠大就假設樣本具代表性,是最常見也最容易被忽略的錯誤
  • 同一個招募管道收集更多資料,通常只會讓偏誤更穩定,而不會讓它消失

注意

樣本數很大不能解決抽樣偏誤的問題:一千筆全部來自同一個便利管道的樣本,仍然可能系統性地不代表目標母體,增加更多同一種樣本並不會修正這個偏差。
自我檢測

一份調查透過學生自願加入的線上社團發送,回收了 800 份問卷。要把結論推論到「全校所有學生」之前,最重要的第一步是什麼?

一份調查透過學生自願加入的線上社團發送,回收了 800 份問卷。要把結論推論到「全校所有學生」之前,最重要的第一步是什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

相關與因果限制

35 分鐘

相關、混淆與因果限制

學習目標:解讀關聯但不越界到因果,辨識可能混淆變數。

你發現 exposure 與 outcome 之間有明顯的正相關,同事立刻說:「所以增加 exposure 會提升 outcome。」相關性只描述兩個變數是否一起變動,並不能單獨證明其中一個造成另一個。在下因果結論之前,需要先問:有沒有第三個變數同時影響這兩者,讓觀察到的關聯其實是假象?

混淆變數(confounder)的樣子
條件說明
與解釋變數相關這個第三變數(例如 age_band)與 exposure 的分布有系統性關聯
也與結果變數相關同一個第三變數(age_band)也獨立地與 outcome 有關聯
扭曲觀察到的關係如果不控制這個第三變數,exposure 與 outcome 之間看到的關聯,可能部分或完全來自 age_band
整體相關 vs. 分層後的相關
overall_corr = df[["exposure", "outcome"]].corr().iloc[0, 1]
print(round(overall_corr, 3))

by_age = df.groupby("age_band").apply(lambda g: g["exposure"].corr(g["outcome"]))
print(by_age.round(3))
# 如果整體相關很強,但在每個 age_band 內部相關都變弱或消失,
# age_band 很可能是一個混淆變數,而不是 exposure 真的造成了 outcome

注意

散佈圖呈現的相關性,單獨永遠無法證明因果關係。就算相關係數很高,也只能說「exposure 與 outcome 一起變動」,不能說「exposure 造成了 outcome」,除非有更嚴謹的研究設計排除混淆變數與其他解釋。
  • 看到強相關時,先問「有沒有一個變數同時影響這兩者」,而不是直接下因果結論
  • 用已知的分層變數(如 age_band、group)檢查相關性是否在子群內依然成立
  • 如果分層後相關消失或大幅減弱,原本的整體相關很可能受到混淆變數影響
  • 因果聲稱需要比觀察式相關更嚴謹的設計;EDA 階段只負責描述與提出假設
一個混淆變數藏起了什麼(模擬情境)

整體資料顯示 exposure 與 outcome 的相關係數是 0.55,同事據此主張「增加 exposure 能提升 outcome」。你依 age_band 分層檢查後發現:年齡較大的分層同時有較高的 exposure 與較高的 outcome,年齡較小的分層則兩者都偏低;在每一個 age_band 內部,exposure 與 outcome 幾乎不相關。age_band 同時推動了兩個變數,製造出一個整體看起來很強、但在每個子群內都不存在的關聯。

  1. 先算整體相關
    計算 exposure 與 outcome 的整體相關係數,記下數值與方向。
  2. 列出可能的混淆變數
    想一想哪些欄位(如 age_band、group)可能同時影響這兩個變數。
  3. 分層後重新計算
    依可能的混淆變數分組,分別計算組內的相關係數,比較是否與整體一致。
  4. 依結果調整措辭
    如果分層後相關明顯減弱或消失,把原本的因果語氣改成「整體關聯可能受某變數影響」。
自我檢測

整體資料顯示 exposure 與 outcome 的相關係數是 0.6,但在每個 age_band 內部分別計算後,相關係數都降到接近 0。最合理的解讀是什麼?

整體資料顯示 exposure 與 outcome 的相關係數是 0.6,但在每個 age_band 內部分別計算後,相關係數都降到接近 0。最合理的解讀是什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

估計與不確定性

35 分鐘

估計、不確定性與信賴區間直覺

學習目標:以直覺理解區間估計;區分抽樣不確定性與資料品質問題。

你算出樣本的 outcome 平均值是 58.4,並把它當成「真正的答案」報告出去。但如果重新抽一次樣本,這個數字幾乎一定會有點不一樣。樣本平均值只是對目標母體真正數值的一個估計,而不是精確答案;區間估計的目的,就是誠實地表達「這個估計有多不確定」。

用重複抽樣(bootstrap)建立區間估計的直覺
import numpy as np

rng = np.random.default_rng(seed=104)
values = df["outcome"].dropna().to_numpy()

boot_means = []
for _ in range(1000):
    resample = rng.choice(values, size=len(values), replace=True)
    boot_means.append(resample.mean())

boot_means = np.array(boot_means)
lower, upper = np.percentile(boot_means, [2.5, 97.5])
print(round(lower, 2), round(upper, 2))
# 這個區間大致表達:如果重複這個抽樣與估計過程很多次,
# 估計出來的平均值大約有 95% 會落在這個範圍內
區間寬度變寬時,最可能反映的是什麼
情況對區間寬度的影響該懷疑的是抽樣不確定性,還是資料品質?
樣本數變小區間通常變寬抽樣不確定性:樣本越小,對母體的估計自然越不精確
資料本身變異較大(標準差較大)區間通常變寬抽樣不確定性:反映真實世界的分散程度,不代表資料有錯
某個分層的量測方式明顯不一致或有系統性錯誤區間可能變寬,但根本問題不是抽樣資料品質問題:需要先修正量測或收集方式,而不是只擴大樣本
區間變窄,但中心是錯的(模擬情境)

某個分層使用的量測工具有系統性偏差,讓每一筆 outcome 都被低估了約 5 分。即使把這個分層的樣本數從 100 增加到 5000,bootstrap 區間會變得很窄,但區間的中心仍然錯誤地偏低了約 5 分,因為問題不在抽樣,而在量測本身。增加樣本量讓你對「錯誤答案」更有信心,卻沒有讓答案變正確。

  • 區間很窄,不代表估計值一定正確;它只代表「如果重複抽樣,結果會很一致」
  • 在擴大樣本量之前,先確認量測方式與資料收集流程本身沒有系統性問題
  • 不同分層如果用不同方式收集資料,應分別檢查區間寬度,不要只看合併後的整體區間
  • 報告區間估計時,同時說明它只處理抽樣不確定性,不保證資料沒有其他品質問題

注意

增加樣本量可以讓區間估計變窄,但無法修復系統性的量測錯誤或有缺陷的抽樣設計;如果資料本身有系統性偏誤,樣本再大,估計出來的區間中心仍然可能是錯的。
自我檢測

兩份分析都用 bootstrap 建立了 outcome 平均值的區間估計。分析一的樣本數是 50,區間是 [50, 66];分析二的樣本數是 2000,區間是 [57, 59]。對這個差異最合理的解讀是什麼?

兩份分析都用 bootstrap 建立了 outcome 平均值的區間估計。分析一的樣本數是 50,區間是 [50, 66];分析二的樣本數是 2000,區間是 [57, 59]。對這個差異最合理的解讀是什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Statistical vs Practical Significance

30 分鐘

Statistical vs Practical Significance

學習目標:區分「有證據存在差異」與「差異大小/實務重要性」。

A 組與 B 組的 outcome 平均值分別是 60.2 與 60.5,兩者的 95% 區間估計沒有重疊,代表「有證據顯示兩組確實不同」。但這個差異只有 0.3,如果團隊的決策門檻是「差異必須達到 5 分以上才值得改變政策」,這個有證據的差異可能完全不值得採取行動。「有差異」和「差異大到值得在意」是兩個不同的問題。

同時報告差異的證據與差異的大小
group_means = df.groupby("group")["outcome"].mean().round(2)
diff = round(group_means.loc["B"] - group_means.loc["A"], 2)
print("平均值差異:", diff)

decision_threshold = 5.0  # 團隊事先定義:差異需達到多少才值得改變政策
print("是否達到實務重要性門檻:", abs(diff) >= decision_threshold)
四種組合,四種不同的下一步
有證據顯示差異存在?差異大到符合實務門檻?建議的下一步
有有值得規劃行動,並持續追蹤驗證效果是否穩定
有沒有差異真實存在,但太小,不值得投入資源改變現況
沒有(不適用)目前證據不足以判斷是否有差異,不宜宣稱「沒有差異」,應考慮擴大樣本或改善量測
沒有明確結論(區間很寬)(不適用)不確定性太大,無法下結論;需要更多資料或更精確的量測
同樣「有證據」,兩種不同結論(模擬情境)

案例一:A 組與 B 組區間不重疊,差異是 0.3 分,團隊事先定義的門檻是 5 分;結論是「有證據但不值得行動」。案例二:另一次比較中,A 組與 B 組區間同樣不重疊,差異是 9 分,超過門檻;結論是「有證據,且值得規劃後續行動」。兩個案例的證據強度(區間是否重疊)處理方式相同,但因為差異大小不同,建議的下一步完全不同。

  • 在分析開始前,先和利害關係人一起定義「差異要多大才值得行動」的門檻,而不是事後再找理由
  • 報告時把「是否有證據」與「差異是否夠大」分成兩句話,不要合併成一句模糊的結論
  • 樣本數非常大時,連很小的差異也可能顯示「有證據」;此時門檻比較更顯重要
  • 如果區間很寬、無法判斷是否有差異,應誠實地說「證據不足」,而不是把它當成「沒有差異」

注意

「有證據顯示差異存在」不等於「這個差異值得改變決策」。在報告任何差異時,除了說明是否有證據,也要說明差異的實際大小,並對照一個事先定義好的、與業務相關的門檻。
自我檢測

兩組的區間估計不重疊,顯示有證據存在差異,但實際差異只有原始量表的 0.3 分(滿分 100)。以下哪一句最正確?

兩組的區間估計不重疊,顯示有證據存在差異,但實際差異只有原始量表的 0.3 分(滿分 100)。以下哪一句最正確?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Independent Lab

45 分鐘

Independent Lab:EDA Report

學習目標:獨立交付包含發現、不確定性、替代解釋與後續問題的探索報告。

資訊

實作任務:使用實作資料,獨立選定一個真實問題,完整走過本課程的探索循環:Question → Explore → Quantify Uncertainty → Compare → Challenge Explanations → Report Limits,並交付一份有界限的 EDA 報告。沒有公布答案,你的推理過程與驗證才是被檢視的重點。
  1. 提出問題
    寫下這份報告要回答的一個具體問題,以及誰會使用這個結果。
  2. 探索資料
    檢查分布、離散程度與缺失情況,並用 IQR 規則標出並調查任何可疑觀測。
  3. 量化不確定性
    用重複抽樣或百分位數方法,為你的主要估計建立一個區間估計。
  4. 比較群組
    比較至少兩個群組或分層,並檢查這個比較在不同子群中是否一致。
  5. 挑戰你自己的解釋
    找出至少一個可能的混淆變數或抽樣偏誤,並說明它會如何改變你的結論。
  6. 評估實務重要性
    把你觀察到的差異大小,對照一個你自己定義並說明理由的決策門檻。
  7. 報告限制
    寫下這份分析目前無法回答、需要更多資料或更嚴謹設計才能確認的問題。
  • 一個清楚陳述的問題,以及預期的使用者
  • 涵蓋分布、離散程度、缺失與可疑觀測的探索摘要
  • 至少一個主要估計的區間估計,並說明其計算方式
  • 至少一項對關聯或因果解讀的挑戰(混淆變數或抽樣偏誤)
  • 有證據的差異 vs. 有實務意義的差異,兩者分開陳述
  • 至少一項限制與一項後續應該追問的問題
  • AI 協助情形的紀錄(若有使用)與你自己驗證了什麼
一份報告,兩種呈現方式

弱版本:「C 組的 outcome 明顯比較高,建議優先投入資源。」強版本:「C 組的 outcome 平均值比其他組高 8 分,95% 區間估計為 [5, 11],超過團隊設定的 5 分行動門檻;但 C 組同時 exposure 也偏高,age_band 分布也較年輕,這兩個因素都可能是混淆變數,需要先排除才能確認是 C 組本身的效果。」強版本同時交代了差異大小、不確定性與至少一個待排除的替代解釋。

  • 只報告效果量與有無證據,卻完全沒有提到可能的混淆變數或抽樣偏誤
  • 把探索階段試過的多種分組方式隱藏起來,只呈現看起來最支持結論的那一種
  • 省略「這份分析回答不了什麼」,讓報告讀起來比實際證據更篤定
  • 沒有說明哪些步驟由 AI 協助產生、哪些部分是自己逐項驗證過的

注意

在探索過程中如果試了很多種切法(不同分組、不同欄位組合),只挑出「最漂亮」的那個結果來報告,會造成多重比較(multiple comparisons)風險:你很可能只是挑中了雜訊剛好形成的模式,卻把它當成真實發現。報告時應說明你實際檢查過哪些切法,而不是只呈現最戲劇化的那一個。

完成

如果 AI 協助計算統計量、畫圖或草擬報告文字,請自己逐項核對:資料範圍與分組是否符合你設定的問題、計算方式與假設是否合理、效果大小的描述是否誇大,以及任何因果性的措辭是否已經越界。AI 可以加快草擬速度;驗證與最終結論仍是人的責任。

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

接下來做什麼?