JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

相關不等於因果

冰淇淋與溺水一起上升——但其中一個並不會造成另一個。因果核心的那個反事實問題。

經典的偽相關

在美國,每個月溺水的人數,幾乎完美地跟著冰淇淋甜筒的銷量一起變動。把兩者畫在一起,你會得到一條漂亮的上升直線:冰淇淋賣得越多,溺水越多。那我們是不是該禁掉冰淇淋來救命?當然不是。兩個數字都在夏天攀升——天氣熱的時候,人們買更多冰淇淋,而且完全是另一回事地,也有更多人去游泳。冰淇淋從來沒有把任何人推下水。

當兩個測量值一起上升、一起下降時,我們說它們是相關的(correlated),而相關係數會用一個數字標示它們綁得多緊。但相關只描述了你手上既有資料裡的一種模式;它完全沒有說,如果你伸手進去改變其中一樣東西,會發生什麼事。當兩個變數一起變動,卻不是因為一個造成另一個時,統計學家稱之為偽相關(spurious correlation)。

偽相關到處都是,而且常常很好笑:尼可拉斯·凱吉演出的電影數量,跟在泳池溺水的人數相關;每人平均的起司消費量,跟被床單纏住而死亡的人數相關。這些是從成千上萬條時間序列裡撈出來的巧合。但大多數會誤導人的相關,根本不是巧合——它們來自一個隱藏的第三個因素,例如夏天的炎熱,同時推動著兩個數字。

每月冰淇淋銷量(x)對每月溺水數(y)的散布圖。點排得很緊,配適出來的線往上傾斜——強烈的正相關。拖動那些點,線就跟著動,但這張圖上的任何一條線,都無法告訴你是否其中一個變數造成了另一個。

一張散布圖,點從左下往右上攀升,中間穿過一條直的趨勢線。

知道相關「在背後沒有直接因果」時,會以哪幾種方式冒出來,是很有幫助的。每當一張圖表誘惑你下結論時,就把這份清單跑一遍。

  1. 純粹的巧合:變數一多,總有些會碰巧排在一起(尼可拉斯·凱吉效應)。
  2. 共同原因:一個隱藏的第三因素同時驅動兩者——夏天的炎熱同時推高冰淇淋與游泳。
  3. 反向因果:也許是 Y 造成 X,而不是反過來(生病的人臥床休息,於是「臥床」看起來像是造成了生病)。
  4. 選擇:資料被蒐集的方式,硬是製造出一條在真實世界裡並不存在的連結。

因果問題:如果我們介入了會怎樣?

那我們究竟怎麼從「這兩件事一起出現」,走到「這一個造成那一個」?這一躍,是從「看見」到「動手」。相關活在「看見」的世界裡:你被動地觀察已經發生的事。因果則活在「動手」的世界裡:你想像伸手進去、刻意改變某樣東西,再問:結果有什麼跟著改變?

把它變具體。你的團隊重新設計了結帳按鈕,並注意到:點了新按鈕的使用者買得更多。誘人的標題是:新按鈕拉高了銷售。但你只是在旁觀使用者做了什麼。也許那種會去點閃亮新按鈕的人,本來就比較想買。因果問題不一樣,也更銳利:如果我們強迫每一位使用者都看到新按鈕,又(在一個平行宇宙裡)強迫同一批使用者看到舊按鈕,總購買量會差多少?

統計學家用一個特別的記號來標示這個差別。Pr(Y | X)——讀作「在我們觀察到 X 的條件下,Y 的機率」——這是相關所捕捉的。Pr(Y | do(X))——「如果我們介入、把 X 設定成某值,Y 的機率」——這才是因果關心的。它們通常並不相等。

\Pr(Y \mid X) \;\neq\; \Pr\!\big(Y \mid \operatorname{do}(X)\big)

看見 X 對上動手做 X。左邊是觀察(相關);右邊想像一個介入(因果)。把兩者混為一談,是資料分析的原罪。

反事實與潛在結果

替「因」下定義,最乾淨的方式,是去問一個並沒有真正發生的世界——一個反事實(counterfactual)——的問題。一位女士吃了顆止痛藥,一小時後頭痛消失了。是藥造成了緩解嗎?誠實的因果問題是:在她什麼都沒吃的那個反事實世界裡,她的頭痛是不是反正也會好?如果會,那藥什麼也沒做。如果頭痛本來會繼續,那藥就有幫助。

這個想法有個精確的形式,稱為潛在結果(potential outcomes)框架。對每一個單位——一個人、一位使用者、一座城市——想像在我們做任何事之前,就存在著兩個數字。Y(1) 是這個單位「若接受處理」會有的結果;Y(0) 是「同一個」單位「若沒接受處理」會有的結果。每個單位都把這兩個潛在結果像兩個密封的信封一樣,裝在自己裡面。

