美文网首页
A/B Tests with python(二)

A/B Tests with python(二)

作者: kaka22 | 来源:发表于2020-08-04 21:26 被阅读0次

6. 分析收集到的数据

6.1 加载收集到的数据

可以看到有两个数据集 control_data为不改变的数据 和 experiment_data为改变后的数据。 两者的数据结构是一样的:

  • 日期Date、
  • Pageviews数 (cooikes数 每天浏览页面的数量)、
  • Clicks数(点击按钮的数量)、
  • Enrollments数(点击后继续登录的数目)、
  • Payments数(登录14天后)
import math as mt
import numpy as np
import pandas as pd
from scipy.stats import norm

control=pd.read_csv("control_data.csv")
experiment=pd.read_csv("experiment_data.csv")
control.head()
experiment.head()

这次实验积累了37天的数据

6.2 健全性检查

在开始分析该实验结果之前,我们要做的第一件事是健全性检查。 这些检查有助于验证实验是否按预期进行,并且其他因素不会影响我们收集的数据。 这也可以确保数据收集正确。

本实验有3个不变指标:

  • 课程概述页面中的Cookie数 Number of Cookies in Course Overview Page
  • 免费试用按钮的点击次数 Number of Clicks on Free Trial Button
  • 免费试用按钮点击率 Free Trial button Click-Through-Probability

其中两个指标是简单计数:Cookie数量和点击次数,第三个指标是概率(CTP)。 如果上述指标在A/B两组存在显著性差异,那么最终结果是不可靠的。

(1)计数差异的检验

这一小节是对cooikes的绝对量和点击量的绝对量,分析在两个组的差异是否显著
虽然前边有说到对于同一用户多次进入页面的cooikes作为不同的处理,但是以下代码可以看出忽略了这个造成的数量差异(也就是用uv用户观测数量近似为pv页面观测数量)

pageviews_cont=control['Pageviews'].sum()
pageviews_exp=experiment['Pageviews'].sum()
pageviews_total=pageviews_cont+pageviews_exp
print ("number of pageviews in control:", pageviews_cont)
print ("number of Pageviewsin experiment:" ,pageviews_exp)
number of pageviews in control: 345543
number of Pageviewsin experiment: 344660

可以从结果看到,实验组和对照组的Pageviews近似一样,接下来我们需要通过假设检验的方法验证这种差异是随机性导致的。

我们期待的对照组pv数值,应该是总pv的一半(50%)。如果将样本分配到对照组这个事件看作是伯努利试验中成功的事件,同时我们希望这个概率是0.5。那么,分配给对照组的样本量(pv)应该满足二项分布的随机变量X。

当n很大时,基于中心极限定理,二项分布可以近似为正态分布,所以


p=0.5 #期待的概率值
alpha=0.05
p_hat=round(pageviews_cont/(pageviews_total),4)
sd=mt.sqrt(p*(1-p)/(pageviews_total))
ME=round(get_z_score(1-(alpha/2))*sd,4)
print ("置信区间的范围在",p-ME,"和",p+ME,"之间,样本值是",p_hat,)

置信区间的范围在 0.4988 和 0.5012 之间,样本值是 0.5006

可以看出,对照组样本比例是0.5006在置信区间范围内,所以pv(页面uv)这个指标是通过检验的,不存在显著差异。

同理,对于点击量clicks

clicks_cont=control['Clicks'].sum()
clicks_exp=experiment['Clicks'].sum()
clicks_total=clicks_cont+clicks_exp

p_hat=round(clicks_cont/clicks_total,4)
sd=mt.sqrt(p*(1-p)/clicks_total)
ME=round(get_z_score(1-(alpha/2))*sd,4)
print ("置信区间的范围在",p-ME,"和",p+ME,"之间,样本值是",p_hat)

置信区间的范围在 0.4959 和 0.5041 之间,样本值是 0.5005

(2) 概率差异的检验

