携程ABTest伴随UBT(User Behavior Tracking System)系统一起,两年多的时间,从最初online寥寥几个实验,到现在单是机票BU每周就有数十个app/online/h5平台同时线上运行。

在14年-16年James领导下的技术驱动的大携程体系,对于项目上线的收益、年终KPI考核、CEO奖项的评比都需要拿ABTest数据说话(据说James对数据特别敏感,曾经在2016年某hackathon决赛中,未上线前一team在台上大谈项目收益,James当即打断说"你们的项目上AB了吗?没上的话不要讲了",该team被当场淘汰) 。

携程市值不断增长的背后,是无数个ABTest的支持,而携程机票大部分的ABTest都放到前台来配置,有幸在2016年经历N多大项目的上线ABT过程,本文将以此为背景来说明携程机票对于ABTest的应用。(ABTest在携程被简称为ABT)

一、ABTest的定义

ABTest本身其实是物理学的"控制变量法",通过只改变一个因素来确定其变化对CR(conversion rate)或者收益的影响。其本身具备统计意义,而且具备实际意义。

试想一下如果没有ABTest,那新项目上线后的收益如何排除季节因素、市场环境因素的影响,而且一个页面上如果同时做多处改动,如何评判是哪个改动造成的收益或损失?这对一个理性思维的人是不可接受的。

简单理解为将一群人分成两类,通过展示新旧版version A/B来测试哪种版本效果好,差异是多少。

二、ABTest流程

ABTest数据流:APP启动时,公共框架会拉取所有线上ABTest的试验号和对应版本(所有BU)存入本地,当用户进入机票频道时候,在特定场景触发本地实验号调用。比如往返实验,在用户首页点击往返搜索时,开发会从本地文件中查询160519_fld_round试验号该用户的对应版本,确定跳转新/旧版页面。在试验号接收到调用时,同时触发一个ABTest的trace埋点o_abtest_expresult,该埋点会记录clientcode,sid,pvid,试验号及版本信息,最终经过ETL,BI会汇总一张AB实验表,将上述信息汇总,便于后续做关联计算。

分流计算:每个设备在刚启动的时候会根据设备号+试验号+随机数组成一串N位数,对100取模的余数从0-99,假设ABCD四个版本流量 10:70:10:10的情况下,则余数0-9为A版、10-79为B版、80-89为C版、90-99为D版。A版为默认版,如果尾数异常(Null或溢出),则走A版。

AB版本:如果仅有新旧两个版本的情况下,一般会设置ABCD四个版本,(其中ACD为旧版,B为新版;如果有多个迭代新版,则从EFG开始)来进行AA测试和AB测试。

1、AA测试:CD版同为旧版,且流量各为B版一半,在流量随机分配的情况,通过对比CD版的数据表现来验证旧版的状态是稳定的。A版作为旧版,也称为兜底版本,BCD的剩余流量走A版,版本异常的情况下走A版。

2、AB测试:在确保CD数据相对稳定的前提下,再对比B和ACD版本的数据,来对比新旧版的差异。

实验正交性:

1、非正交实验:如左图展示,在旧版的基础上再做区分,会因为样本数量的问题而限制同时进行的实验个数,而且无法评估两个新版同时存在的影响。

2、正交试验:右图展示,不同实验流量完全打散随机分配,上一个实验与下一个实验理论上流量上没有关联,这样可以在一个页面同时进行多项实验。
这里再提一个Magic Number = 7,虽然理论上单页面上同时进行的正交试验数量没有上线,但是经过长期经验积累,单页面同时线上实验不要超过7,否则会造成难以捉摸的幺蛾子异常。

埋点下线机制

像ABTest里面的埋点触发场景埋点还是由开发控制的,也还是会存在埋点不准确的情况,比如说往返的实验,触发场景是在首页点击往返搜索,理论上去程列表页的UV应该是参与式样的样本数抑制。实际情况是,去程列表页30W的UV,但ABT的报表显示每天样本为50W,经过SQL验算两者交集为20W,就说明有10W人是在往返流程但并没有参与实验(数据经过脱敏处理,但不改变相对位置)。

所以基于这样的幺蛾子,在ABT结束后,既要删除代码,又要实验流量全开100%

1、流量调整100%目的:将历史版本的客户端旧版规避,需要操作100%流量。

