个人公众号:livandata

  1. AB-test思路

数据驱动概念兴起的同时,AB-test也同步出现在大家的视线中,各互联网大厂率先引进了AB-test系统,希望通过循环的测试,上线最符合公司客群的产品。这一理念一出引发行业内各个公司的效仿,各种宣导纷至而来,那么,什么是AB-test?什么样的公司能迅速构建出AB-test系统?我们今天来一起聊一下:

什么是AB-test?

携程的大佬们曾给出一个定义:AB试验可以简单的认为是传入一个实验号和用户分流ID到AB试验分流器,分流器吐出分流版本A、B、C、D等,截取一部分应用流量,落地某一段时间的分流数据,进而分析各个版本的优劣,决定启用新版本还是沿用老版本的过程。

这一定义大家能不能理解呢?

我们用更通俗的语言做一下解读:

首先,试验的目的是为了决策新开发的两个或两个以上的版本该上线哪一个的问题,即当有较多的版本选择时可以先测一把,让数据告诉我们哪一个方案比较适合我们公司的客户。

大家有没有遇到经验失效的时候,就是我们按照自己的经验设计出来的产品、活动,客户并不买账,失效的原因有很多,其中一个比较常见的原因就是经验失效,即我们培养起来的经验往往是根据之前公司或者历史数据形成的,问题在于新公司/当下时间中客群发生了变化,我们之前的经验未必完全符合现在的客群,这也就凸显出了AB-test的价值,AB-test是根据本公司现在的客群进行的对照试验,可以直观的表达出客户需要什么样的产品。

其次,试验用到的一个重要组件是分流器,分流器有什么用处呢?顾名思义——分流用的,就是通过一定的规则将APP中随时流动的数据分成多个版本,客户进入APP后会自动分配到各个版本中,各个版本对应开发的新旧版本,进行稳定测试。

分流器中常用的方法是对客户的session/cookie进行hash运算,然后将运算结果取模mod(即取余运算,不清楚的看官可以百度一下),通过取模后的值进行分流,分流的过程涉及正交、互斥试验的设计,其中细节,我们下文中会详细描述。

其三,就是试验效果评估的过程,AB-test的两个重点之一就是效果评估(另一个就是上面的分流器),如何评估一个试验是否成功?试验1的UV大于试验2的UV是否就说明试验1是好的?这其中就涉及到了统计中的各种检验知识,我们会在下文原理部分详细描述。

现在我们从简到繁了解一下AB-test的试验思路:

假设一个客户来到我们的APP,其在AB-test中的数据访问可以如下图描述:

看图听故事如下:

1)一个客户进入到我们的APP时,会在客群的部分做一次筛选,即试验是否是有划分客群,如果有客群划分,则需要判断新来的客户是否命中我们的试验客群;

2)第二步我们要判断需要进行什么类型的试验,正交还是互斥?以及此次试验需要切分多少流量,5%还是10%?

3)经过了客群识别和流量切分后,我们的客户来到了试验分组部分,系统采集客户访问的cookie/session信息计算出唯一hash值,并对这一hash值做mod处理;

4)mod处理之后的数据会被分到t个桶中的某一个,然后再根据一定的比例和算法将t个桶中的数据分成三组,即:A组、A组和B组,假设分流比例为:1/3,1/3,1/3;

5)A-A组即为旧版本对照组,用来检验分流是否有效,如果A-A组不显著,说明数据不受系统性因子影响,分流是有效的;A-B组即为新旧版本的对照组,其中B组为新版本;

6)A-A-B组的数据比较即为试验数据分析,分析人员借此完成试验的效果检验,确定试验是否显著;

看完上面这一串介绍,有没有一种原来如此的感觉?

AB-test的基本流程可以是上图的样式,但是充其量只能作为一个简图,接下来我们一点点的抽丝剥茧,还原AB-test产品的真相:

1) 什么是正交试验?什么是互斥试验?