置信区间的范围在 -0.0013 和 0.0013 之间,样本值是 0.0001

CTP指标也通过检验了! 不变指标全部通过检验。

6.3 核心-策略相关指标检验

本小节是A/B实验的价值所在,检验策略相关指标差异的显著性,即判断策略给公司带来的收益是显著的,还是不显著的,不显著可能就不值得上线。这种显著是正收益,还是负收益。

注意:给定数据中enrollments和payments两列有缺失值,所有在检验这部分相关指标时,真正有效的数据只有23天的

包括

  • 课程登记转化率(Gross Conversion):课程登记用户数(enrolled)/免费试用按钮点击量(clicks)
  • 全流程转化率(Net Conversion):课程付费用户数(paid)/免费试用按钮点击量(clicks)
#统计实验组和对照组各自有效的点击量
clicks_cont=control["Clicks"].loc[control["Enrollments"].notnull()].sum()
clicks_exp=experiment["Clicks"].loc[experiment["Enrollments"].notnull()].sum()
print ("number of Enrollments in control:", clicks_cont)
print ("number of Enrollments in experiment:" ,clicks_exp)
number of Enrollments in control: 17293
number of Enrollments in experiment: 17260
(1)检验课程登记转化率(Gross Conversion)如下:

这里检验仍是两总体比例之差检验


enrollments_cont=control["Enrollments"].sum()
enrollments_exp=experiment["Enrollments"].sum()
GC["d_min"] = 0.01
GC_cont=enrollments_cont/clicks_cont
GC_exp=enrollments_exp/clicks_exp
GC_pooled=(enrollments_cont+enrollments_exp)/(clicks_cont+clicks_exp)
GC_sd_pooled=mt.sqrt(GC_pooled*(1-GC_pooled)*(1/clicks_cont+1/clicks_exp))
GC_ME=round(get_z_score(1-alpha/2)*GC_sd_pooled,4)
GC_diff=round(GC_exp-GC_cont,4)
print("因为策略造成的指标变化:",GC_diff*100,"%")
print("置信区间: [",GC_diff-GC_ME,",",GC_diff+GC_ME,"]")

因为策略造成的指标变化: -2.06 %
置信区间: [ -0.0292 , -0.012 ]

可以看出差异的置信区间不包括0,所有策略造成的指标变化在统计上是显著的(statistically significant)

但是是否在现实意义上是显著的(practically significant),我们需要与D_min(业务上允许的最小值)比较

GC的D_min是0.01,实验差异大于0.01,所以这个差异在现实意义上也是显著的。

课程登记转化率(Gross Conversion)指标是显著减少的(-2.06%),在点击量差异不显著的情况下,说明实验策略有效的减少了课程登记用户数(enrolled),弹窗有效的阻挡了一部分用户登记课程!(这特么不就是业务的诉求么)

(2)全流程转化率(Net Conversion)如下:

与上边类似

#Net Conversion - number of payments divided by number of clicks
payments_cont=control["Payments"].sum()
payments_exp=experiment["Payments"].sum()

NC_cont=payments_cont/clicks_cont
NC_exp=payments_exp/clicks_exp
NC_pooled=(payments_cont+payments_exp)/(clicks_cont+clicks_exp)
NC_sd_pooled=mt.sqrt(NC_pooled*(1-NC_pooled)*(1/clicks_cont+1/clicks_exp))
NC_ME=round(get_z_score(1-alpha/2)*NC_sd_pooled,4)
NC_diff=round(NC_exp-NC_cont,4)
print("因为策略造成的指标变化:",NC_diff*100,"%")
print("置信区间: [",NC_diff-NC_ME,",",round(NC_diff+NC_ME,4),"]")

因为策略造成的指标变化: -0.49 %
置信区间: [ -0.0116 , 0.0018 ]

误差的置信区间包括0,在统计意义上不显著,NC的D_min是0.75%,在现实意义上也不显著。这也是我们的业务诉求,不希望全流程转化率(Net Conversion)降低太多,但是其在统计意义上不显著,说明可能会造成比较大的降低。

