糖厂用自动打包机打包,每包标准重量是100千克。每天开工后需要检验一次打包机工作是否正常。某日开工后测得9包重量(单位:千克)如下:
99.3 98.7 100.5 101.2 98.3 99.7 99.5 102.1 100.5
已知包重服从正态分布,试检验该日打包机工作是否正常(a=0.05)?
用这题演示python实现双边检验的几种方法
import numpy as np
from math import *
array = [99.3,98.7,100.5,101.2,98.3,99.7,99.5,102.1,100.5]
#需要对比样本与统计总体的平均值
T_mean=100
x_mean=np.mean(array)
x_std=np.std(array,ddof=1)
样本量较小,总体标准差未知,因此使用t检验量
t=abs(x_mean-T_mean)/(x_std/sqrt(len(array)))
这里检验统计量t值计算如下
t = (样本均值 - 总体均值)/(样本标准差/sqrt(样本个数))【小样本且总体标准差未知的情况下】
print("x_mean:{:.5} ,x_std:{:.5} ,t:{:.5}".format(x_mean,x_std,t))
这里我得出的结果是
x_mean:99.978 ,x_std:1.2122 ,t:0.054996
接下来可以选择
计算出标准t值进行比较
计算出p值
直接人工查表标准t
计算标准t值
计算临界值:
scipy.stats.t.ppf(level_of_confidence, degree_of_freedom)
计算p值
计算p值:
scipy.stats.t.sf(abs(t_score),df) 或scipy.stats.t.cdf(abs(t_score),df)
左尾或右尾的检验分别用上述的sf和cdf方法,双尾检验需需要适时乘个2(如果t大于0那么就是2t.cdf(abs(t_score),df),如果是t小于零就得2t.sf(t_score,df)
除了使用scipy的stats模块,还可以使用matplotlib.pyplot模块(相当于是用原理计算了
import matplotlib.pyplot as plt
s2 = np.random.standard_t(10, size=100000)
h = plt.hist(s, bins=100, density=True)
(np.sum(s2>abs(t))+np.sum(s2
#算出的p值等于方法二用函数算出的p值相同
>p: 0.95745#因为这里调用了random库,所以这里p值算出来不是固定的,会随着数组内容的随机变化而变化
综合1、2就可以有如下代码
print("critical t value:{}\np_value(calculated by function):{}".format(stats.t.ppf(0.95,9),2*stats.t.cdf(t,df=len(array)-1)))
>critical t value:1.8331129326536335
p_value(calculated by function):0.9574902045208937
人工查表
t分布临界值表如下:axis=0 level of freedom; axis =1 df
或者可以使用在线查表工具,查看各种分布的临界值表
value calculator 临界值查表工具 t检验临界值表
参考以及延伸阅读推荐:
最后可以用这篇里的示例训练一下:假设检验的Python实现
原文链接:https://blog.csdn.net/weixin_44115606/article/details/108887962