近期整理ABtest相关知识点,并且做了一个电商项目,仅此记录,欢迎拍砖~
- 单尾检验,用普通p值检验方式
- 双尾检验,用逻辑回归import statsmodels.api as sm
目录:
- ABtest理解
- ABtest特点
- ABtest使用场景
- ABtest步骤
- ABtest项目实战
- 影响ABtest结果的因素
ABtest理解
ABtest指的是将多个版本在同一时间维度下随机选择具有相似性的几组用户进行测试,收集数据并分析哪个版本效果更佳。
ABtest特点
先验性:不同于后验结论
并行性:试验组与对照组同时实验,消除了因节假日、季节性的影响
科学性:科学流量分配,将相似用户均匀分配到试验组中,实验结果具有代表性
注意:不要只看整体表现,还要区分细分场景下实验结果的偏差。
ABtest使用场景
UI设计,产品新功能,页面布局,文案内容,个性化推荐,
ABtest步骤
现状分析提出假设——设定目标制定方案——设计与开发——分配流量进行测试——采集分析数据——发布新版本/改进设计方案/调整流量继续测试
下面结合某电商项目实例说明:
1.现状分析提出假设
电商网站想要提高用户转化率,即用户购买产品的数量
2.设定目标制定方案
设计新页面,通过AB测试评估新旧页面的效果
3.设计与开发
4. 分配流量
如何分配流量?可以通过专门分量的网站实现
不影响用户体验:UI设计、文案调整等,均匀分配。文案1,文案2,文案3-对照组;
不确定性较强的试验:新功能,小流量测试,减少用户体验影响。新版本小流量,老版本大流量对照组。要保证小流量特征具有代表性,因为要将小流量推广至100%;
希望收益最大化试验:运营活动。活动1大流量,活动2大流量,无活动小流量对照组;
采集分析数据
python实现
一、数据清洗与处理
1.引入包,导入ABtest实验数据集,了解数据集内容
import numpy as np
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv('ab_test.csv')
df.info()
df.describe()
df.head()
数据集共有5列:
userid是用户唯一标识,需要看下是否有重复
timestamp是发生行为的时间
group分为对照组和实验组
landing_page分为新页面实验组和旧页面对照组,需要看下两者是否对应
converted有两个值true和false,true代表页面转化了,false代表页面未转化
#一般转化率是多少
df['converted'].mean()#11.97%
#各字段是否存在缺失值
df.isnull().any()#均无缺失值
#判断分组group与落地页landing_page不对应的用户,属于异常值,需删除
df[((df['group']=='control') == (df['landing_page']=='old_page'))==False]['user_id'].count()#共3893条
df1 = df[((df['group']=='control') == (df['landing_page']=='old_page'))==False]
#删除
df2 = df.drop(index = df1.index)
df2.info()#还剩290584,294478-3893=290585,说明还存在数据异常
#删除后检验一遍
df2[((df2['group']=='control') == (df2['landing_page']=='old_page'))==False]['user_id'].count()
#0,说明删除成功,异常不在这两个字段中,所以看下user_id
df['user_id'].nunique() #290583,说明userid有重复值
df2[df2['user_id'].duplicated()]#user_id为773192用户有重复值
df2 = df2.drop_duplicates()#删除
df2[df2['user_id'] == 773192]#检验
二、数据分析
(df2['landing_page']=='new_page').mean()#用户看到新页面概率为:50%,说明试验和对照组平均分布
p_old = df2[df2['group'] == 'control']['converted'].mean()#对照组转化率:12.04%
p_new = df2[df2['group'] == 'treatment']['converted'].mean()#试验组转化率:11.88%
obs_diff = (p_new-p_old)#-0.001579
说明试验组与对照组转化率并没有明显变化,下面进行假设检验判断这个结论的显著性
假设检验1
零假设:新页面-旧页面<=0
备择假设:新页面-旧页面>0
假设零假设为真,看显著性
#进行随机抽样分布10000次,得到均值差
diff = []
for i in range(10000):
df_sample = df2.sample(df2.shape[0],replace=True)
con = df_sample[df_sample['group'] == 'control']['converted'].mean()
tre = df_sample[df_sample['group'] == 'treatment']['converted'].mean()
diff.append(tre-con)
diff = np.array(diff)
null_var = np.random.normal(0,diff.std(),size = diff.size)
(null_var>obs_diff).mean()#p = 0.9056
通过中心极限定理可知,抽样分布得到的均值差符合正态分布,构建一个正态分布模型。通过找出零假设分布中大于实际差异的那部分比值,从而计算出了 p 值。模拟样本中模拟差异值大于检测样本中观察差异值比例为90%+,也就是说p值是即新页面-旧页面<=0零假设成立的概率,由于p值远大于𝛼=0.05 ,不具备统计显著性,因此不能拒绝零假设,即不能排除旧页面转化率高于新页面转化率的可能。
假设检验2
逻辑回归:每行值其实就是转化与不转化的差别,用逻辑回归将对照组和试验组作为虚拟变量,计算p值。
df2[['control','treatment']] = pd.get_dummies(df['group'])
df2 = df2.drop('control',axis = 1)#以control作为基准列
df2['intercept'] = 1
df2.rename(columns = {'treatment': 'ab_page'},inplace=True)
#以converted做因变量,ab_page试验组or对照组做自变量,进行逻辑回归
lm = sm.Logit(df2['converted'],df2[['intercept','ab_page']])
res = lm.fit()
res.summary()
解释:
(1)可以看出,其他变量不变情况下,当control变为treatment时,转化率增加0.98,也就是说当treatment变为control,转化率增加1倍,可见变化不大。
(2)p=0.19远大于𝛼=0.05,因此不能拒绝零假设。
这里与假设检验1不同的是,逻辑回归的假设是双尾
其他因素是否影响转化率?
考虑用户国家或地区对转化率的影响
df4 = pd.read_csv('/Users/xy/Desktop/countries.csv')
df3 = pd.merge(df2,df4,on = 'user_id')#将两个表以userid为主键连接
df3['country'].unique()#array(['US', 'CA', 'UK'], dtype=object)
df3[['US','CA','UK']] = pd.get_dummies(df3['country'])
df3 = df3.drop('US',axis =1)#以US为基准列
lm2 = sm.Logit(df3['converted'],df3[['intercept','CA','UK']])
res2 = lm2.fit()
res2.summary()
解读:当CK和UK从0变为1时,转化率分别为1.05和1.04倍,变化不大。P值也是远大于0.025,因此均不能排除 𝐻0:𝛽1=0 的零假设。即国家列和转化率存在不相关的可能性。
结论:
本项目主要对电商网站ABtest进行数据统计,主要分析新旧页面的转化率以及其他因素的影响。
通过以上分析可知,我们不能拒绝零假设,即不排除旧页面转化率高于新页面的可能;也不能排除页面转化率与用户所在国家不相关的可能。考虑新页面成本问题,不建议更新新页面,同时也不用强调某个国家的重要性。
结语:
在现实情况中,影响页面转化的因素还有很多需要探究,包括用户年龄,非英语国家或科技欠发达地区,网页登陆时间和时长等,这些都有可能影响对新页面的接受程度和用户转化。建议可以采集相关数据,进行进一步的数据分析。
影响ABtest结果的因素
- 样本量不能过少
测试样本量过少很容易被异常样本所影响,但是样本量过大又会增加试错成本,尤其是重要改版,一般是从小流量开始逐步放大测试流量。因此在实验前,要预估样本量。样本质量:分流处的样本是否有效 - 样本质量:分流处的样本是否有效
当实验结果十分理想化,需要确定是样本本身造成的还是实验造成的。解决办法就是AA测试。比如将90%样本作为对照组,10%作为试验组,再从90%中分出10%的对照组2和10%的对照组3去进行AA测试。 - 实验时间的长短
一般来说电商购买行为受周末、工作日影响较大,周期应该至少是7天;
如果是UI改版影响用户体验的测试,会给用户2-3天的适应期;在考察实验结果。
以上,是对ABtest学习的总结,如有疑问欢迎留言学习~如需源数据,请留言! - 实验是否受到多个试验并行性影响
参考:
http://help.appadhoc.com/zh/introduction/what.html
https://www.zhihu.com/question/20045543大佬讲的多个试验相互影响还有待研究
https://www.jianshu.com/p/8fa49d40b16b
https://zhuanlan.zhihu.com/p/108916194
https://www.jianshu.com/p/c6df75dbb2fa