gitbook/AB测试从0到1/docs/318454.md
2022-09-03 22:05:03 +08:00

211 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 02统计基础深入理解A/B测试中的假设检验
你好,我是博伟。
在上节课学习A/B测试指标的统计属性时我用一句话给你简单解释了下假设检验选取一种合适的检验方法去验证在A/B测试中我们提出的假设是否正确。
这句话其实很抽象,所以今天这一讲,我们就具体展开下,看看假设检验是什么,以及如何利用假设检验来做出推断。
## 假设检验(Hypothesis Testing)是什么?
假设检验,顾名思义,就是要检验我们提出的假设是不是正确的,在事实上能否成立。
在统计中我们很难获取总体数据Population。不过我们可以取得样本数据Sample然后根据样本数据的情况产生对总体数据的假设。所以我们所说的假设检验其实就是检测通过样本数据产生的假设在总体数据即事实上是否成立。
在A/B测试的语境中假设一般是指**关于实验组和对照组指标的大小的推断。**
为了更加形象地帮你理解假设检验,这节课我就从一个推荐系统的案例出发,从中抽象出假设检验的基本原理和相关概念,让你在实践中学习理论,同时把理论应用到实践中去。
新闻App中的推荐系统是重要的组成部分可以根据用户过往的浏览记录来推荐用户喜欢的内容。最近工程团队改进了推荐系统的算法就想通过A/B测试来验证改进的效果。
实验组中使用新算法,对照组中使用旧算法,然后通过点击率来表征算法的效果:推荐效果越好,点击率越高。那么,我们提出的假设就是:实验组(新算法)的点击率比对照组(旧算法)的点击率高。
你可能会有些疑惑,我们提出的“假设”,和假设检验中的“假设”是相同的吗?
其实不完全相同。
## 假设检验中的“假设”是什么?
为什么这么说呢因为在假设检验中的“假设”是一对零假设Null Hypothesis和备择假设Alternative Hypothesis它们是完全相反的。在A/B测试的语境下零假设指的是实验组和对照组的指标是相同的备择假设指的是实验组和对照组的指标是不同的。
为了更好地理解零假设和备择假设,我们可以回到推荐系统的案例中,把最开始提出的假设转化成假设检验中的零假设和备择假设:
* 零假设是,实验组和对照组的点击率是相同的。
* 备择假设是,实验组和对照组的点击率是不同的。
你可能会问,我们最开始提出的假设不是“实验组的点击率比对照组的点击率高”吗?为什么备择假设中仅仅说两组的点击率不同,却没说谁大谁小呢?
要回答这个问题我们就得先了解单尾检验One-tailed Test和双尾检验Two-tailed Test这两个概念。
* 单尾检验又叫单边检验One-sided Test它不仅在假设中说明了两个比较对象不同并且还明确了谁大谁小比如实验组的指标比对照组的指标大。
* 双尾检验又叫双边检验Two-sided Test指的是仅仅在假设中说明了两个比较对象不同但是并没有明确谁大谁小。
回到推荐系统案例中的最初假设,我们已经明确了实验组的点击率比对照组的高,那就应该选用单尾检验。但是,我们的备择假设却变成了两组的点击率不同,这是双尾检验的假设,为什么呢?
这就是理论和实践的不同之处也是为什么我们觉得A/B测试的理论好掌握但实践总出问题的原因。这里我先告诉你结论再给你说明为什么。结论是**在A/B测试的实践中更推荐使用双尾检验。**
更推荐你使用双尾检验的原因,主要有两个。
第一个原因是,双尾检验可以让数据自身在决策中发挥更大的作用。
我们在实践中使用A/B测试就是希望能够通过数据来驱动决策。我们要尽量减少在使用数据前产生的任何主观想法来干扰数据发挥作用。所以双尾检验这种不需要我们明确谁大谁小的检验更能发挥数据的作用。
第二个原因是,双尾检验可以帮助我们全面考虑变化带来的正、负面结果。
在实践中,我们期望改变可以使指标朝着好的方向变化,但是万一指标实际的变化与期望的正好相反呢?这就可以体现双尾检验的优势了。双尾检验可以同时照顾到正面和负面的结果,更接近多变的现实情况。但是单尾检验只会适用于其中一种,而且通常是我们期望的正面效果。
所以正因为我们选择双尾测试,在备择假设中我们才只说了两组不同,并没有说谁大谁小。
## 假设检验中的“检验”都有哪些,该怎么选取?
现在,我们知道了假设检验中的“假设”包括零假设和备择假设两种,那么“检验”都包括什么呢?
其实检验有很多种单尾检验和双尾检验是从“假设”的角度来分类的。除此之外常见的“检验”还可以根据比较样本的个数进行分类包括单样本检验One-Sample Test、 双样本检验Two-Sample Test和配对检验Paired Test。那么问题来了在测试中到底该选择哪种检验方法呢
答案是:**在A/B测试中使用双样本检验**。
其中的原因其实很简单,我给你解释下它们各自的适用范围,你就知道了。
* 当两组样本数据进行比较时就用双样本检验。比如A/B测试中实验组和对照组的比较。
* 当一组样本数据和一个具体数值进行比较时就用单样本检验。比如我想比较极客时间用户的日均使用时间有没有达到15分钟这个时候我就可以把一组样本数据抽样所得的极客时间用户的每日使用时间和一个具体数值15来进行比较。
* 当比较同一组样本数据发生变化前和发生变化后时就用配对检验。比如我现在随机抽取1000个极客时间的用户给他们“全场专栏一律1折”这个优惠然后在这1000个人中我们会比较他们在收到优惠前一个月的日均使用时间和收到优惠后一个月的日均使用时间。
看到这里,你可能会问,我还听说过**T检验**T Test和**Z检验**Z Test那这两个检验在A/B测试中该怎么选择呢
选择T检验还是Z检验主要看样本量的大小和是否知道总体方差Population Variance
* 当我们不知道总体方差时使用T检验。
* 当我们已知总体方差且样本量大于30时使用Z检验。
我还给你画了张图,你一看就明白了。
![](https://static001.geekbang.org/resource/image/a9/04/a96d2d6ddeb4100b4d595d863693yy04.png?wh=6079*3575)
那么这些理论具体到A/B测试实践中一个经验就是**均值类指标一般用T检验概率类指标一般用Z检验比例检验。**
为什么会有这样的经验呢?
因为上节课我讲了样本量大的情况下均值类指标是正态分布正态分布的总体方差的计算需要知道总体中各个数据的值这在现实中几乎做不到因为我们能获取的只是样本数据。所以总体方差不可知选用T检验。
而概率类指标是二项分布二项分布的总体方差的计算不需要知道总体中各个数据的值可以通过样本数据求得总体方差。而且现实中A/B测试的样本量一般都远大于30所以选用Z检验。这里的**比例检验**Proportion Test)是专指用于检验概率类指标的Z检验。
讲了这么多检验,我现在来总结一下:**对于A/B测试来说要选用双尾、双样本的比例检验概率类指标或T检验均值类指标。**
再次回到我们的案例中来,由于点击率为概率类指标,所以这里选用双尾、双样本的比例检验。
## 如何利用假设检验做出推断?
选取了正确的假设和检验方法接下来就要检验我们的假设是不是正确了这在A/B测试中就是分析测试结果这一步啦。
### A/B测试可能出现的结果
假设检验会推断出两种结果:
1. 接受零假设,拒绝备择假设,也就是说实验组和对照组的指标是相同的。
2. 接受备择假设,拒绝零假设,也就是说实验组和对照组的指标是不同的。
但是请注意,这两个结果只是假设检验根据样本数据,通过一系列统计计算推断出的结果,并不代表事实情况(总体数据情况)。如果考虑到事实情况的话,结合假设检验的推断结果会有四种可能:
![](https://static001.geekbang.org/resource/image/a8/f3/a831c6b06fede368102b38c7af6f45f3.png?wh=7759*3836)
可以看出,只有当假设检验推断的情况和事实完全相符时,推断才正确,否则就会出现两类错误。
**第一类错误Type I Error)**统计上的定义是拒绝了事实上是正确的零假设。在A/B测试中零假设是两组的指标是相同的当假设检验推断出两组指标不同但事实上两组指标相同时就是第一类错误。我们把两组指标不同称作阳性Positive。所以第一类错误又叫假阳性False Positive
发生第一类错误的概率用α表示,也被称为**显著水平**Significance Level。“显著”是指错误发生的概率大统计上把发生率小于5%的事件称为小概率事件代表这类事件不容易发生。因此显著水平一般也为5%。
**第二类错误Type II Error)**统计上的定义是接受了事实上是错误的零假设。在A/B测试中当假设检验推断出两组指标相同但事实上两组指标是不同时就是第二类错误。我们把两组指标相同称作阴性Negative所以第二类错误又叫假阴性False Negative。发生第二类错误的概率用β表示统计上一般定义为20%。
这两种错误的概念读起来可能比较拗口,也不太容易理解,那么我就举一个新冠病毒核酸检测的例子来给你具体解释一下。
我们在这里的零假设是:被测试者是健康的,没有携带新冠病毒。
把携带新冠病毒作为阳性,没有携带作为阴性。如果一个健康的人去检测,结果检测结果说此人携带新冠病毒,这就犯了第一类错误,拒绝了事实上正确的零假设,是假阳性。如果一个新冠肺炎患者去检测,结果检测结果说此人没有携带新冠病毒,这就犯了第二类错误,接受了事实上错误的零假设,是假阴性。
现在我们了解了假设检验推断的可能结果,那么,如何通过假设检验得到测试结果呢?
实践中常用的有两种方法P值P Value法和置信区间Confidence Interval法。
### P值法
在统计上P值就是当零假设成立时我们所观测到的样本数据出现的概率。在A/B测试的语境下P值就是当对照组和实验组指标事实上是相同时在A/B测试中用样本数据所观测到的“实验组和对照组指标不同”出现的概率。
如果我们在A/B测试中观测到“实验组和对照组指标不同”的概率P值很小比如小于5%,是个小概率事件,虽然这在零假设成立时不太可能发生,但是确实被我们观测到了,所以肯定是我们的零假设出了问题。那么,这个时候就应该拒绝零假设,接受备择假设,即两组指标是不同的。
与此相反的是当我们在A/B测试中观测到“实验组和对照组指标不同”的概率P值很大比如70%,那么在零假设成立时,我们观测到这个事件还是很有可能的。所以这个时候我们接受零假设,拒绝备择假设,即两组指标是相同的。
在统计中我们会用P值和显著水平α进行比较又因为α一般取5%所以就用P值和5%进行比较,就可以得出假设检验的结果了:
* 当P值小于5%时,我们拒绝零假设,接受备择假设,得出两组指标是不同的结论,又叫做结果显著。
* 当P值大于5%时,我们接受零假设,拒绝备择假设,得出两组指标是相同的结论,又叫做结果不显著。
至于P值具体的计算我推荐你用工具来完成比如Python或者R
* 比例检验可以用Python的[proportions\_ztest](https://www.statsmodels.org/stable/generated/statsmodels.stats.proportion.proportions_ztest.html)函数、R的[prop.test](https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/prop.test)函数。
* T检验可以用Python的[ttest\_ind](https://www.statsmodels.org/stable/generated/statsmodels.stats.weightstats.ttest_ind.html)函数、R的[t.test](https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/t.test)函数。
### 置信区间法
置信区间是一个范围一般前面会跟着一个百分数最常见的是95%的置信区间。这是什么意思呢在统计上对于一个随机变量来说有95%的概率包含总体平均值Population mean的范围就叫做95%的**置信区间**。
置信区间的统计定义其实不是特别好懂,其实你可以直接把它理解为**随机变量的波动范围**95%的置信区间就是包含了整个波动范围的95%的区间。
**A/B测试本质上就是要判断对照组和实验组的指标是否相等那怎么判断呢**答案就是计算实验组和对照组指标的差值δ。因为指标是随机变量,所以它们的差值δ也会是随机变量,具有一定的波动性。
这就意味着我们就要计算出δ的置信区间然后看看这个置信区间是否包括0。如果包括0的话则说明δ有可能为0意味着两组指标有可能相同如果不包括0则说明两组指标不同。
至于置信区间的具体的计算我也推荐你使用Python或者R等工具完成
* 比例检验可以使用Python的[proportion\_confint](https://www.statsmodels.org/stable/generated/statsmodels.stats.proportion.proportion_confint.html)函数、R的[prop.test](https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/prop.test)函数。
* T检验可以使用Python的[tconfint\_diff](https://www.statsmodels.org/stable/generated/statsmodels.stats.weightstats.CompareMeans.tconfint_diff.html#statsmodels.stats.weightstats.CompareMeans.tconfint_diff)函数、R的[t.test](https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/t.test)函数。
现在回到推荐系统的案例中我会分别用P值法和置信区间法来根据A/B测试的结果进行判断。
* 实验组新推荐算法样本量为43578其中有2440个点击点击率为5.6%。
* 对照组旧推荐算法样本量为43524其中有2089个点击点击率为4.8%。
这时候我用R中的比例检验函数[prop.test](https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/prop.test)来计算P值和置信区间。
```
prop.test(x = c(2440, 2089), n = c(43578, 43524), alternative = "two.sided", conf.level = 0.95)
```
得到了如下结果:
![](https://static001.geekbang.org/resource/image/75/03/75c56fdd59dee61dea812c26c187aa03.png?wh=404*163)
可以得出P值=$1.167 e^{-7}$ 远远小于5%且接近于0所以我们拒绝零假设接受备择假设并且推断出实验组和对照组指标显著不同。
同时我们也可以得出两组指标差值δ的95%置信区间为\[0.005,0.011\]不包含0也可以推断出两组指标显著不同。
## 小结
今天这节课我们针对A/B测试的理论基础—假设检验学习了假设、检验以及相关的统计概念。你只要记住以下两个知识点就可以了。
第一对于A/B测试来说要选用双尾、双样本的比例检验概率类指标或T检验均值类指标。这决定了你在计算分析A/B测试结果时如何选取检验的参数所以很重要。
第二在A/B测试实践中计算样本量大小、指标波动性和分析测试结果的时候会用到这些统计概念。
* 计算样本量大小时,会用到: 第一类/第二类错误及其概率α和β。
* 计算指标波动性时,会用到:方差和置信区间。
* 分析A/B测试结果时会用到各类检验、置信区间、P值。
本节课中的关于假设检验的概念和知识点比较琐碎,为了方便你日后理解记忆,我也给你准备了下面的导图:
![](https://static001.geekbang.org/resource/image/6d/41/6dd0059d264833ce89f7acdc11b25b41.png?wh=2250*2047)
到这里我们的统计篇就告一段落了现在你应该已经掌握了A/B测试所需的基本统计知识啦。其实前两节的内容比较偏理论会不太好理解。不过理论知识的学习如果只是填鸭式地讲效果可能并不好。那该怎么掌握这些理论知识呢在我这些年做A/B测试的实践中发现要想真正把理论知识理解透化为己用还是需要自己多思考多实践。等你有了一些实战后自然就能自己体悟到理论学习的好处了。而且这时候再回过头来看理论就会非常容易看懂。
所以在今天的内容中如果有哪些地方你还不能理解那也没关系不要给自己设置心理障碍可以先放一放。之后的课程中我都会运用今天讲到的理论去解决在A/B测试中遇到的问题。你可以在学习的过程中不断回顾这些理论或者发挥主观能动性多查阅一些资料。等你学完整个课程再回头看这两节理论知识一定会发现理论原来如此简单。
那么接下来我们就进入“基础篇”模块去详细学习A/B测试的主要流程吧
## 思考题
这节课涉及的统计概念都是虽然经常听到,但是难理解的,你们在学习统计中有没有对这些概念的理解有独特的心得?可以拿出来分享给大家。
欢迎在留言区写下你的思考和想法,我们可以一起交流讨论。如果你觉得有所收获,欢迎你把课程分享给你的同事或朋友,一起共同进步!