您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

一个案例、6个步骤全程详解A/B测试,看这篇就够了

时间:2021-07-21 10:17:39  来源:华章科技  作者:

导读:本文将利用一个例子来探索设计、运行和分析对照实验的基本原则。这些原则适用于各种软件开发环境,包括网页服务器和浏览器、桌面应用程序、移动端应用程序、游戏主机、虚拟个人助理等。为了叙述尽量简单和具体,我们将专注于一个网站优化的例子。

作者:罗恩·科哈维(Ron Kohavi)、黛安·唐(Diane Tang)、许亚(Ya Xu)

来源:华章科技

一个案例、6个步骤全程详解A/B测试,看这篇就够了

 

01 设立实验

我们用一个虚构的线上销售小部件的电子商务网站作为具体的例子。我们可以测试各类改动:新功能的引入、用户界面的改动、后端的改动等。

在我们的例子里,市场营销部门希望通过发送含打折优惠券的促销邮件提高销量。这涉及潜在业务模型的改变,因为该公司之前没有发过优惠券。然而,公司有员工最近了解到Dr. Footcare公司在添加优惠券后大幅流失营收的案例,也通过GoodUI.org了解到移除优惠券会产生正面的影响。

因为这些外部数据,公司担心在结账页面增加优惠券输入框会降低营收,即使没有优惠券,仅仅因为看到这一栏也会拖慢用户的结账速度,并导致用户开始搜索优惠券甚至放弃结账。

我们希望评估仅添加优惠券输入框带来的影响。这里可以用“伪门法”或“画门法”——如同造一个假门或者在墙上画一个门——来看看多少人会试图打开它。

在这个例子中,我们实现了一个在结账页面添加优惠券输入框的微小改动。这里我们不是要实现一个真正的优惠券系统,因为并没有优惠券可用。不论用户填写的是什么,系统都会显示:“此优惠券不可用。”

我们的目的仅是评估添加一个优惠券输入框本身对营收的影响,并确定是否有必要担心它会分散用户结账的注意力。

由于这是一个很简单的改动,我们将测试两种UI的实现方式。同时测试多个实验组去评估一个想法而不是一个实现是很常见的实验设置。在这个例子里,“想法”是添加优惠券输入框,“实现”是指一个特定的UI改动。

这个简单的A/B测试是评估这一新业务模型可行性的关键一步。

思考如图2.1所示的漏斗形的线上购物过程有助于我们将UI改动方案转换成一个假设。客户从网站主页开始,浏览一些小部件,往购物车里添加小部件,开始付款过程,最终完成付款。

一个案例、6个步骤全程详解A/B测试,看这篇就够了

▲图2.1 一个用户线上购物漏斗模型。用户不一定会在这个漏斗里线性前进,可以跳过、重复或是往返于步骤间

当然,这个漏斗是简化的模型,客户很少会这样线性化地完成每个步骤,他们会在步骤之间往返,有些重复访问的客户也会跳过某些中间步骤。然而,这个简单模型对我们全面考虑实验设计和实验分析很有帮助,因为实验的目的通常是有针对性地改善这个漏斗中的某个特定步骤。

对于这个实验,我们在结账页面添加一个优惠券输入框,测试如图2.2所示的两个不同的UI,并评估它们对营收的影响。我们的假设是:“添加优惠券输入框会降低营收。”

一个案例、6个步骤全程详解A/B测试,看这篇就够了

图2.2 a对照组:旧的结账页面 b实验组1:优惠券或礼品券输入框位于信用卡下方 c实验组2: 优惠券或礼品券弹出框

为了测量这一产品改动带来的影响,我们需要定义目标指标,也称为成功指标。如果只有一个目标指标,那么我们可以直接将其用作综合评估标准(Overall Evaluation Criterion, OEC)。对于这个实验,营收可能是个显而易见的选择。

请注意,即便想要提高的是营收总和,也不建议将营收总和作为指标,因为它依赖于变体对应的用户数量。即使各变体被等量分配,实际用户数也可能因为偶然性而有所不同。我们推荐按实际样本量归一化的关键指标,因此人均营收才是一个好的OEC。

