【A/B測試】支付寶營銷策略效果分析
A/B測試常用于比較不同設(shè)計衩藤、運營方案的優(yōu)劣叠赦,以輔助決策纲缓。本分析以支付寶營銷活動為例,通過廣告點擊率指標(biāo)比較兩組營銷策略的廣告投放效果仰禽。
1.數(shù)據(jù)來源
本文所用數(shù)據(jù)集來自阿里云天池
該數(shù)據(jù)集包含三張表氮墨,分別記錄了支付寶兩組營銷策略的活動情況:
·emb_tb_2.csv: 用戶特征數(shù)據(jù)集
·effect_tb.csv: 廣告點擊情況數(shù)據(jù)集
·seed_cand_tb.csv: 用戶類型數(shù)據(jù)集
本分析報告主要使用廣告點擊情況數(shù)據(jù),涉及字段如下:
·dmp_id:營銷策略編號(源數(shù)據(jù)文檔未作說明吐葵,這里根據(jù)數(shù)據(jù)情況設(shè)定為1:對照組规揪,2:營銷策略一,3:營銷策略二)
·user_id:支付寶用戶ID
·label:用戶當(dāng)天是否點擊活動廣告(0:未點擊温峭,1:點擊)
2.數(shù)據(jù)處理
2.1 數(shù)據(jù)導(dǎo)入和清洗
import numpy as np
import pandas as pd
#載入數(shù)據(jù)
data=pd.read_csv(r'F:\data\ABtest\effect_tb.csv',header=None)
data.columns=["dt","user_id","label","dmp_id"]
#不需要第一列日志天數(shù)屬性數(shù)據(jù)猛铅,刪除該列
data=data.drop(columns='dt')
data.head(5)
image.png
data.shape
(2645958, 3)
#查看是否有重復(fù)值
data.nunique()
image.png
可以看到數(shù)據(jù)行數(shù)和用戶數(shù)不一致,需要檢查是否存在重復(fù)行
data[data.duplicated(keep=False)].sort_values(by=['user_id'])
有相當(dāng)多的重復(fù)行 需要進(jìn)行去重
data=data.drop_duplicates()
#檢查是否還存在重復(fù)項
data[data.duplicated(keep=False)]
image.png
檢查是否具有空值
data.info(null_counts=True)
image.png
可以看到?jīng)]有空值凤藏,無需進(jìn)行處理
data.describe()
image.png
未發(fā)現(xiàn)有奇異值奸忽,也無需進(jìn)行處理
##查看數(shù)據(jù)類型
data.dtypes
image.png
2.2樣本容量檢驗
在進(jìn)行A/Btest之前需要檢查樣本容量是否滿足最小樣本容量要求
可以借助網(wǎng)上的樣本量計算工具:https://www.evanmiller.org/ab-testing/sample-size.html
首先需要設(shè)定點擊率基準(zhǔn)線以及假設(shè)的提升比例,在這里將對照組的點擊率設(shè)為基準(zhǔn)線
# click rate of control group
data[data["dmp_id"] == 1]["label"].mean()
image.png
對照組的點擊率四舍五入取1.26%揖庄,假設(shè)新的營銷策略可以使點擊率提升一個百分點栗菜。由計算可得至少需要2167個樣本。
image.png
data['dmp_id'].value_counts()
image.png
可以看到兩種營銷策略的樣本量分別為41萬加和31萬加蹄梢,遠(yuǎn)大于所需樣本量的最小值.
# 保存清洗好的數(shù)據(jù)備用
# save it to file
data.to_csv("F:\data\ABtest\output.csv", index = False)
# reload data
# data = pd.read_csv("F:\data\ABtest\output.csv)
3.假設(shè)檢驗
先觀察幾組實驗的點擊率情況
print("對照組:",data[data['dmp_id']==1]['label'].mean())
print("營銷策略一:",data[data['dmp_id']==2]['label'].mean())
print("營銷策略二:",data[data['dmp_id']==3]['label'].mean())
image.png
可以看到策略一和策略二相較對照組在點擊率上都有不同程度提升疙筹。
其中策略一提升0.2個百分點,策略二提升1.3個百分點禁炒,只有策略二滿足了前面我們對點擊率提升最小值的要求而咆。
接下來需要進(jìn)行假設(shè)檢驗,看策略二點擊率的提升是否顯著幕袱。
a.零假設(shè)和備擇假設(shè)
假設(shè)對照組點擊率為p1暴备,策略二的點擊率為p2,則
零假設(shè) H0:p1>=p2; 備擇假設(shè) H1:p1< p2
b.分布類型凹蜂、檢驗類型和顯著性水平
樣本服從二項分布馍驯,樣本相互獨立,樣本量n>>30玛痊,總體均值和方差未知,所以采用z檢驗狂打。顯著性水平取0.01
3.1 方法一:公式計算
# 用戶數(shù)
n_old = len(data[data.dmp_id == 1]) # 對照組
n_new = len(data[data.dmp_id == 3]) # 策略二
# 點擊數(shù)
c_old = len(data[data.dmp_id ==1][data.label == 1])
c_new = len(data[data.dmp_id ==3][data.label == 1])
# 計算點擊率
r_old = c_old / n_old
r_new = c_new / n_new
# 總和點擊率
r = (c_old + c_new) / (n_old + n_new)
print("總和點擊率:", r)
image.png
# 計算檢驗統(tǒng)計量z
z = (r_old - r_new) / np.sqrt(r * (1 - r)*(1/n_old + 1/n_new))
print("檢驗統(tǒng)計量z:", z)
image.png
# 查α=0.05對應(yīng)的z分位數(shù)
from scipy.stats import norm
z_alpha = norm.ppf(0.05)
z_alpha
image.png
z_alpha = -1.64擂煞, 檢驗統(tǒng)計量z = -59.44,該檢驗為左側(cè)單尾檢驗趴乡,拒絕域為{z<z_alpha}对省。
所以我們可以得出結(jié)論:原假設(shè)不成立蝗拿,策略二點擊率的提升在統(tǒng)計上是顯著的。
3.2 方法二:python函數(shù)計算
直接用python statsmodels包計算z值和p值
import statsmodels.stats.proportion as sp
z_score, p = sp.proportions_ztest([c_old, c_new],[n_old, n_new], alternative = "smaller")
print("檢驗統(tǒng)計量z:",z_score,"蒿涎,p值:", p)
image.png
檢驗統(tǒng)計量z: -59.44168632985996 哀托,p值: 0.0
p值約等于0,p < α劳秋,與方法一結(jié)論相同仓手,拒絕原假設(shè)。
作為補(bǔ)充玻淑,我們再檢驗下策略一的點擊率提升是否顯著嗽冒。
# 策略一檢驗
z_score, p = sp.proportions_ztest([c_old, len(data[data.dmp_id ==2][data.label == 1])],[n_old, len(data[data.dmp_id == 2])], alternative = "smaller")
print("檢驗統(tǒng)計量z:",z_score,",p值:", p)
image.png