DataTester 是字节跳动在 2019 年正式通过火山引擎数智平台推出的对外服务的 A/B 实验工具,它基于先进的底层算法,提供科学分流能力,提供智能的统计引擎,实验结果可靠有效,助力业务决策。

让中小企业也能借助字节跳动的技术力量拥抱最新的产品趋势,融入字节跳动的各种方法论,打造更加优秀的产品。DataTester 在字节内每日新增 1500+实验,累计已有 150W+ 的 A/B 实验进行过。

在外部客户的服务上,也已覆盖推荐、广告、搜索、UI、产品功能等业务场景,提供从实验设计、实验创建、指标计算、统计分析到最终评估上线等贯穿整个实验生命周期的服务。来自得到、美的、凯叔讲故事 APP 等企业客户,已经通过火山引擎 DataTeser 开启了用数据驱动科学决策的道路。

点击 火山引擎DataTester官网了解更多

一、初阶

1.AB 实验
为了验证一个新策略的效果,准备原策略 A 和新策略 B 两种方案。随后在总体用户中取出一小部分,将这部分用户完全随机地分在两个组中,使两组用户在统计角度无差别。将原策略 A 和新策略 B 分别展示给不同的用户组,一段时间后,结合统计方法分析数据,得到两种策略生效后指标的变化结果,并以此判断新策略 B 是否符合预期。

  • 上述过程即 A/B 实验,亦被称为“对照实验”或“小流量随机实验”。

2.互斥组
互斥组,也称互斥层、实验层。“实验层”技术是为了让多个实验能够并行不相互干扰,且都获得足够的流量而研发的流量分层技术。

举个例子,假如我现在有 4 个实验要进行,每一个实验要取用 30%的流量才能够得出可信的实验结果。此时为了同时运行这 4 个实验就需要 4*30%=120%的流量,这意味着 100%的流量不够同时分配给这 4 个实验。

那么此时我们只能选择给实验排序,让几个实验先后完成。但这会造成实验效率低下。实验层技术就可以完美解决这个问题。

我们把总体流量“复制”无数遍,形成无数个流量层,让总体流量可以被无数次复用,从而提高实验效率。各层之间的流量是正交的,你可以简单理解为:在流量层选择正确的前提下,流量经过科学的分配,可以保证各实验的结果不会受到其他层实验的干扰。

3.互斥实验
互斥实验:互斥组中的所有实验都不会共享用户,如果一个用户/设备命中了实验 A,就不会命中该互斥组中的其他实验。

举例,你要同时做按钮颜色和按钮形状的实验,就需要将两个实验加入到一个互斥组列表。

4.正交实验
互斥组=互斥层=实验层

  • 每个独立实验为一层,一份流量穿越每层实验时,都会随机打散再重组,保证每层流量数量相同。

如何理解流量正交?

举个例子。假设我现在有 2 个实验。实验 A(实验组标记为 A1,对照组标记为 A2)分布于实验层 1,取用该层 100%的流量;实验 B(实验组标记为 B1,对照组标记为 B2)分布于实验层 2,也取用该层 100%的流量。(要注意,实验层 1 和实验层 2 实际上是同一批用户,实验层 2 只是复用了实验层 1 的流量)
引用
如果把 A1 组的流量分成 2 半,一份放进 B1 组,一份放进 B2 组;再把 A2 组的流量也分成 2 半,一份放进 B1 组,一份放进 B2 组。那么两个实验对于流量的调用就会如下图所示。此时实验 A 和实验 B 之间,就形成了流量“正交”。

流量正交有什么意义呢?

  • 我们可以发现,因为 A1 组的一半流量在 B1 中,另一半流量在 B2 中,因此即使 A1 的策略会对实验 B 产生影响,那么这种影响也均匀的分布在了实验 B 的两个组之中;
  • 在这种情况下,如果 B1 组的指标上涨了,那么就可以排除 B1 是受 A1 影响才形成上涨。这就是流量正交存在的意义。

