AB 測試中的假設(shè)檢驗(yàn)與分層抽樣?。ǜ酱a和數(shù)據(jù)集)
今天由優(yōu)秀的蘿卜同學(xué)給大家分享一篇AB測試干貨~
本文會將原理知識穿插于代碼段中,相關(guān)代碼和數(shù)據(jù)集空降文末可以獲取。
前言
在電商網(wǎng)站 AB 測試非常常見,是將統(tǒng)計(jì)學(xué)與程序代碼結(jié)合的經(jīng)典案例之一。盡管如此,里面還是有許多值得學(xué)習(xí)和注意的地方。
A/B 測試用于測試網(wǎng)頁的修改效果(瀏覽量,注冊率等),測試需進(jìn)行一場實(shí)驗(yàn),實(shí)驗(yàn)中控制組為網(wǎng)頁舊版本,實(shí)驗(yàn)組為網(wǎng)頁新版本,實(shí)驗(yàn)還需選出一個指標(biāo) 來衡量每組用戶的參與度,然后根據(jù)實(shí)驗(yàn)結(jié)果來判斷哪個版本效果更好。
通過這些測試,我們可以觀察什么樣的改動能最大化指標(biāo),測試適用的改動類型十分廣泛,上到增加元素的大改動,下到顏色小變動都可使用這些測試。
背景
在本次案例研究中,我們將為教育平臺 “ 不吹牛分析網(wǎng) ” 分析 A/B 測試的結(jié)果,以下是該公司網(wǎng)站的客戶漏斗模型:瀏覽主頁 > 瀏覽課程概述頁面(課程首頁) > 注冊課程 > 付費(fèi)并完成課程

越深入漏斗模型,不吹牛分析網(wǎng)就會流失越多的用戶(正?,F(xiàn)象),能進(jìn)入最后階段的用戶寥寥無幾。為了提高參與度,提高每個階段之間的轉(zhuǎn)化率,z哥試著做出一些改動,并對改動進(jìn)行了 A/B 測試,我們將幫z哥分析相關(guān)測試結(jié)果,并根據(jù)結(jié)果建議是否該實(shí)現(xiàn)頁面改版。
因?yàn)槔?Python 進(jìn)行 A/B 測試在每個數(shù)據(jù)集上的使用大同小異,所以我們這里只展示課程首頁的A/B測試過程,其余頁面的數(shù)據(jù)集會一并提供給大家作為練習(xí)。
Python實(shí)戰(zhàn)
? 數(shù)據(jù)讀入
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsplt.rc('font',**{'family':'Microsoft YaHei, SimHei'})# 設(shè)置中文字體的支持# 實(shí)現(xiàn) notebook 的多行輸出from IPython.core.interactiveshell import InteractiveShellInteractiveShell.ast_node_interactivity ='all' #默認(rèn)為'last'course = pd.read_csv('course_page_actions.csv')course.info(); course.sample(5)

參數(shù)說明:
timestamp:瀏覽時間
id:用戶 id
group:用戶所屬組別
action:用戶行為,view--僅瀏覽;enroll--瀏覽并注冊
duration:瀏覽界面時長(瀏覽越久,可能越感興趣,就越有可能注冊)
? 注冊率分析
點(diǎn)擊率 (CTR: click through rate)通常是點(diǎn)擊數(shù)與瀏覽數(shù)的比例。因?yàn)榫W(wǎng)站頁面會使用 cookies,所以我們可以確認(rèn)單獨(dú)用戶,確保不重復(fù)統(tǒng)計(jì)同一個用戶的點(diǎn)擊率。為了進(jìn)行該實(shí)驗(yàn),我們對點(diǎn)擊率作出如下定義:CTR: 單獨(dú)用戶點(diǎn)擊數(shù) / ?單獨(dú)用戶瀏覽數(shù),這一需要注意的點(diǎn)可以使用 pandas 中的 nunique() 函數(shù)來快捷完成

同理,實(shí)驗(yàn)組的計(jì)算方式相同,結(jié)果分析如下:

根據(jù)已有數(shù)據(jù),我們通常會猜測會不會是新界面更加能夠吸引用戶停留并瀏覽,從而達(dá)到用戶瀏覽時間越長,就越有可能注冊課程
? 瀏覽時長分析
可視化分析
這里的我們將使用 seaborn 結(jié)合 markdown 公式的方式來實(shí)現(xiàn)快捷又強(qiáng)大的數(shù)據(jù)可視化