對那一個單位來說,因果效果,就只是它兩個信封之間的差。如果某位病人在用藥下,疼痛量表上會是 10 分中的 3 分,也就是 Y(1) = 3;不用藥則是 10 分中的 8 分,也就是 Y(0) = 8;那麼這種藥對她的效果就是 3 − 8 = −5 分的疼痛。我們把這個差,稱為個別處理效果(individual treatment effect)。

\tau_i = Y_i(1) - Y_i(0)

個別處理效果:同一個單位「若接受處理」的結果,減去它「若沒接受處理」的結果。因果,究其根本,是把一樣東西和它自己「本來可能會怎樣」相比。

因果推論的根本難題

這裡有個關鍵的卡點,讓因果推論自成一個領域。對任何單一單位,你永遠只能看到它兩個潛在結果中的「一個」。給病人吃藥,你就觀察到 Y(1) = 3;而她什麼都沒吃的那個世界,Y(0),從未發生,所以你永遠看不到它。不給藥,你觀察到 Y(0);這下換 Y(1) 消失了。另一個信封永遠是缺的。統計學家 Paul Holland 把這稱為因果推論的根本難題(the fundamental problem of causal inference)。

換個說法,因果推論其實是一個喬裝過的「遺漏值」問題。我們很想替每個單位,填好一張有 Y(1) 和 Y(0) 兩欄的表——但每一列正好有一半是空白的,而且無論你怎麼盯著看得到的那一半,也變不出藏起來的那一半。個別效果 Y(1) − Y(0),對一個真實的人,永遠無法直接測量。

我們實際記錄到的,是一個單一的觀察結果,它會依這個單位有沒有接受處理,在兩個信封之間切換。記 Tᵢ = 1 為單位 i 接受處理、Tᵢ = 0 為沒有:

Y_i^{\text{obs}} = T_i\,Y_i(1) + (1 - T_i)\,Y_i(0)

我們只在接受處理者身上看到 Y(1),只在未接受處理者身上看到 Y(0)——對任何人都看不到兩者。缺掉的那一半,就是反事實。

平均處理效果

如果個別效果沒救,我們就用一個聰明的方式,把企圖心放低:不再問藥對某一個人做了什麼,而是問它在「整群人」身上「平均」做了什麼。這個量,就是平均處理效果(average treatment effect,簡稱 ATE)——也就是 Y(1) − Y(0) 在所有人身上的平均。它是實務因果推論的主力。

用 E 代表「在整個母體上取平均」,ATE 就是「接受處理那個世界」結果的平均,減去「沒接受處理那個世界」結果的平均:

\text{ATE} = \mathbb{E}\big[Y(1) - Y(0)\big] = \mathbb{E}\big[Y(1)\big] - \mathbb{E}\big[Y(0)\big]

我們永遠無法替一個只看到一半的欄位取平均——但有時候,我們能從不同群的單位,分別估出 E[Y(1)] 和 E[Y(0)] 這兩塊。

這就是隨機實驗的魔法。替每個單位擲一枚硬幣:正面進實驗組,反面進對照組。因為硬幣完全不理會每個人的任何特質,這兩組在平均上、在每個面向都會很像——年齡、動機、天氣,連你從沒測過的東西都一樣。於是實驗組的平均結果,就成了 E[Y(1)] 的公正替身,對照組的平均則替 E[Y(0)] 站台。兩者的差,就估計出了 ATE。

\widehat{\text{ATE}} = \bar{y}_{\text{treat}} - \bar{y}_{\text{control}}

在隨機實驗裡,兩組平均的簡單差,就是平均處理效果的不偏估計。這一行,就是隨機試驗之所以是黃金標準的原因。

具體地說:把 2,000 位使用者隨機切成兩半,給 1,000 人看新的結帳按鈕、1,000 人看舊的。如果新按鈕組有 12.0% 的人購買、舊按鈕組有 10.0% 購買,那你估出的 ATE 就是 12.0% − 10.0% = 2.0 個百分點。因為這個切分是隨機的,你可以理直氣壯地把這 2 個百分點當成因果效果,而不只是相關。

import pandas as pd

# one row per user: group is 'treat' or 'control', bought is 0 or 1
rates = df.groupby("group")["bought"].mean()
ate = rates["treat"] - rates["control"]
print(ate)   # 0.12 - 0.10 = 0.02  ->  a 2-point lift
從隨機 A/B 測試估 ATE,就是一次分組彙總(group-by)加一次相減。難的不是算術——而是你得先掙到那個「隨機分派」,才讓這個相減有意義。

為什麼天真的分組比較會誤導

現在把隨機分派拿掉——這正是你面對「自己跑來的」幾乎所有資料時的處境:伺服器日誌、醫院病歷、一份問卷。人們是自己選進、或被選進那些組別的。當接受處理與沒接受處理的人,在任何處理「之前」就不一樣時,他們平均的單純差,就不再是 ATE 了。它是 ATE 再加上一個會污染結果的項。