5.实验组
实验组和对照组是一组相对的概念,A/B 实验通常是为了验证一个新策略的效果。假设在实验中,所抽取的用户被随机地分配到 A 组和 B 组中,A 组用户在产品中体验到新策略,B 组用户在实验中体验的仍旧是旧策略。在这一实验过程中,A 组便为实验组,B 组则为对照组。

6.参数、参数类型、参数值
在开一个实验时,你需要通过一个标识来区分对照组和实验组,我们用参数来解决标识的问题。在 A/B 测试的实验中,每一个对照组和实验组可以有 1 个参数也可以有多个参数,每个参数都会有参数类型(目前支持 String、Number、Boolean),每个参数还会有参数值。

  • 如,对于注册文案的实验,我们可以建立一个 String 类型的参数(命名为:register_name),对照组的参数值为"一键注册",实验组的参数值为"立即注册"。

7.指标
在开一个实验时,目的是对比对照组和实验组的某个或者某几个指标。

  • 如,分析点击按钮的次数时,需要上报注册按钮的点击事件,然后在「A/B 测试」产品上配置指标即可。

8.流量
互联网行业的 A/B 实验中,流量通常用于描述产品所拥有的总体用户数量。

9.流量分配
开 A/B 实验时,一般都会小流量测试,当看到某个实验组效果后,再大流量测试,最终再全量上线。

10.过滤条件
在实验中增加一些限制条件,规定被实验命中的用户必须符合(或不符合)这些条件,进而达到缩小用户集群、精准找到用户的目的,这种限制条件即“过滤条件”,亦称 filter。

11.白名单用户
在实验正式开启之前,通常需要先选择几名用户进入测试阶段,观察实验是否能够正常获取想要收集的数据,或客户端是否有 bug 等。参与这一步的用户被称为“白名单用户”。

12.命中
用户经过随机分配后,进入实验组或对照组,参与到实验之中,即称为用户被实验“命中”;反之则为“未命中”。

13.时长
即 A/B 实验持续的时间长度,在「A/B 测试」产品中,时长的单位是“天”。

14.SDK
SDK 就是 Software Development Kit 的缩写,中文意思就是“软件开发工具包”。辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”,我们可以把 SDK 理解成一个小型工具包,来实现指定的功能,帮助我们解决指定的问题,集成「AB 客户端 SDK」的主要作用就是帮助实验者进行分流。

15.WAU
WAU(Weekly Active Users),周活跃用户数,最近一周(含当日的 7 天)启动使用产品的用户数,一般按照自然周进行计算。

16.MAU
MAU(Monthly Active Users),月活跃用户数,最近一个月(含当日的 30 天)启动使用产品的用户数,一般按照自然月进行计算。

17.方差与标准差
方差:方差是数据组中各数据值与中心值间距的平方和的平均值。


方差的计算公式:公式中 M 为数据的平均数,n 为数据的个数,s²为方差。
标准差:标准差是方差的平方根,即 s。

二、中阶

1.留存率
实验报告中的留存率指的是“按进组时间拆分的留存率”,是根据【用户首次进实验组的时间】作为起始,用户回到 App 作为回访,计算用户 n 日留存。
统计方式如下:

举个例子说明:第一天实验组 A 的用户数为:10000,第一天 base_user 为 10000。
第二天实验组 A 的用户数为:10400,其中 9200 用户是第一天便已经在 A 中的用户,1200 用户为当天新进组用户;第二天 base_user 为 1200,第一天的次日留存为 9200/10000=92%。
第三天实验组 A 的用户数为:10200,其中 8000 用户为第一天便已经在 A 中的用户,1100 用户为第二天进入 A 中的用户,1100 为第三天进入 A 的用户;第三天的 base_user 为 1100, 第一天的 2 日留存为 8000/10000=80%, 第二天的次日留存为 1100/1200=91.67%。
然后分别把每个进入实验日期的指标用 base_user 进行加权平均,得到次日留存率、第 2 天留存率等。

当日"已进组用户" 表示当日曝光进组的总用户数,包括之前已进组的老用户和初次到访的"新进组用户"。

