来源 | 斑马
增长团队有三宝:埋点、漏斗、AB测。本文给大家讲讲,AB测试系统如何从应用到搭建?
一、什么是AB测试?
A/B 测试是一种产品优化方法;为同一个优化目标制定两个方案,让同一部分用户中的一部分用户命中 A 方案,同时另一部分用户命中 B 方案,统计并比较不同方案的点击率、转化率等数据指标,通过不同方案的数据表现,在确定数据表现通过假设检验后,决定最终方案的实验方法。
二、AB测试的意义?
AB测试是支持数据决策最有力的工具。
以下为最基础的数据驱动流程,方案验证即为AB测试过程,实验才是检验真理的唯一标准。
- 数据收集
- 数据分析
- 发现问题
- 提出方案
- 方案验证
- 发布上线
三、AB测试实验需要满足两个特性
1. 同时性
两个策略是同时投入使用的,而不是AB两种策略分先后上线,这样会有其他因素影响。
2. 同质性
两个策略对应的使用群体需要保证尽量一致。
四、AB测试实验详解
1. 流量分配规则:正交与互斥
(1)正交实验
每个独立实验为一层,一份流量穿越每层实验时,都会随机打散再重组,保证每层流量数量相同。
(2)互斥实验
实验在同一层拆分流量,不论如何拆分,不同组的流量是不重叠的。
(3)什么情况下正交、互斥分配流量?
我们刚刚就用的正交流量分配方式,导致了错误的数据结果,如果那个实验我们用互斥的流量分配方法就完美的解决了这个问题。
AB测试实验中, 两个或多个实验内容相互影响则选择互斥方法分配流量,两个或多个实验内容不会相互影响则选择正交方法分配流量。
- 正交:可以节省流量;
- 互斥:可以让耦合的实验完美剥离开来不互相影响。
(4)举个例子
在详情页面上做两个实验:
- 其中一个是转化按钮颜色的AB测试实验;
- 另外一个是转化按钮文案的AB测试实验。
如果我们使用正交分配流量的方式会出现什么情况呢?
也就是流量同时命中实验一与实验二,最后展现在用户面前的就是如下图四种情况,这种情况我们是无法统计出准确的数据结果的,因为已经违背了单一变量原则。
这种最好使用互斥来分配流量,一部分用户命中实验一、另一部分用户命中实验二。
2. AB测试系统实验架构
AB测试系统实验架构包括: 应用层-实验层-策略层。
(1)应用层
应用层级别最好,应用层与应用层之间的流量是正交的。
(2)实验层
实验层是应用层子层,实验层与实验层之间的流量是互斥的。
(3)策略层
策略层是实验层子层,一个实验可以有多个策略,多个策略之间流量相互不影响。
举个例子:
- 应用:App客户端;
- 实验:购买按钮颜色;
- 策略:红色、橘色。
3. 创建实验
创建实验时一般先设置好实验条件和统计指标
实验条件:AB测试系统可以对一些条件的用户进行限制,城市、年级、新老用户、版本号、平台(ios、android、h5)。这里我们完全可以直接引入用户画像系统直接进行人群定向取做AB测试实验。传送门:
斑马:用户画像从搭建到应用实战 zhuanlan.zhihu.com
这个功能主要是针对满足这样实验条件的用户进行分流,如不满足这些条件则不分流,直接命中默认策略。默认策略是我们在创建策略时勾选的,如果用户不满足条件命中默认策略,这些用户产生的数据是不参与计算的,也就不会影响实验结果。
(1)城市、年级、新老用户
这几个条件很好理解,就是指用户所在城市、年级、新老,但需要用户登录才能拿到这样的信息。
如果设定了实验条件,用户处于非登录态怎么办呢?
非登录态的用户我们认为他是不满足实验条件的,所以会走默认策略,这样会避免一些不满足实验条件的用户却命中实验的可能。但为了保证同一个用户在登入登出看到的页面是相同的,所以这部分人即使登录后也会走默认策略。
但不是全部未登录用户都会这样,我们判断当前时间与未登录用户刚登录的时间点的差值是否大于两天。
如果大于两天我们会让他命中实验,进行分流,这样也是为了保证每天下载的大量用户也会命中AB测试的情况,达到一个平衡的状态。
(2)适用版本
这里的版本是针对客户端的AB测试提供的功能。
比如:Ios 在1.0.1 版本,Android在1.0.2版本上线一个AB测试实验。
如果不绑定版本号会出现什么情况?
因为版本发布,除强制升级外,用户还处于老版本。对于老版本的用户也会命中实验,但是这些用户并没有看到不同的策略,就会出现,AB测试系统分给用户A策略,但是用户看到的是B策略,最终影响数据准确性。
版本号设置会向上兼容,也就是说只有此版本号,或者高于此版本的用户才能命中实验。
(3)平台
平台分为3种,分别为:IOS客户端、Android客户端、JS(H5)
分别针对不同的平台进行的AB测试。
这里不说Ios和Android,只说一下H5,因为H5的埋点上报与客户端不一样,H5 的分流的唯一ID也与客户端不一样。客户端的分流使用的ID是设备ID,H5则是cookieID
统计指标:
(1)对于AB两个策略上线后,我们需要跟踪两个策略的数据效果
这两个策略的效果数据来源就是页面的浏览与按钮的点击两个埋点事件来提供数据支持的。比如:客户端需要对课程详情页的报名按钮样式进行AB测试实验,数据监控的时候我们就需要统计进入详情页的人数与报名按钮点击uv进行统计。
以报名按钮uv/详情页uv此数值来统计报名按钮样式的AB两种策略效果,那么在创建实验时就需要确定统计指标,确定指标后就需要确定实验所需要哪些埋点指标统计。这里就需要详情页uv以及报名按钮uv两个埋点事件
当然还有更负责的数据指标,但都可以通过埋点数据上报来进行统计。
(2)计算方式
假设一个漏斗中包含了 A、B、C、D、E 五个步骤,选择的时间范围是 2015 年 1 月 1 日到 2015 年 1 月 3 日,窗口期是 1 天。那么,如果用户在2015年1月1日到2015年1月3日触发了步骤 A,并且在步骤 A 发生的 1 天内,依顺序依次触发了 B、C、D、E,则视作该用户完成了一次成功的漏斗转化。
在这个过程中,如果穿插了一些其它的步骤或者行为,例如在满足时间限制的情况下,用户的行为顺序是 A > X > B > X > C > D > X > E,X 代表任意一个事件,则该用户依然视作完成了一次成功的漏斗转化。
如果该用户在这个事件限制范围内,依次触发了 A > B > C > E,则该用户没有完成该漏斗的转化,并且会被记作步骤 C 的流失用户。
考虑一个更复杂的情况,如果一个用户在所选时段内有多个事件都符合某个转化步骤的定义,那么会优先选择更靠近最终转化目标的事件作为转化事件,并在第一次达到最终转化目标时停止转化的计算。
假设一个漏斗的步骤定义是:访问首页、选择支付方式、支付成功,那么不同用户的行为序列及实际转化步骤(标红部分)见如下例子:
- 例 1:访问首页 -> 选择支付方式(支付宝) -> 选择支付方式(微信)-> 支付成功。
- 例 2:访问首页 -> 选择支付方式(支付宝) -> 访问首页 -> 选择支付方式(微信)-> 支付成功。
- 例 3:访问首页 -> 选择支付方式(支付宝) -> 访问首页 -> 选择支付方式(微信)-> 支付成功 -> 选择支付方式(微信)-> 支付成功。
五、分流引擎
分流策略:简单的理解就是哪些用户会命中策略A,哪些用户会命中策略B。
在说分流策略之前先举个例子,配合例子更好理解。
假设报名按钮颜色实验分50%流量,策略“红色”按钮分流量40%,策略“蓝色”按钮分流量60%
例如:取模10000,那报名按钮颜色实验的数字区间为0-5000;10000*50%。
策略“红色”按钮数字区间为0-2000;5000*40%。
现在我们对用户唯一id,应用id进行哈希。哈希后得到一个数字,这个数字落到哪个数字区间就将用户分到哪个策略中去。经测试10w次分流,8s,流量diff在1%以内,每个应用分到的用户正交,不相互影响。
如图:
六、对接方式
AB测试系统和App服务端或H5服务端对接
分别有两个接口:一个是策略请求接口、一个是埋点接口。
(1)埋点接口
AB测试系统将接口参数传给服务端,服务端将参数传给客户端和H5前端。
客户端或者前端遍历这些 eventids(埋点事件id)如果有用户命中这些埋点事件则上百 abtestid key及值。
(2)策略接口
例如实验是客户端报名按钮“红色”、“蓝色”。
当流量进入到客户端后, 客户端向服务端询问:我这有俩颜色的按钮,我要展示哪个颜色的按钮啊?
服务端:我暂时也不知道,我帮你问问AB测试服务。
服务端问AB测试服务:客户端来流量了,有两个颜色的按钮,需要展示哪个颜色的按钮啊?
AB测试服务:展示“红色”按钮。
服务端:我知道了,并告诉客户端:展示“红色”按钮。
客户端:我知道了,客户端展示“红色”报名按钮。
七、AB测试效果分析
1. 我们为什么要做假设检验?
AB测试 是典型的通过样本数据估计总体数据效果的方法,所以为了避免出现小概率错误,我们需要对AB测试的结果进行假设检验。
2. 如何进行假设检验?
AB测试的假设检验一般为两个总体成数的假设检验
我们为什么要假设检验?
我们在生活中经常会遇到对一个总体数据进行评估的问题,但我们又不能直接统计全部数据,这时就需要从总体中抽出一部分样本,用样本来估计总体情况。
举一个简单的例子:
学而思网校App进行了改版迭代,现在有以下两个版本:
- 版本1:首页为一屏课程列表 ;
- 版本2:首页为信息流。
如果我们想区分两个版本,哪个版本用户更喜欢,转化率会更高。
我们就需要对总体(全部用户)进行评估,但是并不是全部存量用户都会访问App,并且每天还会新增很多用户,所以我们无法对总体(全部用户)进行评估,我们只能从总体的用户中随机抽取样本(访问App)的用户进行分析,用样本数据表现情况来充当总体数据表现情况,以此来评估哪个版本转化率更高。
假设检验定义
假设检验是先对总体参数提出一个假设值,然后利用样本信息判断这一假设是否成立。
假设检验的假设
由定义可知,我们需要对结果进行假设,然后拿样本数据去验证这个假设。
所以做假设检验时会设置两个假设:
一种叫原假设,也叫零假设,用H0表示。原假设一般是统计者想要拒绝的假设。原假设的设置一般为:等于=、大于等于>=、小于等于<=。
另外一种叫备择假设,用H1表示。备则假设是统计者想要接受的假设。备择假设的设置一般为:不等于、大于>、小于<。
例子在进行假设检验时,我们希望接受版本2的假设,想拒绝接受版本1的假设。所以我们的假设设置为:H0 :μ版本1 >= μ版本2 ,H1 : μ版本1 < μ版本2。
为什么统计者想要拒绝的假设放在原假设呢?
因为原假设备被拒绝如果出错的话,只能犯第I类错误,而犯第I类错误的概率已经被规定的显著性水平所控制。
有点看不懂哈?没关系,我们讲一下假设检验中的两种错误和显著性水平就清楚了。
两种错误:弃真错误、取伪错误
我们通过样本数据来判断总体参数的假设是否成立,但样本时随机的,因而有可能出现小概率的错误。这种错误分两种,一种是弃真错误,另一种是取伪错误。
弃真错误也叫第I类错误或α错误:它是指原假设实际上是真的,但通过样本估计总体后,拒绝了原假设。明显这是错误的,我们拒绝了真实的原假设,所以叫弃真错误,这个错误的概率我们记为α。这个值也是显著性水平,在假设检验之前我们会规定这个概率的大小。
取伪错误也叫第II类错误或β错误:它是指原假设实际上假的,但通过样本估计总体后,接受了原假设。明显者是错误的,我们接受的原假设实际上是假的,所以叫取伪错误,这个错误的概率我们记为β。
现在清楚原假设一般都是想要拒绝的假设了么?
因为原假设备被拒绝,如果出错的话,只能犯弃真错误,而犯弃真错误的概率已经被规定的显著性水平所控制了。这样对统计者来说更容易控制,将错误影响降到最小。
显著性水平
显著性水平是指当原假设实际上正确时,检验统计量落在拒绝域的概率,简单理解就是犯弃真错误的概率。这个值是我们做假设检验之前统计者根据业务情况定好的。
显著性水平α越小,犯第I类错误的概率自然越小,一般取值:0.01、0.05、0.1等。
当给定了检验的显著水平a=0.05时,进行双侧检验的Z值为1.96。
当给定了检验的显著水平a=0.01时,进行双侧检验的Z值为2.58。
当给定了检验的显著水平a=0.05时,进行单侧检验的Z值为1.645。
当给定了检验的显著水平a=0.01时,进行单侧检验的Z值为2.33。
检验方式
检验方式分为两种:双侧检验和单侧检验。单侧检验又分为两种:左侧检验和右侧检验。
- 双侧检验:备择假设没有特定的方向性,形式为“≠”这种检验假设称为双侧检验
- 单侧检验:备择假设带有特定的方向性 形式为”>””<“的假设检验,称为单侧检验 “<“称为左侧检验 “>”称为右侧检验
检验统计量:据以对原假设和备择假设作出决策的某个样本统计量,称为检验统计量。
拒绝域:拒绝域是由显著性水平围成的区域。
拒绝域的功能主要用来判断假设检验是否拒绝原假设的。如果样本观测计算出来的检验统计量的具体数值落在拒绝域内,就拒绝原假设,否则不拒绝原假设。给定显著性水平α后,查表就可以得到具体临界值,将检验统计量与临界值进行比较,判断是否拒绝原假设。
双侧检验拒绝域:
左侧检验拒绝域:
右侧检验拒绝域:
假设检验步骤
- 提出原假设与备择假设;
- 从所研究总体中出抽取一个随机样本;
- 构造检验统计量;
- 根据显著性水平确定拒绝域临界值;
- 计算检验统计量与临界值进行比较。
两种假设检验
假设检验根据业务数据分为两种:一个总体参数的假设检验和两个总体参数的假设检验。
一个总体参数的假设检验,即只有一个总体的假设检验。
举个例子:
学而思App原版本1转化率为 19%,学而思App版本2开发完成后,直接全量发布整体上线,过一段时间后统计转化率为27%,我们想判断版本2是否比版本1好,这时我们做的假设检验总体只有1个,全部用户。对于总体只有一个的称为一个总体参数的假设检验。
两个总体参数的假设检验:有两个总体的假设检验。
同样的例子:
学而思App版本1和学而思App版本2同时上线,流量各50%,这时我们做的假设检验总体有2个,分别为命中版本1的全部用户与命中版本2的全部用户。
两种假设检验的检验统计量计算方式有所不同,所以做区分描述。
一个总体参数的假设检验
大小样本:样本量大于等于30的样本称为大样本,样本量小于30的样本称为小样本。
一个总体参数的大样本(n≥30)假设检验方法:
假设形式:
双侧检验:H0 :μ=μ0, H1 :μ≠μ0;
左侧检验:H0:μ≥μ0, H1 :μ<μ0;
右侧检验:H0:μ≤μ0, H1:μ>μ0;
检验统计量:
当总体标准差已知时,用 σ 参与计算更精准。
双侧检验:
左侧检验:
右侧检验:
P值决策:P<α ,拒绝H0
一个总体参数的小样本(n<30)假设检验方法:
假设形式:
双侧检验:H0 :μ=μ0, H1:μ≠μ0;
左侧检验:H0:μ≥μ0, H1:μ<μ0;
右侧检验:H0:μ≤μ0, H1:μ>μ0;
检验统计量:
当总体标准差已知时,用 σ 参与计算更精准。
双侧检验:
左侧检验:
右侧检验:
t值怎么看:n 是样本量=10、自由度=n-1。当α=0.05时,临界值-双侧检验:t0.025(9) 单侧检验t0.05(9)
P值决策:P<α,拒绝H0
一个总体成数的假设检验
定义:
- 样本成数:它是指样本中具有某一相同标志表现的单位数占样本容量的比重,记为p。
- 总体成数:它是指总体中具有某一相同标志表现的单位数占全部总体单位数的比重,一般用π表示。
假设形式:
双侧检验:
左侧检验:
右侧检验:
检验统计量:
P:样本成数π0
总体成数n:样本量α与拒绝域:
双侧检验:
左侧检验:
右侧检验:
P值决策:P<α ,拒绝H0
两个总体参数的假设检验
大小样本:样本量大于等于30的样本称为大样本,样本量小于30的样本称为小样本。
两个总体参数的大样本(n≥30)假设检验方法:
假设形式:
双侧检验:
左侧检验:
右侧检验:
检验统计量:
当总体标准差已知时,用 σ 参与计算更精准。
α与拒绝域:
双侧检验:
左侧检验:
右侧检验:
P值决策:P<α,拒绝H0
两个总体成数的假设检验
当n1*P1、n1*(1-P1)、n2*P2、n2*(1-p2)都大于或等于5时,就可以称为大样本。
假设形式:
双侧检验:H0 : π1-π2 =0 ,H1 : π1-π2≠0
左侧检验:H0 : π1-π2 ≥0 ,H1 : π1-π2<0
右侧检验:H0 : π1-π2 ≤0 ,H1 : π1-π2>0
检验统计量:
(1)原假设为H0 : π1=π2或 π1-π2 ≥0 、π1-π2 ≤0情况下。
检验统计量:
(2)原假设为H0 : π1-π2=d0(d0≠0)
检验统计量:
α与拒绝域:
双侧检验:
左侧检验:
右侧检验:
P值决策:P<α ,拒绝H0
R语言实现假设检验
z.test():BSDA包,调用格式
z.test(x, y = NULL, alternative = "two.sided,less,right", mu = 0, sigma.x = NULL,
sigma.y = NULL, conf.level = 0.95)
x,y为样本数据,单样本时忽略y;alternative选择检验类型,two.sided 双侧检验,less左侧检验,greater右侧检验 ;mu为原假设的均值;sigma.x,sigma.y为标准差;conf.level为置信水平,var.equal是逻辑变量,var.equal=TRUE表示两样品方差相同,var.equal=FALSE(缺省)表示两样本方差不同
t.test():调用格式
t.test(x, y = NULL, alternative=c("two sided","less","greater"), mu = 0,paired = TRUE,
var.equal = FALSE, conf.level = 0.95,...)
x,y为样本数据,单样本时忽略y;alternative选择检验类型,two.sided 双侧检验,less左侧检验,greater右侧检验 ;mu为原假设的均值;sigma.x,sigma.y为标准差;conf.level为置信水平,var.equal是逻辑变量,var.equal=TRUE表示两样品方差相同,var.equal=FALSE(缺省)表示两样本方差不同
binom.test():调用格式
binom.test(x, n, p = 0.5,alternative = c("two.sided", "less", "greater"),conf.level = 0.95)
其中,x是成功的次数;n是试验总数,P是原假设的概率,也是总体成数的公式
版权声明及安全提醒:本文转自网络平台,文章仅代表作者观点,不代表「金融文库」立场。相关版权归原作者所有,「金融文库」仅提供免费交流与学习,相关内容与材料请勿用于商业。我们感谢每一位原创作者的辛苦付出与创作,如本转载内容涉及版权及侵权问题,请及时联系我们客服处理(微信号:JRwenku8),谢谢!