当前位置: 代码迷 >> 综合 >> 【统计学】假设检验 z检验t检验 Python实现
  详细解决方案

【统计学】假设检验 z检验t检验 Python实现

热度:53   发布时间:2024-02-24 10:30:25.0

一、快速理解

我开始学习假设检验时遇到了几个问题:

  1. 什么是假设检验?
  2. 为什么要假设检验?

什么是假设:对总体参数(均值,比例等)的具体数值所作的陈述。(因为一般来说总体的属性具体值我们是测不出来的,也只是靠不停的测试逼近具体值,所以只能假设总体的某一个属性的具体值为xxx)而假设检验就是先对总体的参数提出某种假设,然后利用样本的信息判断假设是否成立的过程

样本值是变化的,通过样本值计算出来的样本参数不一定每次都一样,我们不知道测出来的参数与总体参数是样本的随机性还是一些其他的原因导致的(例如测量过程出现错误,或者样本变异了变成不能代表总体的样本)。如果A、B两种产品的尺寸比较接近,我们想了解这种差异是因为一些不可避免的误差(也就是可以接受的差异)还是因为机器出故障了、或者两者就不是同一种尺寸的产品(是你不能接受他们相同的原因,不可接受的差异,也就是具有显著性、统计显著性、具有显著性差异,可以理解两者差异不足够微小,而是太明显、太显著了,以至于不能认为两者是相同的)。

要判断是否具有统计学上的显著性,也就必须借助统计学工具来判断。通常就是用样本参数计算检验统计量(一些参数,比如说t_value,p_value,z_value),判断检验统计量是否符合一定的条件。而用样本参数计算前我们还需要提出相应的假设(因为计算检验统计量就是对比两个参数的区别,在样本参数与总体参数比较时,我们只计算出样本参数,总体参数不知道因此必须假定为某一个值(就是假定为题目给出的值)),判断是否符合条件以后从而得出假设是否成立。

我在假设的建立、理解p值等问题上也遇到了不少困难,后来写了这篇文章梳理了一下,感觉能讲清楚了,欢迎大家看看~ : 假设检验:建立原假设的原则、方法

二、选择检验统计量的方法

检验统计量的确定

三、Python实现办法

  1. 【小样本 总体方差未知】某厂生产的电子元件的寿命X(单位:h)服从正态分布,按标准规定:一批的平均寿命不得小于250h。现从该批中随机抽取16个元件,测得寿命如下:
    159,280,101,212,224,379,179,264,222,362,168,250,149,260,485,170
    是否有理由认为原件的平均寿命显著地大于225小时?

Null hypothesis: array_mean<=225
Alternative hypothesis: array_mean>225

#1
import numpy as np
from scipy.stats import t
from scipy  import stats
from math import *
array = [159,280,101,212,224,379,179,264,222,362,168,250,149,260,485,170]
amean= np.mean(array)
num = len(array)
Tlong = 225
t_std = np.std(array,ddof = 1)
#小样本 总体方差未知 Student t
t_value,p_value=stats.ttest_1samp(array,Tlong)
t_tra =(amean - Tlong)/(t_std1/sqrt(num))
print("critical t_value:{:.5},\tp_value:{:.5},\tt_value_by_function:{:.5},\tt_value_by_formula".format(stats.t.ppf(0.95,15),p_value,t_value),t_tra)
if(abs(t_value)<stats.t.ppf(0.95,15)):print("t_value < critical value:\tno clear evidence to reject the null hypothesis.")
else:print("t_value > critical value:\treject the null hypothesis, we hold evidence to think that these elements' longevity r longer than 225 hours")

结果如下:

>critical t_value:1.7531,	p_value:0.51396,	t_value_by_function:0.66852,	t_value_by_formula 0.11023885084349423
>t_value < critical value:	no clear evidence to reject the null hypothesis.

因此,没有充分的理由拒绝原假设,没有足够的理由能认为原件的平均寿命显著大于225小时

  1. 【大样本 两个总体参数检验】A, B两厂生产同样的材料。已知其抗压强度服从正态分布,且A组方差 =632 ,b组材料方差=572。从A厂生产的材料中随机抽取81个样品,测得a组抗压强度平均值=1070kg/cm2;从B厂生产的材料中随机抽取64个样品,测得b组抗压强度平均值 = 1020kg/cm2。根据以上调查结果,能否认为A,B两厂生产的材料平均抗压强度相同(a=0.05)?

NUll hypothesis: amean == bmean or ab_difference_value ==0
Alternative hypothesis: amean != bmean or ab_diffrence_value != 0

这么建立原假设和备择假设的原因:假设检验是在原假设的基础上计算的,如果原假设不是两者相同我们在计算统计量时就不知道两个组的总体参数,也就无法计算,无法用Z检验

#8.9 大样本 两个总体参数检验 Z检验
#8.9 大样本 两个总体参数检验 Z检验
from math import *
from scipy.stats import norm
amean =1070
bmean =1020
astd_squ = 63
bstd_squ = 57
anum = 81
bnum = 64
z_by_formula = (amean - bmean)/sqrt((pow(astd_squ,2)/anum)+(pow(bstd_squ,2)/bnum))
critical_z = norm.ppf(0.95)
p = 2 * norm.sf(abs(z_by_formula)) 
print("z_value = {:.5}\tcritical_z_value = {:.5}\tp_value = {}".format(z_by_formula,critical_z,p))
if(z_by_formula<critical_z and p>0.05):print("z value < critical value:\tno clear evidence to reject the null hypothesis.")
elif(z_by_formula>critical_z and p<0.05):print("z value > critical value:\treject the null hypothesis, we hold evidence to think that A is different to B")

显示结果如下:

z_value = 5.0059	critical_z_value = 1.6449	p_value = 5.561036869412281e-07
z value > critical value:	reject the null hypothesis, we hold evidence to think that A is different to B

由于p值小于显著性水平且z统计量大于临界值z,所以认为有充分证据说明应当拒绝原假设,并认为A、B组之间抗压强平均水平不同。

通常大样本时可以直接使用statsmodels 包中的 ztest 函数,而不需要手动计算,用ztest函数非常方便。
可以参考这篇文章:用 python 做 z 检验,t 检验