3.置信区间
置信度区间就是用来对一组实验数据的总体参数进行估计的区间范围。

举个例子,我们现在开了一个实验来优化商品页面的用户购买率,其中采用了新策略 B 的实验组,购买率提升均值为 5%,置信区间为[-3%,13%]。
怎么理解此处的置信区间呢?
由于在 A/B 实验中我们采取小流量抽样的方式,样本不能完全代表总体,那么实际上策略 B 如果在总体流量中生效,不见得会获得 5%的增长。如果我们设策略 B 在总体流量中推行所导致的真实增长率为μ,那么在这个案例中,μ的真实取值会在[-3%,13%]之间。

值得注意的是,μ并不是 100%概率落在这一区间里,在计算置信区间的过程中,我们会先取一个置信水平,计算这一置信水平下的置信区间是多少,A/B 实验中我们通常计算 95%置信度下的置信区间。回到刚刚的例子,我们就可以得知,μ的真实取值有 95%的可能落在[-3%,13%]之间。

4.多天累计指标
“多天累计指标”是所选实验日期范围内,对应指标多天合并的累计值。

举个例子,假如现在我们要看 6 月 1 日号到 6 月 3 日,用户 A、B、C 的用户阅读数这一指标:上表中的数字关系很清晰地展示了多天累计指标与单日指标之间的逻辑(其实就是加一起而已)。

在 A/B 实验中,如果我们所检测的指标支持多天累计指标,那么我们基本上应该以多天累计指标为准,而不要过多关注实验周期内的单日指标。多天累积数据意味着,随着实验的进行,实验的总体样本不断增加,实验的检验灵敏度在不断提高。

5.A/B 实验分流服务
开设 A/B 实验,顾名思义,我们至少需要一个 A 组和一个 B 组,那么究竟是什么决定了哪些用户被实验命中,以及哪些用户进入 A 组/B 组呢?就是靠 A/B 实验分流服务。

  • 分流服务会帮助实验者,从总体流量中抽取部分流量,并将抽取的流量随机地分配进 A 组与 B 组之中,尽量减少抽样误差。
  • 需要注意的一点是,当分流服务分流完成后,被选中进入实验的用户会被赋予一个“身份信息”——ab_version(又称 vid),这个 id 标记着你究竟应该进入实验的哪一组中。

三、高阶

1.假设检验
A/B 实验的核心统计学理论是(双样本)假设检验。假设检验,即首先做出假设,然后运用数据来检验假设是否成立。需要注意的是 ,我们在检验假设时,逻辑上采用了反证法。通过 A/B 实验,我们实际上要验证的是一对相互对立的假设:原假设和备择假设。

  • 原假设(null hypothesis):是实验者想要收集证据予以反对的假设。A/B 实验中的原假设就是指“新策略没有效果”。
  • 备择假设(alternative hypothesis):是实验者想要收集证据予以支持的假设,与原假设互斥。A/B 实验中的备择假设就是指“新策略有效果”。

利用反证法来检验假设,意味着我们要利用现有的数据,通过一系列方法证明原假设是错误的(伪),并借此证明备择假设是正确的(真)。这一套方法在统计学上被称作原假设显著性检验 null hypothesis significance testing (NHST)。

举个例子:我们要针对某页面的购买按钮做一个实验。我认为:将购买按钮的颜色从蓝色改为红色,可以提高购买率 3%。在这个实验中,我们想通过统计学检验的“原假设”就是“购买按钮改成红色不能提升购买率”;

“备择假设”就是“购买按钮改成红色能够提升购买率”。这是一对互斥的假设。也就是说,实际上我们要证明的就是“改成红色不能提升购买率”是错误的。

2.第一类错误 &显著性水平(α)

  • 第一类错误,指原假设正确(真),但是我们假设检验的结论却显示原假设错误。这一过程中我们拒绝了正确的原假设,所以第一类错误是“弃真”。
  • 第一类错误在实际操作中表现为:实验结论显示我的新策略有用,但实际上我的新策略没有用。