正交试验:每个独立试验为一层,为保证各层之间不相互影响,一份流量穿越每层试验时,会再次随机打散,且随机效果离散,这一过程叫正交,这样的试验叫正交试验。

正交试验能最大化的保证各层试验相互独立,确保各个试验不会相互影响。

我们用图形来表示正交,如下图:

X层的全部流量随机打散,然后进入到Y层,看到的结果即为Y层的流量为X层流量重组之后的再分配,两层之间相互独立。

互斥试验:即为在同一层中拆分流量,且不论如何拆分,不同的流量是不重叠的。

互斥试验是在流量足够的情况下进行的分流策略,各个试验之间也不会相互影响。

我们同样用图形来表示互斥,如下图:

X层的流量会各自独立的分到Y层,相互之间不受影响。

2) 如何计算最小样本量?

最小样本量的计算,我们会在下文原理篇详细讲解~

3) 多个试验同时发生时如何分层?

前面我们讲解了正交和互斥两个原则,接下来我们介绍一下在正交和互斥的原则下该如何设计试验分层?

正交、互斥两种试验的引用是为了能够更充分、更高效的使用流量,实际试验中往往是多组试验同时存在,既有正交,又有互斥,如下图:

上图中的分组情况可以看出:域1和域2互斥拆分流量,域2中的流量串过1-1层、1-2层、1-3层,进入到2层和3层,1-1层、1-2层、1-3层是互斥的,1层、2层、3层是正交的,上层的流量大于等于下层。

从使用场景上看,1层、2层、3层可能分别为UI层、搜索结果层、广告结果层,这几个层级基本上没有任何的业务关联度,即使共用相同的流量,也不会对实际的业务造成影响。但是如果不同层之间所进行的试验相互关联,就需要进行互斥试验,例如:1-1层是修改页面按钮上文字的颜色,1-2层是修改按钮颜色,如果按钮和文字颜色一致,估计按钮就不可用了,试验的基本原则是控制变量,即尽可能的保证每次试验只有一个变量,不要让一个变量的试验动态影响另一个变量试验,否则试验就会失去公正性。另外,如果我们觉得一个试验可能会对新老客户产生完全不同的影响,那么就应该对新客户和老客户分别展开定向试验,观察结论。

无论从层级上还是单层的分流上都被充分应用,流量的使用效率很高,但是,随着试验越来越多,对试验的管理也会显得越来越重要,往往后期会需要专门的人员进行管理。

4) Hash分流过程是啥样的?

分流的方式有很多种,笔者这次来和大家聊一下hash的算法如何实现分流效果。

AB-test又称作是桶测试,为什么叫桶测试呢?关键就在于分流的过程,我们先解释一下桶和试验组的关系:

假设试验有12个人,我们对这12个人进行编号,编号方法可以使用cookie,也可以使用session,总之获取到这12个人的唯一编码;当获取到唯一编码之后我们就可以开始分流了,我们对每个人的唯一编码进行hash处理,常规使用MD5进行hash计算,这样计算的好处在于MD5几乎不会重复,分流效果较好;计算好的hash值需要进行mod处理,图中有6个桶,我们就用6进行mod处理, 12个人按照余数分散到六个桶里面,原则上12个人的分流是随机的分散到各个桶里面,很难保证每个桶里的人数一致,但是从统计学的角度上讲,当数据量足够大时,数据会均匀的分散到各个桶里面。

桶分流完成后,我们需要处理的就是将这些桶平均分成两组,原则是保证随机性和平均分配,聪明如你,应该已经明白分流的原理了吧?

5) Hash分流是否能保证样本在A-A-B三组中平衡分布?

三组数据的分流原则上需要尽可能平衡,即各个特征都能均匀的分布在三组试验中,这样才能符合AB-test控制变量的原则。生化试验中控制变量是一个较为简单的问题,不管是脊蛙反射还是肠胃蠕动试验,但是社会学中的试验,控制变量却异常复杂,因为面对大量人群,很难通过随机分配保证各个特征的平衡,而且有些隐含变量很难被发现,也难以做到平衡。

