假设检验
随机抽样与假设检验
随机抽样的结果能够帮助我们检验假设。比如我们做一个民调,在民调的 1400 人中,发现喜欢 A 的人是 1200,喜欢 B 的人是 200 人。这个抽样结果就可以帮助我们检验这个假设:目标人群中喜欢 A 的人和喜欢 B 的人是一样的。我们就会觉得这个假设不太成立,因为如果目标人群中喜欢 A 和喜欢 B 的人是一样的话,我们从中随机抽样,很大的概率应该是两种人相差不大,对吧?但现在的抽样结果相差也太大了:一种是 1200,另一种才 200。因此,我们可以利用这个随机抽样的结果,来证明这个假设成立的可能性不大。
我们在工作中经常进行假设检验的工作。我们进行做抽样的实验。抽样就有随机性。那么,我们怎么基于抽样的结果进行假设检验呢?这就是统计学中的假设检验问题。
假设检验的直观理解
我们下面以疫苗为例,通过仿真,来说明假设检验的原理。
我们的目的是验证疫苗的效果。为此,我们做以下的实验:
我们招募了 43738 个志愿者。招募这么多志愿者是不容易的,因为打疫苗是有风险的,最严重的情况下可能导致死亡。所以这些志愿者是特别优秀的,他愿意付出自己的生命,帮我们来尝试这个疫苗。
我们就给其中一半打疫苗,一半打安慰剂。过了 4 周以后,再去看这 4 万个志愿者,发现其中有 468 个人得了新冠,其中 117 个是打了疫苗的,351 个是没有打疫苗的。这是它的测量结果。现在请大家判断,这个疫苗有效吗?
大家是不是会觉得这个疫苗是有效的?我们简单推理一下:如果疫苗无效的话,那么在得病的人中,打疫苗和没打疫苗的人,应该差不多,对吧?但现在不是这种情况啊:在得病的人中,打疫苗和没打疫苗的人的比例大约是 1:3。这就是说:打疫苗的人数少很多。所以“疫苗无效”这个假设好像不太对,是吧?
所以我们脑子里其实是这么推理的:我们假设疫苗无效,然后在心里评估此时出现 117 人是打了疫苗的,351 人是没有打疫苗的,这种情况是不是一种比较极端的情况。如果比较极端的话,那么就觉得这个假设好像不太成立。
用数学的语言表达,就是,我们在评估:如果“疫苗无效”的假设成立的话,“468 个人得了新冠,其中 117 个是打了疫苗的,351 个是没有打疫苗的”这个我们观察到的情况,出现的概率大不大。如果很小的话,我们就有点怀疑了:我平时很少中奖,怎么今天运气就这么好,就中奖了呢?这肯定不对啊。所以,我们就对这个假设表示怀疑。
疫苗有效性假设检验仿真
我们下面通过仿真来获得这个概率。我们通过 Urn 仿真这种情况:当“疫苗无效”时,“468 个人得了新冠,其中 117 个是打了疫苗的,351 个是没有打疫苗”的概率。
我们的 Urn 仿真是这样的:现在有 468 个病人,43270 个好人,都在桶子里。我们从中随机取样出 21869 人(就是一半人),然后看这些人中病人的数目。一共仿真 50 万次。根据我们的概率知识,我们能大概预计到:正常情况下,其中应该包括大约 234 个病人。这就是一半打疫苗的人中的得病数。
代码如下:
imulations_fast = np.random.hypergeometric
(ngood=468, nbad=43270,
nsample=21869, size=500000)
我们画出 50 万次仿真的打疫苗的病人数的分布,就会有如下发现:
首先,像我们期待的那样,出现得最多的是 234 个病人的情况。这是可以理解的:因为我们是随机选出了一半的人,那么这 468 个病人,也就被随机地选出了 234 人。
其次,除了 234 个病人的仿真结果,因为仿真的随机性,也有其他病人数的结果,比如 220 个病人,等等。它们出现的次数没有 234 个病人的情况出现的次数多。
最后,基本上没有出现过病人数少于 200 的情况,病人数为 117 人的情况就更少了,而比 117 人更极端(少于 117 人)的情况就更更少了。
可是我们却观察到了“117 个是打了疫苗的,351 个是没有打疫苗的”。如上所述,这个现象在“疫苗无效”的假设下出现的概率非常小啊。所以,在我们的“疫苗无效”的假设下,我们观察到的“468 个人得了新冠,其中 117 个是打了疫苗的,351 个是没有打疫苗的”这个现象出现的可能性极小。这就让我们可以比较放心地拒绝(reject)“疫苗无效”的假设。
假设检验原理和 p 值
这就是假设检验的基本原理:先定义一个假设(比如疫苗无效),然后根据这个假设,计算观察到的现象的概率。如果这个概率很小,那么就可以比较放心地拒绝(reject)这个假设。
当我们有观察现象符合的概率分布的数学表达式时,我们能很方便地计算假设下观察现象的概率。比如,对上面的例子,我们知道打了疫苗的病人数符合超几何分布,所以,我们可以不做仿真,而是利用超几何分布的数学公式,把“468 个人得了新冠,其中 117 个是打了疫苗的,351 个是没有打疫苗的”这个现象的概率算出来。这样就更方便了。
因为我们衡量的是 “117 个疫苗病人” 这一观察现象“极端”的程度,所以我们主要观察的是它的“偏差”。因此,我们不仅计算 117 个疫苗病人的概率,我们还把比它更极端的情况(比如 116 个疫苗病人、115 个疫苗病人,等等)的概率也计算出来。所以这个概率是 117 以及更少的疫苗病人出现的概率,也就是从 0 到 117 的累积概率。
上面这个概率,就是 p 值。p 值是一个特别重要的概念。它指的就是我们在一个假设下,出现比我实验得到的现象,以及比这一现象更极端的现象的累积概率。如果这个概率特别小的话,那么我们就对这个假设会产生很大的怀疑:这不太可能吧,因为我从来不中奖的,怎么今天就中奖了呢?这肯定不对:你肯定不是随机抽的,而是你专门来找我的。
我们的这一假设检验过程和我们识别电诈的怀疑是类似的。我们收到一个中奖的电话,肯定会怀疑:如果你是随机挑的中奖者,怎么会找到我呢?这概率太小了吧。如果你这么想的话,那么你就是真正懂假设检验的人。事实上,那些电诈集团的人,可不是随机抽样的。它给你打电话,是有针对性的:它首先通过各种黑客把你的电话号码搞过去,然后对你做详细的背景调查,甚至有同伙来你们家附近转过,把你的各种情况都摸清楚,然后再给你打电话。所以它都是有备而来的,他绝对不是随机选中你。我们识别骗子的检验和假设检验,其实是一个道理。
假设检验方法
理解了 p 值的概念后,我们理解假设检验方法就特别容易了。下面是假设检验的基本方法。
首先,有两种假设:一种叫做 NULL 假设,一般用 H0 表示。另一种是 H1,或者叫 Ha。它叫“替代假设”。为什么叫“替代假设”呢?就是如果 NULL 假设不成立的话,我们用一个什么假设来替代它呢?所以 Ha 和 H0 是“替代”关系:它们是要比较矛盾的。
在实际中,我们通常比较关心 Ha:替代假设。比如疫苗的例子。我们想要检验的假设是替代假设:“疫苗有效”。但是,我们实际去检验的是与这个假设相反的 NULL 假设“疫苗无效”。然后,我们根据观察结果来评估:测量的结果在这,它在 NULL 假设下是不是极端?如果极端,我们就觉得:这个 NULL 假设可能不太成立,这就意味着,那么,替代假设的可能性高一些。
大家会说:为什么不直接检验疫苗有效呢?像前面的例子,疫苗病人 117人,比没打疫苗的病人 351人少这么多,这也给我们一个感觉:疫苗是有效的,对吧?这样推理是可以的,但不好做数学上的精确评估。就像上面的两种,如果“疫苗无效”,那么我们可以用超几何分布来模型疫苗病人的数目的概率分布,但是“疫苗有效”下,我们怎么建立这个数学模型呢?这就很难。因此,我们就选择对 NULL 假设进行检验。此时,我们就可以算出 117 个疫情病人的 p 值是多少。比如是 0.001 还是 0.0001。根据这个数值,我们就能量化我们拒绝这个假设的信心。很多同学学假设检验,学到这里就晕了:这个太违反常理了!为什么非要弄个 NULL 假设呢?这就是原因。
注意,在评估一个出现的情况的“极端”程度时,我们会加上比它更极端的情况的概率。具体来说,假设检验时,我们不直接去测试这个替代假设,而是测试 NULL 假设。我们评估在 NULL 假设成立的情况下,我们观察到的这个现象,以及比它更极端的现象,可能性有多大。比如上面的例子,我们不仅计算 117 个疫情病人的概率,还把比 117 更少,因此更极端的情况的概率都加上。
说法的注意事项
当 p 值很小时,我们不能说 NULL 假设是假的,而应该说:H0 似乎没有正确描述我们测量的现象。如前面的例子,当 NULL 假设成立时,出现我们观察到的现象的概率还是有的,只是非常小。此时,因为 p 值特别小,所以我们能比较有信心地拒绝 H0。
既然我们能够比较放心地拒绝 H0,这也意味着和这个假设相反的“可选假设” Ha 可能成立。在上面的例子中,我们比较放心地拒绝的假设是“疫苗无效”,这就意味着“疫苗有效”的“可选假设”很可能成立。但大家注意,我们千万不能说:我们现在就证明了“疫苗有效”的假设成立了。这么说的话不严谨,因为我们并没有证明这个。我们只能说:Ha 成立的可能性比较大,或者:我们比较有信心地认为它可能是对的。
假设检验的过程
假设检验的过程如下:
首先,基于一些观察数据,提出一个假设 Ha,比如疫苗有效。
然后,提出一个 NULL 假设 H0。它和 Ha 是反着的。
然后,收集新数据,来检验 H0。注意,我们不能在原来的数据上检验 H0。因为你是基于这些观察数据提出的Ha,所以我们要去做新的实验,用新的数据来进一步检验 NULL 假设。
当我们得到新数据后,就计算这个数据及比这个数据更极端的情况,在 NULL 假设下发生的概率,这就是 p 值。
p 值计算的例子
p 值的计算和我们的问题息息相关。下面举例来说明 p 值计算的过程:
这个例子是关于多项选择题的答案分布的假设:我们的多项选择题有 ABCD 四个选项。我们每次实验都统计 12 道题,统计它的答案中 b 出现的次数。我们用 X 来表示得到的这个次数。
多次实验后,我们提出假设:出现答案 b 的概率是 0.8,不出现 b 的概率是 0.2。
我们下面检验这个假设。为此,我们又做一次实验,采样了 12 道题,发现 b 才 4 个。
这时,我们怎么计算出这个观察的 p 值呢?我们就算出 12 次中 b 出现 4 次,非 b 出现 8 次的概率,学过概率论的同学一定会算吧。注意:我们不仅求出 b 出现 4 次,非 b 出现 8 次的概率,我们还要把更极端的情况,那就是 b 出现 3次、2 次、1次、以及完全没出现,这些概率全求出来,然后相加。
求出来之后,我们发现,它是 0.0006,非常小,非常不可能,所以我们“倾向于”拒绝这个假设。这有点像大家答应男/女朋友出去吃饭。男/女朋友说明天我们一起去吃饭,你应该回答说:我“倾向于”明天跟你去吃饭,而不能说:好,我一定和你去吃。因为万一到时候,你老师给你打电话,要你赶紧回实验室,那男/女朋友岂不就会说你不讲信用?所以你得说“倾向于”。当然,你可以跟他说:我不和你出去吃的概率特别特别小,也就是说我有极大的可能陪你去吃饭。你男/女朋友就会觉得这个同学太专业、太靠谱、太严谨了,是最靠得住的朋友!
那么,我们下面再看一个例子。比如我们实验后,发现这次 b 是 10 个。我们也算一下 p 值,就是出现 10 个以及比 10 个更少的概率,发现是 0.73。那这个太有可能了。所以,这时候我们没有信心拒绝这个假设。
p 值的判断门限
我们下面介绍怎么基于 p 值进行假设检验。我们会设一个门限。如果 p 值小于这个门限,我们就比较有信心地拒绝 NULL 假设。一般来说,我们将门限设为 0.05,就是 5%。
p 值门限的设置和我们具体问题的要求有关。比如这个疫苗特别特别重要,比如说是给孩子打的疫苗,我们的拒绝必须非常有信心,此时,我们就可以把这个门限弄小一点,比如 0.005,也就是说:必须我们的 p 值小于 0.005,我们才拒绝“疫苗无效”的假设,然后给孩子打这个疫苗。否则的话,我还是保守一点,不拒绝这个假设,因此也就不会给孩子打这个疫苗。所以,p 值门限代表了我们拒绝 Null 假设的“信心”要求。这个门限的设置是我们根据任务的要求来设置的。目前很多论文里面都约定俗成地把门限设为 0.05,但它不是国家标准。
p 值的判决门限的英文术语叫 level of significance,翻译成中文呢,叫“显著性水平”,或者临界水平、控制水平、临界阈值。它反映的是我们对拒绝 NULL 假设的“信心”的要求。它越小,就意味着我们的拒绝,会在 p 值更小的情况下才会做,此时,我们对这个拒绝的信心,就更强一些。因为我们为什么能够拒绝一个假设呢?是因为在这个假设下,我们观察到的现象不太可能出现。它越不可能出现,我们拒绝这个假设的信心就越大。
门限是 0.05,意味着什么呢?意味着在 5% 的情况下,我们偶尔还是会拒绝这个正确假设。此时,我们拒绝一个假设,但明明这个现象以及比它更极端的情况,在这个假设正确的情况下,出现概率是 5%。所以这时候,我们的拒绝其实是错误了。所以,我们不能说这假设是成立的,或者不成立的,因为这是有概率的。
假设检验方法的选择
所以假设检验最重要的是计算出 p 值,然后和我们设定的门限进行比较。
假设检验和 p 值计算没有统一的方法,需要我们根据我们的问题来选择正确的方法。就像我们前面看到的,p 值是有物理意义的。它是观察到的现象以及比它更极端的现象,出现的概率。那么,观察到的现象是一种什么现象,用什么概率分布描述?什么是“极端”?这些都和我们的问题的具体要求有关。所以,计算 p 值没有统一的方法,我们得根据我们的问题,选择不同的检测方法和 p 值计算方法。
我们下面就介绍各种情况,以及在这些情况下的检测方法和 p 值计算方法。
单样本和双样本
单样本指的不是一个样本,而是样本来自 1 个群体;双样本呢,是样本来自两个群体。
当我们的假设是关于一群用户的,比如我们研究生同学的平均年龄是 23 岁,这就是单样本,因为它是关于一个群体。
双样本呢,是关于两个群体的。比如:学通信工程专业的同学和学电子信息技术专业的同学,他们的平均年龄不一样,这就是关于双样本的。
很多测试都有单样本和双样本两个版本。
双边和单边
关于 p 值的计算,我们有两种方法:双边和单边。我们下面用例子来说明这两种情况。
我们测试一个硬币是不是公平的。我做了一次实验,抛它 12 次,然后统计观察的结果,发现正面 4 次,反面 9 次。然后,我们需要计算 p 值。
计算 p 值需要计算比观察到的现象更极端的情况的概率,那么,什么是“更极端”呢?这里就有两种判断方法:
如果我的假设是“硬币是公平的”,那么,比现在观察到的“正面 4 次,反面 8 次”更极端的情况就包括两种:“正面少于 4 次”,“反面 少于 4 次”。因为我们的假设是这个硬币是公平的,所以它的极端情况就是正反面的数目不均匀,对吧?所以这个“不均匀”是不是就有两个极端了:一个是它极端地偏向于正面,另外一个是极端地偏向于反面。所以这时候我们就两头的概率都要算。这就是“双边”的。
如果我的假设是“它不偏向背面”,那么,比现在观察到的“正面 4 次,反面 8 次”更极端的情况就只包括一种:“正面少于 4 次”。具体来说,我们假设“它不偏向背面”,但我们测的结果是正面 4,反面 8,所以,这是这个假设下的一种极端情况:你说你不偏向背面,但我现在正面才四个,背面却有 8,是不是挺极端的?这时,我们要算的比这更极端的情况,就是正面才 3 个、2 个、1 个,或者完全没有。所以这时候我们这个极端的计算就是单边的,因为我们只看比 4 小的这一边,不去看比 8 大的另一边。
所以,算 p 值考虑极端情况时,我们得根据具体的假设内容来确定是单边还是双边。
假设检验方法的选择
我们下面计算三种常用的假设检验方法。它们分别适用不同的场景。
t-test
t-test 用于对连续值的假设检验。比如这个假设:大家的平均年龄是 35 岁。做出这个假设后,我就做一个调研,然后基于调研,做 t-test,来检验我的假设。
t-test 的大致过程如下:我们首先根据样本个数等信息,基于调研结果,算出一个 t 值。然后用这个 t 值,去查表,得到对应的 p 值。查 p 值的时候,我们需要确定是查单边的还是双边的。对我们这个问题来说,大家年龄的极端情况有两种:比 35 低,比 35 高。这些都是极端情况,因此,我们要找双边的 p 值。得到 p 值后,我们将它和阈值(比如 0.05)比较。比如小于阈值,我们就认为能够比较有信心地拒绝这个假设。
除了根据 t 值查表得到 p 值这个方法,我们也可以反过来,根据阈值所在的 p 值得到对应的 t 值门限,然后比较计算得到的 t 值和这个t 值门限。如果大于这个门限,那么就认为能够比较有信心地拒绝这个假设。
上面这个假设是单样本的。下面我们看一个双样本的 t-test 的例子。比如这个假设:男生比女生的身高要高。这是比较男生和女生两个人群的均值。它的假设检验过程和上面说的类似,只是 t 值的计算略有不同。
z-test
通常,在样本数小于 30 时,或者样本总体的标准差未知的情况下,我们用 t-test。反之,如果我们已知样本总体的标准差,或者我们的样本数超过了 30,那么我们可以用 Z-test。
t-test 和 z-test 的区别主要在于它们用的分布不同:一个用的是 t 分布;一个用的是正态分布。随着自由度的增长,T 分布就会逼近正态分布。而在自由度比较小的时候,T 分布的尾巴比正态分布高一点,这就意味它的极端情况的概率要大一些,所以它算出来的 p 值也就大一些,因此,我们更有可能不会做出拒绝假设的决定。
卡方检测
t-test 和 z-test 适用于连续数据的假设检验,而离散数据的假设检验可以用卡方检验。比如,我们有一个同学的数据,里面记录着同学们喜欢的音乐类型和“最终是否毕业”。这两个属性的取值就都是离散的。然后我们想验证喜欢不同音乐的同学的毕业率一样,这时候我们就可以使用卡方检验。
上面讲得还比较抽象。请认真地完成课后练习,体会其中的例子,得到一手的经验。我们见过的假设检验的例子多了,就会用它了。
非参数检验
上面的方法都基于具有参数的概率分布,比如正态分布,所以也被称为参数检验。当数据量特别少,或者我们不能用正态分布时,我们可以用非参数测试。
我们简要介绍非参数测试的思想。它的思想是这样的:它想知道,观察到的现象,是随机造成的结果呢,还是统计上显著的?因此,它就把数据随机地搞乱,然后评估观察数据在随机搞乱的数据中,是不是很极端。如果发现弄乱后的结果和我们观察到的结果也差不多,那么就意味着我们观察到的结果并不极端,这时我们没有什么信心来拒绝对应的假设。所以它的基本思想也是想要看看观察到的现象是不是极端。这和我们前面谈过的假设检验的原理是一样的。
小结
本节我们着重学习了假设检验的原理。从“疫苗有效”的仿真出发,首先理解了 NULL 假设,观察现象在 NULL 假设下的极端出现概率,以及更极端的概念,由此理解了 p 值的概念,懂得了单边、双边的更极端情况计算的原理,然后介绍了单样本和双样本,连续数据和离散数据的测试类型,以及非参数检验。
练习
假设检验是一个实用的工具,所以,掌握它最好的方法就是练习。下面我们就进行练习。
我们首先完成布朗大学的 Jupyter Notebook 的学习。这里面有三个假设检验挺好玩的。第一个是好莱坞电影的。它想要比较 2015 年上映的电影的分数是不是跟别的电影差不多,没有什么不同。第二个是比较 2006 和 2016 年电影的不同。第三个是评估上映的年份和是否收入过亿的关系。通过这些练习,我们对单样本、双样本的 t-test、卡方检验,就有感觉了。然后工作了才知道怎么干活。在这部分,它把代码都编好了。大家只要跑,学习就行了。
我们然后完成其中两个练习。这个要大家编程。这个练习是关于警察抓人的假设检验。它想要看一下:有家的人和无家可归的人,被抓后,被起诉的概率是否不同?然后,这两种人被抓的时候,警察的人数有区别没?
上面这个是基本练习。做完这个基本练习之后呢,有余力的同学,请再完成布朗大学的这个高级一点的作业。如果大家以后想要年薪百万的话,可能就得做一下这个练习。它里面首先让你写出来各种测试的代码,然后有五种场景,让你选择合适的测试。
最后,请大家根据你心仪的岗位,构思需要做假设检验的例子。单样本和双样本,各举一个例子。然后,生成一些假设的数据,对这个假设进行一下测试。最后提交一个简历的内容。这个练习的作用是大家上完这个课之后,简历也写好了,就可以去面试了。
Index |