在统计学中,我们用显著性水平(α)来描述实验者犯第一类错误的概率。

当某个实验组的指标是显著的,说明这个实验结果大概率是可信的。这个概率是 95%,也就是说,系统有 95%的信心确认这个实验结果是准确的。

3.显著性水平存在的意义是什么?
一个按钮从蓝色改成红色,一个窗口从左边移到右边,到底用户体验会变好还是变差呢?我们并不确定,因此我们试图使用 A/B 实验的办法,帮助我们转化这种“不确定”——观察小流量实验中新旧策略的表现,从而确定新旧策略的优劣。

但是,这样就能完全消除不确定性了吗?

答案是不能,因为存在抽样误差。

  • 举个例子,假设瑞士人均收入为中国的十倍,那么随机抽三个瑞士人和三个中国人,能保证样本里这三个瑞士人的平均收入是三个中国人的十倍吗?万一这三个中国人是马云,王健林和一个小学生呢?
  • 反过来想,假设在 1%的流量下,组 A(按钮呈红色)比组 B(按钮呈现蓝色)购买率高,将流量扩大至 100%,能保证策略 A 的表现仍旧比策略 B 出色吗?显然,我们还是不确定。
    抽样误差带来的不确定性,使得我们在做小流量实验时,永远没法保证结论是完全正确的。幸运的是,对于抽样的不确定性,在统计学中,我们有一套方法来量化这种不确定性到底有多大,这便是显著性水平(α)存在的意义。

4.第二类错误( β )&统计功效(statistics power)

  • 第二类错误,指原假设错误(伪),但是我们假设检验的结论却显示“原假设正确(真)、备择假设是错误的”,这一过程中我们接受了错误的原假设,所以第二类错误是“取伪”。
  • 第二类错误在实际操作中表现为:我的新策略其实有效,但实验没能检测出来。

在统计学中,统计功效 = 1 - 第二类错误的概率,统计功效在现实中表现为:我的新策略是有效的,我有多大概率在实验中检测出来。

5.统计显著性/置信水平/置信度/置信系数

  • 置信水平(也称置信度、置信系数、统计显著性),指实验组与对照组之间存在真正性能差异的概率,实验组和对照组之间衡量目标(即配置的指标)的差异不是因为随机而引起的概率。置信水平使我们能够理解结果什么时候是正确的,对于大多数企业而言,一般来说,置信水平高于 95%都可以理解为实验结果是正确的。因此,默认情况下,「A/B 测试」产品将置信水平参数值设置为 95%。
  • 在 A/B 实验中,由于我们只能抽取流量做小样本实验。样本流量的分布与总体流量不会完全一致,这就导致没有一个实验结果可以 100%准确——即使数据涨了,也可能仅仅由抽样误差造成,跟我们采取的策略无关。在统计学中,置信度的存在就是为了描述实验结果的可信度。

在实验的过程中,我们所抽取的样本流量实际上与总体流量会存在些许的差异,这些差异就决定了我们通过实验得出的结论或多或少会存在一些“误差”。

举个例子,实验中,我通过改变落地页的颜色让购买率提升了 3%,但是因为样本流量并不能完全代表总体流量,有可能“我改变颜色这一策略其实没用,购买率提升 3%是抽样结果导致的”。

那么发生这种“我的策略其实没用”事件的概率有多大呢?在统计学中,我们会用“显著性水平(α)”来描述发生这一事件的概率是多少。而置信度=1-α。

在「A/B 测试」产品上,根据业界标准,显著性水平α取 0.05。在 A/B 实验中,如果发生“我的策略其实没用”这一事件的概率小于 0.05,我们即称实验结论已经“统计显著/可置信”。这意味着你采取的新策略大概率(A/B 实验中意味着大于 95%)是有效的。相反,如果这一事件的概率大于 0.05,则称实验结论“不显著/不可置信”。