7. 双重检验-符号检验

8. 结论与存在的问题

(1)对于三个预期不会变的指标,全部通过检验,说明除了策略影响外,A/B两组没有受到外界不可知因素影响,这是后面结论可靠的前提。

(PS:实际AB实验中会可能出现抽样不均的情况,为了保证实验数据的变化仅仅是实验本身引起的,可以一次性抽取4,5组流量,选择任意两组不加策略空跑,监控核心指标数据,选取两组数据最接近的上实验(控制变量),即AA实验,相比之后检验,AA实验是预先控制好变量,减少不确定因素带来的误差)

(2)对于第二类评估指标的检验结果:

课程登记转化率(Gross Conversion)变化显著,即实验组课程登记数减少显著。

全流程转化率(Net Conversion)变化不显著(参数检验统计显著,现实业务不显著,符号检验不显著),说明策略没有影响到付费用户。

(3)存在的理解问题:

1.本次项目作为课设,虽然结合了实际的业务场景,但是数据,指标仍不足。例如策略目标是提高课程完成率,但是整个实验都没有这方面的数据...

2.5000作为估计标准差的样本量,怎么得来的?

3.在计算样本量时,Number of cookies who viewed the course overview page = PageViews 这个近似着实没看懂,到底是存在逻辑错误,还是实践与理论的鸿沟所致,毕竟运用的时候总追求那么精确和严谨。

4.未能理解pv作为分流单元的意义,即每当用户刷新一次页面,同一个cookie下的用户这次进入实验组,下次就可能进入对照组。

9. 建议与后续实验

提供建议并简要说明你的理由。

对你会开展的后续试验进行概括说明,你的假设会是什么,你将测量哪些指标,你的转移单位将是什么,以及做出这些选择的理由。

9.1 建议

暂时不实施该更改,还需要更深入的探究。

因为总转化率具有统计和实际显著性,这说明增加时间提醒的实验会为学生预先设定明确的期望,从而减少因为没有足够的时间而离开免费试 学,并因此受挫的学生数量;这符合我们最初的假设。

但是净转化率同时不具有统计和实际显著性,这说明增加时间提醒的实验有可能会在很大程度上减少继续通过免费试学和最终完成课程的学生数量;这不符合我们最初的假设。

9.2 后续试验

试验概述

我的感觉,网络课程的一个很大短板是缺乏学习的互动性,虽然有导师对项目进行修改,有助教在微信群里答疑,还有学习论坛等,这些沟通方式都是相对单向,不太及时,会让学员有点单打独斗的感觉,如果遇到问题或感到迷茫没有及时解答,可能很多学员就会半途而废了,但是如果导师一对一辅导也有点不太现实,这会大大增加课程成本,所以建议可以发挥互联网直播的作用来增加学习的互动性。

为了增大留存率,对于已经参加免费试学的学员,每一周可以增加一场直播互动,直播内容可以涉及导师面对面、课程答疑、优秀学员分享、职业规划等

假设

假设这种每周直播互动,能起到及时答疑、榜样鼓励、增加兴趣的作用,增加已参加免费试学学员最终付费率。

度量选择:

(1) 不变度量:点击了“免费试学”的用户id 数量

此试验是在用户点击免费试学,并且登录id后,再随机分配到实验组和对照组,因此选择点击“免费试学”的用户id数量做不变度量;

(2)评估度量:留存率= 14天后付费用户id数量 / 点击“免费试学”用户id数量

试验可能会影响14天后付费用户id数量(分子),因此留存率是个很好的评估指标;

转移单位:

用户id;因为试验对象是参加免费试学的用户,id
会被跟踪,且 id 数量不受试验内容影响。

相关文章

网友评论

      本文标题:A/B Tests with python(二)

      本文链接:https://www.haomeiwen.com/subject/gjterktx.html