下一个关键问题是决定哪些用户被计入人均营收这一指标的分母中:

  • 所有访问该网站的用户。这是可行的,但会带来噪声:未进入结账页面的用户也会被包括进来。由于我们的改动发生在结账页面,这些用户不会受到任何影响。将他们排除在外可以提高A/B测试的灵敏度。
  • 仅包括完成付款的用户。这是不正确的,因为它假设这个改动只会影响付款额度,而不影响完成付款的用户的比例。如果更多的用户付款,那么即使总营收增加,人均营收也可能会降低。
  • 仅包括开始付款流程的用户。考虑到改动发生在漏斗中的环节,这是最好的选择。我们包括了所有潜在受影响的用户,且排除了不被影响但会稀释实验结果的那部分用户(从未进入结账页面的用户)。

现在细化后的假设是“在结账页面添加优惠券输入框会降低开始付款流程的用户的人均营收”。

02 假设检验:确立统计显著性

设计、运行或分析实验之前,先来复习一些与统计假设检验相关的基础概念。

首先,我们通过理解基准线均值及其标准差来刻画一个指标。标准差表明了指标估值的变动有多大。我们需要知道这一变动,以正确地估计实验所需的样本量,以及在分析时计算统计显著性。对于大多数指标,我们测量它们的均值,但是也可以选择其他的概述统计量,比如百分位数。

灵敏度,或者说检测到统计上显著差异的能力,会随着标准差的降低而提高。提高灵敏度的典型做法是分配更多的流量进入变体,或者拉长实验的运行时间(通常用户量会随着时间增加)。

然而,实验开始的几周后,后面这种方法可能没有前者有效果,因为重复访问的用户使得去重用户量的增长呈次线性,而有些指标本身的方差也会随着时间而增长。

运行实验时,我们会为多组样本,而非单组样本,刻画一个指标。具体来说,在对照实验中,实验组有一组样本,每个对照组各有一组样本。如果零假设是来自实验组的样本和来自对照组的均值相同,我们会定量测试两组样本的差异的可能性大小。

如果可能性非常小,则我们拒绝零假设,并宣称差异是统计显著的。确切地说,有了实验组样本和对照组样本的人均营收的估计值,我们可以计算估计值的差异的p值,即在零假设为真的情况下观测到这种差值或更极端的差值的概率。

如果p值足够小,则我们拒绝零假设,并得出实验有效应(或者说结果统计上显著)的结论。但是多小是足够小呢?

科学的标准是使用小于0.05的p值,也就是说,如果事实上是没有效应的,那么100次里我们有95次能正确地推断出没有效应。另一种检验样本差异是否统计显著的方法是看置信区间有没有包含零值。95%置信区间是一个可以在95%的时间里覆盖真实差异值的区间。

对于较大的样本量,这个区间通常以观测到的实验组和对照组差值为中心点,向两边各扩展1.96倍于标准差的宽度。图2.3展示了p值和置信区间这两种方法的等价性。

一个案例、6个步骤全程详解A/B测试,看这篇就够了

▲图2.3

  • 上图:用p值评定观测到的差值是否统计显著。如果p值小于0.05,则认为是统计显著的。
  • 下图:用95%置信区间Δ-1.96σ,Δ+1.96σ评定统计显著性的等价方法。如果零值落在置信区间之外,则认为是统计显著的

关于p值更详细的解读可以参考此前的文章《终于有人把p值讲明白了》。

03 设计实验

现在可以开始设计实验了。我们已经有了一个假设和一个实际显著的边界,并且刻画了指标。我们将接着做以下决定来敲定设计:

  1. 随机化单元是什么?
  2. 我们的目标群体是什么?
  3. 实验需要多大的样本量?
  4. 实验需要运行多久?

这里我们假设随机化单元是用户。

以一个特定群体为目标意味着你只想对具有某一特征的用户运行实验。例如,要测试新的仅限于某几种语言的文本,这时,可以选择界面语言设置为这几种语言的用户。其他常见的目标属性包括地理区域、平台和设备类型。在我们的这个例子里,假设以所有用户为目标。

