A/B Tests with python(一)

2020-08-04  本文已影响0人  kaka22

参考链接:AB Testing With Python - Walkthrough Udacity's Course Final Project
深入学习AB测试(一)-AB Testing With Python[项目实战]
优达学城A/B测试项目

对应课程链接:商业分析 A/B 测试

1. Udacity's A/B Testing Course

这个链接是优达学院Udacity 发布的很棒的免费课程 A/B Testing, 也叫作拆分测试, 用于测试网站或移动应用程序潜在改进的在线实验。

Udacity的AB测试课程由Google开设,重点在于A / B测试的设计和分析。 该课程涵盖如何选择和表征指标以评估您的实验,如何设计具有足够统计能力的实验以及如何分析结果并得出有效结论。

2.实验概述

实验名称:“免费试用”筛选器 "Free Trial" Screener.
对Udacity的网站进行调整,其总体业务目标是最大限度地提高学生的课程完成率。

2.1 做出改动前的版本

有两个选项:“开始免费试用”和“访问课程资料”。

  1. 单击“开始免费试用”,将要求他们输入信用卡信息,然后他们将注册为该课程的付费版本的免费试用。 14天后,除非自动取消,否则将自动向他们收费。

  2. 单击“访问课程资料”,他们将可以免费观看视频并参加测验,但是他们将不会获得帮助或获得证书,也不会提交最终项目以供反馈。

2.2 实验做了哪些改动

测试了一项更改,即如果学生单击“开始免费试用”,则会询问他们有多少时间可用于该课程
如果学生填每周5个小时或以上,则将照常通过结帐流程。如果他们表示每周少于5个小时,则会出现一条消息,指示Udacity课程通常需要花费更多的时间才能成功完成课程,并说明学生可以免费获取课程资料。
此时,学生可以选择继续注册免费试用版,或免费获得课程资料。此屏幕截图显示了实验的样子。

2.3 实验假设

假设:改动可能会对学生提前提出更明确的期望,从而减少因没有足够时间而退出免费试用的学生数量,而不会显着减少继续参加免费试用并最终完成学习的学生数量。 如果这个假设成立,Udacity可以改善学生的整体体验,也可以为辅助老师减压,让他们专注于那些可以投入更多时间的用户。

2.4 实验详情

导流的单位是按cookie(网站为了辨别用户身份而储存在用户本地终端上的数据),尽管如果学生注册了免费试用版,则从该点开始使用用户ID对其进行跟踪。 相同的用户ID不能两次注册免费试用版。 对于未注册的用户,即使在访问课程概述页面时已登录,也不会在实验中跟踪其用户ID。

简单来说就是:对于一个课程网站,有一个免费体验课程的业务,以前直接点击"开始免费试用"就进入结账流程,现在做了一项修改,在点击后会询问有多少时间可用于该课程,5小时以上才会进入结账流程,否则只会提醒可以领取免费课程资料。做A/B test 的目的就是为了分析,这样的修改是否可以减少因没有足够时间而退出免费试用的学生数量,而不会显着减少继续参加免费试用并最终完成学习的学生数量。

3. 指标选择

一个成功的A/B实验应该有两种类型的指标:

  1. 不变指标
    原则上不能发生变化的指标,用来作为策略的健康检验,确保新上线的策略不会发生原则性错误。用来确保实验的变化确实是由策略造成的,就好比控制变量,在研究某一个自变量对因变量的影响时,需要控制其他变量一样。
  2. 评估指标
    希望变化的指标,这个和实验的产品或者商业目标有关。

补充:对于每一个指标,都需要声明一个Dmin——它标志着最小的变化,这对业务来说是非常重要的。例如,任何低于2%的转化率变化,即使在统计上是显著的,对企业来说也是不实际的。

指标的选择及理由:

  1. 不变指标
    1) Number of cookies(Cookie的数量): 浏览之后才可以考察变动的指标 所以无论是实验组还是对照组 浏览页面的数量应该是不变的

    2) Number of clicks(点击次数): 点击之后才可以考察变动的指标 所以无论是实验组还是对照组 点击按钮的数量应该是不变的

    3) Click-through-probalility(点进概率)= Number of clicks/Number of cookies : 分子、分母都不变 这个就很容易理解了

  1. "评估指标"
    选择评估指标要回到业务需求
    1) Gross conversion(总转化率)= Number of user-ids/Number of clicks
    业务需求:减少因没有足够时间而退出免费试用的学生数量 即 点击了按钮但是没有报名的数量希望减少
    期望:减小;因为我们假设这个时间提醒会为学生预先设定明确的期望,从而减少因为没有足够的时间而离开免费试学,并因此受挫的学生数量,即:分子会减小,分母不变,因此总转化率期望是减小。
    2) Net conversion(净转化率) = 14 天期限后付费用户 id 的数量/Number of clicks
    业务需求:不会显着减少继续参加免费试用并最终完成学习的学生数量 即 点击按钮后进行报名且14天后支付了的学生数量不希望减少
    期望:Net conversion(净转化率)期望结果:不变;因为我们期望最终通过免费试学和最终完成课程的学生数量不变(即分子不变),而分母也不变,即期望该指标不变
  2. 无关指标
    1)Number of user-ids(参加免费试学的用户id数量)
    对于指标 Number of user-ids 而言,实验组进行时间提醒后,可能会减少,因此不能作为不变指标;但是这种绝对数量的减少不宜作为评估指标,还是通过转化率这种相对指标更能体现实验组和对照组的区别。
    2)Retention (留存率)
    对于 Retention 而言,由于其分母为 Number of user-ids ,所以既不作为不变指标,也不作为评估指标。

