先看區間,別只看 p 值
你仔細設計了測試、跑得夠久,現在儀表板上並排顯示兩個數字。誘惑就是只瞄一格——「p < 0.05,顯著,上線吧!」——然後就翻篇了。這篇要談的,正是從「結果出來了」到「我們做了正確的決定」之間,所有可能出錯的地方。我們先從最有用的一個習慣開始:去看差異的信賴區間,而不是只看p 值。
這裡有一個貫穿全篇的具體例子。你在測試一個新的結帳按鈕。對照組看到舊按鈕;實驗組看到新按鈕。每組各有 30,000 位訪客。對照組轉換率(conversion rate)5.0%,實驗組 5.4%。最醒目的差異是 +0.4 個百分點——相對提升約 +8%。p 值大約落在 0.024,意思是:「如果新按鈕其實毫無作用,出現這麼大或更大的差距是相當罕見的——大約 2.4% 的機率。」很好。但這一個數字丟掉了你真正用來做決定的東西:效果有多大,而我們又有多確定?
信賴區間保留了那個資訊。以這個結果來說,差異的 95% 區間大約是 +0.05 到 +0.75 個百分點——換成相對值,約 +1% 到 +15%。這個區間才是誠實的摘要:真正的提升,合理範圍從「勉強值得折騰」一路到「真的很棒」。光說一句「顯著」,會掩蓋掉下界其實幾乎貼著零這件事。
區間從何而來?先寫出我們在乎的量——兩個觀測到的轉換率之間的差異(上面那個小帽子代表「由樣本估計而來」):
我們要估計的效果:實驗組比率減去對照組比率。
每個估計都帶著雜訊。差異的標準誤會把兩組各自的擺動合起來——對比率而言,每一組的雜訊取決於該比率與樣本數:
兩個比率之差的合併標準誤。
把數字代進去,差異的標準誤約為 0.18 個百分點。95% 區間在兩側各延伸約 1.96 個標準誤,所以誤差範圍約 0.35 個百分點:0.40 ± 0.35 得到 +0.05 到 +0.75 個百分點。因為下界剛好落在零上方一點點,p 值才勉強壓在 0.05 以下。區間和 p 值說的是同一個故事——但區間告訴你的更多。
效果的約略 95% 信賴區間。
一條互動式數線,顯示差異的點估計,周圍有一條水平的信賴區間長條,並標出零線;長條變寬或變窄時,可看出它何時與零重疊。
統計顯著 vs 實務顯著
統計顯著只回答一個問題:「這個差距大概不只是雜訊吧?」實務顯著回答的卻是另一個完全不同的問題:「這個效果大到值得我們採取行動嗎?」這兩者經常分道揚鑣,把它們混為一談,是解讀結果時最常見的錯誤之一。
只要使用者夠多,幾乎任何差異都會變得統計顯著。想像每組有 500 萬位訪客,差異是 +0.01 個百分點——微不足道。標準誤小到連這麼微小的差距都會產生遠低於 0.05 的 p 值。顯著嗎?是的。值得花一整季的工程重做、讓程式碼更複雜、還承擔新 bug 的風險嗎?幾乎可以確定不值得。
反過來也會咬人:如果樣本太小、或指標雜訊太大,一個真正巨大、有價值的效果也可能達不到顯著。這正是你在上線前做檢定力分析、並先定下最小可偵測效果的原因——好讓測試真有機會抓到值得抓的效果。一個檢定力不足的測試出現「不顯著」,意思是「我們看不出來」,而不是「沒有效果」。
那要怎麼判斷實務顯著?在測試之前就先決定:最小要多大的提升,才真的會改變你的決定——那就是你的 MDE。然後把整條信賴區間拿去跟那條線比較。你在比的相對提升,就是差異除以基準值:
把效果表達成基準值的百分比——通常比原始的百分點更好思考。
- 如果「整條」區間都在你的「值得」門檻之上——這是明確、可行動的勝利。
- 如果區間跨越了門檻——這個測試真的無法給你答案;你需要更多資料,或更大的效果。
- 如果整條區間都在門檻之下——就算「顯著」,這個效果也太小、不值得行動。
偷看,以及它為何會灌水偽陽性
有一個感覺很負責、卻會悄悄毀掉你測試的習慣:每天早上打開儀表板,一看到 p 值掉到 0.05 以下就決定收手。這叫做偷看(提前查看),它會把你的偽陽性率灌得遠高於你以為自己在跑的那 5%。
看一眼為什麼會有害?標準檢定那 5% 的保證,前提是你「只看一次」,而且是在事先固定好的樣本數上看。每多看一次,就是多擲一次骰子——多給隨機雜訊一次獨立的機會去飄過 0.05 那條線。如果你的規則是「第一次跨線就停」,你量的就不是效果,而是在挑雜訊剛好看起來最大的那一刻。
一個誠實的類比:分批擲一枚公正的硬幣,盯著累計結果看。在某個時刻,純粹靠運氣,正面會暫時領先到「看起來很多」的地步。如果你可以在任何你選定的時刻喊「這硬幣有偏!」,那你遲早會喊出來——即使它是一枚完全公正的硬幣。偷看給了雜訊同樣的自由。
數字很殘酷。照計畫只看一次,你的偽陽性率就是預期的 5%。途中偷看五次、任何一次跨線就停,它會爬到大約 14% 到 19%。若是連續監看、一跨過 0.05 就立刻收手,在虛無假設為真的情況下,偽陽性率會逐漸逼近 100%——時間夠長,一枚公正硬幣總會在某個時刻看起來「顯著」。
一條隨樣本累積、p 值隨時間變化的動畫折線,並有一條 0.05 的水平門檻線;即使沒有真正效果,折線仍反覆地在門檻上下穿越。
樣本比例不符:你的測試壞了
你把流量切成 50/50,所以測試結束時,你預期每組的計數大致相等。如果你反而看到明顯的失衡——比方說 100,000 人裡是 50,500 對 49,500——那就是管線某處壞了。這叫做樣本比例不符(SRM),而它是你解讀任何東西之前,最重要的一項合理性檢查。
為什麼一點小失衡是危險信號,而不只是個有趣的小現象?隨機分派(randomization)正是兩組一開始能夠相互比較的全部理由——它讓你能把對照組當作「不做任何改變、本來會發生什麼」的公正替身。如果比例不對,代表你的分派或記錄壞了,這通常意味著兩組現在以某種隱藏、非隨機的方式產生了差異。一旦如此,其他每個數字——你的效果、你的 p 值、你的區間——全都蓋在流沙上。
你用卡方檢定來偵測 SRM,它把觀測到的計數和預期的切分拿來比較。這個統計量會對每一組,把「觀測值與預期值之差的平方、再除以預期值」加起來:
卡方適合度統計量;O 是觀測計數,E 是預期計數。
from scipy.stats import chisquare observed = [50500, 49500] # users actually bucketed into A and B expected = [50000, 50000] # what a clean 50/50 split should give chi2, p = chisquare(observed, expected) print(chi2, p) # 10.0 0.00157 -> SRM! stop and debug
注意它有多敏感。一個肉眼看來像捨入誤差的差距——50,500 對 49,500——在這個規模下就產生約 0.0016 的 p 值。因為在大 n 下連微不足道的偏離都會冒出來,團隊會對 SRM 採用很嚴格的標準(通常是 p 低於 0.001、甚至 0.0005),這樣才只去追真正的故障。但真正的 SRM 通常一目了然:p 值小到不行。
常見元兇:機器人或垃圾流量過濾只套用在其中一組;實驗組多了一個轉址或額外載入步驟,悄悄流失了速度較慢的使用者;快取讓部分訪客卡住;不同版本之間的記錄方式有差異;或是用一個跨工作階段不穩定的鍵來分派使用者。解法永遠是找到並修好原因、然後重跑——絕不是去「調整」那組壞掉的數字。
新奇效應與慣性效應
就算切分完全乾淨,你在第一週量到的效果,也可能不是你未來幾個月要承受的那個效果。原因是人們會「隨時間」對改變產生反應,而那個反應可能把你早期的數字往任一方向拉。這裡有兩個方向相反的陷阱。
新奇效應:使用者注意到某個新奇、亮眼的東西,只因為它「新」就去戳它。一個重新設計的按鈕被點,純粹是因為它看起來不一樣。互動在早期飆高,然後隨著新鮮感消退而下滑。你第一週的結果會「高估」真實、長期的效果——憑那一波飆升就上線,之後你會失望。
慣性效應(primacy effect,又稱慣性/首因效應)則是它的鏡像。老使用者習慣了舊作法,改變會讓他們一時錯亂——他們手忙腳亂、抗拒,指標往下掉。然後他們適應了,數字回升、甚至爬到比一開始更高的地方。此時你早期的結果反而「低估」了長期效果——太早放棄這個測試,你就扼殺了一個真正的贏家。
你怎麼判斷正在發生哪一種?把效果「隨時間」畫出來,別只看單一的累計數字——如果每日效果還在往上或往下走,代表你還沒到達穩態。然後把新使用者和回訪使用者分開看:新奇效應和慣性效應主要作用在「對改變有反應的既有使用者」身上,而全新的使用者沒有「舊作法」可以比較,所以他們的行為是對長期效果更乾淨的讀數。
指標太多:多重比較的陷阱
你的測試上線時帶著一個有二十個指標的儀表板——點擊、營收、停留時間、捲動深度、註冊,沒完沒了。這裡有個讓人不舒服的算術:就算你的改變「完全」沒做任何事,在 5% 顯著水準下做二十次獨立檢查,你預期其中大約會有「一個」純靠運氣亮起來。盯著夠多的指標,「顯著」這個詞就失去了意義。
我們可以給它一個數字。如果每個檢定各自有 5% 的偽陽性率,那麼 m 個檢定中「至少有一個」誤報的機率,就是一減去「全部都安靜」的機率:
當 α = 0.05、m = 20 個指標時,這是 1 − 0.95^20 ≈ 0.64。
百分之六十四。在二十個指標、改變其實毫無作用的情況下,至少有一個純靠運氣大喊「顯著」的機率約是 64%。現在再把每個指標按國家、裝置、瀏覽器切開,比較的次數——以及偽陽性——就爆炸了。這正是 p-hacking 的引擎:試夠多的東西,然後挑出剛好跨過線的那一個來報告,彷彿你一開始就預測到了一樣。
一條鐘形的虛無分配,外側 5% 的尾端被塗上陰影;上面散落著數個樣本點,其中一個落在陰影尾端內,說明在許多檢定中偶然出現的偽陽性。
有三道誠實的防線,而且你應該照順序使用。第一,事先登記「一個」主要指標——也就是你在設計那篇選定的整體評估準則(OEC)——並用這「單一」數字來評斷測試。第二,把其他每一個指標都當成探索性的:它可以為下一個測試生成假設,但它無權做「這一次」的決定。第三,如果你真的必須同時根據好幾個指標下決定,就為這份「多重」做校正。
最簡單的校正是 Bonferroni 法:如果你在檢定 m 個指標、想要整體 5% 的錯誤率,就要求每一個別檢定都得通過一個更嚴格的標準,也就是 α 除以 m。它很保守——可能漏掉真正的效果——但誠實又簡單。當指標很多時,團隊常偏好控制 偽發現率(false discovery rate, FDR),它容許在被標記的項目中有一小部分已知比例的偽陽性,以換取抓到更多真正的效果。
Bonferroni:把錯誤額度平均分配給全部 m 次比較。
結果判讀檢查清單
把這一切組成一套你每次都照著跑、而且「照順序」跑的例行程序。順序很重要:先合理性檢查測試是否根本有效,再誠實地讀主要指標,最後才讓次要指標為「下一次」悄悄提供點子。
- 先看 SRM。用卡方檢定查實際的流量切分。若沒過,停下來除錯——在切分乾淨之前,連一個數字都別解讀。
- 你照計畫了嗎?確認你跑到了事先計畫的樣本數,而不是在某次幸運的偷看時提前收手。
- 讀主要指標的效果「以及」它的信賴區間——不要只看 p 值。它有多大、又有多不確定?
- 實務顯著。整條區間都在你事先設的門檻(MDE)之上嗎?顯著不等於值得。
- 效果隨時間的變化。把它畫出來;留意新奇與慣性效應。它穩定下來了,還是仍在走勢中?
- 護欄。確認你的護欄指標沒有退步——一個拖垮頁面速度或營收的轉換勝利,不是勝利。
- 次要指標。把它們當成探索性的;為多重比較做校正;用它們來形成假設,而不是用來做「這一次」的決定。
- 做決定並寫下來。上線、迭代,或放棄——並記下理由,好讓下一個人(常常就是未來的你)能稽核。
注意到了嗎,這篇裡幾乎每個陷阱都有同一帖解藥:在你看到資料之前就把規則定好——指標、樣本數、停止點、成功門檻。實驗中的誠實,大半是事先承諾,再加上「願意去讀區間、而不是追逐單一一顆星號」的謙遜。養成這兩個習慣,你會勝過手握更花俏工具的分析師。