\underbrace{\bar{y}_{\text{treat}} - \bar{y}_{\text{control}}}_{\text{what you compute}} \;=\; \underbrace{\text{ATE}}_{\text{what you want}} \;+\; \underbrace{\text{bias}}_{\text{selection / confounding}}

你算得出來的數字,只有在那個偏差項等於零時,才會等於你真正想要的數字。隨機分派把它逼到零;而原始的觀察性資料,幾乎從來不會。

這個偏差最常見的來源,是干擾因子(confounder):一個同時影響「誰會接受處理」與「結果是什麼」的變數。夏天的炎熱,就是冰淇淋與溺水背後的干擾因子——它把兩者都拉高。在結帳按鈕的例子裡,「使用者本來有多想買」可能同時驅動了「點新按鈕」和「購買」。干擾因子會在你在乎的兩件事之間,鍛造出一條沒有因果箭頭的相關。

一個干擾因子(夏天的氣溫)坐在冰淇淋銷量與溺水「兩者之上」,各射出一支箭頭。下面兩者之間那條虛線,是我們觀察到的相關——它是真的,但沒有任何因果箭頭把它們連起來。一旦把那個干擾因子算進去,這條偽連結就會溶解。

一張圖,最上面是「氣溫」,箭頭往下指向「冰淇淋」與「溺水」;下面兩個方塊之間以虛線相連。

它的近親是選擇偏誤(selection bias):光是「挑誰落到哪一組」這個動作本身,就把一個差別烤進了結果裡。如果醫院把病情最重的病人送去接受新療法,那接受處理的那一組事後看起來就會比較糟——不是因為療法有害,而是因為他們一開始就比較重。天真地比較兩組,你可能會「證明」一個能救命的療法其實會致命。

最戲劇化的警告,是辛普森悖論(Simpson's paradox):一旦你依某個干擾因子拆開,比較的方向竟然會反轉。一項著名的腎結石研究發現,療法 A 的整體成功率低於療法 B——然而 A 在小結石上贏、在大結石上也贏。一個療法怎麼可能在「每個」子群都比較好,整體卻比較差?因為醫生把較硬的療法 A 用在難治的病例(大結石)上,所以 A 的整體數字,是被「分配給它的病人」拖下去的,而不是被療法本身。

辛普森悖論,現場演示:每個有顏色的子群各自往一個方向走,但合在一起的整團點卻往相反方向走。把分組切換開或關,看著結論翻轉。值得信任的答案,是把那個會干擾的子群算進去的那一個。

一張散布圖,整體趨勢線往下,但其中分開的各色群集卻各自往上。

前路:我們仍然如何下因果結論

如果相關這麼危險,我們究竟還能不能掙到「因果」這個詞?能——靠兩條路之一。第一條,是我們自己用隨機分派,把那個缺掉的反事實「製造」出來;這就是你在上面見過的黃金標準,也是實驗設計那條學習路徑的主題。當你能擲硬幣時,那個偏差項在設計上就消失了,平均的差「就是」因果效果。

但你常常無法隨機分派——那可能不道德、不合法、不可能,或太慢。你沒辦法隨機指派人去抽三十年的菸。第二條路,是仔細地推敲「資料是怎麼來的」,把假設攤在陽光下,再用一些「從純觀察性資料模擬出一場實驗」的設計。這就是本學習路徑接下來的內容。

  1. 畫出因果圖。一張由箭頭組成的因果有向無環圖(causal DAG),能讓你看出該控制哪些變數——而且出乎意料地,也看出哪些該放著別動(下一篇)。
  2. 向大自然借硬幣。自然實驗——工具變數雙重差分,以及迴歸不連續——利用世界裡那些「幾乎隨機」分派處理的巧合。
  3. 事後打造一個公平的比較組。配對與傾向分數,把接受處理的單位和相似的未處理單位配成對,以平衡干擾因子。
  4. 然後對答案做壓力測試:面對一個你忘了測量的干擾因子,它有多脆弱?

在你往下走之前,這裡有一份隨身清單。把它用在你下次遇到的「X 造成 Y」標題上——不論是在論文、新聞稿,還是你自己的儀表板裡。

  1. 有沒有人被隨機分派?如果有,這個主張站得穩。如果沒有,保持懷疑。
  2. 有沒有明顯的共同原因?說出一個光憑它自己就能製造出這條連結的干擾因子。
  3. 箭頭會不會是反的?也許是「果」造成了那個所謂的「因」。
  4. 這些組是怎麼被選出來的?在「最後是誰被測量到」裡,尋找選擇偏誤。
  5. 效果的大小重要嗎?一個真實但微小的效果,很少足以支撐一個重大的決策。

相關不等於因果——但只要問對問題(一個反事實)、瞄準對的目標(平均處理效果),並對干擾因子做出誠實的交代,因果仍然是我們能去追求的東西。接下來的篇章,會把工具交到你手上。把那組偽相關的冰淇淋記在心裡:目標從來不是去害怕相關,而是每一次都去問——到底是什麼,真的讓這些數字一起變動?