2、下线代码:保证app的size不会过度冗余,同时因埋点场景的问题,有些时候虽然流量全切100%,但仍有部分流量走旧版(非常诡异),所以将客户端代码下掉是非常必要。

其他说明:

1、在任何情况下,分析的基础条件就是流量随机分配,如果质疑这件事情,则整个ABTest就失去意义.

2、实验分流一般采用设备号clientcode,但是也可以根据uid来,但情况较少

3、对于实验的显著性指标P值一般使用较少且不易理解,就不做过多解释(一年也没怎么用这个指标)

4、分流调节机制,新版流量不要忽上忽下,特别是涉及到核心页面的时候,否则可能会造成用户看到的页面反复变化,增加适应时间和学习成本以及影响用户体验。

三、分析数据

ABT的目的:ABTest是希望通过如何改进新版优于旧版,而不是通过ABTest证明新版弱于旧版而下线实验,所以需要有效的分析数据。

如何看图表:

图表反映时间趋势,在ABTest中表现为新旧版本两条折线图,且一般会出现交叉的情况,那我们就需要判断这些交叉是有随机性波动还是实验的效果,我在实践中总结简单易用的一条原则是:“抓大放小”。

抓大放小(个别表现不影响整体趋势):当你遮住有限个点的时候,不影响整体的差异。比如下图,当你遮住2-11和2-13两天的数据时,会发现蓝色B版优于红色旧版。(当然遮住点的数量因人而异,一般不超过总量10%)

这张图就很难用抓大放小的方式来判断差异,无法证明是新版好还是旧版好,这时候需要分解这个指标来继续分析。

机票的核心指标是转化率CR(conversion rate)和收益(revenue),通常他们之间的关系如下图所示。

携程机票前台以scrum team的形式迭代,每个team对于需求的评审是以ROI(投入产出比,return on investment)来决定项目的优先级,而return可能是CR的提升,也可能是单票收入的提升。

对于上线实验数据跟踪,也是以当初ROI的预期来进行判断实验效果,尤其在没有达到预期的情况下,寻求解决方案。(这其中还有诸多限制条件,比如收益类项目,如果CR有明显下降需要重点关注。)

分析思路

这个分解公示也代表分析的思路,无论对于收益类项目还是CR类项目,都会先看单UV收入和CR(一般情况下,ABTest不会改变每个订单的票量,这是基于整体订单估算的平均值,我们暂且认为TA是常量),当这两项都保持正向增长的情况下,那可以直接开大流量继续验证直至项目完美收官(这种案例比较少)。更多的情况是,对于重大项目,即使结果是积极正向的实验,我们也会大概了解下改进点发生在哪个页面或者哪个产品,做到心中有数

而当发生问题的时候,我们都会对CR和单票收入做分解:

1、CR下降的情况,看主流程每个页面的CR,是哪个页面下降,从页面的来源去向和点击来看,是否有明显的异常,一般来讲,对业务足够熟悉的PM在这一步可以结合业务和这些数据大概会有一些预判,是哪些因素可能造成的影响,之后再请教BI专业人员或者自己拉SQL来验证数据,从而进行改进。

2、利润下降的原因,继续分解指标,可以分产品、航司、利润构成等指标来分解,找到新旧版的gap,然后结合业务场景做一些预判,进行找数据来支持这个想法,继续迭代新版。

之前的状态是PM对于AB实验的数据有一大坨报表,但是并不知道如何使用,也不知道怎么看报表,不知道怎么分解指标,但其实对于整体进行了解之后,具备简单的分析能力,关键是有业务背景知识的情况下,这样的几个公式的八股文的分析可以解决80%的问题,对于实在无法定位的问题,可以找BI寻求帮助。

四、总结

ABTest其实核心在于如何定位问题解决问题,但是限于身份不能通过数据来进行举例说明。但其实分析思路应该是一致,比如机票场景下指标分解的核心公式来解决80%的问题,在每个行业应该都会有这样的公式,可以根据特定业务背景自己总结运用。

PM如能够掌握这些基本的指标分析、能够看懂图表、这里面就能够自助解决80%的问题,这样的ABTest效率其实已经是非常高的。