結(jié)果分析
新界面的注冊率有所提高,而瀏覽時長方面均呈現(xiàn)輕微的右偏
實(shí)驗(yàn)組的瀏覽時長平均值比控制組高 15mins 左右,方差差別不大
所以我們可以初步判斷新改版的課程首頁更吸引用戶,后續(xù)將進(jìn)行假設(shè)檢驗(yàn)來進(jìn)一步驗(yàn)證我們的猜想
? 假設(shè)檢驗(yàn)
我們將從控制組和實(shí)驗(yàn)組中各抽取一定數(shù)量的樣本來進(jìn)行假設(shè)檢驗(yàn),下面是置信水平 α 的選擇經(jīng)驗(yàn):
樣本量過大,α-level 就沒什么意義了。為了使假設(shè)檢驗(yàn)的數(shù)據(jù)樣本更加合理,我們可以使用分層抽樣。Python 沒有現(xiàn)成的庫或函數(shù),可以使用前人的輪子。
from mysampling import get_sample# df: 輸入的數(shù)據(jù)框 pandas.dataframe 對象#?sampling:抽樣方法?str## 可選值有 ["simple_random","stratified","systematic"]## 按順序分別為: 簡單隨機(jī)抽樣、分層抽樣、系統(tǒng)抽樣# stratified_col: 需要分層的列名的列表 list,只有在分層抽樣時才生效# k: 抽樣個數(shù)或抽樣比例 int or float## (int, 則必須大于0; float,則必須在區(qū)間(0,1)中)## 如果 0< k <1, 則 k 表示抽樣對于總體的比例## 如果 k >=1, 則 k 表示抽樣的個數(shù);當(dāng)為分層抽樣時,代表每層的樣本量data =get_sample(df=course, sampling='stratified',stratified_col=['group'], k=300)data.sample(4); data.info()

因?yàn)榭傮w未知,所以我們可以使用兩獨(dú)立樣本 T 檢驗(yàn),其實(shí)雙樣本 Z 檢驗(yàn)也能達(dá)到類似的效果
# 總體未知,可采用兩獨(dú)立樣本T檢驗(yàn)from scipy import statsexp_duration = data.query('group == "experiment"')['duration']con_duration = data.query('group == "control"')['duration']print('兩獨(dú)立樣本 T 檢驗(yàn)...')stats.ttest_ind(a=exp_duration, b=con_duration)print('-'*45)print('雙樣本 Z 檢驗(yàn)...')import statsmodels. api as smsm.stats.ztest(x1=exp_duration, x2=con_duration)
不難發(fā)現(xiàn),有時雙樣本 Z 檢驗(yàn)同樣可以達(dá)到兩獨(dú)立樣本 T 檢驗(yàn)的效果。

綜述,我們將拒絕零假設(shè),接受 “ 新界面的瀏覽時長顯著不同于(高于)舊界面 ” 的這個假設(shè)。
AB測試的不足
但 A/B 測試也有不足之處。雖然測試能幫你比較兩種選擇,但無法告訴你你還沒想到的選擇,在對老用戶進(jìn)行測試時,抗拒改變心理、新奇效應(yīng)等因素都可能使測試結(jié)果出現(xiàn)偏差。
抗拒改變心理:老用戶可能會因?yàn)榧兇獠幌矚g改變而偏愛舊版本,哪怕從長遠(yuǎn)來看新版本更好。
新奇效應(yīng):老用戶可能會覺得變化很新鮮,受變化吸引而偏愛新版本,哪怕從長遠(yuǎn)看來新版本并無益處。
所以在設(shè)計(jì) A/B 測試、基于測試結(jié)果得出結(jié)論時都需要考慮諸多因素。下面總結(jié)了一些常見考慮因素:
老用戶第一次體驗(yàn)改動會有新奇效應(yīng)和改變抗拒心理;
要得到可靠的顯著結(jié)果,需要有足夠的流量和轉(zhuǎn)化率;
要做出最佳決策,需選用最佳指標(biāo)(如營收 vs 點(diǎn)擊率);
應(yīng)進(jìn)行足夠的實(shí)驗(yàn)時長,以便解釋天/周/季度事件引起的行為變化;
轉(zhuǎn)化率需具備現(xiàn)實(shí)指導(dǎo)意義(推出新元素的開支 vs 轉(zhuǎn)化率提高帶來的效益);
對照組和實(shí)驗(yàn)組的測試對象要有一致性(兩組樣本數(shù)失衡會造成辛普森悖論等現(xiàn)象的發(fā)生)。
完整案例數(shù)據(jù)和代碼
鏈接:?
https://pan.baidu.com/s/16GPrkrf4Bb6NAwOGInoEJA??
提取碼:v8bq
