注意,你所做的 A B 實驗,可能是錯的!

2022-09-10 17:09:34 字數 4329 閱讀 2051

對於 a/b 實驗原理認知的缺失,致使許多企業在業務增長的道路上始終在操作一批「錯誤的 a/b 實驗」。這些實驗並不能指導產品的優化和迭代,甚至有可能與我們的初衷背道而馳,導致「負增長」。

在 a/b 實驗不斷走紅的今天,越來越多的企業開始意識到 a/b 實驗的重要意義,並試圖通過 a/b 實驗,前置性地量化決策收益,從而實現增長。然而,當你和其他業務夥伴談及 a/b 實驗時,你總能聽到這樣的論調:

「這事兒很簡單,做個實驗就行了。準備兩個版本,在不同渠道裡發版,然後看看資料。」

「把使用者按照 did(device_id)尾號奇偶分流進實驗組和對照組,然後看看資料表現。」

不可否認,這部分企業的確走在前沿,初步擁有了 a/b 實驗的思維。然而令人遺憾的是,他們操作的所謂「a/b 實驗」,其實並不具備 a/b 實驗應有的功效。

更令人遺憾的是,他們似乎對此並不知曉。

對於 a/b 實驗原理認知的缺失,致使許多企業在業務增長的道路上始終在操作一批「錯誤的 a/b 實驗」。這些實驗並不能指導產品的優化和迭代,甚至有可能與我們的初衷背道而馳,導致「負增長」。

因此,為了能夠更好地明白什麼是 a/b 實驗,我們不妨先來了解幾種錯誤的 a/b 實驗。

典型表現

「使用者抽樣不科學」是錯誤 a/b 實驗的第一宗罪。操作這種錯誤 a/b 實驗的企業常採取以下做法:

簡單地從總體流量中抽取 n%用於實驗,不考慮流量分布,不做分流處理(例如:簡單地從總體流量中任意取出 n%,按照 id 尾號單雙號把使用者分成兩組)。

錯在哪兒

不同應用市場/渠道的使用者常常帶有自己的典型特徵,使用者分布具有明顯區別。對總流量進行「簡單粗暴」地抽樣也有著同樣的問題——分流到實驗組和對照組的流量可能存在很大的分布差異。

實際上,a/b 實驗要求我們,盡可能地保持實驗組和對照組流量分布一致(與總體流量也需保持分布一致),否則得出的實驗資料並不具有可信性。

為什麼要保持分布一致呢?我們不妨來看乙個問題:

某大學由兩個學院組成。

直覺上來說,許多人會覺得,男生錄取率總體上會高於女生。然而事實並不是這樣,讓我們來看看實際數字:

從上表可以看出,儘管兩個學院男生錄取率都高於女生,但綜合考慮兩個學院的情況時,男生的總體錄取率卻要低於女生。這種現象在統計學中被稱為辛普森悖論。

辛普森悖論由英國統計學家 e.h 辛普森於 1951 年提出。其主要內容是:幾組不同的資料中均存在一種趨勢,但當這些資料組合在一起後,這種趨勢消失或反轉。其產生的原因主要是資料中存在多個變數。這些變數通常難以識別,被稱為「潛伏變數」。潛伏變數可能是由於取樣錯誤造成的。

在 a/b 實驗中,如果實驗組和對照組的樣本流量分布不一致,就可能產生辛普森悖論,得到不可靠的實驗結果。

分流是 a/b 實驗成功與否的關鍵點,在早期企業還不具備過硬研發能力情況下,想要真正做對 a/b 實驗,最佳方法是借助第三方實驗工具中成熟的分流服務。

火山引擎 a/b 測試長期服務於抖音、今日頭條等頭部網際網路產品,分流服務科學可靠,並且能夠支撐億級 dau 產品進行 push 實驗,在高併發場景下保持穩定,幫助我們從總體流量中更加均勻地分流樣本,使實驗更科學。

典型表現

接入了實驗工具,a/b 實驗就能做對了嗎?也不盡然。許多實驗者在進行實驗操作時,將有關聯性的實驗放置在不同的實驗互斥層上,導致實驗結果不可信。

何謂「互斥層」?在火山引擎 a/b 測試中,「互斥層」技術是為了讓多個實驗能夠並行,不相互干擾,且都獲得足夠的流量而研發的流量分層技術。

假設我現在有 4 個實驗要進行,每乙個實驗要取用 30%的流量才能夠得出可信的實驗結果。此時為了同時執行這 4 個實驗就需要 4*30%=120%的流量,這意味著 100%的流量不夠同時分配給這 4 個實驗。那麼此時我只能選擇給實驗排序,讓幾個實驗先後完成。但這會造成實驗效率低下。試想一下,抖音每天有上千個實驗要進行,如果只能排隊挨號,抖音的實驗 schedule 恐怕要排個 10 年。

那麼有沒有辦法可以解決這個問題呢?

有,就是使用互斥層技術,把總體流量「複製」無數遍,形成無數個互斥層,讓總體流量可以被無數次復用,從而提高實驗效率。

各互斥層之間的流量是正交的,你可以簡單理解為:在互斥層選擇正確的前提下,流量經過科學的分配,可保證各實驗的結果不會受到其他互斥層的干擾。

在選擇互斥層的時候,實驗者應當要遵循的規則是:假如實驗之間有相關性,那麼實驗必須置於同一互斥層;假如實驗之間沒有相關性,那麼實驗可以置於不同互斥層。如果不遵循這一原則,那麼 a/b 實驗就會出問題。

錯在哪兒

那麼,問題究竟是出在了哪兒呢?