这样的问题称在生化试验中称作是系统误差,在互联网AB-test中则会引发辛普森悖论。生化试验中往往通过重复试验来避免,互联网下的AB-test很难进行重复试验,因为无法让一个人即使用A版本,又使用B版本,串行试验又会添加时间因素,所以只能采用其他的方式解决这个问题。

那么,什么是辛普森悖论呢?

我们用一个真实的医学 AB 测试案例来说明这个问题。这是一个肾结石手术疗法的 AB 测试结果:

看上去无论是对于大型结石还是小型结石,A疗法都比B疗法的疗效好。但是总计而言,似乎B疗法比A疗法要好。

这个AB测试的结论是有巨大问题的,无论是从细分结果看,还是从总计结果看,都无法真正判断哪个疗法好。

那么,问题出在哪里呢?这个AB测试的两个实验组的病历选取有问题,都不具有足够的代表性。参与试验的医生人为的制造了两个试验组本身不相似,因为医生似乎觉得病情较重的患者更适合A疗法,病情较轻的患者更适合B疗法,所以下意识的在随机分配患者的时候,让A组里面大结石病历要多,而B组里面小结石病历要多。

更重要的问题是,很有可能影响患者康复率的最重要因素并不是疗法的选择,而是病情的轻重!换句话说,A疗法之所以看上去不如B疗法,主要是因为A组病人里重病患者多,并不是因为A组病人采用A疗法。

所以,这一组不成功的AB测试,问题出在试验流量分割的不科学,主要是因为流量分割忽略了一个重要的“隐藏因素”,也就是病情轻重。正确的试验实施方案里,两组试验患者里,重病患者(也就是AB-test中的特征值)的比例应该保持一致。

我们再来聊一个互联网领域的场景,我们对APP上一个按钮进行了颜色调整,需要比较一下颜色调整前后用户UV点击率是否提高?经过一段时间的试验,我们得到了两组试验的数据,为了说明辛普森悖论的问题,我们单独抽离出了性别作为比较(原因有二:一是性别在这次试验中是重要特征,二是这一特征的数据不均衡,刚好出现了辛普森问题),计算出了两组试验的点击率,如下:

数据中我们发现,单独看这一试验,无论是女性特征和男性特征,数据表现都是A组中较好,但是,总计却是B组效果较好,其中的差异我想大家已经清楚了,性别特征并没有均衡的分布在两个试验组中。

这个解决方法就是——定向试验

在进行试验之前,先做一次试验分析,确定对试验影响较大的因素,然后通过分流的权重设置来均衡各个组之间的特征差异,因素确认用到的方法较多,比如GBDT等等。

如下图:

在进行试验同时,可以实现各分组特征中的监控,如果发现某一特征在某一组中偏小,就增加这一特征在这一组的分配权重,以保证特征一致性。但是这样也存在特征取舍的问题,具体就不展开来描述了,有兴趣的小伙伴可以自行查询一下,毕竟,能做到这一点的公司已经很不错了。

分层试验,交叉试验,定向试验是我们规避辛普森悖论的有力工具。

规避辛普森悖论,还要注意流量动态调整变化的时候新旧试验参与者的数据问题,试验组和对照组用户数量的差异问题,以及其他各种问题。而优秀的增长黑客,不会去投机取巧“制造数据”,而是认真思考和试验,用科学可信的数据来指导自己和企业的决策,通过无数次失败的和成功的AB测试试验,总结经验教训,变身能力超强的超级英雄。

2. AB-testing原理

统计计算主要应用在效果评估领域。客户经过分流之后在各个试验组中产生数据,统计的作用即为查看对应组的样本量是否达到最小样本量,数据之间是否存在显著性差异,以及进行差异大小的比较。

如下图:

A-A-B三组数据观察n天后,会产生3组数据,我们接下来的任务就是计算这三组数据的统计效果,进而确定哪个方案效果好……

1) 如何计算最小样本量?

最小样本量是按照统计功效进行计算的,主要分两类:绝对值类(例如:UV)和比率类(例如:点击率)。

