python单样本假设检验实例

假设检验可以建立批判思维,切忌盲目追寻他人的观点。在各个领域都应用广泛,例如犯罪学,科学研究中都会假设某个推理,然后通过一系列结论去证明这个推断是否成立,如果成立则接受假设,若不成立则接受反面推断。
假设检验的四个步骤
一、问题是什么
1.明确问题是什么,根据问题假定两个假设:零假设和备选假设,两个假设是对立的。零假设总是表述为研究没有改变,没有效果,不起作用
2.判断检验类型
  • 单样本检验检验=》检验单个样本的平均值是否等于目标值
  • 相关配对检验=》检验相关或配对观测之差的平均值是否等于目标值
  • 独立双样本检验=》检验两个独立样本的平均值之差是否等于目标值
3.确定抽样分布类型
  • 当样本数量大于30时,符合中心极限定理,抽样分布呈正态分布
  • 样本数量小于30时,抽样分布符合t分布或其他分布
4.确定检验方向
  • 单尾检验
    左尾:若备选假设包含有<,则选左尾检验

 

    右尾:若备选假设包含有>,则选右尾检验

 

  • 双尾检验
    将判断标准一分为二位于抽样分布的两侧,左右侧各占一半判断标准,若假设中包含不等号,则属于双尾检验。

 

二、做出结论标准是什么(证据是什么)
在假设零假设成立时,计算样本平均值的概率:p值
当样本分布符合t分布是计算p值得方法如下
根据t值,查找t表格,得到p值
三、判断标准是什么
设定显著水平α
四、做出结论
当p<=α时,拒绝零假设,接受备选假设
p>α时,接受零假设
 
实例
环保标准规定汽车的新排放标准:平均值<20ppm,现某汽车公司测试10辆汽车的排放结果如下:15.6 16.2 22.5 20.5 16.4 19.4 16.6 17.9 12.7 13.9 。问题:公司引擎排放是否满足新标准。
一、问题是什么
  1、零假设:公司引擎排放不满足标准,即平均值>=20
  备选假设:公司引擎排放满足标准,即平均值<20
  2、判断检验类型:改例子为单样本检验
  3、确定抽样分布
  1)用python展示统计描述(平均值、标准差)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dataSer=pd.Series([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9])
sample_mean=dataSer.mean()#样本平均值
sample_std=dataSer.std()#样本标准差

计算得平均值为17.17ppm,标准差为2.98ppm

  2)我们知道当样本数量大于30时,符合中心极限定理,抽样分布呈正态分布,样本数量小于30时,抽样分布符合t分布或其他分布。为了知道这是个样本的分布,我们可以使用python中的displot绘图,画出直方图和拟合曲线。
import seaborn as sns
#解决画图中中文乱码,解决负号问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#绘图
sns.distplot(dataSer)
plt.title('数据集分布')
plt.show()

从绘图中可以看出样本数据集近视正态分布,又由于样本数量少于30 ,因此抽样分布符合t分布。自由度df = n-1 = 9

4、确定检验方向:由于备选假设中包含<,则属于左尾假设
二、证据是什么:计算p值
两种方法:
1、手动计算
#样本大小
n=10
#标准误差=样本标准差/n的开方
se=sample_std/np.sqrt(n)
计算se=0.9428149341201592
#总体平均值:政府发布的标准值
pop_mean=20
#t值
t=(sample_mean-pop_mean)/se

得t=-3,即样本均值在总体均值的左侧,距离总体平均值3个标准误差。根据t表格,即可找出p值,这里我们也可以用下面链接中的工具得出p值。

最后得到p值为0.15,但这个工具计算的是双尾检验的p值,根据下图我们可以看出双尾检验的p值为单位检验的2倍,因此这里的p值应为 0.15/2 = 0.075
2、调用python自带方法计算
使用scipy包中的ttest_1samp,计算单独样本t检验。该函数返回的第一个值为t值,第二个值为双尾检验的p值。
from scipy import stats
import pandas as pd
dataSer=pd.Series([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9])
pop_mean=20
t,p_twoTail=stats.ttest_1samp(dataSer,pop_mean)
p_oneTail = p_twoTail/2
print("t=",t,"p_twoTail=",p_twoTail, "p_oneTail = ", p_oneTail)
t= -3.001649525885985 p_twoTail= 0.014916414248897527 p_oneTail =  0.0074582071244487635

三、判断标准是什么

建立判断标准检验证据是否有效,给定的判断标准即显著水平
α=5%
四、做出结论
当p<=α时,拒绝零假设,接受备选假设
p>α时,接受零假设
由于p=0.00745<0.05,因此拒绝零假设,接受备选假设,即公司引擎排放满足标准。
用python代码来判断如下:
左尾判断条件:t<0 and p < alpha
右尾判断条件:t>0 and p < alpha
alpha = 0.05
if (t<0 and p_oneTail < alpha):
    print("拒绝零假设,有统计显著,也就是汽车引擎排放满足标准")
else:
    print("接受零假设,没有统计显著,也就是汽车引擎排放不满足标准")
拒绝零假设,有统计显著,也就是汽车引擎排放满足标准

 全部代码如下:

"""
环保标准规定汽车的新排放标准:平均值<20ppm,现某汽车公司测试10辆汽车的排放结果如下:
15.6 16.2 22.5 20.5 16.4 19.4 16.6 17.9 12.7 13.9 。
问题:公司引擎排放是否满足新标准。
"""
#1、零假设:公司引擎排放不满足标准,即平均值>=20
 #   备选假设:公司引擎排放满足标准,即平均值<20
#2、判断检验类型:该例子为单样本检验
#3、确定抽样分布
 # 1)用python展示统计描述(平均值、标准差)
import numpy as py
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
dataser=pd.Series([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9])
sample_mean=dataser.mean()#样本平均值
sample_std=dataser.std()#样本标准差
print(sample_mean,sample_std)#结果为17.169999999999998 2.9814426038413018
   # 2)我们知道当样本数量大于30时,符合中心极限定理,抽样分布呈正态分布,样本数量小于30时,抽样分布符合t分布或其他分布。为了知道这是个样本的分布,我们可以使用python中的displot绘图,画出直方图和拟合曲线。
#解决画图中中文乱码,解决负号问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
sns.distplot(dataser)
plt.title('数据集分布')
plt.show()
from scipy import stats
pop_mean=20#题中平均值
t,p_twoTail=stats.ttest_1samp(dataSer,pop_mean)
p_oneTail = p_twoTail/2
print("t=",t,"p_twoTail=",p_twoTail, "p_oneTail = ", p_oneTail)
#t= -3.001649525885985 p_twoTail= 0.014916414248897527 p_oneTail =  0.0074582071244487635

#由于p=0.00745<0.05,因此拒绝零假设,接受备选假设,即公司引擎排放满足标准。

 

posted @ 2018-09-11 21:20  秋雨秋雨秋雨  阅读(8173)  评论(0编辑  收藏  举报