6.中心极限定理
显著性水平的理论依据便是中心极限定理。我们可以量化抽样误差的根基在于中心极限定理的存在。
什么是中心极限定理?

  • 由于存在抽样误差,我们每次实验所得到的指标结果,都可能与我们期望得到的真正结果有误差。假设我们从总体中抽取样本,计算其指标的均值,每一次计算,样本均值都会受抽样误差影响。假如我们做无数多次实验,那么理论上,这无数多个样本均值中,总应该有一个是“真的”,不受抽样误差影响的,这个值在统计学里被称为“真值”。
  • 中心极限定理定告诉我们,如果我们从总体流量里不断抽取样本,做无数次小流量实验,这无数次抽样所观测到的均值,近似呈现正态分布(就是下图这样的分布)。这个分布以真值为中心,均值越接近真值,出现的概率就越大;反之均值越偏离真值,出现的概率就越小。
    PS:此处为了便于理解,放弃了阐述统计学概念,仅从 A/B 实验场景下出发,解释中心极限定理。

    为什么样本均值越接近真值,出现的概率越大?

    举个例子,如果从全中国人这个总体中,抽取很多很多次样本,计算很多很多次平均收入。可以预见,我们会因为样本不同而得到很多个不同的平均收入值。这些数值确实有可能因为偶然抽到顶级富豪而偏高,或因为抽到极贫困的人口而偏低。

    但是,上述两种情况毕竟是少数(均值越偏离真值,出现的概率小)。随着抽样次数增多,我们会发现,平均收入落在大多数普通人收入范围内的次数,会显著增多(均值接近真值,出现的概率大)。并且,有了中心极限定理的帮助,我们可以知道每个均值出现的概率是多少。

8.校验灵敏度 MDE

  • MDE 是什么:Minimum Detectable Effect (MDE),最小可检测单位,即检验灵敏度,是实验在当前条件下能有效检测的指标 diff 幅度。当前条件,指当前样本量,指标值和指标分布情况,并假设样本方差与总体指标方差足够接近。有效检测,指检出概率大于等于 80%(type II error 小于等于 20%)。
  • MDE 可以用来做什么:通过比较指标 MDE 与指标的目标提升率,来判断不显著的指标结论是否 solid,可以避免实验在灵敏度不足的情况下被过早作出非显著结论而结束,错失有潜力的 feature。
  • 如何设置:MDE 越小,意味着您要求测试的灵敏度越高,所需的样本量也越大。如果 MDE 设置过于精细,不仅会浪费不必要的流量,同时实际收益可能不能弥补新策略的研发和推广成本。灵敏度不足(比如预期 1%就达标,但实验灵敏度仅能检测 5%及以上),可能会导致错失有潜力的 feature。

火山引擎 DataTester 科普:A/B 实验常见名词解释的更多相关文章

  1. 火山引擎 DataTester:让企业“无代码”也能用起来的 A/B 实验平台

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当数字化变革方兴未艾,无代码正受到前所未有的关注.Salesforce 的数据显示,52%的 IT 部门表示,公司 ...

  2. 【知识体系】Kafka文档汇总、组成及架构,配置,常见名词解释,命令行及api操作,官方文档内容,各部分深入,zookeeper和security,监控和运维

    〇.相关资料 1.快速搭建文档: 2.详细讲义 3.在线官方文档:http://kafka.apache.org/documentation/ 4.Kafka知识个人总结 5.KafkaPPT汇报 链 ...

  3. 还原火山引擎 A/B 测试产品——DataTester 私有化部署实践经验

      作为一款面向ToB市场的产品--火山引擎A/B测试(DataTester)为了满足客户对数据安全.合规问题等需求,探索私有化部署是产品无法绕开的一条路.   在面向ToB客户私有化的实际落地中,火 ...

  4. 火山引擎 A/B 测试产品——DataTester 私有化架构分享

    作为一款面向 ToB 市场的产品--火山引擎A/B测试(DataTester)为了满足客户对数据安全.合规问题等需求,探索私有化部署是产品无法绕开的一条路. 在面向 ToB 客户私有化的实际落地中,火 ...

  5. 如何又快又好实现 Catalog 系统搜索能力?火山引擎 DataLeap 这样做

      摘要 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理.资产.安全等全套数据中台建设,降低工作成本和数据维护成本.挖掘数据价 ...

  6. 火山引擎 DataLeap:一家企业,数据体系要怎么搭建?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 导读:经过十多年的发展,数据治理在传统行业以及新兴互联网公司都已经产生落地实践.字节跳动也在探索一种分布式的数据治 ...

  7. 火山引擎MARS-APM Plus x 飞书 |降低线上OOM,提高App性能稳定性

    通过使用火山引擎MARS-APM Plus的memory graph功能,飞书研发团队有效分析定位问题线上case多达30例,线上OOM率降低到了0.8‰,降幅达到60%.大幅提升了用户体验,为飞书的 ...

  8. 火山引擎 DataLeap 的 Data Catalog 系统公有云实践

      Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景.本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Ca ...

  9. 火山引擎DataLeap数据调度实例的 DAG 优化方案

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 实例 DAG 介绍 DataLeap 是火山引擎自研的一站式大数据中台解决方案,集数据集成.开发.运维.治理.资产管理能力 ...

  10. 火山引擎 DataLeap:3 个关键步骤,复制字节跳动一站式数据治理经验

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理. ...

