这篇文章通过一个实列来介绍如何利用python来进行假设检验。上一篇文章中,我们介绍了假设检验就是将所要验证的假设分成两个对立的假设,然后验证哪一个假设成立的概率要大一点。这里我将会介绍专业人员验证假设的两种方法:
本文利用的数据是一份关于人们喝咖啡的数据,包含每一个人的身高、是否喝咖啡等信息。这里展示了头部的5条数据:
我们好奇的一个问题是这些喝咖啡人的平均身高是否大于70英寸(1.75米),也就是我们想验证这个总体中的身高均值是否大于70英寸。所以我们可以设立假设有(μ代表身高的平均值):
为了验证关于总体参数的假设,我们需要从总体中抽取样本进行检验。第一个方法是通过构造统计量的抽样分布,查看置信区间,并与假设进行对比。具体过程可以概括为:
具体代码实现过程如下:
import pandas as pd
import numpy ad np
import matplotlib.pyplot as plt
%matplotlib inline
df=pd.read_csv('coffee_dataset.csv')
np.random.seed(42) #设置种子
sample_df=df.sample(150)
means=[] #存储每一次计算得到的均值
for _ in range(10000):
bootsample=sample_df.sample(150,replace=True) #replace=True时为自助抽样,也就是有放回的抽样
means.append(bootsample.height.mean())
low,high=np.percentile(means,2.5),np.percentile(means,97.5)
low和high分别代表置信区间的下限和上限
plt.hist(means)
plt.axvline(x=low,color='r',linewidth=2)
plt.axvline(x=high,color='r',linewidth=2)
结果为:
可以看到,抽样分布大致为正太分布。为什么会服从正太分布呢?因为根据中心极限定理,在样本量趋于无限的时候,样本均值服从正态分布。上面的图像是在进行10000次自助抽样时候的状态,随着抽样次数的增加,图像会越来越趋近正太分布。
另外,95%的置信度下,置信区间的范围大致为67-68.25之间。因此我i们看到,抽样分布95%以上的值都小于70,所以我们应该接受零假设,也就是认为总体的平均身高小于70英寸。
上一部分我们采用置信区间,判断样本计算的统计量值是否在置信区间里面,以此来判断是否接受原假设。这里我们采用另外一种方式来判断是否接受原假设。我们知道当样本容量足够大时,样本均值服从均值为总体均值,方差为样本均值方差的正态分布。那么我们就可以,模拟零假设成立下的统计量的抽样本分布,并根据这个分布计算P值,以此来判断是否接受零假设。关于P值,可以参看我的另一篇文章《一文详解假设检验、两类错误和p值》。下面我介绍具体的实现方法:
同样首先导入相应的包和数据:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
df=pd.read_csv('coffee_dataset.csv')
接着从数据中抽取150个样本,这是把原数据当成总体,而对总体进行抽样的过程:
np.random.seed(42)
sample_df=df.sample(150)
对样本进行10000次自助抽样,并计算均值:
means=[] #存储每一次计算得到的均值
for _ in range(10000):
bootsample=sample_df.sample(150,replace=True) #replace=True时为自助抽样,也就是有放回的抽样
means.append(bootsample.height.mean())
计算样本统计量的方差,并在假设零假设成立下,模拟正态的抽样分布:
null_vals=np.random.normal(70,np.std(means),10000)
可视化图形:
plt.hist(null_vals)
sample_mean=sample_df.height.mean()
计算p值,p值其实就是基于备择假设,比样本统计量更极端值的比例:
(null_vals>sample_mean).mean()
在该例的假设中,H1的假设为:
所以在基于H1的假设下,更偏向极端值的就是抽样分布中大于样本计算出来的统计量值的比例。这就是p值,值越大我们越不能拒绝零假设。上面计算的值为1,所以我们无法拒绝原假设。这个结果也和上部分利用置信区间得到的结论一样。这里我们给出通过模拟零假设进行假设检验的一般过程: