A/Btest (A/B测试)的营销策略效果分析
目錄
- 前言
- 一、數(shù)據(jù)介紹
- 二、觀察數(shù)據(jù)
- 1.引入庫
- 2.讀入數(shù)據(jù)
- 3.觀察數(shù)據(jù)
- 三、計(jì)算效果
- 1.簡(jiǎn)單比對(duì)不同策略點(diǎn)擊率
- 2.觀察樣本容量
- 3.計(jì)算(以策略二組和對(duì)照組為例)
- 3.1 設(shè)定假設(shè)
- 3.2 計(jì)算方法
- 3.2.1 方法一:公式計(jì)算
- 3.2.2 方法二:Python函數(shù)計(jì)算
- 4.擴(kuò)展
- 4.1 擴(kuò)展一:策略一組和對(duì)照組對(duì)比
- 4.2 擴(kuò)展二:策略二組和策略一組對(duì)比
- 總結(jié)
前言
本文分析以支付寶營(yíng)銷活動(dòng)為例,通過廣告點(diǎn)擊率指標(biāo)比較兩組營(yíng)銷策略的廣告投放效果。
一、數(shù)據(jù)介紹
來自阿里天池:數(shù)據(jù)
用到的是:effect_tb.csv: Click/Non-click dataset.
這個(gè)csv文件主要用來記錄用戶是否對(duì)廣告進(jìn)行點(diǎn)擊。
二、觀察數(shù)據(jù)
1.引入庫
# import libraries import pandas as pd import numpy as nppd.set_option('float_format', lambda x: '%.4f' % x)2.讀入數(shù)據(jù)
# load data data = pd.read_csv('effect_tb.csv',header = None) data.columns = ["試驗(yàn)后天數(shù)","用戶編號(hào)","是否點(diǎn)擊","試驗(yàn)組別"]3.觀察數(shù)據(jù)
data.info() # table summary data.describe() # distinct count of columns data.nunique() #把重復(fù)用戶的用戶編號(hào)變成一個(gè)list去觀察 dup_userid=data["用戶編號(hào)"].value_counts()[data["用戶編號(hào)"].value_counts()>1].index.tolist()#查看是否都全部字段都重復(fù)的記錄 data[data.duplicated()]
雖然有重復(fù)的用戶id,但是可能在不用的時(shí)間(試驗(yàn)后幾天)去做這個(gè)測(cè)試,也可能被放在不同的組別(實(shí)驗(yàn)組別)、有不同的結(jié)果(是否點(diǎn)擊),我們都去驗(yàn)證一下。
用戶ID和【試驗(yàn)后天數(shù)】、【試驗(yàn)組別】重復(fù)的記錄條數(shù): 0
意味著一個(gè)用戶在不同天用了不同版本,簡(jiǎn)而言之,沒有一個(gè)用戶在同一天用一個(gè)版本。
可以不刪除數(shù)據(jù),因?yàn)槿绻凑沼脩艟幪?hào)去重了,會(huì)對(duì)整個(gè)對(duì)比有影響。(之后討論)
data.pivot_table(index = "試驗(yàn)組別", columns = "是否點(diǎn)擊", values = "用戶編號(hào)",aggfunc = "count",margins = True)三、計(jì)算效果
1.簡(jiǎn)單比對(duì)不同策略點(diǎn)擊率
#各組的點(diǎn)擊率: print("對(duì)照組點(diǎn)擊率:",data[data["試驗(yàn)組別"]==1]["是否點(diǎn)擊"].mean())print("一組試驗(yàn)點(diǎn)擊率:",data[data["試驗(yàn)組別"]==2]["是否點(diǎn)擊"].mean())print("二組試驗(yàn)點(diǎn)擊率:",data[data["試驗(yàn)組別"]==3]["是否點(diǎn)擊"].mean())
策略一組和策略二組都相對(duì)于對(duì)照組有提升,看起來策略二組提升得更多。
查看策略一組二組相對(duì)于參照組來說提升了多少
print("對(duì)照組點(diǎn)擊率:",data[data['試驗(yàn)組別']==1]['是否點(diǎn)擊'].mean())print("策略一相對(duì)對(duì)照組提升:",round((data[data['試驗(yàn)組別']==2]['是否點(diǎn)擊'].mean()-data[data['試驗(yàn)組別']==1]['是否點(diǎn)擊'].mean())*100,3))print("策略二相對(duì)對(duì)照組提升:",round((data[data['試驗(yàn)組別']==3]['是否點(diǎn)擊'].mean()-data[data['試驗(yàn)組別']==1]['是否點(diǎn)擊'].mean())*100,3))策略一提升了0.279%,策略二提升了1.364。
假定我們希望新的營(yíng)銷策略能讓廣告點(diǎn)擊率至少提升1個(gè)百分點(diǎn)才算提升。那么這里策略一不算是提升。我們研究策略二組的點(diǎn)擊率是否在置信區(qū)間內(nèi)有顯著提升。
2.觀察樣本容量
在進(jìn)行A/B測(cè)試前,需檢查樣本容量是否滿足試驗(yàn)所需最小值。
這里借助Evan Miller的樣本量計(jì)算工具:
Evan Miller鏈接
已知對(duì)照組點(diǎn)擊率為1.26%,假定我們希望新的營(yíng)銷策略能讓廣告點(diǎn)擊率至少提升1個(gè)百分點(diǎn)才算提升,顯著性水平α取5%,則算得所需最小樣本量為:2167。
data["試驗(yàn)組別"].value_counts()
兩組營(yíng)銷活動(dòng)的樣本量都滿足最小樣本量需求。
3.計(jì)算(以策略二組和對(duì)照組為例)
3.1 設(shè)定假設(shè)
接下來需要進(jìn)行假設(shè)檢驗(yàn),這里先查看一組點(diǎn)擊率的提升是否顯著。
零假設(shè)和備擇假設(shè)。記對(duì)照組點(diǎn)擊率為p0,策略二組點(diǎn)擊率為p2,則:
零假設(shè) H0: p0 ≥ p2 (對(duì)照組的點(diǎn)擊率大于等于策略一組)
備擇假設(shè) H1: p0 < p2 (對(duì)照組的點(diǎn)擊率小于策略一組)
分布類型、檢驗(yàn)類型和顯著性水平樣本服從二點(diǎn)分布,獨(dú)立雙樣本,樣本大小n>30,總體均值和標(biāo)準(zhǔn)差未知,所以采用Z檢驗(yàn)。顯著性水平α取0.05。顯著性水平α取0.05的單尾檢測(cè)(左側(cè))對(duì)應(yīng)的z值 = -1.64。
z值可以用python得出或者查看z-score表:
from scipy.stats import norm z_alpha = norm.ppf(0.05) # 若為雙側(cè),則norm.ppf(0.05/2)結(jié)果為z_alpha=-1.6448536269514729,統(tǒng)計(jì)上一般取-1.645,拒絕域?yàn)閧z <z_alpha }
3.2 計(jì)算方法
獨(dú)立雙樣本,樣本大小n>30,總體的均值和標(biāo)準(zhǔn)差未知的Z檢驗(yàn)的檢驗(yàn)統(tǒng)計(jì)量公式如下:
3.2.1 方法一:公式計(jì)算
# 用戶數(shù) n_old = len(data[data["試驗(yàn)組別"] == 1]) # 對(duì)照組 n_two = len(data[data["試驗(yàn)組別"] == 3]) # 策略二組# 點(diǎn)擊數(shù) c_old = len(data[data["試驗(yàn)組別"] == 1][data["是否點(diǎn)擊"] == 1]) c_two = len(data[data["試驗(yàn)組別"] == 3][data["是否點(diǎn)擊"] == 1])# 計(jì)算點(diǎn)擊率 r_old = c_old / n_old r_two = c_two / n_two#點(diǎn)擊率標(biāo)準(zhǔn)差 std_old=np.std(data[data["試驗(yàn)組別"] == 1]["是否點(diǎn)擊"]) std_two=np.std(data[data["試驗(yàn)組別"] == 3]["是否點(diǎn)擊"])# 總和點(diǎn)擊率 r = (c_old + c_two) / (n_old + n_two)print("轉(zhuǎn)化率的聯(lián)合率::", r)''' 結(jié)果: 轉(zhuǎn)化率的聯(lián)合率: 0.014429896833357214 '''按照公式計(jì)算:
z_two = (r_old - r_two) / np.sqrt(r * (1 - r)*(1/n_old + 1/n_two)) print("檢驗(yàn)統(tǒng)計(jì)量z:", z_two)''' 結(jié)果: 檢驗(yàn)統(tǒng)計(jì)量z: -59.66600946268368 '''z_one = -59.66600946268368 < -1.64,符合拒絕域?yàn)閧z<z_alpha}。
所以我們可以得出結(jié)論:原假設(shè)(對(duì)照組的點(diǎn)擊率大于策略一組)不成立,策略二點(diǎn)擊率的提升在統(tǒng)計(jì)上是顯著的。
3.2.2 方法二:Python函數(shù)計(jì)算
直接用python statsmodels包計(jì)算z值和p值。
proportions_ztest官方鏈接
難點(diǎn):
alternativestr The alternative hypothesis, H1, has to be one of the
following
- ‘two-sided’: H1: difference in means not equal to value (default)
- ‘larger’ : H1: difference in means larger than value
- ‘smaller’ : H1: difference in means smaller than value
p值約等于0,p < α,與方法一結(jié)論相同,拒絕原假設(shè)。
4.擴(kuò)展
4.1 擴(kuò)展一:策略一組和對(duì)照組對(duì)比
策略二組點(diǎn)擊率的提升是否顯著。
p1為策略一組,p0為對(duì)照組
- 零假設(shè) H0: p1 < p0 (策略二組相比于對(duì)照組無提升)
- 備擇假設(shè) H1: p1 ≥ p0 (策略二組相比于對(duì)照組有提升)
z_one < -1.64,,p < 0.05,拒絕原假設(shè),即策略一組相比于對(duì)照組有提升。
4.2 擴(kuò)展二:策略二組和策略一組對(duì)比
那么策略一和策略二相比呢?
p1為策略一組,p2為策略二組
因?yàn)閺闹暗慕Y(jié)果看起來策略二組比策略一組提升更多,那么我們先假設(shè)是這樣。
- 零假設(shè) H0: p2 <≥ p1 (策略二組相比于策略一組有提升)
- 備擇假設(shè) H1: p2 ≥ p1 (策略二組相比于策略一組無提升)
看一下樣本容量,算出這兩組對(duì)比所需最小樣本量為:2580。
這兩組樣本的容量符合要求。
p值約等于1,p > α(0.05),符合原假設(shè),即策略二組相比于策略一組有提升。
總結(jié)
- 策略一和策略二都相對(duì)于對(duì)照組對(duì)廣告點(diǎn)擊率有顯著提升效果。
- 策略二相對(duì)于策略一對(duì)廣告點(diǎn)擊率有顯著提升效果。
總結(jié)
以上是生活随笔為你收集整理的A/Btest (A/B测试)的营销策略效果分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当在浏览器中输入一个域名后,会发生什么
- 下一篇: 强强联手 汇丰银行和IBM合作开发量子金