随机推荐

  1. 关于react提问以及解答

    1. 请教个工程问题. 团队运用webpack打包前端代码,转译后的文件每次都需要push到代码库远端:从开发角度而言,是不希望这部分代码在代码库的:两个原因:1是不方便代码review,2是代码仓库 ...

  2. 数据结构-线性表-单循环链表(使用尾指针)(c++)

    目录 单循环链表 说明 注意 (一)无参构造函数 (二)有参构造函数 (三)析构函数 (四)获取长度 (五)打印数组 (六)获取第i个元素的地址 (七)插入 (八)删除 (九)获取值为x的元素的位置 ...

  3. SQL Server 2000 创建角色,登陆用户,安全用户,批量授予权限

    前言 我在2011年刚入门学习的时候,是从 SQL Server 2008 开始学的,再加上这些年较少接触 SQL Server 2000,因此对它不是很熟. 之前都是在 SQL Server 200 ...

  4. C/C++ 通过SQLiteSDK增删改查

    SQLite,作为一款嵌入式关系型数据库管理系统,一直以其轻量级.零配置以及跨平台等特性而备受青睐.不同于传统的数据库系统,SQLite是一个库,直接与应用程序一同编译和链接,无需单独的数据库服务器进 ...

  5. 【luogu题解】P9749 [CSP-J 2023] 公路

    \(Meaning\) \(Solution\) 这道题我来讲一个不一样的解法:\(dp\) 在写 \(dp\) 之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件和答案的表示. 状态 ...

  6. 2 与HTTP相关的各种概念

    目录 1 与HTTP相关的各种应用 1 网络世界 2 浏览器 3 Web服务器 4 CDN 5 爬虫 2 与HTTP相关的各种协议 1 HTML 2 编程语言 3 WebService 4 WAF 1 ...

  7. MybatisPlus高级特性之SimpleQuery工具类

    1.是很么? SimpleQuery可以对selectList查询后的结果使用Stream流进行操作,使其可以返回指定的结果,简洁了api的调用 2.怎么玩? 案例演示 (1) list操作 /** ...

  8. Java多线程学习(Day02)

    目录 线程简介 线程实现(重点) 线程状态 线程同步(重点) 线程通信问题 线程实现: 方式一:继承Thread类 /** * TODO * @author 清莲孤舟 * @CreateDate 20 ...

  9. python tkinter 使用(二)

    python tkinter 使用(二) 本篇文章着重讲下tkinter中messagebox的使用. 1:提示框 def showinfo(event): messagebox.showinfo(& ...

  10. 关于 K8s 的一些基础概念整理

    〇.前言 Kubernetes,将中间八个字母用数字 8 替换掉简称 k8s,是一个开源的容器集群管理系统,由谷歌开发并维护.它为跨主机的容器化应用提供资源调度.服务发现.高可用管理和弹性伸缩等功能. ...