ABtest知识点与实战项目

近期整理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()
df.info().png

df.head().png

数据集共有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]#检验
重复值.png

二、数据分析

(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)
image.png
#以converted做因变量,ab_page试验组or对照组做自变量,进行逻辑回归
lm = sm.Logit(df2['converted'],df2[['intercept','ab_page']])
res = lm.fit()
res.summary()
image.png

image.png

解释:
(1)可以看出,其他变量不变情况下,当control变为treatment时,转化率增加0.98,也就是说当treatment变为control,转化率增加1倍,可见变化不大。
(2)p=0.19远大于𝛼=0.05,因此不能拒绝零假设。
这里与假设检验1不同的是,逻辑回归的假设是双尾


image.png
其他因素是否影响转化率?

考虑用户国家或地区对转化率的影响

df4 = pd.read_csv('/Users/xy/Desktop/countries.csv')
image.png
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为基准列

image.png
lm2 = sm.Logit(df3['converted'],df3[['intercept','CA','UK']])
res2 = lm2.fit()
res2.summary()

image.png
image.png

解读:当CK和UK从0变为1时,转化率分别为1.05和1.04倍,变化不大。P值也是远大于0.025,因此均不能排除 𝐻0:𝛽1=0 的零假设。即国家列和转化率存在不相关的可能性。

结论:

本项目主要对电商网站ABtest进行数据统计,主要分析新旧页面的转化率以及其他因素的影响。
通过以上分析可知,我们不能拒绝零假设,即不排除旧页面转化率高于新页面的可能;也不能排除页面转化率与用户所在国家不相关的可能。考虑新页面成本问题,不建议更新新页面,同时也不用强调某个国家的重要性。

结语:

在现实情况中,影响页面转化的因素还有很多需要探究,包括用户年龄,非英语国家或科技欠发达地区,网页登陆时间和时长等,这些都有可能影响对新页面的接受程度和用户转化。建议可以采集相关数据,进行进一步的数据分析。

影响ABtest结果的因素

  1. 样本量不能过少
    测试样本量过少很容易被异常样本所影响,但是样本量过大又会增加试错成本,尤其是重要改版,一般是从小流量开始逐步放大测试流量。因此在实验前,要预估样本量。样本质量:分流处的样本是否有效
  2. 样本质量:分流处的样本是否有效
    当实验结果十分理想化,需要确定是样本本身造成的还是实验造成的。解决办法就是AA测试。比如将90%样本作为对照组,10%作为试验组,再从90%中分出10%的对照组2和10%的对照组3去进行AA测试。
  3. 实验时间的长短
    一般来说电商购买行为受周末、工作日影响较大,周期应该至少是7天;
    如果是UI改版影响用户体验的测试,会给用户2-3天的适应期;在考察实验结果。
    以上,是对ABtest学习的总结,如有疑问欢迎留言学习~如需源数据,请留言!
  4. 实验是否受到多个试验并行性影响

参考:
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容