經典的偽相關
在美國,每個月溺水的人數,幾乎完美地跟著冰淇淋甜筒的銷量一起變動。把兩者畫在一起,你會得到一條漂亮的上升直線:冰淇淋賣得越多,溺水越多。那我們是不是該禁掉冰淇淋來救命?當然不是。兩個數字都在夏天攀升——天氣熱的時候,人們買更多冰淇淋,而且完全是另一回事地,也有更多人去游泳。冰淇淋從來沒有把任何人推下水。
當兩個測量值一起上升、一起下降時,我們說它們是相關的(correlated),而相關係數會用一個數字標示它們綁得多緊。但相關只描述了你手上既有資料裡的一種模式;它完全沒有說,如果你伸手進去改變其中一樣東西,會發生什麼事。當兩個變數一起變動,卻不是因為一個造成另一個時,統計學家稱之為偽相關(spurious correlation)。
偽相關到處都是,而且常常很好笑:尼可拉斯·凱吉演出的電影數量,跟在泳池溺水的人數相關;每人平均的起司消費量,跟被床單纏住而死亡的人數相關。這些是從成千上萬條時間序列裡撈出來的巧合。但大多數會誤導人的相關,根本不是巧合——它們來自一個隱藏的第三個因素,例如夏天的炎熱,同時推動著兩個數字。
一張散布圖,點從左下往右上攀升,中間穿過一條直的趨勢線。
知道相關「在背後沒有直接因果」時,會以哪幾種方式冒出來,是很有幫助的。每當一張圖表誘惑你下結論時,就把這份清單跑一遍。
- 純粹的巧合:變數一多,總有些會碰巧排在一起(尼可拉斯·凱吉效應)。
- 共同原因:一個隱藏的第三因素同時驅動兩者——夏天的炎熱同時推高冰淇淋與游泳。
- 反向因果:也許是 Y 造成 X,而不是反過來(生病的人臥床休息,於是「臥床」看起來像是造成了生病)。
- 選擇:資料被蒐集的方式,硬是製造出一條在真實世界裡並不存在的連結。
因果問題:如果我們介入了會怎樣?
那我們究竟怎麼從「這兩件事一起出現」,走到「這一個造成那一個」?這一躍,是從「看見」到「動手」。相關活在「看見」的世界裡:你被動地觀察已經發生的事。因果則活在「動手」的世界裡:你想像伸手進去、刻意改變某樣東西,再問:結果有什麼跟著改變?
把它變具體。你的團隊重新設計了結帳按鈕,並注意到:點了新按鈕的使用者買得更多。誘人的標題是:新按鈕拉高了銷售。但你只是在旁觀使用者做了什麼。也許那種會去點閃亮新按鈕的人,本來就比較想買。因果問題不一樣,也更銳利:如果我們強迫每一位使用者都看到新按鈕,又(在一個平行宇宙裡)強迫同一批使用者看到舊按鈕,總購買量會差多少?
統計學家用一個特別的記號來標示這個差別。Pr(Y | X)——讀作「在我們觀察到 X 的條件下,Y 的機率」——這是相關所捕捉的。Pr(Y | do(X))——「如果我們介入、把 X 設定成某值,Y 的機率」——這才是因果關心的。它們通常並不相等。
看見 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)。
個別處理效果:同一個單位「若接受處理」的結果,減去它「若沒接受處理」的結果。因果,究其根本,是把一樣東西和它自己「本來可能會怎樣」相比。
因果推論的根本難題
這裡有個關鍵的卡點,讓因果推論自成一個領域。對任何單一單位,你永遠只能看到它兩個潛在結果中的「一個」。給病人吃藥,你就觀察到 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(1),只在未接受處理者身上看到 Y(0)——對任何人都看不到兩者。缺掉的那一半,就是反事實。
平均處理效果
如果個別效果沒救,我們就用一個聰明的方式,把企圖心放低:不再問藥對某一個人做了什麼,而是問它在「整群人」身上「平均」做了什麼。這個量,就是平均處理效果(average treatment effect,簡稱 ATE)——也就是 Y(1) − Y(0) 在所有人身上的平均。它是實務因果推論的主力。
用 E 代表「在整個母體上取平均」,ATE 就是「接受處理那個世界」結果的平均,減去「沒接受處理那個世界」結果的平均:
我們永遠無法替一個只看到一半的欄位取平均——但有時候,我們能從不同群的單位,分別估出 E[Y(1)] 和 E[Y(0)] 這兩塊。
這就是隨機實驗的魔法。替每個單位擲一枚硬幣:正面進實驗組,反面進對照組。因為硬幣完全不理會每個人的任何特質,這兩組在平均上、在每個面向都會很像——年齡、動機、天氣,連你從沒測過的東西都一樣。於是實驗組的平均結果,就成了 E[Y(1)] 的公正替身,對照組的平均則替 E[Y(0)] 站台。兩者的差,就估計出了 ATE。
在隨機實驗裡,兩組平均的簡單差,就是平均處理效果的不偏估計。這一行,就是隨機試驗之所以是黃金標準的原因。
具體地說:把 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為什麼天真的分組比較會誤導
現在把隨機分派拿掉——這正是你面對「自己跑來的」幾乎所有資料時的處境:伺服器日誌、醫院病歷、一份問卷。人們是自己選進、或被選進那些組別的。當接受處理與沒接受處理的人,在任何處理「之前」就不一樣時,他們平均的單純差,就不再是 ATE 了。它是 ATE 再加上一個會污染結果的項。
你算得出來的數字,只有在那個偏差項等於零時,才會等於你真正想要的數字。隨機分派把它逼到零;而原始的觀察性資料,幾乎從來不會。
這個偏差最常見的來源,是干擾因子(confounder):一個同時影響「誰會接受處理」與「結果是什麼」的變數。夏天的炎熱,就是冰淇淋與溺水背後的干擾因子——它把兩者都拉高。在結帳按鈕的例子裡,「使用者本來有多想買」可能同時驅動了「點新按鈕」和「購買」。干擾因子會在你在乎的兩件事之間,鍛造出一條沒有因果箭頭的相關。
一張圖,最上面是「氣溫」,箭頭往下指向「冰淇淋」與「溺水」;下面兩個方塊之間以虛線相連。
它的近親是選擇偏誤(selection bias):光是「挑誰落到哪一組」這個動作本身,就把一個差別烤進了結果裡。如果醫院把病情最重的病人送去接受新療法,那接受處理的那一組事後看起來就會比較糟——不是因為療法有害,而是因為他們一開始就比較重。天真地比較兩組,你可能會「證明」一個能救命的療法其實會致命。
最戲劇化的警告,是辛普森悖論(Simpson's paradox):一旦你依某個干擾因子拆開,比較的方向竟然會反轉。一項著名的腎結石研究發現,療法 A 的整體成功率低於療法 B——然而 A 在小結石上贏、在大結石上也贏。一個療法怎麼可能在「每個」子群都比較好,整體卻比較差?因為醫生把較硬的療法 A 用在難治的病例(大結石)上,所以 A 的整體數字,是被「分配給它的病人」拖下去的,而不是被療法本身。
一張散布圖,整體趨勢線往下,但其中分開的各色群集卻各自往上。
前路:我們仍然如何下因果結論
如果相關這麼危險,我們究竟還能不能掙到「因果」這個詞?能——靠兩條路之一。第一條,是我們自己用隨機分派,把那個缺掉的反事實「製造」出來;這就是你在上面見過的黃金標準,也是實驗設計那條學習路徑的主題。當你能擲硬幣時,那個偏差項在設計上就消失了,平均的差「就是」因果效果。
但你常常無法隨機分派——那可能不道德、不合法、不可能,或太慢。你沒辦法隨機指派人去抽三十年的菸。第二條路,是仔細地推敲「資料是怎麼來的」,把假設攤在陽光下,再用一些「從純觀察性資料模擬出一場實驗」的設計。這就是本學習路徑接下來的內容。
- 畫出因果圖。一張由箭頭組成的因果有向無環圖(causal DAG),能讓你看出該控制哪些變數——而且出乎意料地,也看出哪些該放著別動(下一篇)。
- 向大自然借硬幣。自然實驗——工具變數、雙重差分,以及迴歸不連續——利用世界裡那些「幾乎隨機」分派處理的巧合。
- 事後打造一個公平的比較組。配對與傾向分數,把接受處理的單位和相似的未處理單位配成對,以平衡干擾因子。
- 然後對答案做壓力測試:面對一個你忘了測量的干擾因子,它有多脆弱?
在你往下走之前,這裡有一份隨身清單。把它用在你下次遇到的「X 造成 Y」標題上——不論是在論文、新聞稿,還是你自己的儀表板裡。
- 有沒有人被隨機分派?如果有,這個主張站得穩。如果沒有,保持懷疑。
- 有沒有明顯的共同原因?說出一個光憑它自己就能製造出這條連結的干擾因子。
- 箭頭會不會是反的?也許是「果」造成了那個所謂的「因」。
- 這些組是怎麼被選出來的?在「最後是誰被測量到」裡,尋找選擇偏誤。
- 效果的大小重要嗎?一個真實但微小的效果,很少足以支撐一個重大的決策。
相關不等於因果——但只要問對問題(一個反事實)、瞄準對的目標(平均處理效果),並對干擾因子做出誠實的交代,因果仍然是我們能去追求的東西。接下來的篇章,會把工具交到你手上。把那組偽相關的冰淇淋記在心裡:目標從來不是去害怕相關,而是每一次都去問——到底是什麼,真的讓這些數字一起變動?