python scipy.stats计算单样本假设检验(1 sample test)

2020-08-13 09:58:51 浏览数 (2)

单样本检验:检验单个变量的均值与目标值之间是否存在差异,如果总体均值已知,样本均值与总体均值之间差异的显著性检验属于单样本假设检验。

例如:火箭班学生2019年高考成绩698分,2020年的每个人成已知[*,*,*,*,...........],求2020年的成绩和2019年的高考成绩是否有显著差别。

例如:客户要求工件加工长度小于170mm,现加工一批工件,测出其长度分别为[165.6,166.2,168.5,170.5,168.4,169.4,168.6,167.9,162.7,173.9],求这批工件的均值是否符合客户要求。

代码语言:javascript复制
#本节内容学习用python统计包scipy自动计算假设检验:
'''
单(lsamp)样本检验(ttest_1samp)
'''import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']   # 雅黑字体
plt.rcParams['axes.unicode_minus']=False
'''
ttest_1samp:单样本检验:总体方差未知。
返回的第一个值t是假设检验计算出的t值
第二个值是p是双尾检验p值。因为scipcy计算出的是双尾检验的t值和p值,如果要求左尾检验,
根据对称性,双尾检验的的p值对应单尾的2倍。'''
#样本数据集。要求车床加工长度小于170
dataSer=pd.Series([165.6,166.2,168.5,170.5,168.4,169.4,168.6,167.9,162.7,173.9])
#总体平均值
pop_mean=170


#H0原假设:加工等于170;H1备选假设:不等于170;
t,p_twotail=stats.ttest_1samp(dataSer,pop_mean)
print('t值=',t,'双尾检验的p值=',p_twotail)
'''
双尾检验:p>判断标准alpha
'''
#单尾检验p值
p_onetail=p_twotail/2
print('单尾检验p值=',p_onetail)

#判断标准通常是使用显著水平alpha=5%
alpha=0.05
#做出结论
'''
左尾判断条件:t<0 and p<判断标准alpha
右尾判断条件:t>0 and p<判断标准alpha
'''
if t<0 and p_onetail<alpha:
    print('拒绝零假设,有统计显著,加工长度小于170cm,满足标准')
else:
    print('接受零假设,没有显著水平,加工长度大于等于170cm,不满足标准')

#置信区间
#平均值的置信区间,95% CI=(a,b)
#在报告置信区间时,提供这样几个信息:1)哪种类型的置信区间:单样本中的单个平均值置信区间.但我们在后面要讲到的相关样本检验是平均
#值间差异的置信区间。 2)置信水平和区间上下限。置信水平=CI(a,b)
'''
1)置信区间水平对应的t值(t_ci)
查t表格可以得到,95%的置信水平,自由度n-1对应的t值2)计算上下限
置信区间上限a=样本平均值-t_ci*标准误差
置信区间下限b=样本平均值-t_ci*标准误差'''
'''
查找t表格获取95%的置信区间,自由度df=n-1对应的t值'''
t_ci=2.262
#使用scipy计算标准误差
se=stats.sem(dataSer)
#置信区间上下限
mean=dataSer.mean()
print('平均值为:',mean)
a=mean-t_ci*se #上限
b=mean t_ci*se #下限
print('单个平均值的置信区间,95置信水平 Confidence_Interval=(%f,%f)'%(a,b))
#做完一个假设检验之后,如果结果具有统计显著性,那么还需要继续计算其效应量:假设检验如果是显著的,那么有必要报告自变量效应量大小。
#效应量判断:结果取绝对值:0.20 小的效应,0.50中等效应,0.80高的效应
#如果结果不具有统计显著性,并且还需要继续进行决策的话,那么需要计算功效。
#效应量(effect size):样本间差异或相关程度的量化指标.
#度量效应量分类:差异度量、相关度量
#差异度量cohen's d =(样本平均值1-样本平均值2)/标准差  样本平均值与总体平均值相差多少
#相关度度量r^2=t^2/(t^2 df)
#效应量:差异指标Cohen's d
std=dataSer.std()
d=(mean-pop_mean)/std
#相关度指标
#样本大小
n=10
#自由度
df=n-1
r2=(t*t)/(t*t df)
print('d=',d)
print('r^2=',r2)

程序运行结果为:

代码语言:javascript复制
t值= -1.933 双尾检验的p值= 0.0851
单尾检验p值= 0.04258
拒绝零假设,有统计显著,加工长度小于170cm,满足标准
平均值为:168.17000
单个平均值的置信区间,95置信水平 Confidence_Interval=(166.029370,170.310630)
d= -0.6115
r^2= 0.29353

0 人点赞