利用python进行假设假设检验

这篇文章通过一个实列来介绍如何利用python来进行假设检验。上一篇文章中,我们介绍了假设检验就是将所要验证的假设分成两个对立的假设,然后验证哪一个假设成立的概率要大一点。这里我将会介绍专业人员验证假设的两种方法:

  1. 第一种方法,利用置信区间。首先模拟统计量的抽样分布,然后对比我们的假设和抽样分布中的情况是否一致。
  2. 第二种方法,模拟零假设。首先我们假设零假设为真,然后依此模拟统计量分布,最后观察得到的数据是否一致。

数据介绍和确立假设

本文利用的数据是一份关于人们喝咖啡的数据,包含每一个人的身高、是否喝咖啡等信息。这里展示了头部的5条数据:
利用python进行假设假设检验_第1张图片
我们好奇的一个问题是这些喝咖啡人的平均身高是否大于70英寸(1.75米),也就是我们想验证这个总体中的身高均值是否大于70英寸。所以我们可以设立假设有(μ代表身高的平均值):

H0: μ≤70
H1: μ>70

利用置信区间

为了验证关于总体参数的假设,我们需要从总体中抽取样本进行检验。第一个方法是通过构造统计量的抽样分布,查看置信区间,并与假设进行对比。具体过程可以概括为:

  1. 对从总体中抽取出来的样本进行多次自助抽样,得到一个样本集。
  2. 对样本集中,每一次自助抽样的样本,计算其中身高的均值。
  3. 用这些均值构建样本均值的抽样分布。
  4. 根据特定的置信水平,从抽样分布中,为总体均值确定置信区间。

具体代码实现过程如下:

  1. 先导入相应的包
import pandas as pd
import numpy ad np
import matplotlib.pyplot as plt
%matplotlib inline
  1. 导入数据
df=pd.read_csv('coffee_dataset.csv')
  1. 从数据中随机抽取150个样本
np.random.seed(42) #设置种子
sample_df=df.sample(150)
  1. 对样本重复进行10000次自助抽样,并计算每个样本的身高均值
means=[]    #存储每一次计算得到的均值
for _ in range(10000):
    bootsample=sample_df.sample(150,replace=True)  #replace=True时为自助抽样,也就是有放回的抽样
    means.append(bootsample.height.mean())
  1. 根据抽样分布,以95%的置信度,确定总体均值满足的置信区间
low,high=np.percentile(means,2.5),np.percentile(means,97.5)

low和high分别代表置信区间的下限和上限

  1. 可视化置信区间
plt.hist(means)
plt.axvline(x=low,color='r',linewidth=2)
plt.axvline(x=high,color='r',linewidth=2)

结果为:
利用python进行假设假设检验_第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)

利用python进行假设假设检验_第3张图片
计算抽样得到的样本均值:

sample_mean=sample_df.height.mean()

计算p值,p值其实就是基于备择假设,比样本统计量更极端值的比例:

(null_vals>sample_mean).mean()

在这里插入图片描述

在该例的假设中,H1的假设为:

H1: μ>70

所以在基于H1的假设下,更偏向极端值的就是抽样分布中大于样本计算出来的统计量值的比例。这就是p值,值越大我们越不能拒绝零假设。上面计算的值为1,所以我们无法拒绝原假设。这个结果也和上部分利用置信区间得到的结论一样。这里我们给出通过模拟零假设进行假设检验的一般过程:

  1. 计算实际从数据的抽样中,得到的统计量的数值
  2. 模拟零假设中得出的统计量数值
  3. 对比统计量和零假设中的数值
  4. 根据备择假设,计算P值

你可能感兴趣的:(数据分析,python,数据分析)