实验的样本量大小(对我们而言就是用户量)对结果的精确度有直接影响。如果你想要检测出很小的变化或者对结论更有信心,那么就要运行一个有更多用户的实验。这里我们列出一些可能要考虑的调整:

  • 如果用购买指示符(即用户买/没买,无论买了多少)而不是人均营收作为OEC,那么标准差会更小,意味着更少的用户就能达到同样的灵敏度。
  • 如果提高实际显著水平,比如我们不再关心1%的变化,而只关心更大的变化,由于更大变化更容易被检测到,我们就可以缩小样本量。
  • 如果想用更小的p值阈值,比如0.01,以使得我们能更确信结果有差异而拒绝零假设,则需要增大样本量。

其他一些决定实验样本量的考虑因素如下:

  • 实验的安全性如何?对于一些重大的改动,由于无法确定用户会有什么反应,你可能想要先从一小部分用户开始测试。这个考量不影响实验最终所需样本量,但是会影响放量策略。
  • 这个实验是否需要和其他实验共享流量?如果是,怎么平衡流量需求?概括来说,如果有其他的变动也要测试,可以选择同时运行或者依序运行。如果必须在多个同时运行的测试间分割流量,那么每个测试将只能得到更小的流量。

另一个重要的问题是实验需要运行多久。我们需要考虑如下这些因素:

  • 更多的用户:对于线上实验,用户随着时间流入实验,时间越长,用户数越多。统计功效通常也会随之提高(当测量累积指标时会有例外,比如会话数,其方差也随着增大,统计功效则未必会随用户数增加而提高)。考虑到同样的用户会反复访问,用户随时间的累积可能是次线性的:第一天有N个用户,两天的总用户数会小于2N,因为部分用户这两天都会来访问。
  • 周内效应:周末访问的用户群体可能和周中访问的不一样。即使同一用户在周中和周末也可能有不一样的表现。确保实验能覆盖一周的周期是很重要的。我们建议实验至少要运行一整周。
  • 季节性:还有一些用户可能有其他不同表现的重要时期需要考虑,比如节假日。如果你的用户遍布全球,美国假期和非美国假期可能会有影响。例如,礼品卡可能在圣诞期间销量很好,但在一年的其他时期则不行。这被称为外部有效性,即实验结果可以被归纳推广到什么程度,这里指被推广到其他时间段。
  • 初始和新奇效应:有些实验在初始阶段有较大或较小的效应,并在之后的一段时间趋于稳定。例如,用户可能会尝试一个新的很亮眼的按钮,然后发现它并不好用,这个按钮的点击量则会随着时间而减少。而有些新功能会有一个被接受的过程,需要一定的时间来建立用户基础。

至此,我们的实验设计如下:

  1. 随机化单元是用户。
  2. 我们以全体用户为目标,并分析那些访问结账页面的用户。
  3. 为了能以80%的统计功效检测出至少1%的人均营收的变化,我们会通过功效分析来确定样本量。
  4. 根据所需样本量,实验要按34%/33%/33%的比例将流量分配到对照组/实验组1/实验组2,且至少运行4天。为了确保了解周内效应,我们将运行实验一整周,如果发现新奇效应或初始效应,则可能需要运行更长时间。

一般来说,实验的统计功效过大是没有问题的,甚至是推荐的,因为有时候我们需要检查细分群(例如,地理区域或平台),且有时候需要保证实验有足够的统计功效来检测多个关键指标的变化。例如,我们可能有足够的统计功效来检测对所有用户的营收的影响,但没有足够的统计功效来观测针对加拿大用户的影响。

还有一点值得注意的是,虽然这里的对照组和实验组有近似相同的样本量,但如果实验组数量增加,则可能要考虑让对照组的样本量比实验组多。

 

04 运行实验并获得数据

现在我们运行实验并收集必要的数据。这里只简单概述一下要点。

为了运行实验,我们需要:

  • 工具化日志记录来获得用户和网站互动的日志数据,以及这些互动是属于哪个实验的。
  • 基础设施来支持实验的运行,从实验配置到变体分配。

一旦开始运行实验,并且使用工具化日志记录收集了日志数据,就可以开始着手处理数据、计算概述统计量并可视化结果了。

