5.2.3 A/B测试中的内部效度
本节内容主要是以笔者设计并开发的A/B测试后台的数据计算模块为基准,结合概率论与数理统计学科中相关知识点及Rstudio的相关命令进行介绍,不属于策略产品经理必须掌握技能,仅感兴趣的读者了解学习。缺乏数理统计基础理论知识的读者可能会比较吃力,可以直接学习5.3节。
在科学研究中,只有A/B测试能够回答因果关系。正因如此,A/B测试才得到了广泛的应用和发展。同样在互联网公司中,A/B测试必须考虑到实验的内部效度和外部效度。
●内部效度:确保除了自变量外,没有其他的因素会影响因变量。换句话说,需要将实验做得有效可信,必须排除掉随机因素,只保留自变量因素。根据5.2.2节的内容定义,可以使用一型错误(置信度水平)和二型错误(power)的数值进行度量。
●外部效度:一项研究结果能够被推广到其他情境或其他人群的程度,分为情境的推广性(比如某App定时自动开启夜间模式可能会对用户停留时长产生正向影响,该实验结果是否能推广至白天)和人群的推广性(比如针对某App,通过某种策略对应用商店的新注册用户的停留时长产生正向影响,该实验结果能否推广至其他新用户?能否推广至全体用户)。
本节将从数值的角度介绍如何计算实验的内部效度,也就是如何得到A/B测试的一型错误(置信度水平)和二型错误(power)的数值;然后介绍在A/B测试中影响外部效度的主要原因——网络效应和辛普森悖论。
内部效度的计算方式应区分人均指标(比如内容型产品中人均阅读漫画章节数等)、比率指标(比如大多数产品中的留存、点击率等),而A/B测试一般以用户ID分组,所以人均指标使用较多。两类指标计算显著性和统计功效的方式是不同的,因为它们的基础数据格式不一样。
●人均指标:以每个用户ID为聚合区组,如果实验组中ID为1的用户阅读了2篇漫画、ID为2的用户阅读了3篇漫画……则可以将实验组的数组写为“(2,3,…)”。实验组和对照组中,大多数服从正态分布的人均指标可以使用参数检验(一种对确定的统计分布的参数平均值、方差进行统计检验的方法),少数不服从正态分布的人均指标可以使用非参数检验(一种在总体方差未知的情况下,利用样本数据对总体分布形态等进行推断的方法)。
●比率指标:以点击率指标(点击率=点击/曝光)为例,点击率实际上可以写为0和1的二值数组,可以使用伯努利检验。
首先,从A/B测试中最常见的人均指标开始介绍。假设我们有两个区组:对照组(A组)和实验组(B组),比较A、B两个区组的人均阅读指标是否存在显著差异。
表5-3列出了假设检验中应该选择何种假设检验方式,笔者在实际工作中接触过的有Student T检验、Wilcoxon U检验、Anova检验和Fisher F检验,在人均指标的假设检验上掌握以上方法即可。每一种假设检验具体的统计学知识不再赘述,请读者自行查阅资料。
表5-3 不同检验目标与假设检验方式

回到我们的问题上来,A组和B组的阅读量如下(仅为举例)。
●A组共10000人,分别阅读了2篇、0篇、1篇、10篇、……、0篇内容(10000个数据),均值为10篇。
●B组共12000人,分别阅读了0篇、3篇、12篇、4篇、……、3篇内容(12000个数据),均值为10.5篇。
我们的目的是研究A、B两组用户的阅读数据是否存在均值差异,也就是对比研究A组均值10篇和B组均值10.5篇是由随机因素引起的还是系统误差(本例中为A、B两组的策略差异)引起的?通过查表得知,这种假设检验的理想情况是通过Student T检验完成的,但是通过查询相关统计学文献可知,在进行T检验的同时需要额外进行检验。
●步骤1:检验A、B两组的数据分布是否为正态分布。如果是正态分布,进入步骤2;如果不是,需要尝试将样本转换为服从正态分布的数据,或者使用非参数检验。
●步骤2:如果A、B两组的数据近似服从正态分布,判断样本方差是否已知。如果已知样本方差,应使用z检验,否则进入步骤3。
●步骤3:在双样本的均值T检验之前,需要判断A、B两组的方差是否相同。如果相同,则进入步骤4;如果不同,需要在步骤4中对样本数据做变换。
●步骤4:使用均值T检验得出一型错误的概率,决定接受零假设(A、B两组人均指标无显著差异)还是应该拒绝零假设(A、B两组人均指标具有显著差异)。
步骤1中检验某一种数据分布的方法一般使用KS检验,由于大多数情况是检验是否符合正态分布的,一般使用以下R语言命令即可。其中,pnorm为R语言中正态分布的函数,该函数为检测数组x是否满足均值为0、方差为1的标准正态分布:
ks.test(x,”pnorm”,0,1)还有一种SW检验方法,但这种方法需要满足样本量在3~5000之间才有效,所以很少使用。其在R语言中的命令为:
shapiro.test(x)以上两个函数均可返回A、B两组样本是否满足正态分布。
实际工作中,大多数样本并不严格满足正态分布,此种情况下应该使用非参数检验Wilcoxon U检验,这是一种类似于配对T检验的非参数检验,是基于二项分布的检验。这种检验方式下我们并不关心具体的打分,而是关心打分的排序(严谨说法是秩次),这类似于Spearman秩相关系数的思想,可以忽视数据真实分布,只要可以比较出大小即可。非参数检验分为符号秩检验和秩和检验(也称Mann-Whitney U检验),在R语言中的命令如下:
wilcox.test(x)具体使用时请参考R语言中该函数的输入值要求。符号秩检验只考虑样本差数的符号。而秩和检验考虑样本差数的符号和样本差数的顺序。
笔者咨询过身边的部分数据分析师,他们经常使用非参数检验,因为需要的条件较少,可以直接应用。但非参数检验的缺点也是显而易见的,它不能充分利用数值信息,以致于统计功效下降得较快,所以在满足正态分布的条件下应该优先使用参数检验。
步骤2中如果已知A、B两组样本的总体方差,可以使用z检验(总体方差可以用数据库中长时间的数据计算得到)。在这种情况下,检验统计量t可以由z代替,临界值也可由标准正态分布的临界值代替,其中z的表达式如下。(这个公式是标准正态分布的计算方式。)