关于 Retention (留存率)= 14 天期限后付费用户 id 的数量/Number of user-ids
我开始认为他也是评估指标 但是想了想 其分母是Number of user-ids 是一个变化的指标 这个就无法进行考察了 所以当做无关指标


4. 估算指标的基准值

在开始实验之前,我们应该知道这些指标在更改之前的行为——即它们的基准值是多少。

4.1 收集数据的估计值

Udacity对这些指标给出以下粗略估算(大概是从每日流量汇总中收集的)


# 构建一个数据字典 之后使用
baseline = {"Cookies":40000,
            "Clicks":3200,
            "Enrollments":660,
            "CTP":0.08,
            "GConversion":0.20625,
            "Retention":0.53,
            "NConversion":0.109313}

4.2 估计标准差

为了估计样本量和计算置信区间,应当估算相应指标的标准差。 标准差越大,就越难以获得显著的结果。

(1)缩放数据(Scaling)
假设每天访问课程介绍页面的样本(cookies)大小为5000个。(这个应该是给定实验组的流量大小)我们希望基于5000这个数值,估计一个标准差,用于评估指标。

因为我们用5000样本来估计标准差,所以其他的绝对量(点击量Clicks,登记数Enrollments)都应该进行等比的缩放,比例值指标保持不变。

#Scale The counts estimates
baseline["Cookies"] = 5000
baseline["Clicks"]=baseline["Clicks"]*(5000/40000)
baseline["Enrollments"]=baseline["Enrollments"]*(5000/40000)
baseline

缩放后的结果:

{
 'CTP': 0.08,
 'Clicks': 400.0,
 'Cookies': 5000,
 'Enrollments': 82.5,
 'GConversion': 0.20625,
 'NConversion': 0.109313,
 'Retention': 0.53
}

4.2.2分析估计值

因为每个客户都是独立的,是否选择也是独立分布,且只有选择和不选择两种选项,因此可以看作二项分布。二项分布中事件成功发生的概率为p,那么事件是否发生的变量X的方差为np(1-p)。
为了考察p的标准差(参考的链接都没有说清楚啊 看的我莫名其妙)
https://www.zhihu.com/question/269931988

所以得到评估指标的标准差为:

要注意一个问题:

unit of diversion(分流单元),被用来定义哪个用户或者触发那个事件会进行样本分流(实验组和对照组)。unit of diversion可以是一种独立标识,比如user_id或者cookie,也可以是一种基于事件的,比如page view(每当用户重新刷新页面时就会进行一次分流)。

只有当以上两者相等时才可以用上式对标准差进行估计, 如果不满足就需要依据经验来算。
我的理解是:分流单元就是页面或者别的一些变动导致流量的变动,只有发生了变动才会产生两种情况(发生或者不发生),这才能满足上述式子的前提是二项分布,这样才有意义。

对于总转化率
总转化率的基准概率可以通过注册免费试用版的用户数量除以点击免费试用版的Cookie数量得出。在这种情况下,分流单元(Cookies)就是用来区分样本并将其分配给对照组和实验组的元素,等于分析单元(单击的cookie),即公式的分母 计算总转化率(GC)。 在这种情况下,这种方差分析估计就足够了。

# Let's get the p and n we need for Gross Conversion (GC)
# and compute the Stansard Deviation(sd) rounded to 4 decimal digits.
GC={}
GC["d_min"]=0.01
GC["p"]=baseline["GConversion"]
#p is given in this case - or we could calculate it from enrollments/clicks
GC["n"]=baseline["Clicks"]
GC["sd"]=round(mt.sqrt((GC["p"]*(1-GC["p"]))/GC["n"]),4)
GC["sd"]
0.0202

对于留存率
留存-留存的基准概率是付费用户数(14天免费后注册)除以注册用户总数。 分析单元也就是分母是注册用户数。 在这种情况下,分流的单元不等于分析的单元(注册的用户),因此分析估计是不够的-如果我们有这些估计的数据,我们也希望凭经验估计此方差。

我觉得如果改动是大家都注册后报名过程中的变动,这时的分流单元就是用户的报名,留存率就会作为评估指标,此时留存率也可以按上述公式进行计算。
一个指标是否是评估指标还是要根据变动在哪里(分流单元是什么)和业务目标来决定的。

# Let's get the p and n we need for Retention(R)
# and compute the Stansard Deviation(sd) rounded to 4 decimal digits.
R={}
R["d_min"]=0.01
R["p"]=baseline["Retention"]
R["n"]=baseline["Enrollments"]
R["sd"]=round(mt.sqrt((R["p"]*(1-R["p"]))/R["n"]),4)
R["sd"]
0.0549