05 分析结果

实验有数据了!分析实验对人均营收的影响之前,需要先做一些合理性检查来确定实验的运行是正确的。

多种漏洞都会使实验结果无效。为了抓住这些漏洞,我们会关注护栏指标(guardrail metric)或不变量(invariant)。这些指标不应该在对照组和实验组之间存在差异。如果有差异,那么实验中测量到的差异有可能是由其他变动而不是被测试的改动导致的。

不变量指标有两种类型:

  1. 与可信度相关的护栏指标,比如对照组和实验组的样本量应该和实验构建时的预期一致,或者它们有同样的缓存命中率。
  2. 机构的护栏指标,比如延迟指标。延迟指标对机构很重要,而且在很多实验中不应该有变化。对于结账页面的实验,如果延迟改变了会令人感到意外。

如果合理性检查失败,那么很有可能背后的实验设计、基础设施或数据处理是有问题的。

完成基于护栏指标的合理性检查之后,我们可以开始看结果(表2.1)。

一个案例、6个步骤全程详解A/B测试,看这篇就够了

表2.1 结账页面实验的人均营收结果

由于两个对照组的p值都小于0.05,我们拒绝实验组和对照组有相同均值的零假设。

这意味着什么呢?我们证实了在用户界面添加优惠券输入框会降低营收。如果进一步研究数据,结果表明营收降低是因为完成付款过程的用户更少。

因此,任何发送优惠券的营销邮件需要扣除的不仅是实现优惠券添加系统带来的处理和维护成本,还有最开始添加优惠券输入框的负面影响。

由于这一市场营销模型被预测可以小幅增加部分目标用户的营收,而A/B测试显示它会显著降低所有用户的营收,最终我们决定放弃引入优惠券的想法。画门法的A/B测试节省了我们很多精力!

06 从结果到决策

运行A/B测试的目标是收集数据以驱动决策。很多工作都用来确保实验结果是可重复的且可信赖的,以做出正确的决策。接下来我们对几种可能发生的不同情况梳理决策过程。

对于每一种情况,我们都已经有了实验结果,且目标是将实验结果转化为产品功能发布/不发布的决策。强调决策部分是因为一个决策既需要考虑从测量结果得到的结论,也要考虑更广泛的背景,例如:

  • 你是否需要在不同的指标之间权衡取舍?如用户互动度增加,但营收降低,应该发布吗?另一个例子是,如果CPU利用率增加,运行服务的成本却可能超过这一变化带来的效益。
  • 发布改动的成本是什么?包括:
  • 发布之前完整搭建这个功能的成本。有些功能可能在实验之前就已经完全建好。对于这种情况,从1%到100%的发布没有额外的成本。也有其他的情况。像我们的例子,实现“画门”是低成本的,但实现完整的优惠券系统则需要付出很高的成本。
  • 发布之后持续维护的工程成本。维护新的代码可能更加昂贵。新代码容易有更多漏洞,且边界情况的测试不完善。如果新代码的复杂度更高,那么在其基础上搭建新的改动会有更多的阻力和成本。

如果成本很高,则必须确保预计的收益高于成本。对于这种情况,需要确保实际显著的边界设立得足够高。反过来,如果成本很低或没有成本,你可以选择发布任何有正面影响的改动,也就是说,实际显著的边界很低。

决策错误的代价是什么?不是所有的决策都是等价的,也不是所有的错误都是等价的。发布没有影响的改动可能没有任何坏处,但放弃有影响的改动可能机会成本很高,反过来也是一样。例如,你在网站上测试两个头条推广,且推广只存续几天的时间。由于改动的生命期很短,做出错误决策的代价很低。此时,你可能愿意降低统计显著性和实际显著性水平。

构造统计显著性和实际显著性阈值的时候,需要考虑以上这些背景。从实验结果出发来做决策或采取行动的时候,这些阈值非常关键。假设我们在实验开始之前已经考虑了这些背景并更新了阈值,现在来用图2.4中的例子解释如何用这些阈值指导决策。

一个案例、6个步骤全程详解A/B测试,看这篇就够了

▲图2.4

