「原理」AB测试-详细过程和原理解读

开发 前端
AB测试最核心的原理,就四个字:假设检验。检验我们提出的假设是否正确。对应到AB测试中,就是检验实验组&对照组,指标是否有显著差异。

[[392732]]

本文转载自微信公众号「巡山猫说数据」,作者巡山猫 。转载本文请联系巡山猫说数据公众号。   

AB测试原理简介

AB测试最核心的原理,就四个字:假设检验。检验我们提出的假设是否正确。对应到AB测试中,就是检验实验组&对照组,指标是否有显著差异。

既然是假设检验,那么就是先假设,再收集数据,最后根据收集的数据来做检验。

先来说说假设。

假设一般成对出现,分为零假设 和 备选假设。

在AB测试中,零假设是:实验组&对照组 指标相同,无显著差异;备选假设则相反,实验组&对照组 指标不同,有显著差异。

举个例子。我们优化了某算法,想提高页面的点击率。针对这个场景的AB测试,零假设就是 新算法&老算法的页面点击率无明显差异,备选假设是 新算法&老算法的页面点击率有显著差异。

再来说说检验。

一般来说,我们是通过具体的指标属性来找寻相应的检验方法。那么问题来了,指标如何分类呢?

指标可以分为两种类别:

1、绝对值类指标。也就是我们平常直接计算就能得到的,比如DAU,点击次数等。我们的一般都是统计该指标在一段时间内的均值或者汇总值,不存在两个值之间还要相互计算。

2、相对值类指标。与绝对值类指标相反,我们不能直接计算得到。比如某页面的CTR,我们是用 页面点击数 / 页面展现数。我们要计算点击数和展现数,两者相除才能得到该指标。类似的,还有XX转化率,XX点击率,XX购买率一类的。我们做的AB实验,大部分情况下都想提高这类指标。

根据指标我们可以知道,该如何计算最小样本量,以及实验周期,以及对应的检验方法。

AB测试详细流程

我们先看一个图,结合这个实验的流程图,我们一点点来说:

选取指标

在做AB测试之前,我们一定要清楚,我们实验的目标是什么。并落地到具体的几个指标上,这几个指标对于我们度量实验结果,有非常明显的帮助。但是,指标也要分层级,唯一一个核心指标+多个观察指标。

核心指标用来度量我们这次实验的效果,以及计算相应的样本量。观察指标则用来度量,该实验对其他数据的影响(比如对大盘留存的影响,对网络延迟的影响等等)。

建立假设

建立假设就如同上文所说,我们建立了零假设和备选假设,零假设一般是没有效果,备选假设是有效果。

选取实验单位

大家应该都使用用户粒度来作为实验单位,但是总体说来,实验单位一般有3种。我们不用掌握,但是很多情况下面试官会问到,大家可以作为了解。

1、用户粒度:这个是最推荐的,即以一个用户的唯一标识来作为实验样本。好处是符合AB测试的分桶单位唯一性,不会造成一个实验单位处于两个分桶,造成的数据不置信。

2、设备粒度:以一个设备标识为实验单位。相比用户粒度,如果一个用户有两个手机,那么也可能出现一个用户在两个分桶中的情况,所以也会造成数据不置信的情况。

3、行为粒度:以一次行为为实验单位,也就是用户某一次使用该功能,是实验桶,下一次使用可能就被切换为基线桶。会造成大量的用户处于不同的分桶。强烈不推荐这种方式。

计算样本量

样本量计算,我们需要了解一下中心极限定理。具体书面定义和推导过程,大家可以在网上百度一下就好,我们这里就通俗的解释一下。中心极限定理的含义,就是只要样本量足够大,无论是什么指标,无论对应的指标分布是怎样的,样本的均值分布都会趋于正态分布。

基于正态分布,我们才能计算出相应的样本量和做假设检验。具体的样本量计算推导过程,大家如有需要,可以关注后加我微信私聊,这里就放结论。

整体公式如下:

由于指标可以分为将绝对值指标和相对值指标。对应的,我们在计算绝对值指标和相对值指标时,标准差的计算方式也会不同。具体如下:

我们举两个例子说明一下,让大家更有体感。

案例1-相对值指标:

某产品点击率1.5%,波动范围[1.0%,2.0%],优化了该功能后,需要AB测试计算样本量