在试验过程中,大部分场景是进行比率类指标的比较,单纯的计算绝对值是没有价值的,而且对于试验效果来讲,绝对值的比较可以转化为比率的比较,所以在计算过程中,我们统一成比率计算,以方便口径统一和数值比较。

理论上,比率类最小样本量计算:

例如:

“XX提交”按钮由红色变为橙色,统计的指标是点击UV转化率UV_rate,测试时间是20200801~20200814,则计算“XX提交”按钮的历史月均值mean(UV_rate)为下面数据的均值avg(UV_rate):

时间 20200701 20200702 20200703 …… 20200730 20200731
UV_rate 0.25 0.24 0.37 …… 0.17 0.33

注:此处的计算需要对统计学中的统计功效有所了解,阅读有阻力可以补充一下“统计功效”的计算方法。

流程图介绍:最小样本量的作用是确定试验是否有效,后管配置好对应的客群信息、开放流量占比、提升率等信息后,后台需要进行“最小样本量”的计算,并进行相关判断,如下图:

2) 如何计算试验有效天数?

补充——统计功效:

确定好最小样本量并实现分流、试验上线之后,需要进行数据的有效天数需要进行相应计算:

试验的有效天数即为试验进行多少天能达到流量的最小样本量。当流量达到最小样本量时,查看数据是否存在显著性差异,如果不存在显著性差异则继续进行试验,直到达到最大要求天数,如果试验仍然没有达到显著性,则确定两组试验不显著,即没有明显差异。

计算过程如图:

如果到达试验最小天数且试验样本量>=最小样本量n_per,则观察试验是否有显著性,如果A-A试验没有显著性且A-B存在显著性(B>A),则表示试验成功,否则试验失败。

如果到达试验最小天数且试验样本量<最小样本量n_per,则继续进行试验;

5) 判断试验天数是否到达试验最大天数(t天):

如果到达试验最大天数且试验样本量>=最小样本量n_per,则观察显著性;

如果到达试验最大天数且试验样本量<最小样本量n_per,则终止试验并标注试验失败。

逻辑流程图为:

通过每天的数据计算可以做出如上判断,进而确定试验进行的有效天数并计算出显著性水平。

3. AB-testing工程化

经过上面的描述,我们可以通过下面的两张图来了解一下在工程方面,AB测试系统是什么样子的:

注释:

1) 根据需求设计好AB试验之后,在AB测试系统配置好对应的策略;

2) 将这一策略固化成文件,并推送到APP的AB系统SDK中;

3) 客户每次访问APP,先扫描AB系统SDK中的策略文件,根据策略文件给客户打标,分配对应的A、B版本;

4) APP中根据策略呈现A、B版本的试验内容,并监控客户的操作行为以及订单行为;

5) 这一行为被记录并上报到大数据环境中;

6) 天在大数据中进行显著性计算和最小样本量的处理,得到对应的显著性结果。

我们再来看一个详细的系统数据,如下图:

目前为止,AB系统已经介绍完成了,AB的结构深不可测,其中也需要经常的更新和讨论,欢迎大家关注沟通~

