Jan Overgoor在Airbnb的博客Nerds上分享了這篇文章。通過案例講述了在利用A/B測試推動產品決策時應該注意的部分問題,如:A/B測試應該做多久、在情景中去解釋A/B測試的結果、為什么應該做A/A測試等。
為什么要做A/B測試?
測試能夠讓我們簡單而直接的進行因果推斷。如圖1,我們一般很難只是通過簡單的觀察來了解是否行為導致了結果或者行為的影響力有多大。
通常外界的影響因素比產品本身變化對測量指標的影響要大許多。用戶在工作日/周末、不同季節、不同天氣情況下、因為網頁廣告或主動探索觸達的產品都可能會表現出截然不同的行為模式。實驗測試的方法能夠幫助我們控制這些額外的因素。如在下圖2中展示了一個Airbnb采用實驗測試并最終拒絕的功能。Airbnb曾希望通過這個功能讓用戶在搜索結果中篩選產品的價位信息,但測試結果發現用戶使用這種篩選方式的頻率反而不如原有的篩選器。
在Airbnb如何進行的A/B測試
目前市場上有著許多的公司提供進行優秀的A/B測試工具,也有部分公司將內部的測試系統開源提供給他人使用如,Cloudera的Gertrude, Etsy的Feature,以及Facebook的PlanOut等。
Airbnb所提供的服務有著一定的特異性:首先,用戶不需要注冊/登錄以獲取服務,因此很難講用戶和行為捆綁在一起;其次,用戶在預定房間的過程中更換實驗的設備(PC和手機);另外,預定的過程可能會長達數天,因此需要等待時間以確定用戶完成/放棄預定流程;最后,預定的成功還取決于空房的數量以及其主人的響應與否,而這些因素是Airbnb所不能掌控的。綜合考慮這些因素后,Airbnb自建了用于實驗的A/B測試系統。
A/B測試中通常以點擊率或轉化率作為評價的指標。在Airbnb,預定的流程同樣很復雜:首先,旅客需要搜索獲得房間的信息,然后再聯系相關的房主;接下來,房主房主將決定是否接受旅客的需求;然后,旅客才能真正預約到房間。除此之外,還有其他的路徑能夠進行預約---旅客可以不需要聯系房主就能預約某些房間,或者提交預約需求后直接到達最后一步。預約流程中的四個步驟如圖3所示。盡管在測試過程中需要考慮4個階段間的轉化,但Airbnb將從搜索到最后預定的整體轉化率作為測試的主要指標。
A/B測試需要持續多久?
對于在線的A/B測試而言,普遍的疑惑在于需要進行多長的時間來收集數據結果并由此得出結論。對于使用P值作為‘終止符’的實驗而言,應該在實驗進行之前就已經預估好了樣本量和效應量,因此可以及時停止實驗。但如果你只是持續監測實驗的進程和P值的變化,那么即使在不存在顯著效應的時候,你有也機會觀察到顯著的影響。另外一個常見的錯誤則是因為沒有及時觀察到顯著效應而過早地結束測試。
下圖4中展示的是Airbnb所進行的一次實驗。新版中將搜索界面中價格篩選工具的范圍從300改到1000美元。
在圖5中展示了A/B測試隨著時間推進的結果。上部分的線條展示的為改版效果(新版/舊版-1),而底部的線條為隨時間變化的p值。可以看到的是,p值的曲線在7天后達到所謂的0.05的統計學顯著,此時的改版的效應值為4%。如果A/B測試到這里結束,則可能的出的結論是新版比舊版對預約的達成有著顯著的促進作用。但Airbnb維持了測試繼續進行,而最終可以看出測試得出的結果是新舊版篩選器對預約的達成全無影響,效應值的變化基本可以歸為是統計噪音。
為什么Airbnb沒有在數據達到0.05顯著時停止A/B測試?因為就Airbnb而言,這樣在早期觀察到的顯著差異隨時間變化成為無差異的現象并不罕見。可能的原因有很多:1.預約的流程普遍會比較長,所以測試早期快速完成的預約會對整個測試結果有著較大的影響;2.傳統的顯著值可能并不適用于現在動輒成千上萬的用戶測試;3.監控測試的進程意味著每多一次測算p值,也多一點兒收獲一個低于0.05的p值的可能。
講一些題外話,熟悉Airbnb網站的用戶可能會注意到它現在采用的正是新版的篩選器。盡管A/B測試的結果表明新版篩選器并不會提升預約的數量,但確實有部分用戶會希望有這樣的篩選器能夠更快找到高端房源,因此Airbnb決定在不損害已有數據的情況下,為這些用戶做出改變。
回到正題:一次A/B測試應該運行多久?為了防止二類(存偽)錯誤,最好的做法是能夠在測試開始前便確定好新版需要達到的最低效果,并根據樣本量(每日新增用戶)和期望的顯著值計算好測試需要進行的時間。Evan Miller就提供了這樣一個在線計算工具:點擊打開。
還有一個問題在于,通常很難確定新版應該要有多大的效果或者會有怎樣的效果:有可能它會帶來巨大的成功,然而由于測試時間過長而耽誤了發布以至于損失過多的利益;或者也有可能A/B測試會導致產品BUG,則越早停止測試越好。
有時候也會碰到測試結果在預定時間之前便觸及顯著水平的情況。所以在P值之外建立一個新的測試指標就顯得很有必要了。如同前文中所述的案例,可以看到在測試首次達到顯著水平的時候,效應量(新/舊-1)的圖線走勢看起來并沒有完全飽和。有時候這樣的直覺思維有利于判斷某個顯著結果是否已經穩定下來嗎,而這樣的直覺通常需要以懷疑主義對待早期的顯著結果。這就意味著,在最測試的早期采用較低的p值來判斷測試結果的顯著性,而隨著更多的數據進入,二類錯誤的可能性開始降低,則可以隨之提高接受結果的p值。
Airbnb通過模擬測試獲得動態的P值曲線來判斷一個早期的顯著值是否值得信任。通過在模擬Airbnb的經濟生態中引入各種變量以獲得不同情況下的效果量和置信度,并以此為依據判斷新的產品設計是否存在真的影響。下圖6中展示了某次模擬測試所得到的決策邊界(注意這個示例是在某些特定變量所得到的曲線,并不能直接適用到其它的情況)。
對測試結果進行情景化的解釋
A/B測試中需要避免的另一個問題是習慣性的將測試結果當做一個整體來看待。一般而言,從某個固定的測量維度來評估測試的結果是沒錯的,這樣做通常可以避免在多個維度中挑選最符合“需要”的數據,而故意忽視不符合假設的結果。但同樣的,只是單純的考慮一個維度也意味著脫離了情景來看待數據,而有時候這些不同的情景可能完全改變你對測試結果的解釋。
舉個例子來說,2013年Airbnb對搜索頁進行了改版設計。對于Airbnb而言,搜索頁算是業務流程中最基礎和重要的頁面了。因此,能否準確的確定改版的效果是非常關鍵的。在下圖7中可以看到搜索頁改版前后的變化:新版中更加強調了房源的圖片(Airbnb為房主提供專業的攝影師以獲得這些圖片)和標記了房源所在位置的地圖。
Airbnb為改版項目投入了許多的資源,設計人員預測新版肯定會表現得更好,定性的研究也表明確實如此。盡管不直接向全部用戶發布新版可能意味著大量的利益損失,但Airbnb還是延續著其‘測試文化’推進了針對搜索頁的A/B測試以評估其真正的效果。
在等待了足夠長的時間過后,A/B測試的結果反饋出新版并沒有帶來更多的預約達成。這當然是難以接受的,所以Airbnb的數據分析員決定從情景出發,將數據細分到不同的情景中來判斷究竟為什么改版沒有帶來足夠的效果。事實證明,問題都處在Internet Explorer上了:如圖8中所示,除了來自IE的訪問以外,新版在其它主流瀏覽器上的表現都是優于舊版的。在修復相關的問題后,源自IE的數據也有了超出2%的增長。
除了告訴我們在做QA的時候要尤其注意IE以外,這個案例也強調了從多個維度對測試結果進行解釋的價值。你可以根據瀏覽器、國家、用戶類型等多個維度分解數據來源進行分析。但需要注意的是,不要為了找到‘顯著’的結果而刻意去分解數據。
為什么要做A/A測試?
最后,在A/B測試中人們常犯的一個錯誤在于自以為測試在理想的狀態中進行。不論是使用自建的還是第三方測試系統,都應該盡量避免這種想法:測試系統很可能反應的并不是完全的真實。導致這些差異的原因可能是測試系統本身的問題或是你沒有正確地使用它。避免這種錯誤的方法就是:當你看到某個特別理想的結果的時候,假設它是有問題的,然后通過排除其他可能的原因來證明它是準確的。
A/A測試就是用于這些檢測的簡便方法:A組和B組使用相同的產品版本,如果二者的結果表現出顯著差異則意味著A/B測試的結果差異是由于A/B組自身而不是產品的差異所導致的。如圖9所示,如果測試系統是正常/使用正確的,那么A/A測試通常會反饋出無差異的結果(當然如果將數據分解到不同的維度來檢測,則你總會在某個維度上看到一些顯著的結果)。
Airbnb通過不斷的A/A測試來針對自建測試系統的潛在問題。在某次測試中,Airbnb檢測了A/B組間樣本量差異的影響。圖10中列出了在全部用戶間取不同比例作為A/A測試的兩組間所得到的實驗結果。可以看到當兩組的樣本量相同的時候,測試的結果反饋出無顯著差異;而當兩組的樣本量存在明顯先差異(25/75)的時候,測試反饋了顯著的結果。Airbnb檢測了這一結果的原因,發現這與其測試系統對未登錄用戶的分組有關。盡管這一錯誤是Airbnb自建的測試系統所特有的,但這個案例也表明了A/A測試的重要性和價值。
總結
嚴格控制的實驗是產品研發過程中強有力的決策工具。希望這篇文章能夠幫助大家更有效地進行A/B測試。
首先,確定測試運行時間的最好方式是提前計算好預期的顯著值所需要的樣本量。如果測試在早期就反饋了理想的結果,最好是帶著懷疑的態度等待測試運行結束。靈活的利用p值將有利于進行產品決策:在早期采用較低的p值(如0.01),然后隨著測試的進行而逐漸提高p值(如0.05)。
第二,從不同的情景中去理解測試的結果是非常重要的。你應該嘗試將數據分解到不同的維度,然后再去理解不同維度下產品的效果。但是需要注意的是,A/B測試的目的在于為了優化產品決策,而不是為了最優化測試結果。優化測試結果通常導致為了獲得一定短期利益的機會主義決策。
最后,驗證你所使用的測試系統是否如你所期望的一樣工作。如果A/B測試反饋的結果有問題或者是過于理想,你都應該仔細核驗它。最簡單的方式就是進行一次A/A測試,重復進行A/A測試有利于了解測試系統的工作原理,并幫助對數據結果進行更全面的解釋。
PS. Jan Overgoor在原文中更多的使用的是‘Experiment(即,實驗)’這個名詞。在翻譯過程中統一以‘A/B測試’來表述。
拓展閱讀
Airbnb的另一名數據專家Bar Ifrach詳細描寫了他們如何通過機器學習預測(個性化的搜索結果展示)房主和旅客的偏好來提高預約的達成率:How Airbnb uses machine learning to detect host preferences?