P:1.5%,p:2.0%(由于波动范围是[1.0%,2.0%],所以至少是2.0%

总样本量 = 16 * (1.5%*(1-1.5%)+2.0%*(1-2.0%))/ (2.0%-1.5%)^2=22000

案例2-绝对值指标:

某产品购买金额标准差是25,优化了该功能后,预估至少有5元的绝对提升,需要AB测试计算样本量

σ=25,Δ=5

总样本量 = 16 * 25*25*2/5*5=800

最小样本量,是指我们的实验单位,必须满足这个数量,实验结果中的数据检验才可信。也就是说,我们的实验桶必须达到这个流量,才能收集数据及检验指标。

流量分割

流量切割有两种方式:分流和分层。

分流是指我们直接将整体用户切割为几块,用户只能在一个实验中。但是这种情况很不现实,因为如果我要同时上线多个实验,流量不够切怎么办?那为了达到最小样本量,我们就得延长实验周期,要是做一个实验,要几个月,相信我,你老板一定会和你聊聊人生理想的。

另一种方式,分层。就是将同一批用户,不停的随机后,处于不同的桶。也就是说,一个用户会处于多个实验中,只要实验之间不相互影响,我们就能够无限次的切割用户。这样在保证了每个实验都能用全流量切割的同时,也保证了实验数据是置信的。

两种方式用图来表达如下:

实验周期计算

相应的,最小样本量有了,我们切分了流量,知道了实验桶一天大概能有多少样本量(也可以算小时,如果产品的流量足够大)。我们直接用 最小样本量 / 实验桶天均流量 即可以得到相应的实验周期。

线上验证

很多公司不会做线上验证。当然,不验证也没关系,就是有可能会踩坑,所以还是建议大家在实验上线后进行线上验证。

线上验证主要是2个方向,一个是验证实验策略是否真的触发。即我们上线的实验桶,是否在产品上实际落地了。比如你优化了一个产品功能,你可以去实际体验下,实验桶产品是否真的有优化。

另一个是验证同一个用户只能在同一个桶中,要是同时出现在两个桶中,后期数据也会不置信。这个上文有说过。

数据检验

数据检验,大家可能都听过。比如Z检验,T检验,单尾检验,双尾检验,算P值,算置信区间等等。我们这里先说说哪种情况用Z检验,哪种情况用T检验。因为这个问题经常会碰到,也是AB测试中,面试官的必问问题。

大家应该都看过这个图:

按照上文我们说的指标分类,一般情况下,绝对值指标用T检验,相对值指标用Z检验。因为绝对指标的的总体方差,需要知道每一个用户的值,这个在AB实验中肯定不可能。而相对值指标是二项分布,可以通过样本量的值计算出总体的值,就如同10W人的某页面点击率是10%,随机从这10W人中抽样1W人,这个点击率也是10%一样。

再来说说具体的检验。一般情况下我们可以用两种常用方法:

1、算P值,也就是算当零假设成立时,观测到样本数据出现的概率。统计学上,将5%作为一个小概率事件,所以一般用5%来对比计算出来的P值。当P值小于5%时,拒绝零假设,即两组指标不同;反过来,当P值大于5%时,接受零假设,两组指标相同。

2、算置信区间。一般情况下,我们都会用95%来作为置信水平。也就是说,当前数据的估计,有95%的区间包含了总体参数的真值。这么说可能比较绕,我们可以简单理解成 总体数据有95%的可能性在这个范围内。

我们计算两组指标的差异值,如果我们算出的差异值置信区间不含0,我们就拒绝零假设,认为两组指标不同;但是如果包含0,我们则要接受零假设,认为两组指标相同。

当然,我们也可以直接算出Z值或者T值,查表对比。但是这种不是很常用,还是以P值及置信区间为主流。

还有些公司,会将所有指标计算到为不同流量区间内的自然波动。比如我有三个指标,日活100W,那么可以拆分成多个流量区间,比如 1w、2w、5w、10w、20w、50w,100w这几个流量比例,然后依次计算这3个指标,在这些流量下的自然波动阈值,如果高于阈值,我们就认为实验有效。这种就会方便很多,但是不够严谨。

最后来说说单尾检验,双尾检验。单尾检验的前提是我们不仅认为两组指标不同,还明确了大小,一般情况下,我们都认为实验组的效果高于基线组。而双尾检验只是认为两组指标不同,未明确大小。通常来说,我们更推荐使用双尾检验,为什么呢?

因为实验本身就是一种利用数据来做决策的方法,我们不要再人为的带入主观设想。而是用双尾检验,我们不仅能量化涨了多少,还能量化掉了多少,因为实验结果有正有负,不一定都是有效果的(正向的),还可能有负向的效果,我们也可以将有负向效果的实验记录下来,沉淀成知识库,为后期实验避坑。

当然,生活中有些事件是可以用单尾检验的。比如我们优化了制造灯泡的流程,提升了灯泡的质量,那对于灯泡的质量检验我们就采用单尾检验就好,因为我们只关心灯泡质量是否和预期一样,有所提升。

知识点总结

以上,我们就讲完了整体的AB测试的流程,以及流程中的各个需要用到的知识点。

我们来总结下知识点:

1、实验流程是 选取指标 -- 建立假设 -- 选取实验单位 -- 计算样本量 -- 流量分割 -- 实验周期计算 -- 线上验证 -- 数据检验。

2、假设分为零假设和备选假设,零假设一般都是实验无效(指标无差异),备选假设是实验有效(指标有差异)。

3、指标可以分为 绝对值指标 和相对值指标,相应的,绝对值指标推荐用T检验,相对值指标推荐用Z检验。

 

4、检验数据是否有效,可以算P值,高于5%就接受原假设,两组指标相同;也可以算置信区间的差异值,如果差异值包含0,则接受原假设,两组指标相同。

 

责任编辑:武晓燕 来源: 巡山猫说数据
相关推荐

2023-11-16 09:01:37

Hadoop数据库

2024-06-27 08:26:10

LooperAndroid内存

2021-07-23 13:34:50

MySQL存储InnoDB

2017-05-04 16:35:45

2020-06-15 07:00:00

GitOpsKubernetesDevOps

2017-04-11 08:36:09

iOS编译应用

2023-02-28 09:07:18

ChatGPTAI

2024-08-14 18:18:47

2021-07-12 09:45:36

NameServer 核心Conusmer

2021-01-12 14:46:34

Kubernetes开发存储

2019-12-06 10:59:20

JavaScript运行引擎

2011-12-14 10:31:43

2019-12-31 20:55:13

Socket通信TCP

2019-08-20 14:01:22

HTTPSSSL协议

2021-07-05 07:51:43

JVM底层Python

2020-05-07 18:39:15

数据库闭源开源

2023-01-10 16:08:04

人工智能扩散模型

2011-08-18 09:46:40

活动目录验证原理

2021-07-14 14:05:24

Fragment项目结构

2009-11-11 14:18:00

动态路由协议
点赞
收藏

51CTO技术栈公众号