Part 3. 實驗結果分析與結論

黃郁傑
8 min readAug 27, 2019

--

實驗分析的部分,我們首先要做完整性測試 (Sanity Check),確保我們的實驗設置和進行都是正確的,然後再來分析結果並給出結論與建議。

Sanity Check

如同我們在Part 1. 指標選擇時提過的,我們會選擇一些Invariant metrics做Sanity Check。如何對這些指標進行統計分析以確保可信度,已經有很多的文章介紹,這裡不多做介紹,有興趣的讀者可以自己找相關文章閱讀。

要記得的是,一但Sanity Check沒有過,千萬不要再接著下去分析結果,一定要回頭再Check是哪個環節出錯。就如同之前說的,A/B test是個iterating的過程,不是單向線性的。

Single Evaluation Metric Analysis

要計算單一變量下,測試組和控制組是否有差異,我們就必須利用之前提到的Variability (SE)。至於如何利用Analytical variability計算是否具有統計顯著性,這裡不再贅述,有興趣的讀者可以自己找相關文章看。

那如何利用Empirical variability計算,下面給出了簡單的範例,簡單來說我們利用SE和樣本量的平方根成反比的關係,推算出Gap的SE,然後再去推算出Confidence Interval,如下所示:

計算Empirical SE
計算Confidence Interval

Double Check Mechanism

除了上述的數學方法外 (我們稱為Parametric method),我們還可以運用Non-parametric method,而且實行起來也非常簡單。假設我們實驗運行10天,如果測試組和控制組實際上沒有差異的話,應該會有5天實驗組效果好於控制組,另外5天則相反,也就是說有50%的機率實驗組較好。假設10天中有8天實驗組表現較好,我們就可以運用二項分布的原理,計算出這樣的機率只有4.4%,因此不太可能兩組之間沒有實際差異 (拒絕Null Hypothesis)。

如果Parametric method和Non-parametric method所顯示的結果不同,那我們就要回頭去看一下分天的數據,看是不是有哪些天數表現怪異導致有這種情況。例如你可能會發現周間沒有差距,但周末差距很大導致了這種情況,那你就應該產生新的假設,去檢驗為什麼周間沒有顯示出一樣的效果了。

What if result insignificant ?

如果出來的結果不具有統計顯著性,先不要急著下結論說假設無效,我們必須要回頭檢查一下我們的數據。其中一個可能的原因是Simpson Paradox,簡單來說就是組成的不同導致最終結果的差距。

為什麼在實驗中會發生這樣的情況呢? 試想一下假設我們今天對推薦排序做了一個實驗,目標是提升CTR,算法同學也對這個實驗十分有信心,但最終的結果卻是實驗組的CTR下降了,為什麼會這樣呢? 如果我們仔細檢查可能會發現這個算法的改動,讓原本平台的低活躍度用戶的Page view變得更多了,也就是說低活躍度的占比提升了,才導致最終的整體CTR下降了。

What we shouldn’t do when result is insignificant ?

當實驗已經如同預期的跑完之後,效果卻不顯著時,我們不應該延長實驗時間多跑幾天,因為這樣子會讓False positive rate。可以想像在5%的顯著水準下,跑個100次也會有5次有差異,詳細請見這個Blog

Statistical Significant v.s Practical Significant?

達到了統計顯著性,就等於應該Launch嗎? 不一定的。記得我們之前提到的Practical Significant,只有達到了Practical Significant才符合我們上線的條件,因此在考量Practical Significant時,也應該考量改變所可能產生的成本,在計算出怎樣的變動幅度才符合ROI的效益。

以下的圖給出了5個實驗的Statistical Significant和Practical Significant,實線部分是指變動的置信區間,藍色虛線部分則是Practical Significant的正負值。這種情況下,實驗一應該要Launch,實驗二/三不應該Launch,實驗四/五則需要更多的樣本 (縮小SE),才能下決定 (因為置信區間的最大值超過Practical Significant閥值,代表可能帶來有用的改變)。

Multiple Evaluation Metric Analysis

多衡量指標的分析基本上是跟單指標是一樣的,但是要注意的是因為同時衡量多個指標,False positive出現的機會就增加了。假設你同時衡量20個指標,每個指標設定95%的confidence level,這種情況下很有可能會出現至少1個False positive。

那怎麼解決呢? 有兩種思路:

  1. 再重複做一次實驗:如果是False positive的話,在做一次的情況下理論上就不會出現,因為它unrepeatable。
  2. 運用Multiple comparison

以下說明兩種Multiple comparison思路:

  • Control 族誤差率(FWER):FWER的概念就是不要出現任何一個False positive,其中最常見的方法為Bonferroni correction。Bonferroni correction是將confidence level除以測試次數。假設您測量的是20 metrics,整體的confidence level是5%的話,則單個指標的顯著性水平應為5%/20 = 0.25%。Bonferroni correction的問題是它過於保守,如果同時測試了許多指標,則可能沒有一個指標顯著 (Type 1 error降低,但Type 2 error上升)。
  • Control 錯誤發現率(FDR):FDR = #false positives / #total rejects。例如:總體指標200個,其中具5%統計顯著性的有40個,FDR設定為5%的情況下,你允許出現2個False positive。FDR與FWER最大的差別在於,他承認false positive的出現是常態,因此選擇接受它。當你選擇的指標很多時,你應該採用FDR,詳情請見wiki

如果有些指標是正向的,有些指標是負向時,該怎麼辦呢?

假設今天FB做一個實驗,期望它對DAU和人均停留時長都有正向幫助,但實驗結果出來發現對DAU有正向幫助,但卻對人均停留時長有損害。這時候應該要怎麼辦呢?

  1. 重複確認你的實驗一切正確
  2. 確認是否有用戶組成改變問題導致 (Simpson Paradox)
  3. 假設上述都沒有問題,那就要做一個取捨。假設你認為短期間人均停留時長雖然有損害,但是相信DAU的增加會增加網路外部性,對未來的人均停留時長有幫助,那或許可以Launch。其實也就是在長短期間做一個抉擇。

Make business decision

如果您從測試中得到了結果,還有兩個問題:

  1. 你是否了解這一變化?
  2. 你想推出這個改變嗎?

如果您的更改對一部分用戶產生積極影響,但對其他用戶切片沒有影響或負面影響,該怎麼辦?你明白為什麼?(例如,英語與中文的粗體詞有不同的測試結果,因為粗體的中文很難閱讀)。

問自己幾個問題:為了證明這一變化,我是否具有Statistic Significance和Practical Significance?我是否了解實際對用戶體驗所做的更改?最後,它值得Launch嗎?

Some tips

一些原則與經驗:

  1. 實驗達到最小樣本量的前提下,實驗分析結論才能可靠。切勿一看到有統計顯著性,就提早結束實驗。
  2. AA測試能在一定程度上保證AB測試效果的可信度。
  3. 評估實驗結果好壞,不是對比每天的指標數據,而是看實驗週期內累計的指標差異。每天的數據是輔助你判斷 (Signed test)。
  4. 避免初期效應,實驗效果計算,一般拋棄第一個完整天數據。
  5. 小心Seasonality,旅行行業數據指標一般具有較強的周期性,實驗週期最好能夠覆蓋日常和周末。
  6. AB測試是有成本的,先小流量(比如10%、20%)測試,實驗運行穩定後再開大流量(50%);如遇線上故障,應先關閉流量,再排查原因,避免更大損失。
  7. 絕大部分實驗都不會對CTR、CVR、GMV有顯著提升效果,若發現這些指標有大幅度變動,需提高警惕,仔細排查數據確認(應去除極端值影響)。

--

--