You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
15 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 10常见误区及解决方法多重检验问题和学习效应
你好,我是博伟。
上节课我们讲了一个在做A/B测试时普遍存在的一个问题那么接下来我就根据自己这些年做A/B测试的经验精选了一些在实际业务中会经常遭遇的误区主要是多重检验问题、学习效应、辛普森悖论和实验/对照组的独立性这四大误区。
这四个误区,其实也可以被看作在实际业务中经常出现的几个问题。不过我在题目中之所以强调说这是误区,是因为你很可能会在这些问题的理解上产生一些偏差。
所以接下来我在讲这两节课时,会按照“问题阐述—问题解析—总结引申—课后思考”的范式来给你讲。也就是说,我会先带你深入剖析问题的成因,然后再举例分析这些问题在实践中的表现形式,最后给出对应的解决方法。
毕竟,在搞清楚问题原理的前提下,再学习问题的表现形式和解决方法,不仅你的学习效果会事半功倍,而且在实际应用时,你也能根据变化多端的业务场景,随机应变,灵活运用。
## **多重检验问题Multiple Testing Problem**
多重检验问题又叫多重测试问题或多重比较问题Multiple Comparison Problem指的是当同时比较多个检验时第一类错误率α就会增大而结果的准确性就会受到影响这个问题。我在基础篇讲A/B测试流程时就多次提到过它比如[第4节课](https://time.geekbang.org/column/article/321007)讲OEC的好处时还有[第7节课](https://time.geekbang.org/column/article/323696)讲什么时间才能查看测试结果时。
### **多重检验为什么会是一个问题?**
要搞清楚多重检验为什么会是一个问题我们还得先从第一类错误率α又叫假阳性率显著水平是测试前的预设值一般为5%说起。我在第2节课也讲过第一类错误率指的就是当事实上两组指标是相同的时候假设检验推断出两组指标不同的概率或者说由于偶然得到显著结果的概率。而且它在统计上的约定俗成是5%。
5%看上去是个小概率事件但是如果我们同时比较20个检验测试你可以先思考一下如果每个检验出现第一类错误的概率是5%那么在这20个检验中至少出现一个第一类错误的概率是多少呢
要直接求出这个事件的概率不太容易我们可以先求出这个事件发生情况的反面也就是在这20个检验中完全没有出现第一类错误的概率然后再用100%减去这个反面事件的概率。
这里我们用PA来表示出现事件A的概率。P每个检验出现第一类错误=5%那么P每个检验不出现第一类错误 = 1-5%=95%所以P20个检验中完全没有第一类错误= 95%的20次方。
这样我们就可以求得这个概率:
![](https://static001.geekbang.org/resource/image/d2/74/d2cfa2e855ca2d90815e5a00c8deb374.png)
这里的 P至少出现一个第一类错误的概率又叫做 FWER Family-wise Error Rate
通过计算得出来的概率是64%。这就意味着当同时比较20个检验时在这20个结果中至少出现一个第一类错误的概率是64%。看看,这是不是个很大的概率了呢?事实上,随着检验次数的增加,这个概率会越来越大,你看看下面这个图就明白了。
![](https://static001.geekbang.org/resource/image/5e/1e/5e933ae0b496b062295a26304d8ac51e.png)
图中的蓝线和橙线分别表示当α=5%和1%时FWER的变化情况。根据这个图我们可以得出两个结论
1. 随着检验次数的增加FWER也就是出现第一类错误的概率会显著升高。
2.α越小时FWER会越小上升的速度也越慢。
第一个结论讲的就是多重检验带来的问题。第二个结论其实为我们提供了一种潜在的解决方法:降低α。
这就意味着当我们同时比较多个检验时就增加了得到第一类错误的概率FWER这就变成了一个潜在的多重检验问题。
### **什么时候会遇到多重检验问题?**
你可能会说我平时都是一个测试一个测试去跑不会同时跑多个测试是不是就不会遇到这个问题了呢其实不是的实践中出现多重检验问题比你想象的要普遍得多它在实践中主要以4种形式出现。
**第一种形式当A/B测试有不止一个实验组时。**
当我们想要改变不止一个变量且样本量充足时,我们可以不必等测试完一个变量后再去测试下一个,而是可以同时测试这些变量,把它们分在不同的实验组当中。
每个实验组只变化一个变量在分析结果时分别用每个实验组和共同的对照组进行比较这种测试方法也叫做A/B/n测试。比如我想要改变广告来提升其效果那么想要改变的变量包括内容、背景颜色、字体大小等等这个时候我就要有相对应的3个实验组然后把它们分别和对照组进行比较。
这就相当于同时进行了3个检验就会出现多重检验问题。
**第二种形式当A/B测试有不止一个评价指标时。**
这个很好理解,因为我们分析测试结果,其实就是比较实验组和对照组的评价指标。如果有多个评价指标的话,就会进行多次检验,产生多重检验问题。
**第三种形式当你在分析A/B测试结果按照不同的维度去做细分分析Segmentation Analysis时。**
当我们分析测试结果时,根据业务需求,有时我们并不满足于只把实验组和对照组进行总体比较。
比如对于一个跨国公司来说很多A/B测试会在全球多个国家同时进行这时候如果我们想要看A/B测试中的变化对于各个国家的具体影响时就会以国家为维度来做细分的分析会分别比较单个国家中的两组指标大小那么此时分析每个国家的测试结果就是一个检验多个国家则是多个检验。
**第四种形式当A/B测试在进行过程中你不断去查看实验结果时。**
这种情况我在[第7节课](https://time.geekbang.org/column/article/323696)中提到过,因为当测试还在进行中,所以每次查看的测试都和上一次的不一样,每查看一次结果都算是一次检验,这样也会产生多重检验问题。
了解了多重检验问题在实践中的表现形式,那么在实践中该如何解决它呢?
### **如何解决多重检验问题?**
首先我要提前说明的是接下来我介绍的解决方法只适用于前3种表现形式。对于第4种表现形式的解决办法我已经在第7节课介绍了那就是不要在A/B测试还在进行时就过早地去查看结果一定要等样本量达到要求后再去计算结果所以这里就不再赘述。
鉴于多重检验问题的普遍性,在统计上有很多学者提出了自己的解决方法,大致分为两类:
1. 保持每个检验的P值不变调整α
2. 保持α不变调整每个检验的P值。
为什么会做这两种调整呢?
在[第2节课](https://time.geekbang.org/column/article/318454)我们介绍了用P值来判断假设检验的结果是否显著时是用检验中计算出的P值和α进行比较的。当P值<α时,我们才说结果显著。
所以我们要么调整α要么调整P值。前面我也说了降低α是一种解决办法最常用的调整α的方法是[Bonferroni校正](https://en.wikipedia.org/wiki/Bonferroni_correction)Bonferroni Correction其实很简单就是把α变成α/n。
其中n是检验的个数。比如α=5%那当我们比较20个检验时校正之后的α=5%/20 = 0.25%此时的FWER =$1-(1-0.25 \\%)^{20}$ = 4.88% ,和我们最初设定的α=5%差不多。
Bonferroni校正由于操作简单在A/B测试的实践中十分流行但是这种方法只是调整了α对于不同的P值都采取了一刀切的办法所以显得有些保守检测次数较少时还可以适用。
根据实践经验在检测次数较大时比如上百次这种情况在A/B测试中出现的情况一般是做不同维度的细分分析时比如对于跨国公司来说有时会有上百个markets Bonferroni校正会显著增加第二类错误率β这时候一个比较好的解决办法就是去调整P值常用的方法就是通过控制[FDR](https://en.wikipedia.org/wiki/False_discovery_rate)False Discovery Rate来实现。
控制FDR的原理比较复杂我就不展开讲了你只需要记住它指的是一类方法其中最常用的是[BH法](https://www.statisticshowto.com/benjamini-hochberg-procedure/)Benjamini-Hochberg Procedure就行了。BH法会考虑到每个P值的大小然后做不同程度的调整。大致的调整方法就是把各个检验计算出的P值从小到大排序然后根据排序来分别调整不同的P值最后再用调整后的P值和α进行比较。
实践中我们一般会借助像Python这样的工具来计算Python中的[multipletests](https://www.statsmodels.org/dev/generated/statsmodels.stats.multitest.multipletests.html)函数很强大里面有各种校正多重检验的方法其中就包括我们今天讲的Bonferroni校正和BH法我们使用时只需要把不同的P值输入选取校正方法这个函数就会给我们输出校正后的P值。
这里我总结一下虽然Bonferroni校正十分简单但由于过于严格和保守所以在实践中我会更推荐使用BH法来矫正P值。
聊完了多重检验问题我们再聊一下A/B测试中另一个常见问题——学习效应。
## **学习效应(Learning Effect)**
当我们想通过A/B测试检验非常明显的变化时比如改变网站或者产品的交互界面和功能那些网站或者产品的老客户往往适应了之前的交互界面和功能而新的交互界面和功能对他们来说需要一段时间来适应和学习。所以往往老用户在学习适应阶段的行为会跟平时有些不同这就是学习效应。
### **学习效应在实践中有哪些表现形式?**
根据不同的改变,老用户在学习适应期的反应也不同,一般分为两种。
第一种是积极的反应一般也叫做新奇效应Novelty Effect指的是老用户对于变化有很强的好奇心愿意去尝试。
比如把点击按钮的颜色,由之前的冷色调变成了非常艳丽的大红色,在短期内可能会使诸如点击率之类的指标提升,但是当用户适应了新的大红色后,长期的指标也可能回归到之前的水平。
第二种是消极的反应一般也叫做改变厌恶Change Aversion。指的是老用户对于变化比较困惑甚至产生抵触心理。
比如你经常光顾的电商网站,之前的加入购物车功能是在屏幕的左上方,但是交互界面改变后加入购物车的位置变到了屏幕的右下方,这个时候你可能就需要在屏幕上找一阵子才能找到,甚至找了一圈没找到,因为烦躁就关掉了页面,那么这时候短期的指标就会下降。
可以想象这些在学习适应期的不同反应一般是短期的长期来看这些短期反应也是会慢慢消退的。但是要注意的是这些短期的学习效应确实会给A/B测试的结果带来干扰使结果变得过于好或者过于差。那么我们如何来及时发现学习效应从而剔除学习效应带来的干扰呢
### **学习效应该如何检测?**
在实践中,主要有两种方法可以用来检测学习效应。
**第一种方法是表征实验组的指标随着时间(以天为单位)的变化情况。**
在没有学习效应的情况下,实验组的指标随着时间的变化是相对稳定的。
但是当有学习效应时,因为学习效应是短期的,长期来看慢慢会消退,那么实验组(有变化的组)的指标就会有一个随着时间慢慢变化的过程,直到稳定。
* 如果是新奇效应,实验组的指标可能会由刚开始的迅速提升,到随着时间慢慢降低。
* 如果是改变厌恶,实验组的指标可能会由刚开始的迅速降低,到随着时间慢慢回升。
当然我们在使用这个方法时需要注意:随着时间表征实验组的指标变化,但并不是让你每天去比较实验组和对照组的大小。如果每天都去比较,就会出现我们刚才讲的多重检验的问题。一定要记住,只有达到样本量之后才可以去比较两组大小,分析测试结果。
**第二种方法是只比较实验组和对照组中的新用户。**
学习效应是老用户为了学习适应新的变化产生的,所以对于新用户,也就是在实验期间才第一次登录的用户来说,并不存在“学习适应新的变化”这个问题,那么我们可以先在两组找出新用户(如果是随机分组的话,两组中新用户的比例应该是相似的),然后只在两组的新用户中分别计算我们的指标,最后再比较这两个指标。
如果我们在新用户的比较中没有得出显著结果(在新用户样本量充足的情况下),但是在总体的比较中得出了显著结果,那就说明这个变化对于新用户没有影响,但是对于老用户有影响,那么大概率是出现了学习效应。
在实践中我们可以用以上方法检测出学习效应,不过要想真正排除学习效应的影响,得到准确的实验结果,还是要延长测试时间,等到实验组的学习效应消退再来比较两组的结果。
## **小结**
今天这节课我们重点讲解了A/B测试中两个常见的实验误区多重检验问题和学习效应。我把这两个问题出现的原理、在实践中的多种表现形式以及相应的解决方法都给你详细讲解了。
不过我还想特别强调一下多重检验问题。多重检验问题的表现形式多种多样所以在A/B测试中尤为常见。我在刚接触A/B测试时就已经知道了这个问题的存在不过当时了解到的是它会在A/B/n测试中出现但后来才发现原来在做细分分析时也会出现多重检验的问题。
幸好这个问题发现得及时,才没有让整个测试功亏一篑。现在再去复盘,主要还是因为当时只知道多重检验问题的存在,了解其中一两个表现形式。但对于为什么会出现多重检验问题,什么时候可能会出现多重检验问题,我都不清楚,所以在问题出现新的表现形式时就没有及时识别出来。
这也是我想要跟你强调的,**知道为什么会出现这个问题,并且发现问题,和解决问题同样重要。**
**思考题**
结合自己的经验想一想过去有没有在A/B测试中遇到多重检验问题和学习效应以及当时是如何处理的呢
欢迎在评论区写下你学习本节课的收获和深度思考,如果今天的内容能帮你解答了一些困惑问题,也欢迎点击“请朋友读”,和他一起学习、成长。感谢你的收听,我们下节课再见。