图2.4 关于决策是否发布时理解统计显著性和实际显著性的例子。实际显著的边界由两条虚线表示。各个示例结果的估计差异值(及置信区间)由黑框表示

  1. 结果不是统计显著的,显然也不是实际显著的。很容易得出结论:该改动没有什么影响。可以做迭代或者放弃。
  2. 结果是统计显著的,也是实际显著的。同样很容易得出结论:发布!
  3. 结果是统计显著的,但不是实际显著的。这时候,你对差异值的量级是有把握的,但是这个量级可能不足以胜过其他因素,比如成本。这一改动也许不值得发布。
  4. 跟例1一样,这是个中性的例子。然而,这里置信区间越过了实际显著的阈值。如果运行一个实验然后发现它可能增加或降低10%的营收,你真的会接受这个实验结果并认为结果是中性的吗?更好的说法是没有足够的统计功效来得到一个有力的结论,也就是说,没有足够的数据来支持发布或不发布的决策。对于这个结果,我们推荐通过运行跟进实验来测试更多的单元,以获得更大的统计功效。
  5. 结果可能是实际显著的,但不是统计显著的。即便最好的猜测是这个改动有影响,也很有可能实际上完全没有影响。从测量的角度来说,最好的建议是重复这个实验,同时增大统计功效以提高结果的灵敏度。
  6. 这个结果是统计显著的,并且可能是实际显著的。像例5一样,有可能这个改动并不是实际显著的。因此,跟前面几个例子一样,我们推荐重复实验并增大统计功效。不过从发布/不发布的决策角度来说,选择发布是一个合理的决定。

要记住的关键一点是,有些时候实验结果给不了清晰的答案,但仍然要做出决策。对于这种情况,我们需要明确考虑的因素,尤其是这些因素如何影响实际显著和统计显著的边界设定。这些考虑会为未来的决策提供基础,而非局限于当前的单一决策。

关于作者:罗恩·科哈维(Ron Kohavi)是爱彼迎的副总裁和技术院士,曾任微软的技术研究员和公司副总裁。在加入微软之前,他是亚马逊的数据挖掘和个性化推荐总监。他拥有斯坦福大学计算机科学博士学位,论文被引用超过40 000次,其中有3篇位列计算机科学领域引用最多的1 000篇论文榜。

黛安·唐(Diane Tang)是谷歌院士,大规模数据分析和基础设施、线上对照实验及广告系统方面的专家。她拥有哈佛大学的文学学士学位和斯坦福大学的硕士及博士学位,在移动网络、信息可视化、实验方法、数据基础设施、数据挖掘和大数据方面拥有专利和出版物。

许亚(Ya Xu)是领英数据科学与实验平台负责人,曾撰写了多篇关于实验的论文,并经常在顶级会议和大学演讲。她曾在微软工作,拥有斯坦福大学的统计学博士学位。

本文摘编自《关键迭代:可信赖的线上对照实验》,经出版方授权发布。

一个案例、6个步骤全程详解A/B测试,看这篇就够了

延伸阅读《关键迭代:可信赖的线上对照实验》

推荐语:爱彼迎、谷歌、领英A/B测试领军人物撰写,亚马逊、谷歌、微软和领英等公司互联网产品成功的秘诀!谷歌院士JeffDean、脸书首任CTO、沈向洋等37位专家推荐。本书基于近些年实验领域的研究成果和实践经验,对实验的方法和应用做了很好的全景式描述,是一本兼顾系统性的方法论和基于实战的经验法则的书籍。



Tags:A/B测试   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
导读:本文将利用一个例子来探索设计、运行和分析对照实验的基本原则。这些原则适用于各种软件开发环境,包括网页服务器和浏览器、桌面应用程序、移动端应用程序、游戏主机、虚...【详细内容】
2021-07-21  Tags: A/B测试  点击:(96)  评论:(0)  加入收藏
在今天召开的火山引擎技术开放日活动中,字节跳动副总裁、算法和数据技术负责人杨震原首次揭秘了字节跳动如何使用A/B测试。火山引擎是字节跳动旗下为企业服务的智能科技品牌,...【详细内容】
2021-04-21  Tags: A/B测试  点击:(168)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条