携程机票的ABTest实践的更多相关文章

  1. 携程酒店DevOps测试实践

    作者简介 王幸福,携程酒店研发部高级测试经理,负责无线自动化测试相关工作.在测试框架和平台研发.移动测试.DevOps等领域有着丰富的经验. 如今很多大型互联网公司.创新型企业都在积极地进行DevOp ...

  2. Elasticsearch 学习之携程机票ElasticSearch集群运维驯服记(强烈推荐)

    转自: https://mp.weixin.qq.com/s/wmSTyIGCVhItVNPHcH7nsA 一.整体架构 为什么采用ES作为搜索引擎呢?在做任何事情的时候,不要一上来就急着了解怎么做这 ...

  3. SOAP-XML请求(iOS应用下集成携程api)

    用携程机票为例: 携程联盟 飞机票.门票 联盟ID:278639 站点ID:739462 密钥KEY:BE57B925-E8CE-4AA2-AC8E-3EE4BBBB686F API_URL:open ...

  4. 携程App的网络性能优化实践

    首先介绍一下携程App的网络服务架构.由于携程业务众多,开发资源导致无法全部使用Native来实现业务逻辑,因此有相当一部分频道基于Hybrid实现.网络通讯属于基础&业务框架层中基础设施的一 ...

  5. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  6. ScaleFlux CSD 2000 在携程的应用实践

    一.业界背景与现状 近些年来,有三件事实在业界同时发生:     1.  业务的发展朝着"生产"和"使用"海量增长数据的方向演进.     2.  摩尔定律 的 ...

  7. 微信小程序体验(1):携程酒店机票火车票

    在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...

  8. 转:携程App的网络性能优化实践

    http://kb.cnblogs.com/page/519824/ 携程App的网络性能优化实践 受益匪浅的一篇文章,让我知道网络交互并不是简单的传输和接受数据.真正的难点在于后面的性能优化 下面对 ...

  9. 携程React Native实践

    React Native(下文简称 RN)开源已经一年多时间,国内各大互联网公司都在使用,携程也在今年 5 月份投入资源开始引入,并推广给多个业务团队使用,本文将会分享我们遇到的一些问题以及我们的优化 ...

随机推荐

  1. ADNI数据集相关概念整理

    数据类型 临床 遗传 MRI图像 PET图像 生物样本 临床 ADNI临床数据集包括关于每个受试者的临床信息,包括招募,人口统计学,身体检查和认知评估数据.可以将整套临床数据作为逗号分隔值(CSV)文 ...

  2. Cmd2001的毒瘤水题题解

    怕不是我再不写题解这题就该成没人做也没人会的千古谜题了...... T1: 仔细分析题面,发现相同就是广义SAM上节点相同,相似就是广义SAM上为从根到某个点路径的前缀..直接SAM上跑从根开始,每个 ...

  3. 回忆Ajax ๑乛◡乛๑

    东西越多,记不完,也记不住,笔记是最好的记忆了. 回顾以前的ajax的写法,简单封装一个ajax. //data = { // url: "url", // method: &qu ...

  4. xenserver系列之安装与配置

    文章内容 1 ,安装 一.选择键盘类型:US. 二.这个是欢迎界面,选择“OK”即可. 三.这个是使用协议,我们必须得接受,否则就不能继续安装了! 四.这个是警告,告诉你XenServer所需要的硬件 ...

  5. Nancyfx框架在传统Webform项目中的应用

    最近有个老项目需要做一个需求更迭,老项目是基于传统的webform项目的 为了更好的前后台交互,决定引入Nancyfx框架 关于Nancyfx框架框架是啥就不多介绍了 总的来说是一款轻量级的web框架 ...

  6. Ural 2036. Intersect Until You're Sick of It 计算几何

    2036. Intersect Until You're Sick of It 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2036 ...

  7. 华为交换机VRRP配置实例收集(转)

    示例图: 其实说白了就是做线路冗余,达到热备切换. 组网需求: 楼层1和楼层2分别通过两条线路做冗余接入交换机(本示例只考虑vrrp,暂不考虑其他方面).当其中一段链路故障时,能通过另外一条链路传输. ...

  8. DG449 High Voltage Single SPDT Analog Switch in SOT23-8

    DESCRIPTION The DG449 is a dual supply single-pole/double-throw (SPDT) switches. On resistance is 38 ...

  9. What is CMSIS-DAP

    The mbed HDK and mbed-enabled hardware support the CMSIS-DAP debug interface, which consists of an a ...

  10. STM32 Controller area network (bxCAN) Identifier filtering

    Identifier filtering In the CAN protocol the identifier of a message is not associated with the addr ...