对于净转化率
净转化的基准概率是付费用户数除以点击免费试用按钮的Cookie数。 样本数量是单击的Cookie数。 在这种情况下,分析和转移的单位是相等的,因此可以使用上述公式。

5. 实验规模

5.1 样本量的大小

假设检验——这一篇文章就够了
推断统计:P值的前生今世

在这一点上,一旦对收集数据进行了估计(最重要的是,它们的估计方差),我们就可以计算所需的样本数量,以便我们的实验具有足够的统计功效和显着性。

给定\alpha= 0.05(显着性水平)和\beta= 0.2(功效),我们想估计实验中至少需要多少总页面浏览量。 该数量将分为两组:对照和实验。 可以使用 online calculator(挺好用的。。)或直接使用所需公式进行计算。

先解释一下α和β:



为了确定对照组和实验组的最小样本量,其提供I型错误概率:\alpha,功效:1-\beta。可以做出如下假设检验:H_0=P_{cont} - P_{exp} = 0 vs. H_1=P_{cont} - P_{exp} = d
通过假设检验可以得到如下样本大小(这里查了好久还是没有查到为什么这样,好像大家都是直接拿来用的?):

输入:I型错误概率:\alpha、功效:\beta、最小变化值d = D_{min}和收集数据估计的转换率\hat{p}
只需要计算Z的1- \alpha/21-\beta的分位数还有求出Sd1、Sd2就可以计算得到最下样本数量。

对应的python函数:

#Inputs: required alpha value (alpha should already fit the required test)
#Returns: z-score for given alpha
def get_z_score(alpha):
    return norm.ppf(alpha)

# Inputs p-baseline conversion rate which is our estimated p and d-minimum detectable change
# Returns
def get_sds(p,d):
    sd1=mt.sqrt(2*p*(1-p))
    sd2=mt.sqrt(p*(1-p)+(p+d)*(1-(p+d)))
    sds=[sd1,sd2]
    return sds

# Inputs:sd1-sd for the baseline,sd2-sd for the expected change,alpha,beta,d-d_min,p-baseline estimate p
# Returns: the minimum sample size required per group according to metric denominator
def get_sampSize(sds,alpha,beta,d):
    n=pow((get_z_score(1-alpha/2)*sds[0]+get_z_score(1-beta)*sds[1]),2)/pow(d,2)
    return n

下面尝试用一下在线计算器和python计算一下评估不同指标需要的最小样本量:
设定d_{GC} = 0.01d_{R} = 0.01d_{NC} = 0.0075

GC["d"]=0.01
R["d"]=0.01
NC["d"]=0.0075
  1. Gross conversion(总转化率)= Number of user-ids/Number of clicks

输入有\alpha= 0.05(显着性水平)和\beta= 0.2(功效)、\hat{p}_{GC} = 0.20625d_{GC} = 0.01

# Let's get an integer value for simplicity
GC["SampSize"]=round(get_sampSize(get_sds(GC["p"],GC["d"]),0.05,0.2,GC["d"]))
GC["SampSize"]
25835

得到的这个数字其实是需要的最小的点击按钮的数量。 浏览网页然后点击按钮的概率为: 3200/40000 = 8%。 因此需要的cooikes数量为 25835/0.08*2 = 645875。

GC["SampSize"]=round(GC["SampSize"]/0.08*2)
GC["SampSize"]
645875
  1. Net conversion(净转化率) = 14 天期限后付费用户 id 的数量/Number of clicks


# Getting a nice integer value
NC["SampSize"]=round(get_sampSize(get_sds(NC["p"],NC["d"]),0.05,0.2,NC["d"]))
NC["SampSize"]
27413.0

同理:需要的cooikes数量为274313/0.08*2 = 685325

NC["SampSize"]=NC["SampSize"]/0.08*2
NC["SampSize"]
685325

取两者的最大值685325。

5.2 持续的时间和曝光比例

假设每天的网页浏览量为80%(40000*80%=32000),则该实验的数据收集周期约为3周(685325/32000 = 22天)。

曝光流量比例要考虑两方面,风险和实验周期;

从风险上来说:

1) 对于用户来说,本试验只是询问用户每周能投入多少时间学习,不会对用户的身体、心理、财务等造成不良影响;收集的关于学习时间的数据,也不是敏感数据;

2) 对于网站来说,没有对数据库及后台改变,不用担心数据的丢失及由于后台的失误导致网页奔溃用户无法访问网页等大问题;因为只是多出了一个时间提示框,也没有对网页进行大的变化,因此也不必担心不同类型浏览器不符合的风险;

因此试验风险较小,可以考虑给出较高比例的的流量。

从实验周期上来说,每天页面总流量是4万,需要的总流量是68.5万,50%流量需要35天,100%流量需要18天;

综合考虑风险容忍度和试验周期,我选择了曝光75%的流量,持续时间23天的方案。

上一篇下一篇

猜你喜欢

热点阅读