↑ 點擊上方 “凹凸數據” 關注 + 星標 ~
每天更新,大概率是晚9點
近期和團隊完成了一次AB測試,期間發現有些小夥伴對AB測試的理解還不夠透徹,剛好項目結束,結合實際情況,對AB測試做一次完整梳理,一方面算是覆盤實際項目,另一方面也算是個總結,以幫助更多的初級數據分析師快速掌握一些高階方法,促進晉升。
在做AB測試時,如果你沒有想過需要做一些假設檢驗,或者是統計分佈,那更應該好好看看這篇文章,這裏不僅是理論框架,以及實操中的注意事項,還有一個完整實例數據案例,建議收藏,在實操時可以跟着一步步操作,更能加強理解(文末附數據來源)。
本篇文章共分爲四個部分:走進AB測試、拓展AB測試、實戰AB測試以及代碼實操
首先進入第一部分:
1、走進AB測試
AB測試最早來源於醫學中的“雙盲測試”,即讓隨機產生的兩組病人,在不知情的情況下分別服用安慰劑和測試用藥,經過一段時間觀察,比較兩組病人是否具有顯著差異,以決定測試用藥是否有效。
針對定義分析可以看出,AB測試的關鍵要求爲“同一時間維度”和“成分相同(相似)的訪客羣組”,通過“收集用戶體驗數據和業務數據”,以“分析評估最好版本正式採用”。
AB測試的主要應用場景一共有兩個:界面設計、算法優化。
界面設計:調整界面顏色、按鈕顏色、界面外觀等因素,通過視覺效果達到吸引用戶的作用。
例如:在界面設計方面,早期重點推薦的是寫實風格,即頁面中的元素更逼真化,而近幾年的界面設計更偏向於扁平風格,雖然不是逼真如實物,也能讓用戶快速判斷圖標的作用;早期比較推崇的是單一顏色的界面風格,而近幾年,漸變色風格逐漸開始佔據一定地位。
算法優化:重點針對頁面中顯示的元素進行優化,如根據推薦算法向用戶推薦一些高頻搜索或者關注的內容,或者調整不同小版塊的出現順序或者所在位置,幫助用戶在最短時間內到達自己需要的功能。
例如:在算法上,在微信上使用任何主要功能時,操作基本上都控制在3個操作步驟以內。
AB測試從計劃開始到最終結束,主要分爲7個步驟。
想要推進AB測試,切不能一次性給全部用戶推進,如果最初設定的優化方向後期需要調整,那帶給公司的損失是不可估量的。
推進AB測試時,不僅要考慮推進節奏,還有注意以下三個問題:
經過以上的學習,只是掌握了AB測試中最爲基本的部分,要想深入理解AB測試,還需要對其進行深層次理解,接下來就開始第二部分:
2、拓展AB測試
在計劃推進AB測試時,如果在同一個上有多個優化方案,如在設計登錄界面的按鈕顏色時,可以一次性測試多個顏色對用戶的影響,此時需要推行的就是AB測試的升級版本——ABN測試了。
在進行AB測試時,可能會有各種情況會對最終的結果產生影響,因此,可以使用AA測試,以及其升級版本——ANB測試方式進行推進,避免偶然因素對目標產生誤差。
既然AB測試能爲產品的優化帶來極大的益處,那麼快速迭代就能幫助企業更快發展,對此,可以針對多個維度同時進行AB測試,這也就是爲什麼有些公司一年內能對同一款產品完成上千次AB測試。
什麼,你沒有感受到AB測試對你的影響,怎麼可能這麼多?那就對了,有些測驗版本也不能保證有效,故此只有一小部分用戶體驗到了,絕大部分用戶是不會知道的,作爲用戶的你就不會感受到了。
具體如何實施呢,看看下面的介紹:
但是這樣的測試有一個弊端,那就是每個測試羣中的用戶數量較少,不一定能反映真實用戶情況,故此,需要進行改進:
那麼作爲數據分析師,在AB測試中需要擔任什麼樣的角色,以及在每一個環節中,需要完成哪些任務,注意哪些問題呢?
以上,我們對數據分析的內容已經瞭解的比較深入了,也明確了作爲數據分析師在進行AB測試時需要完成哪些任務與要求,在本篇的最後,將會使用一個實際案例的數據帶你認識具體需要如何操作。
一起走進第三部分:實戰AB測試。
3、實戰AB測試
本部分先是對整個實操過程進行了一次框架講解,最後附所有代碼腳本、講解以及數據。
開始實操之初,先對數據的商業背景做一個完整的認識:
作爲數據分析師,一定要認真理解數據情況:
面對本次數據,經過查驗,需要作出以下優化:
結合上述對數據的理解,以及對業務環境的熟悉,制定了以下數據分析步驟:
在完成數據分析之後,最終得到了以下結論:
最終經過分析,建議延長本次AB測試的時間,繼續觀察再確定結論。
4、代碼實操
接下來是代碼實操部分:
1)導入相關Python庫
import numpy as np
import pandas as pd
2)導入數據並查看前5行
# 導入數據
df = pd.read_csv('ab_data.csv')
# 查看數據前5行
df.head()
3)查看數據形狀
# 查看數據大小
df.shape
(294478, 5)
4)查看數據信息
# 查看數據信息
df.info()
5)查看缺失值
# 查看缺失值
df.isnull().sum() # 沒有缺失值
6)基於業務理解校驗數據
# 查看對於treatment和 new_page,或者control和old_page會出現不一致的行
df.loc[(df['group'] == 'treatment') != (df['landing_page'] == 'new_page')].count()
7)剔除無效數據
# 去除無效數據,並將其賦值到df2中
df2 = df.loc[~((df['group'] == 'treatment') != (df['landing_page'] == 'new_page'))]
df2.count()
8)校驗重複值
# 查看是否有重複數據
df2.user_id.nunique() # 從用戶ID確定有重複數據
# 查看重複的用戶ID,以及相關信息
df2[df2['user_id'].duplicated(keep=False)] # 重複的用戶ID爲773192
9)刪除重複值,並查看數據情況
# 刪除重複值
df2 = df2.drop_duplicates(subset=['user_id'], keep='first') # 保留重複項中的第一項
# 查看df2的形狀
print(df2.shape)
# 查看df2中是否還有重複值
print(df2.user_id.nunique())
(290584, 5)
290584
10)計算用戶轉化率
# 整體轉化率
df2['converted'].mean() #整體轉化率爲11.96%
0.11959708724499628
# 新頁面轉化率
df2[df2['landing_page'] == 'new_page']['converted'].mean() # 新頁面的轉化率爲11.88%
0.11880806551510564
# 舊頁面轉化率
df2[df2['landing_page'] == 'old_page']['converted'].mean() # 舊頁面的轉化率爲12.04%
0.1203863045004612
# 用戶收到新頁面的概率
df2[df2['landing_page'] == 'new_page'].shape[0] / df2.shape[0] # 用戶收到新頁面的概率爲50%
0.5000619442226688
通過以上數據可以看出:整體頁面轉化率爲11.96%,新頁面轉化率爲11.88%,舊頁面的轉化率爲12.04%,用戶收到新舊頁面的概率參半。
看似使用舊頁面效果更好,是本身就是如此,還是由於一些隨機因素導致的呢?對此需要進行顯著性檢驗:
11)設計AB測試
由於目標是新頁面轉化率高於舊頁面轉化率,設計原假設和備擇假設如下:
H0: P_new - P_old <= 0
H1: P_new - P_old > 0
# 新頁面轉化率
p_new = df2[df2['landing_page'] == 'new_page']['converted'].mean()
p_new
0.11880806551510564
# 舊頁面轉化率
p_old = df2[df2['landing_page'] == 'old_page']['converted'].mean()
p_old
0.1203863045004612
# 新頁面數量
n_new = df2[df2['landing_page'] == 'new_page'].shape[0]
n_new
145310
# 舊頁面數量
n_old = df2[df2['landing_page'] == 'old_page'].shape[0]
n_old
145274
# 引入SciPy庫
from scipy.stats import norm
# 計算顯著性檢驗Z值
z_score = (p_old - p_new) / np.sqrt(p_old * (1 - p_old) / n_old + p_new * (1 - p_new) / n_new)
z_score
1.3109271488301917
# 計算置信區間
norm.ppf(1-0.05)
1.6448536269514722
結論:由於z_score=1.31小於norm.ppf(1-0.05)=1.64,落在95%的置信區間中,所以無法拒絕原假設,建議延長測試時間,繼續觀測情況。
以上,是對AB測試做完了一次完整的梳理,歡迎大家繼續關注。
如果對本文源數據、源碼感興趣,網頁打開鏈接直接下載
https://alltodata.cowtransfer.com/s/b6eddb13746642
後臺回覆「進羣」,加入讀者交流羣~
點擊紅字「積分」,可瞭解積分規則~