增长黑客AB-Testing系统设计相关推荐

  1. 数据分析之AB testing实战(附Python代码)

    大家如果对文章中的数据有需求,请关注公众号:[数据分析与统计学之美],回复关键词:[ab测试]! 目录   1.增长黑客    1)前言    2)运用分析指标框架,驱动互联网产品和运营    3)增 ...

  2. 增长黑客入门:手把手教你增长模型的实践操作

    继前几年的OKR之后,这2年最火热的管理舶来品当属"Growth Hack",将其推上公众视线巅峰的时间就是可口可乐用CGO代替CMO,我们在此不讨论这两者之间的关系(存在即是合理 ...

  3. 增长黑客AB-Test系统(三)——AB-Test Hash分流

    作者:livan 来源:数据python与算法 Hash分流介绍 分流的方式有很多种,笔者这次来和大家聊一下Hash算法如何实现分流,Hash算法在融合MD5算法后,可以实现运算结果几乎不重复,而且方 ...

  4. 增长黑客内容摘要(四五六章)

    增长黑客内容摘要(四五六章) 一.第四章 4.1 职场社交巨头的用户激活秘诀 用户的数量与结成的关系网络深度直接决定了其价值的大小. 策略:1.新册用户到达"邀请好友"页面时,如果 ...

  5. 学习增长黑客: 35个资源帮助你成为增长黑客

    2019独角兽企业重金招聘Python工程师标准>>> At many technology companies, traditional marketing roles are t ...

  6. 硅谷产品实战-总结:19、增长黑客的核心公式

    本文笔记全部来自极客时间中<硅谷产品实战36讲> 增长黑客"这个词最近特别火,这个概念最初是由互联网创业者肖恩· 埃利斯(Sean Ellis)提出的,他希望能够做到" ...

  7. 读书笔记-《增长黑客》-好产品是增长的根本

    增长黑客的基本原则之一就是在确定你的产品是否不可或缺.为何不可或缺以及对谁来说不可或缺之前不要进入快节奏试验阶段,也就是说,你必须要了解你的产品的核心价值是什么.对哪些客户来说具备这些核心价值以及为什 ...

  8. 读书笔记-《增长黑客》-搭建增长团队

    案例 举例:BitTorrent公司 BitTorrent既面临PC软件增长的停滞,也没有移动版的产品,被甩在了后面. 公司组织架构:用的是传统的筒仓式组织架构,分为市场部.产品部.工程部和数据科学部 ...

  9. 读书笔记-《增长黑客》-低成本、高效率的精准营销

    感兴趣关注我的微信公众号"顾林海",聊聊技术.聊聊人生,记录自己所学所想 案例 在线存储服务公司Dropbox 优点: 初期用户很稳定,有种子用户 产品有实用价值 缺点: 规模不够 ...

最新文章

  1. 微服务架构的优势与不足
  2. 解决无法将类型为“System.Web.UI.WebControls.HiddenField”的对象强制转换为类型的错误...
  3. 使用cocoapods时,import 找不到头文件。
  4. Salesforce平台入门
  5. (十三)react hooks
  6. break在matlab中的用法,求助这个算法运行的时候说错误: BREAK只能在FOR或WHile使用...
  7. C# winFrom窗体设计问题-部分文件打不开窗体设计器 变成类.cs
  8. 如何创建多个条形图_在R中创建条形图
  9. 三角函数正交性的推导
  10. matlab给定振形用图表示,基于 MATLAB 的简谐振动合成图形的动态演示
  11. 【小程序源码】游戏助手王者荣耀战力查询,游戏扫码登录器等
  12. 烟大计算机考研二战,以坚持铺就考研之路——记经济管理学院考研优秀个人程林林...
  13. cadence allegro - 四层板设置 ……F
  14. C语言口求整除x与y的余数,取余或取模运算小结
  15. Vue 中实现Video视频不可快进
  16. 动态域名解析--每步动态域名解析
  17. 爬取MOOC课程评论区的评论数据
  18. ORMLite的集成和使用
  19. 物联网之场景联动策略
  20. 漫谈技术职业人生——个人应该具备的能力

热门文章

  1. ZBrush: Alpha纹理生成雕花
  2. 3亿人都参加的95公益周来了,爱心攻略看这里!
  3. 近期一个称重设备微信端开发前端知识点,及使用插件遇到的常见问题
  4. 在学习c51单片机实验七(双机通信及pcb设计)操作Keil uVision4和protus的时候遇到的两个坑
  5. html 中 table tr td br 什么意思 是什么的缩写
  6. SoftLayer Object Storage 节点
  7. ubuntu16.04安装IDEA
  8. 20210310 钣金件螺栓螺帽缺失检测汇总 dropout
  9. 微信小程序----map组件实现检索【定位位置】周边的POI
  10. 深入浅出Linux操作系统搭建JavaEE环境(五)