對於實驗需求旺盛的企業來說,互斥層技術完美解決了多個實驗並行時流量不夠用的問題。然而,亂選互斥層會導致實驗結果不可信。為什麼?舉個例子,現在我們想對購買頁面的購買按鈕進行實驗。

我們作出兩個假設:

針對上述兩個假設,我們需要開設兩個實驗:乙個針對按鈕顏色,乙個針對按鈕形狀。兩個實驗均與購買按鈕有關係,具有明顯的關聯性。這兩組實驗是否可以放在不同互斥層上呢?

**情況 1:相關實驗置於不同層 **

如下圖,我們把兩個實驗分別放置在兩層上,同時開啟兩個實驗。此時使用者 a 開啟了我們的購買頁面,進入到總體流量之中。在互斥層 1 裡,使用者被測試按鈕顏色的實驗命中,進入實驗組 red;在互斥層 2 裡,使用者被測試按鈕形狀的實驗命中,進入實驗組 round。

由圖可知,使用者 a 將受到「按鈕顏色 red」以及「按鈕形狀 round」兩個策略影響,我們無法判斷究竟是哪個策略影響了該使用者的行為。換句話說,由於兩個實驗存在關聯,使用者重複被實驗命中,實驗結果實際受到了多個策略的影響。這種情況下,兩個實驗的結果便不再可信了。

**情況 2:相關實驗置於同一層 **

換個思路,如果將上面的兩個實驗放置在同一層上,那麼使用者在進入實驗後便只會被乙個實驗命中。兩個實驗組均只受到乙個策略影響,實驗結果可信。

企業在進行 a/b 實驗時,工具是基礎設施,在實際業務,我們還需要結合具體的實驗場景,進行正確的實驗設計。

實驗結束後,只簡單地觀測實驗資料的漲跌,不考慮實驗結果是否顯著。

錯在哪兒

「顯著」是乙個統計學用詞,為什麼我們需要在評估實驗結果時引入統計學呢?

我們已經知道,a/b 實驗是一種小流量實驗,我們需要從總體流量中抽取一定量的樣本來驗證新策略是否有效。然而抽樣過程中,樣本並不能完全代表整體,雖然我們竭盡全力地進行隨機抽樣,但最終仍無法避免樣本和總體之間的差異。

了解了這一前提我們就能明白,在 a/b 實驗中,如果只對資料進行簡單的計算,我們對於實驗結果的判斷很可能會「出錯」(畢竟我們通過實驗觀測得到的是樣本資料,而不是整體資料)。

那麼,有什麼辦法去量化樣本與總體之間的差異對資料指標造成的影響呢?這就需要結合統計學的方法,在評估實驗結果時加入相應的統計學指標,如置信度、置信區間、統計功效等。

原則上,如果實驗結果不顯著(或說不置信),我們便不能判斷資料的漲/跌,是否是由實驗中採取的策略造成的(可能由抽樣誤差造成),我們也不能盲目地全量發布新策略/否定新策略。

a/b 實驗中的統計學原理是乙個較為龐大複雜的課題,介於篇幅,我們在此暫不做展開解釋。對這部分內容感興趣的讀者也可持續關注「位元組跳動資料平台」,我們在後期會推出相應內容來為大家進行講解。需要明確的一點是:評估 a/b 實驗,絕不僅僅是比較下實驗組和對照組的資料高低這麼簡單。

在實驗結果評估方面,好的實驗平台需要具備兩個特點:第一是可靠的統計策略,第二是清晰、完善的實驗報告。相較於市面上其他實驗工具,這兩個特點正是火山引擎 a/b 測試的優勢所在。

在統計策略方面,火山引擎 a/b 測試的統計策略長期服務於抖音、今日頭條等產品,歷經打磨,科學可靠;在實驗報告方面,從概覽至指標詳情,火山引擎 a/b 測試依託於經典統計學的假設檢驗方法,結合置信度、置信區間,幫助實驗者全方位的判斷實驗策略收益。

作為網際網路公司的新寵,a/b 實驗確有其獨到之處,但淺顯的實驗認知、錯誤的實驗方法,可能會致使企業在增長的道路上「反向前行」。此處讓我們借用一句經典的影視台詞吧:「發生這種事,大家都不想的。」

關聯產品火山引擎 a/b 測試

擺脫猜測,用科學的實驗衡量決策收益打造更好的產品,讓業務的每一步都通往增長。

你可能是自由的

序 一直都愛吃甜,甜到微微的澀。一直都想寫作,寫到天昏地暗。一直追逐自由,飛到天涯海角。孤獨的牧羊人在廣廖的草原牧著他的羊兒們,一生孤獨的他在3歲那年,父母已離開人世,剩下相依為命的奶奶也在10歲時離他而去,留下的只有兩頭羊兒。那一年,他哭的是那麼傷心,周圍嬉皮笑臉的人帶著乙個悲傷的面具,假惺惺的來...

可能是你見過最好的 React Hooks 庫

ahooks 1 是由螞蟻 umi 團隊 淘系 ice 團隊以及阿里體育團隊共同建設的 react hooks 工具庫。ahooks 基於 react hooks 的邏輯封裝能力,提供了大量常見好用的 hooks,可以極大降低 複雜度,提公升開發效率。ahooks 致力成為和 antd fusion...

差異可能是重要的

3位可儲存8個值。n位可儲存2 n值。因為乙個位元組的8位,乙個位元組可以存放2 8 256 的值。變數的大小對大量的資訊可以儲存 這是更大的變數可以容納更多的限制。我們將進一步解決這個問題的時候,我們進入不同型別的變數。第二,電腦有乙個有限的可用記憶體。每一次我們宣告乙個變數,那游離的記憶是只要用...