↑ 關注 + 星標 ,每天學Python新技能
後臺回復【大禮包】送你Python自學大禮
作者:蘿蔔
今天給大家分享一篇AB測試乾貨~
本文會將原理知識穿插於代碼段中,相關代碼和數據集空降文末可以獲取。
前言在電商網站 AB 測試非常常見,是將統計學與程序代碼結合的經典案例之一。儘管如此,裡面還是有許多值得學習和注意的地方。
A/B 測試用於測試網頁的修改效果(瀏覽量,註冊率等),測試需進行一場實驗,實驗中控制組為網頁舊版本,實驗組為網頁新版本,實驗還需選出一個指標來衡量每組用戶的參與度,然後根據實驗結果來判斷哪個版本效果更好。
通過這些測試,我們可以觀察什麼樣的改動能最大化指標,測試適用的改動類型十分廣泛,上到增加元素的大改動,下到顏色小變動都可使用這些測試。
背景在本次案例研究中,我們將為教育平臺 「 不吹牛分析網 」 分析 A/B 測試的結果,以下是該公司網站的客戶漏鬥模型:瀏覽主頁 > 瀏覽課程概述頁面(課程首頁) > 註冊課程 > 付費並完成課程
越深入漏鬥模型,分析網就會流失越多的用戶(正常現象),能進入最後階段的用戶寥寥無幾。為了提高參與度,提高每個階段之間的轉化率,z哥試著做出一些改動,並對改動進行了 A/B 測試,我們將幫z哥分析相關測試結果,並根據結果建議是否該實現頁面改版。
因為利用 Python 進行 A/B 測試在每個數據集上的使用大同小異,所以我們這裡只展示課程首頁的A/B測試過程,其餘頁面的數據集會一併提供給大家作為練習。
Python實戰數據讀入import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font',**{'family':'Microsoft YaHei, SimHei'})
# 設置中文字體的支持
# 實現 notebook 的多行輸出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity ='all' #默認為'last'
course = pd.read_csv('course_page_actions.csv')
course.info(); course.sample(5)參數說明:
action:用戶行為,view--僅瀏覽;enroll--瀏覽並註冊duration:瀏覽界面時長(瀏覽越久,可能越感興趣,就越有可能註冊)註冊率分析點擊率 (CTR: click through rate)通常是點擊數與瀏覽數的比例。因為網站頁面會使用 cookies,所以我們可以確認單獨用戶,確保不重複統計同一個用戶的點擊率。為了進行該實驗,我們對點擊率作出如下定義:CTR: 單獨用戶點擊數 / 單獨用戶瀏覽數,這一需要注意的點可以使用 pandas 中的 nunique() 函數來快捷完成
同理,實驗組的計算方式相同,結果分析如下:
根據已有數據,我們通常會猜測會不會是新界面更加能夠吸引用戶停留並瀏覽,從而達到用戶瀏覽時間越長,就越有可能註冊課程
瀏覽時長分析可視化分析這裡的我們將使用 seaborn 結合 markdown 公式的方式來實現快捷又強大的數據可視化
結果分析
新界面的註冊率有所提高,而瀏覽時長方面均呈現輕微的右偏實驗組的瀏覽時長平均值比控制組高 15mins 左右,方差差別不大所以我們可以初步判斷新改版的課程首頁更吸引用戶,後續將進行假設檢驗來進一步驗證我們的猜想
假設檢驗我們將從控制組和實驗組中各抽取一定數量的樣本來進行假設檢驗,下面是置信水平 α 的選擇經驗:
樣本量過大,α-level 就沒什麼意義了。為了使假設檢驗的數據樣本更加合理,我們可以使用分層抽樣。Python 沒有現成的庫或函數,可以使用前人的輪子。
from mysampling import get_sample
# df: 輸入的數據框 pandas.dataframe 對象
# sampling:抽樣方法 str
## 可選值有 ["simple_random","stratified","systematic"]
## 按順序分別為: 簡單隨機抽樣、分層抽樣、系統抽樣
# stratified_col: 需要分層的列名的列表 list,只有在分層抽樣時才生效
# k: 抽樣個數或抽樣比例 int or float
## (int, 則必須大於0; float,則必須在區間(0,1)中)
## 如果 0< k <1, 則 k 表示抽樣對於總體的比例
## 如果 k >=1, 則 k 表示抽樣的個數;當為分層抽樣時,代表每層的樣本量
data =get_sample(df=course, sampling='stratified',
stratified_col=['group'], k=300)
data.sample(4); data.info()因為總體未知,所以我們可以使用兩獨立樣本 T 檢驗,其實雙樣本 Z 檢驗也能達到類似的效果
# 總體未知,可採用兩獨立樣本T檢驗
from scipy import stats
exp_duration = data.query('group == "experiment"')['duration']
con_duration = data.query('group == "control"')['duration']
print('兩獨立樣本 T 檢驗...')
stats.ttest_ind(a=exp_duration, b=con_duration)
print('-'*45)
print('雙樣本 Z 檢驗...')
import statsmodels. api as sm
sm.stats.ztest(x1=exp_duration, x2=con_duration)不難發現,有時雙樣本 Z 檢驗同樣可以達到兩獨立樣本 T 檢驗的效果。
綜述,我們將拒絕零假設,接受 「 新界面的瀏覽時長顯著不同於(高於)舊界面 」 的這個假設。
AB測試的不足但 A/B 測試也有不足之處。雖然測試能幫你比較兩種選擇,但無法告訴你你還沒想到的選擇,在對老用戶進行測試時,抗拒改變心理、新奇效應等因素都可能使測試結果出現偏差。
抗拒改變心理:老用戶可能會因為純粹不喜歡改變而偏愛舊版本,哪怕從長遠來看新版本更好。新奇效應:老用戶可能會覺得變化很新鮮,受變化吸引而偏愛新版本,哪怕從長遠看來新版本並無益處。所以在設計 A/B 測試、基於測試結果得出結論時都需要考慮諸多因素。下面總結了一些常見考慮因素:
要做出最佳決策,需選用最佳指標(如營收 vs 點擊率);應進行足夠的實驗時長,以便解釋天/周/季度事件引起的行為變化;轉化率需具備現實指導意義(推出新元素的開支 vs 轉化率提高帶來的效益);對照組和實驗組的測試對象要有一致性(兩組樣本數失衡會造成辛普森悖論等現象的發生)。代碼&數據集下載https://alltodata.cowtransfer.com/s/93491d4160e541