我们就职于互联网数据分析岗位。工作涉及到大量的 A/B 检验,而我们项目的进展在很大程度上取决于 A/B 检验的准确性和效率,但是我在大学里学习的统计学大多数都讲述平均值的评估,而互联网中在局部优化的情况下,更倾向于点击率、转化率、ctr的提升,理论与具体工作内容的差异导致我们在工作中没有那么得心应手,考虑到学习的效率与工作的深度理解,写了本文以供参考,旨在做到行文逻辑清晰,同时用gif动图来提升表现力。
A/B 检验中最重要的两件事是实验设计和实验结果的准确分析。 在本文中,我们将坚持最常见的设计,并比较各种统计分析方法,从非常标准的 检验和曼-惠特尼检验到最先进的方法,如 加权bootstrap。阅读本文后,您将学会如何从众多可用的统计检验中选择正确的检验,并在工作产生的数据上进行检验。
感谢大家的一如即往的支持,本系列课程 《如何深度理解AB测试》 在微信和小红书上都得到了热情的订阅,大家在学习和面试的过程中都得到了想要的结果,本人深感欣慰。
欢迎订阅:深度理解AB测试
1. 基本概念
1.1. 点击率策略方案
假设我们想评估用于广告定向的新点击率预测模型的质量。A/B 检验是最可靠的测量方法。
第一步是定义我们要监控的关键指标。在我们的例子中,我们使用的是广告的平均点击次数:如果经过检验后我们的新模型的表现更好,我们就采用新策略,这样就会分配更多相关广告,因此,点击次数的平均值就会增加,进而增加广告收入。
其中, 是点击次数, 是用户数
在 A/B 检验中,我们将用户随机分为两组:对照组和实验组。对于对照组的用户,我们将使用当前的线上的生产模型,而对于实验组的用户,我们将部署新的新的点击率预测模型。
实验结束后,我们将使用可用的统计假设检验之一,比较实验组和对照组的指标平均值(每个用户的平均点击次数)。
1.2 假设检验
要进行统计检验,我们首先要根据随机变量提出零假设和备择假设。通常,零假设表示什么都没有改变。在我们的例子中,零假设就是 “对照组和实验组的平均点击次数相同”。与此相反,备择假设则表示组间存在显著差异。在统计学中,它们通常分别被称为 和 :
在提出假设后,我们可以使用几十种统计检验方法中的一种进行分析。每种检验都可以用两个数字来描述,它们反映了检验的 "质量":假阳性率( )和统计功效( )。
假阳率是在 为真的情况下拒绝 的概率。如果统计程序是正确的(所有假设都满足,并且统计检验在给定数据下的程序运行无误),则该比率由 值控制。
统计功效是拒绝 的概率,而在上帝视角观测 实际上不成立。
-
很容易想象一个 为零的统计检验,意味着分子 = 0。无论 A/B 检验的结果如何,我们只需接受 (全部判断为Negtive)。这样,我们就不会出现假阳性,因此我们没有任何机会拒绝 。但这种统计检验的统计功效显然为0,因为即使 实际上是假的,我们也永远不会拒绝它。
-
反之,我们很容易想象出一种统计功效为 100% 的统计检验。我们只需拒绝 ,而不管 A/B 检验的结果如何。这样,我们就有 100%的概率拒绝 ,而实际上它并不是真的。显然,这种统计检验的 为 100%,因为即使 为真,我们也不会接受它。
以上说明了 与 是 正比例关系。
正如你可能思考的结果,在实践中总是需要权衡利弊。 越高,统计功效就越高,反之亦然。让我们绘制一个非常标准的 Mann-Whitney 检验的 FPR 与统计功效的关系图,下面将详细讨论如何获得这样的关系图。
默认您是数据科学家,应该知道这是一条 ROC 曲线。
我们总是希望这条曲线尽可能靠近左上角。
垂直灰线对应的是 5%的 ,即标准 值阈值。这条线与曲线的交点即为对应于 5% 的检测统计功效。我们将其称为 5% FPR下的统计检验功效(或简称power)。在上图中可见,5% 时的标准 Mann-Whitney 检验的功效为 65%。
从这一点出发,我们将把 固定为 5%,并在此水平下比较各种检验的功效。为简洁起见,以下描述中我们将默认把 5% 下的统计检验功效称为功效。
统计检验的功效取决于四个方面:
-
检验方法 -
实验数据的分布 -
效应大小(Effect size) -
检验组的样本量
我们将为 CTR 预测任务模拟一些合理的数据,以绘制各种检验的 ROC 曲线和功效,并了解根据数据分布应使用哪种检验。
1.3 数据生成
这张图描述了一个用来模拟或分析用户点击行为的统计模型,通常用在互联网广告、推荐系统等领域。解释一下上图的含义:
-
ground truth user CTR ~ Beta(β)
-
ground truth user CTR: 指基准用户的点击率(Click-Through Rate)。这是用户看到某个东西(比如广告、链接)后,会去点击它的固有、内在概率。这个概率是假设存在的、真实的,但通常无法直接观测。 -
~ Beta(β): ~ 符号表示“服从...分布”。Beta(β) 指贝塔分布。所以这行表示,用户的真实点击率被建模为一个随机变量,它服从贝塔分布。贝塔分布的取值范围是0到1,非常适合用来描述概率或比率。 β代表这个贝塔分布的参数(通常贝塔分布有两个参数,α和β,这里用 β 统一表示)。 -
clicks ~ Binomial(views, CTR)
-
clicks: 指用户实际产生的点击次数。这是一个可以观测到的数值。 -
~ Binomial(views, CTR): 表示点击次数服从二项分布。二项分布描述了在一系列独立的“试验”中,“成功”事件发生的次数。 -
views: 指观看次数或展示次数(也叫曝光量/Impressions)。它对应二项分布中的“试验总次数”。 -
CTR: 指用户的点击率(来自第一行的那个真实CTR)。它对应二项分布中单次试验“成功”(即发生点击)的概率。 -
含义: 这行的意思是,在用户观看了 Views 次的情况下,每次观看都有 CTR的概率产生点击,那么最终的总点击次数 Clicks 就服从一个由 Views 和 CTR 决定的二项分布。 -
VIEWS ~ LogNormal(1, σ)
-
VIEWS: 指观看次数或展示次数(同第二行的views)。 -
~ LogNormal(1, σ): 表示观看次数服从对数正态分布。如果一个变量的对数服从正态分布(高斯分布),那么这个变量本身就服从对数正态分布。这种分布经常用来描述那些取值为正数、且分布比较偏态(skewed)的变量,比如收入、网页访问次数等。 -
(1, σ): 这是对数正态分布的参数。它们通常表示其对数所对应的正态分布的均值(这里是1)和标准差(这里是σ)。
箭头含义:
-
从第一行的 CTR指向第二行的CTR的蓝色箭头:表示二项分布中的概率参数CTR,是由第一行定义的贝塔分布产生的随机变量。 -
从第三行的 VIEWS指向第二行的views的红色箭头:表示二项分布中的试验次数参数 views,是由第三行定义的对数正态分布产生的随机变量。
总结:
这是一个分层概率模型(Hierarchical Model)。它描述了:
-
用户的内在点击倾向( )本身是随机的(服从贝塔分布)。 -
用户浏览内容的次数( )也是随机的(服从对数正态分布)。 -
最终观测到的点击次数( ),是在给定上述随机的浏览次数和随机的点击率的条件下,通过一个二项分布过程产生的。
这种模型结构允许我们同时考虑用户固有属性( )和用户浏览次数( )的不确定性,从而更全面地理解和预测点击行为。
让我们考虑一下最普通的点击率策略任务。对照组和实验组的用户数量相等。每个用户都看过一定数量的广告,并点击过其中的一些(或没有)。因此,每个用户都有两个数据特征是浏览次数和点击次数。
-
浏览次数分布
我们假设用户的浏览次数分布为[[../z卡/对数正态分布|对数正态分布]]:大多数用户只看到少量广告,而少数用户看到大量广告。在实验中,我们将控制这种分布的偏度。
-
转化率分布
每个用户都有自己的平均转化率(实际用户点击率)。我们假定 用户CTR 遵循 [[../文章/如何理解统计学/beta分布|beta分布]]。这是比率分布的常见选择,因为它以 0 和 1 为界。在实验中,我们将固定分布的均值(均值成功率),并改变方差。如果零方差就代表每个用户都有相同的平均点击率,而随着方差的增大,用户也会更加多样化。具有固定平均值的贝塔分布的方差由 参数控制。
3. 点击分布
每个展示都有可能以概率=基准用户 CTR 转化为点击,因此我们从二项分布中对每个用户的点击次数进行采样,试验次数采用单个用户浏览次数,成功概率采用基准用户点击率。
我们生成数据实验组和对照组的点击成功率(贝塔分布的平均值)会有一定的差异,生成数据本身就有一定的差异,观测我们的统计手段是否能够识别这种差异。
我们设计实验的初衷还是希望实验能够在 基准 上有所提升(uplift)。
概括地说,我们的数据生成过程如下:
-
对照组初始化 个用户,同时实验组初始化 个用户。 -
从相同的对数正态分布中生成实验组和对照组中每个用户的广告浏览次数。 -
从贝塔分布中为每个用户生成真实用户点击率,控制组的平均值为 ,实验组的平均值为 。 -
从二项分布中生成每个用户的广告点击次数,试验次数采用浏览次数,成功率采用基准用户点击率。
整个过程重复一次,就能得到一次 “合成 A/B 检验 ”的结果。我们将重复 次,得到 次合成 A/B 检验的结果。对于每个 A/B 检验,我们都将运行一系列统计检验,并通过绘制 曲线来比较不同检验方法的检验性能。
1.4 统计功效和 p 值 CDF
通过以上设计的数据生成管道,我们重复模拟了 人工实验,其中
实际上是假的,应该被拒绝。让我们使用统计检验来获得
个 p 值,每个实验一个
值。在理想情况下,我们希望所有的
值都等于(越接近)零,因为我们生成数据的时候设计成实际实验组和对照组之间存在正向差异。在实际情况中,
值会以某种方式分布。让我们来看看
值的累积密度函数 (CDF)。
值得关注的是,当 值较小时, 值的密度较大。如果我们知道 是错误的(我们在实验组数据设计上有非零的上浮),那么 值大多集中在一个小值区域,这符合实验数据与检测的预期。
同时还有一个值得思考的问题,这里的 值 实际上等于统计检验的统计功效(当满足条件是 为 Ture)。如果我们取值为 0.05 时的 值,这实际上是 值 <= 0.05 时的实验比例。CDF(0.05)是拒绝 时的实验比例。由于我们知道 并非在所有实验中都为真,因此 CDF(0.05) 是当 实际上不为真时我们拒绝 的实验比例(统计功效)。因此,我们在这里得到的曲线图恰恰正是统计检验的 ROC 曲线(统计功效 vs FPR)。我们将用这种方法绘制各种统计检验的 ROC 曲线,并对它们进行比较。
1.5 p 值正确性检查
在进行统计检验时,我们总是默认假阳性率受 值临界值的控制。如果这是真的,那么一切都很符合预期。但这也可能其他问题导致的错误。最常见的错误情况是违反了统计检验最基本的假设(例如,违反了 检验的正态性)。在实验设计与统计检验的基本假设之间是需要要保持均衡,违反假设往往是现实存在的,但不足以破坏统计检验。如果 值能很好地控制 ,那么尽管违反了假设,检验也会给出正确的结果,这种鲁棒性的衡量一个检验方法优劣的重要参考。因此,对于每一个统计检验,我们都应该能够检查 值是否控制了数据的 。
为此,我们需要生成 A/A 检验。生成数据的逻辑复用:采用相同的数据生成管道,但 值为0。这样,我们将从完全相同的分布中对实验组和对照组进行采样,因此 在这里将为真。当且仅当 值均匀分布在 A/A 检验的 上时, 值才能正确控制 。
为了理解这一事实,让我们考虑一下 0.05 的
值阈值。当实际
值低于这个临界值时,我们拒绝
,得到假阳性(如前所述,我们用上帝视角看,只要我们使用 A/A 检验,
就是真的)。我们认为,在这种情况下,
等于我们的
值阈值,例如,对于 A/A 检验,只有 5% 的比例
值会低于 0.05 的阈值。这正是均匀性的要求。只有当 A/A 检验的 p 值分布均匀时,我们才能使用给定数据进行统计检验。我们将在模拟中对每个统计检验进行检查,大多数情况下,我们会看到笔直的对角线
,这说明实验数据与检验方法都符合预期。
在下面的章节中,我们将介绍十几种具有不同性能、数据分布假设和计算效率的统计检验。每个检验的介绍方式都大同小异:我们将简要介绍其直观性、数据假设、参考源,并分析其在不同数据分布下的检验能力。
2. 点击次数检验
2.1. 点击次数的 t 检验
附加假设:正态性、组间方差相等
让我们从最基本的方法开始。第一种是对人均点击次数进行 检验。我们希望实验组的点击次数高于对照组,并检验这种差异的显著性。
检验涉及对数据的严格假设,例如正态性和检验组之间的方差相等。然而,从经验上看, 检验对违反这些假设是稳健的。我们将看到, 条件下 值的 在相当大的数据分布参数范围内是均匀的。这就是特别给出假设的原因。
让我们将 设为 0.02,并绘制 检验的结果图。
我们使用同一个仪表盘来比较所有检验的表现。左上角的大图是统计功效曲线。左下角有一个横向条形图,显示的是 0.05 值阈值下的统计功效。在统计功效曲线图中,蓝色曲线与灰色垂直线交叉处也有相同的数值。最强大的检验方法预期展现最长的条形图。
右上角有一条 FPR 曲线,我们将用它来监控检测的健康状况,如上所述 p值的CDF。该曲线应尽可能接近对角线(如上述AA检验中讨论)。最后,有两个直方图反映了数据生成过程: 浏览次数和基准用户点击率分布。它们会随着我们改变 的偏度和 基准用户的 的方差而变化。
我们可以看到,标准的 t 检验效果相当不错。给定 0.05 p 值阈值的检验统计功效接近 0.7, 下的 非常均匀。
但这种设计好的实验可能被认为是一种逻辑自证,毕竟生成的数据的分布完全符合 检验的数据要求。我们可以明显的看到,在这个例子中,浏览次数和真实用户点击率的分布对于 检验来说非常 “理想”。浏览次数没有严重偏斜,基准用户点击率的标准偏差也很小。
让我们改变浏览次数分布的偏度:
从gif图的变化可以看出,浏览次数偏度越大,
检验的功效就越低。此外,对于极度偏斜的分布,
检验的
值显然不符合
下的均匀分布。在数值较小的区域,
值会高估
(在这一区域,曲线图位于对角线之外)。它成为对
的 “保守 ”估计。使用这种检验方法没有问题,因为我们仍然可以确定
<= p 值,但检验的统计功效很低。
产生这种效果最主要原因是高度倾斜分布严重违反了正态性假设。如果浏览次数分布严重偏斜,点击次数分布也会偏斜。偏度越大,恢复样本平均正态性所需的样本(用户)就越多。
2.2. 点击次数的曼-惠特尼检验
假设:无假设(单一度量值不一定能解释大多数测量结果)
检验方法的劣势: 假设复杂,计算复杂
曼-惠特尼是比较平均点击数的另一种基本方法。众所周知,由于以下原因,该检验在偏态分布情况下效果良好:
-
它不需要任何额外的数据分布假设,因为是非参数估计 -
由于它针对的是rank(点击数)而不是点击数本身,因此对异常值的影响更小。
括号中的假设是对数据中并列(等值)的不严苛条件。例如,如果 99.9% 的用户都有 2 次点击,那么 曼-惠特尼 检验就无法正常工作。在我们的模拟中,不存在这样的情况,这就是为什么 曼-惠特尼检验能正常工作的原因。但如果你工作中实际的数据集中绝大多数用户的点击次数为 0,你就要谨慎了,因为 曼-惠特尼检验可能会在这样的数据上失败。关于这一假设的进一步讨论。
该检验的主要注意事项是,它不比较检验组的样本均值。该检验有时被说成是比较样本中位数,但其实不是。尽管其 非常直观,但它既不等同于中位数比较,也不等同于平均数比较。但从以往的工作经验上看,它的检验效果相对来说很优秀,并被广泛使用。
曼-惠特尼 检验的另一个局限性在于其计算复杂性。在 检验中,我们只需要样本均值、方差和计数,这些都可以在分布式环境中高效计算。相比之下,曼-惠特尼检验需要对指标进行全局排序,这在某些情况下可能会造成问题。
让我们比较一下曼-惠特尼检验和 检验。
可以看出,当偏度较低时,曼-惠特尼 检验的功效与 t 检验的功效大致相同(t 检验甚至更好一些,因为曼-惠特尼检验中的秩运算会导致一些信息损失)。但是,当分布变得严重偏斜, 检验的统计功效下降时,曼-惠特尼检验的统计功效下降得更慢。
此外,即使对于非常偏斜的浏览次数, 下的 曼-惠特尼检验 值也遵循均匀分布,这说明 值总能给出正确的 。但是,即使两个检验在 下都服从均匀分布,曼-惠特尼检验也开始优于 检验。可以看出, 检验不太适合数据偏斜。
除了浏览次数的偏斜性,点击量中偏斜性的另一个来源是 基准用户点击率 的分布。如果所有用户的点击率大致相同,那么点击率的偏度将与浏览次数的偏度大致相同。如果不同用户的点击率变化很大,那么点击率的偏度可能比浏览次数的偏度还要高。让我们改变基准用户点击率的分布,观察会发生什么。
如您所见,当基准用户点击率的方差增大时, 曼-惠特尼检验开始优于
检验。两种检验在
下的分布都很好,但
检验再次受到偏度的影响。
因此,如果数据偏度较大,可以考虑使用 曼-惠特尼 检验而不是 检验。但当偏度较低时, 检验可能是更好的选择。如果您处理的是大数据,曼-惠特尼检验的计算复杂性可能会给实验带来巨大的计算损耗。
3. 全局点击率检验
A/B 检验中最常见的情况是比较点击率而不是点击量。这背后的逻辑非常清楚:点击量的差异通常很大,现实中的生活中,总是有大量浏览和大量点击的用户,也有很少浏览和点击的用户。而点击率的方差要小得多,在统计学理论层面,较小的方差通常会使统计检验更加显著。
3.1. 假设
我们通常假定点击率和点击量的变化方向总是一致的。事实上,后者是一个很强的假设,让我们来讨论一下。
全局点击率的方向性与点击次数总和的方向性相同,但大前提是我们在实验中不改变浏览次数。改变横幅广告就能改变用户平均观看次数的可能性极小,因为这取决于用户访问首页的次数。对于新闻排名来说,这可能不是一个那么符合事实的假设,因为更高的排名会提高用户的参与度,他们往往会更频繁地访问热门新闻。
下面我们来讨论比较全局点击率的常用方法。
3.2. 二项式 z 检验
附加假设:
-
不会影响浏览次数; -
每个点击和每个浏览都是一个 i.i.d 样本(独立同分布样本)。
有人可能会认为我们的数据实际上是总点击次数(1) 和 总浏览次数减去总点击次数(0)的二进制样本。但事实上却不这么理想,这些样本根本就不是 i.i.d.,因为单个用户的点击不是同分布的。想象一下一个 CTR 非常高的用户。他的所有样本往往都是 1 (点击次数),并且显然是相关的。业内的标准是不将此指标用于全局点击率,但不妨让我们试一试,检验一下是否与我们的预期一致。
正如您所看到的,当所有用户都具有相同的基准用户点击率时,二项检验的效果非常好。理论上,在这种情况下,它是最强大的检验。不幸的是,当我们增大基准用户点击率的方差,并违反检验假设时,该检验会低估
,
下的 CDF 远高于对角线。这意味着我们不能确定
<= p 值,因此我们应该合理考量这个检验。
3.3. bootstrap 全局点击率
假设:不影响浏览次数。
从上一节可以看出,我们不能使用普通的 z 检验来估算全局点击率。全局点击率估算的常用方法是 bootstrap法。在bootstrap 法中,我们对用户进行重新采样,并计算每个样本的全局点击率。然后,我们就可以使用bootstrap分布来建立置信区间并进行统计检验。
在处理大数据时,bootstrap方法被通常带来非常大的计算量。但对于全局 CTR,我们可以使用泊松bootstrap 法。这个方法的思路很简单:我们不是对用户进行重新采样,而是从泊松分布中抽取每个用户出现在样本中的次数。然后,我们用这个数字来权衡浏览次数和点击次数。在我们的代码中,我们使用这种技术来加快计算速度。
全局点击率可以表示为用户点击率的加权平均值,每个用户的点击率根据浏览次数加权。
在全局点击率中,每个用户的贡献与浏览次数成正比。我们在代码中使用这个表达式,并运行加权用户点击率bootstrap 法,得到bootstrap的全局点击率分布。
让我们将 bootstrap 法与 曼-惠特尼 检验进行比较。
当浏览次数的偏差较小时,Bootstrap 的检验能力与 曼-惠特尼检验的能力基本相当。但当偏斜度增大时,Bootstrap 法的效果就比 曼-惠特尼检验好得多。主要原因是bootstrap法明确考虑了每个用户的浏览次数。另外,请注意,当浏览次数偏斜度非常高时,bootstrap 的
值开始无法评估
(
下的 CDF 超过对角线)。任何 A/B 检验的前提都是对所选统计检验的 p 值进行 A/A 检验检验。
让我们比较一下 曼-惠特尼检验和 bootstrap,同时改变基准用户
的方差。
如图,当用户点击率的基本真实值的方差足够大时,曼-惠特尼检验的效果开始优于 bootstrap(平均点击次数的噪声小于全局点击率)。全局点击率失效的原因浏览次数并不是用户点击率的最佳权重。
因此,如果您的数据高度偏斜,但基准用户点击率方差较小,请考虑使用 bootstrap 法。但不要忘记检查 下 p 值的一致性。还要注意的是,即使使用泊松 bootstrap 法,计算该检验也需要大量的计算。下面我们将讨论bootstrap 法的三种有效替代方法。
3.4. 全局点击率 Delta法
假设:不影响浏览次数。
由于 i.i.d. 假设不成立,二项 检验对全局点击率的检验失败。它对全局点击率方差的估计存在偏差。Delta 法是对全局点击率方差进行无偏估计的有效方法。
让我们将 Delta 法与bootstrap法和 曼-惠特尼 检验法进行比较,看看它们是否具有不同的浏览次数偏度的情况下。
正如您所看到的,Delta 方法的功效与 bootstrap 的功效大致相等,但当偏度相当高时,
值会低估
。使用这种检验方法时需要非常小心,必须进行 A/A 检验的正确性检查。
我们改变基准用户点击率方差:
在这幅图中,Delta 方法的行为与 bootstrap 方法的表现基本相同。总之,如果您能计算 bootstrap,就应该选择 bootstrap。如果计算 bootstrap 对数据来说计算量太大,可以使用 Delta 方法,但一定要检查
下 p 值的分布,Delta 方法的计算量相对较小,但对于目前计算资源比较丰富的情况下,我们可以忽略这种计算时间的差异。
3.5. 分桶法