在得到z值后,只需要计算z值所处的正态分布的概率即可(类似于3Δ原则)。
pnorm(Z)步骤3需要检验A和B两组样本的方差是否相等,因为T检验是均值差异性的检验。同一检验要么检验均值、要么检验方差,所以需要方差相等时才可以进行第4步的均值T检验。A、B两组数据的f统计量如下,其中s2A代表A组样本方差,s2B代表B组样本方差。

在R语言中可以使用多种方法计算f统计量,最简单的方法是输入:
var.test(x,y)其中,x和y分别为两组的阅读数据,当然也可以根据f检验的定义进行计算:
f=var(y)/var(x)步骤4是均值T检验,只有经过了前面3个步骤并都满足条件(正态性、方差未知、满足方差齐性条件),才可以使用均值T检验。
我们在实际工作中遇到的大多数情况是方差有所差异,此时一型错误的概率p值保持正确,但是统计功效下降得很快。如果数据看起来是正态分布,只是方差不同,则可以对两组数据做归一化处理x/var(x)、y/var(y),再使用T检验,这样比使用非参数检验的效果更好。
在R语言中,T检验是一种最常用的检验方式,只需要使用以下命令:
t.test(x,y)R语言中,T检验使用的是welch检验方式。只有二者的方差完全相等时才称为传统T检验,只要方差不相等,则都称为welch T检验。
笔者在设计相关数据模块的时候进行了相关数据模拟,实验模拟结论是:通常来说,方差差值在3倍以内时,传统T检验和welch T检验的结果接近,其他情况下welch检验方法更优。因为welch检验对方差进行了调和,以便得出更精确的结论。
至此,内部效度中关于双样本均值T检验部分介绍完成。
内部效度中比率指标一般采用二项分布检验中的二项比例齐性检验。
这种检验是检验A、B两组样本中潜在成功比例p值是否相同的假设检验,比如发送推送时对于不同的文案,A组用户的点击率为30%,B组的点击率为31%,能否判定两组用户的点击率指标存在显著差异?(下文会介绍留存指标,留存指标计算方法和点击率指标的计算方法有所差异,所以此处以点击率指标举例。)
因为二项分布的极限情况为正态分布,所以大多数公司以均值T检验来计算点击率是否存在差异,但其实这种方法存在一定的误差,尤其在数据量较小时,两组数据很可能并不服从正态分布,计算出的一型错误的概率(p值)有所偏差。
正确的做法是使用二项比例齐性检验,此时的H0假设为p1=p2=p,H1假设为p1≠p2,在R语言中的命令为:
prop.test(x,y)至此,A/B测试中双样本的人均指标(多样本的相关检验请自行查阅资料)和比率指标的统计检验就介绍完了。
但只研究一型错误(显著性水平)是不够的,还需要计算二型错误的概率(统计功效),进行最小样本数估算,这在一些样本量较小的A/B测试中尤其需要。R语言中计算T检验最小样本量的命令为:
power.t.test(power=0.8,delta=?,sig_level=0.05)一般来说,每一组的独立样本量大于1000时基本可以满足统计功效在80%以上,但以防万一,仍然需要计算最小样本量。
笔者介绍这些内容,并非希望策略产品经理完全掌握以上技能,而是出于以下两个目的。
●部分公司不存在可用的A/B测试后台和显著性计算方式,对数据的分析可能需要策略产品经理自行完成,本节的内容可以为这部分人群提供一些思路。
●即使公司已经有更加准确可用的A/B测试后台和数据报表,了解其背后的大致运作方式有助于更好地理解A/B测试数据。