一、A/B test 目的
檢驗產品或活動方案調整優化在某指標上是否有顯著改善效果。檢驗構建實驗組和對照組。之后,在后期的觀察中,通過一些統計方法,驗證效果的差異性是否顯著。
二、A/B test 原理
兩獨立樣本t檢驗(注意區分計算不同:兩總體均值檢驗、兩總體率值檢驗)
三、A/B test 流程
①明確目標:驗證實驗相比對照組是否有顯著性差異變化(提升或下降),如點擊率、轉化率、人均訂單量等等。
②選定指標:根據實驗目的和業務需求選定實驗結果好壞的評價指標。
一般分層級,一個核心指標+多個觀察指標。
核心指標用來計算需要的樣本量,以及度量我們這次實驗的效果。
觀察指標則用來度量,該實驗對其他數據的影響(比如對大盤留存的影響,對網絡延遲的影響等等)
③建立假設:建立零假設和備選假設。
零假設一般是實驗改動沒有效果,備選假設是有效果,即實驗組相比對照組有顯著性差異。
④計算樣本量:選取顯著性水平、功效值,根據公式計算實驗組所需最小樣本量。
樣本量與變異系數、功效(一般要求0.8~0.95)成正比,與提升度(一般小於0.05)成反比。
因此,當延長可接受的實驗周期累計樣本量還是不夠時,可以通過以下2種思路來降低樣本量要求。
(1)選擇變異系數較小的衡量指標;
(2)降低功效值要求,放寬提升度 。
注意:以下方法代入σ² 的是A和B的2個方差組合(點這里了解其它3種兩組率比較樣本量計算方法),相當於2倍方差,因此計算的也是A、B兩組總共需要的最小樣本量,假設檢驗時每組只需一半的樣本量即可。
,
注意:通常以用戶粒度來作為實驗單位。
(1)用戶粒度:這個是最推薦的,即以一個用戶的唯一標識來作為實驗樣本。好處是符合AB測試的分桶單位唯一性,不會造成一個實驗單位處於兩個分桶,造成的數據不置信。
(2)設備粒度:以一個設備標識為實驗單位。相比用戶粒度,如果一個用戶有兩個手機,那么也可能出現一個用戶在兩個分桶中的情況,所以也會造成數據不置信的情況。
(3)行為粒度:以一次行為為實驗單位,也就是用戶某一次使用該功能,是實驗桶,下一次使用可能就被切換為基線桶。會造成大量的用戶處於不同的分桶。強烈不推薦這種方式。
⑤收集數據:網站或APP的訪問者將被隨機分配對照組和實驗組,上線驗證,並收集數據。
流量分割:有分流和分層兩種思路。如果要同時上線多個實驗,分流流量不夠切,或者為了達到最小樣本量需要很長的實驗周期怎么辦?這也不現實。此時就可以考慮分層的思路,就是將同一批用戶,不停的隨機后,處於不同的桶。也就是說,一個用戶會處於多個實驗中,只要實驗之間不相互影響,我們就能夠無限次的切割用戶。
實驗周期:最小樣本量 / 實驗桶天均流量 。
注意:在做AB測試時,盡量設定一個測試生效期,這個周期一般是用戶的一個活躍間隔期。
線上驗證:(1)驗證實驗改動是否生效 ;(2)驗證必須分流時,同一用戶是否在一個桶里,否則數據就不置信了。
⑥檢驗分析:達到最小樣本量,查看看顯著性結果、功效。最好耐心觀察一段時間等結果穩定時再得出最終結果。
(1)描述三指標
(2)方差齊性檢驗
(3)比較t檢驗統計量或p值(一般,絕對值指標用t檢驗,”相對值指標“,即比率用Z檢驗)
四、A/B test簡單案例
實例背景簡述:
某司「猜你想看」業務接入了的新推薦算法,新推薦策略算法開發完成后,在全流量上線之前要評估新推薦策略的優劣。所用的評估方法是A/B test,具體做法是在全量中抽樣出兩份小流量,分別走新推薦策略分支和舊推薦策略分支,通過對比這兩份流量下的指標(這里按用戶點擊衡量)的差異,可以評估出新策略的優劣,進而決定新策略是否全適合全流量。
實例A/B test步驟:
選定指標:CTR
實驗組:新的推薦策略B
建立假設:新的推薦策略實驗組B可以帶來更多的用戶點擊。
計算樣本量:此處和大部分公司一樣缺少這一步。
收集數據:實驗組B數據為新的策略結果數據,對照組A數據為舊的策略結果數據。均為偽造數據。
檢驗分析(Python):利用 python 中的 scipy.stats.ttest_ind 做關於兩組數據的雙邊 t 檢驗,結果比較簡單。但是做大於或者小於的單邊檢測的時候需要將雙邊檢驗計算出來的 p-value 除於2 取單邊的結果與顯著性水平α=0.05進行比較。
注:大部分公司也只做了收集數據后三個描述指標的比較,未作假設檢驗。
我們先看看實驗組B和對照組A均值情況:
很明顯,實驗組B的均值 >對照組A的均值,但這就能說明實驗組B可以帶來更多的業務轉化嗎?還是僅僅是由於一些隨機因素造成的?
1 from scipy import stats 2 import numpy as np 3 import numpy as np 4 import seaborn as sns 5 6 A = np.array([ 1, 4, 2, 3, 5, 5, 5, 7, 8, 9,10,18]) 7 B = np.array([ 1, 2, 5, 6, 8, 10, 13, 14, 17, 20,13,8]) 8 print('策略A的均值是:',np.mean(A)) 9 print('策略B的均值是:',np.mean(B))
1 Output: 2 策略A的均值是:6.416666666666667 3 策略B的均值是:9.75
由於存在抽樣誤差,為了更加科學就需要進一步做個假設檢驗。因為我們是希望實驗組B效果更好,所以設置:
(1)原假設H0:B<=A
(2)備擇假設H1:B>A (一般研究者欲支持的結論設為備擇假設,其反面作為原假設),即單側檢驗
scipy.stats.ttest_ind(x,y)默認驗證的是x.mean()-y.mean()這個假設。為了在結果中得到正數,計算如下:
stats.ttest_ind(B,A,equal_var= False)
1 output: 2 Ttest_indResult(statistic=1.556783470104261, pvalue=0.13462981561745652)
根據 scipy.stats.ttest_ind(x, y) 文檔的解釋,這是雙邊檢驗的結果。
為了得到單邊檢驗的結果,需要將計算出來的 p-value 除於2 取單邊的結果與顯著性水平α進行比較。
顯著性水平α選定取0.05,計算的 p-value=0.13462981561745652,p/2 > α=0.05,未落在拒絕域,所以不能夠拒絕原假設,接受備擇假設H1:B>A成立。即暫時還不能夠認為實驗組B就一定能帶來多的用戶點擊。
五、A/B test需要注意點:
1、先驗性:通過低代價,小流量的實驗,在推廣到全流量的用戶。
- AB測試一定要從小流量逐漸放大
如果上線一個功能,直接流量開到50%去做測試,那么如果數據效果不好,或者功能意外出現bug,對線上用戶將會造成極大的影響。所以,建議一開始從最小樣本量開始實驗,然后再逐漸擴大用戶群體及實驗樣本量。
2、並行性:不同版本、不同方案在驗證時,要保證其他條件都一致。
- 用戶屬性一定要一致
如果上線一個實驗,我們對年輕群體上線,年老群體不上線,實驗后拿着效果來對比,即使數據顯著性檢驗通過,那么,實驗也是不可信的。因為AB測試的基礎條件之一,就是實驗用戶的同質化。即實驗用戶群,和非實驗用戶群的 地域、性別、年齡等自然屬性因素分布基本一致。
- 一定要在同一時間維度下做實驗
舉例:如果某一個招聘app,年前3月份對用戶群A做了一個實驗,年中7月份對用戶群B做了同一個實驗,結果7月份的效果明顯較差,但是可能本身是由於周期性因素導致的。所以我們在實驗時,一定要排除掉季節等因素。
分流
- 上線后驗證改動對用戶是否生效
用戶如果被分組后,未觸發實驗,我們需要排除這類用戶。因為這類用戶本身就不是AB該統計進入的用戶(這種情況較少,如果有,那在做實驗時打上生效標簽即可)
- 上線后驗證用戶不能同時處於多個組
如果用戶同時屬於多個組,那么,一個是會對用戶造成誤導(如每次使用,效果都不一樣),一個是會對數據造成影響,我們不能確認及校驗實驗的效果及准確性
- 如果多個實驗同時進行,一定要對用戶分層+分組
比如,在推薦算法修改的一個實驗中,我們還上線了一個UI優化的實驗,那么我們需要將用戶划分為4個組:A、老算法+老UI,B、老算法+新UI,C、新算法+老UI,D、新算法+新UI,因為只有這樣,我們才能同時進行的兩個實驗的參與改動的元素,做數據上的評估
3、科學性:是指不能直接用均值轉化率、均值點擊率等來進行AB test決策,應該通過置信區間、假設檢驗、收斂程度等數學原理進一步科學驗證得出結論。
- AB測試最后得出結論B組相對於A組某指標提升了多少一般是一個區間,比如說(1.4,1.9)或者(1.5%,1.7%)
- 如果實驗組最小樣本量不足該怎么辦
(1)優先考慮,流量分割時通過擴大分配的比例,拉長時間周期,累計獲得理想的最小樣本量。
(2)減少最小樣本量。通過(a)更改指標選擇變異系數小的指標,或(b)降低功效值要求、放大提升度來實現。
- 是否需要上線第一天就開始看效果?
達到最小樣本量時,可以查看顯著性結果、功效。最好繼續耐心觀察一段時間,結果穩定時得出最終結果。
另,由於AB-Test,會影響到不同的用戶群體,所以,我們在做AB測試時,盡量設定一個測試生效期,這個周期一般是用戶的一個活躍間隔期。如招聘用戶活躍間隔是7天,那么生效期為7天,如果是一個機酒app,用戶活躍間隔是30天,那生效期為30天
- 實際情況(如何改進)
樣本量計算這步,可能在部分公司不會使用,更多的是偏向經驗值;如果我們對總體均值區間估計范圍精度要求不高,最小樣本量計算其實不是一個必須的過程,當然樣本量越大這個范圍就越精確,但同時我們付出的時間成本也會越高。
假設檢驗這一步,部分公司可能也不會使用。
大部分公司,都會有自己的AB平台,產運更偏向於平台上直接測試,最后在一段時間后查看指標差異。
對於以上兩種情況,我們需要計算不同流量分布下的指標波動數據,把相關自然波動下的閾值作為波動參考,這樣能夠大概率保證AB實驗的嚴謹及可信度。
4、其它
- 網絡效應
這種情況通常出現在社交網絡,以及共享經濟場景(如滴滴)。舉個例子:如果微信改動了某一個功能,這個功能讓實驗組用戶更加活躍。但是相應的,實驗組的用戶的好友沒有分配到實驗組,而是對照組。但是,實驗組用戶更活躍(比如更頻繁的發朋友圈),作為對照組的我們也就會經常去刷朋友圈,那相應的,對照組用戶也受到了實驗組用戶的影響。本質上,對照組用戶也就收到了新的功能的影響,那么AB實驗就不再能很好的檢測出相應的效果。
解決辦法:從地理上區隔用戶,這種情況適合滴滴這種能夠從地理上區隔的產品,比如北京是實驗組,上海是對照組,只要兩個城市樣本量相近即可。或者從用戶上直接區隔,比如我們剛剛舉的例子,我們按照用戶的親密關系區分為不同的分層,按照用戶分層來做實驗即可。但是這種方案比較復雜,建議能夠從地理上區隔,就從地理上區隔。
- 學習效應
這種情況就類似,產品做了一個醒目的改版,比如將某個按鈕顏色從暗色調成亮色。那相應的,很多用戶剛剛看到,會有個新奇心里,去點擊該按鈕,導致按鈕點擊率在一段時間內上漲,但是長時間來看,點擊率可能又會恢復到原有水平。反之,如果我們將亮色調成暗色,也有可能短時間內點擊率下降,長時間內又恢復到原有水平。這就是學習效應。
解決辦法:一個是拉長周期來看,我們不要一開始就去觀察該指標,而是在一段時間后再去觀察指標。通過剛剛的描述大家也知道,新奇效應會隨着時間推移而消失。另一種辦法是只看新用戶,因為新用戶不會有學習效應這個問題,畢竟新用戶並不知道老版本是什么樣子的。
- 多重檢驗放大犯錯概率問題
這個很好理解,就是如果我們在實驗中,不斷的檢驗指標是否有差異,會造成我們的結果不可信。也就是說,多次檢驗同一實驗導致第一類錯誤概率上漲;同時檢驗多個分組導致第一類錯誤概率上漲。
舉個例子:
出現第一類錯誤概率:P(A)=5%
檢驗了20遍:P(至少出現一次第一類錯誤)
=1-P(20次完全沒有第一類錯誤)
=1- (1−5%) ^20
=64%
也就是說,當我們不斷的去檢驗實驗效果時,第一類錯誤的概率會直線上漲。所以我們在實驗結束前,不要多次去觀察指標,更不要觀察指標有差異后,直接停止實驗並下結論說該實驗有效。
【參考】
【3】各類統計檢驗方法大匯總
【4】統計學知識系列:一篇搞懂假設檢驗(ps:精煉的應用總結,檢驗統計量選擇邏輯有問題)
【5】史上最全AB-Test知識點(ps:最好的實踐應用總結)
【7】AB實驗中最小樣本量的計算 /樣本量估算(一):隨機對照試驗(兩組率)比較的樣本量計算方法
https://mp.weixin.qq.com/s?__biz=MzU5NDgyMjc0OQ==&mid=2247484789&idx=1&sn=633220ade76cf9fa3cf5192553bb56b0&chksm=fe7a1647c90d9f51058a853e71ffc2ceefd5b061031713baa84700a53b3db391d740ca3753b8&mpshare=1&scene=24&srcid=&sharer_sharetime=1573050285889&sharer_shareid=eb0f35d36ca2c67ef08aee2506048ecf&ascene=14&devicetype=iOS12.4.1&version=18000f2e&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&fontScale=100&exportkey=AXM2YsKg23Rr7ADoRjtMe1M%3D&pass_ticket=sMwSw%2F%2FPv3sZ8lD35yaIOREYv6RLIXBLsoHZEK9ryJyElrniTuKEr4Uw5zs1iQD7&wx_header=1
https://mp.weixin.qq.com/s?__biz=MzAwOTYyMDY3OQ==&mid=2650378381&idx=2&sn=0a9eef1ac32853e560f00e34bdd41eaa&chksm=8351ed25b42664330c302495cc81bd0853090e25e28eef840a7e6c760555b3145a2d08f22b03&scene=21#wechat_redirect