② 将用户流量对应分成几组,在保证每组用户特征相同的前提下,让用户分别看到不同的方案设计;
注意几个术语,这个在后面的实战代码中有用。在做AB testing的时候,一般分为control组和treatment组,其中control组看到的是老页面(old page),treatment组看到的是新页面(new page)。
③ 根据几组用户的真实数据反馈,科学的帮助产品进行决策;
通过分析用户使用的日志数据,来决定是扩大实验,还是继续修改方案,重新迭代。如果判定实验成功,则扩大实验范围。如果判定实验失败,终止本次实验,继续修改方案
3、AB testing实战
1)AB testing的统计学基础(独立双样本的假设检验)
关于假设检验这个知识点,我在前面的文章中已经详细介绍过,这里就不一一说明,截取了几张图片供大家参考,大家如果感兴趣,可以看一下这篇文章:https://blog.csdn.net/weixin_41261833/article/details/104623377
① ab testing
② 假设检验
③ 显著性水平
④ 统计量
2)AB testing演示的python代码
再进行代码演示之前,我们先对每个字段做一个说明:user_id是用户的id;timestamp 是用户访问页面的时间;group 表示把新的落地页分到treatment组、把旧的落地页分到了control组;landing_page表示的是落地页;converted 表示的是否转化,1表示转化(通俗的说:拿爱奇艺会员来说,普通用户是否转换为了VIP用户,1表示转换了,0表示未转换);
import pandas as pd --------------------------------------------------------- # 读取数据,查看前5行 df = pd.read_csv("ab_test.csv") df.head() --------------------------------------------------------- # 数据预览,查看数据有多少行、多少列 df.shape --------------------------------------------------------- # 查看数据中是否有空值 df.isnull().any() df.info() --------------------------------------------------------- # 查看数据中的错误行 print((True) != (True)) print((True) != (False)) print((False) != (True)) print((False) != (False)) """ true != true fasle treatment new_page true != false true treatment old_page false != true true control new_page false != false false control old_page """ # 下面这句代码,展示的就是group=treatment且landing_page=old_page和group=control且landing_page=new_page,这样的错误行; num_error = df[((df.group == "treatment")!=(df.landing_page == "new_page"))].shape[0] num_error --------------------------------------------------------- # 去掉错误行后,再次查看是否还存在错误行 print("没有删除错误行之前的记录数:", df.shape[0]) df2 = df[~((df.landing_page == "new_page")&(df.group == "control"))] df3 = df2[~((df2.landing_page == "old_page")&(df2.group == "treatment"))] print("删除错误行之后的记录数:", df3.shape[0]) print("错误行共有",str(df.shape[0]-df3.shape[0]),"条记录") num_error2 = df3[((df3.group == "treatment")!=(df3.landing_page == "new_page"))].shape[0] num_error2 --------------------------------------------------------- # 查看是否有重复行 print("数据的记录数为:", df3.user_id.shape[0]) print("将user_id去重计数后的记录数为:", df3.user_id.nunique()) """ 通过上述分析,可以看出:user_id中有一条记录数是重复的。接下来,我们可以找出这条重复的记录,并去重。 """ --------------------------------------------------------- # 查看重复的行 df3[df3.user_id.duplicated(keep=False)] # 去除重复的行 df4 = df3.drop_duplicates(subset=["user_id"],keep="first") df4.shape[0] --------------------------------------------------------- # 我们来看一下control组的转化率 control_converted = df4.query('group=="control"').converted.mean() control_converted # 再来看一下treatment组的转化率 treatment_converted = df4.query('group=="treatment"').converted.mean() treatment_converted """ 自己下去思考一下:根据上述结果,老页面的转化率比新页面的转换率好,是不是就可以说明老页面好呢? """ --------------------------------------------------------- # 进行独立两样本的假设检验 import statsmodels.stats.proportion as ssp converted_old = df4[df4.landing_page == "old_page"].converted.sum() converted_new = df4[df4.landing_page == "new_page"].converted.sum() n_old = len(df4[df4.landing_page == "old_page"]) n_new = len(df4[df4.landing_page == "new_page"]) data = pd.DataFrame({"converted":[converted_old, converted_new], "total":[n_old ,n_new]}) display(data) z_score, p_value = ssp.proportions_ztest(count=data.converted, nobs=data.total, alternative="smaller") print("Z值为:", z_score) print("P值为:", p_value) ---------------------------------------------------------
结果如下:
结果分析:通过上述的结果发现,P值为0.9,远大于0.05,也就是说,我们没有理由拒绝原假设,即只能接受原假设,也就是新老版本之间没有太大的差别。我们接下来要做的就是终止这次试验,继续优化自身的方案。
3)AB testing拓展
关于AB testing的相关知识,我们就简单说到这里,下面再次提供几个链接供大家参考学习:http://m.blog.itpub.net/31555699/viewspace-2653832/ ,https://www.jianshu.com/p/61e6c34d0704