一. 什么是z检验
当总体服从正太分布 N ( μ , δ 2 ) N(\mu, \delta^2) N(μ,δ2)时,统计量 z = X ‾ − μ δ / n z = \frac{\overline{X} - \mu}{\delta/\sqrt{n}} z=δ/nX−μ服从标准正太分布,因此可以利用该统计量对样本均值 X ‾ \overline{X} X进行假设检验。这种检验方法称为 z z z检验法。
适用条件:
- 总体服从正态分布且方差已知,此时统计量 z = X ‾ − μ δ / n z = \frac{\overline{X} - \mu}{\delta/\sqrt{n}} z=δ/nX−μ
- 总体的方差未知,但样本量足够大,一般样本容量 n n n需要大于30,此时统计量 z = X ‾ − μ S / n z = \frac{\overline{X} - \mu}{S/\sqrt{n}} z=S/nX−μ
δ \delta δ为总体标准差, S S S为样本标准差, μ \mu μ为总体均值, X ‾ \overline{X} X为样本均值。
二. 常见z检验的实现
1. 单样本双边检验
原假设 H 0 H_0 H0 | 备则假设 H 1 H_1 H1 | 拒绝域 |
---|---|---|
μ = μ 0 \mu = \mu_0 μ=μ0 | μ ≠ μ 0 \mu \neq \mu_0 μ=μ0 | ∣ z ∣ > z α / 2 |z| > z_{\alpha/2} ∣z∣>zα/2 |
假设某车间用一台包装机包装葡萄糖。已知每袋糖的净重是一个随机变量,且服从标准差为 0.015 kg 的正态分布。某日随机抽取它所包装的9袋糖,称得净重为(kg):
0.497
,
0.506
,
0.518
,
0.524
,
0.498
,
0.511
,
0.520
,
0.515
,
0.512
0.497,0.506,0.518,0.524,0.498,0.511,0.520,0.515,0.512
0.497,0.506,0.518,0.524,0.498,0.511,0.520,0.515,0.512 问每袋糖的净重的均值
μ
\mu
μ是不是0.5kg?
原假设:
H
0
:
μ
=
0.5
k
g
H_0: \mu = 0.5kg
H0:μ=0.5kg
备则假设:
H
1
:
μ
≠
0.5
k
g
H_1: \mu \neq 0.5kg
H1:μ=0.5kg
从备则假设的形式可以得知总体的实际均值可能大于0.5kg,也可能小于0.5kg,因此它是一个双边检验,置信水平 α \alpha α = 0.05。
代码实现:
import math
import numpy as np
from scipy.stats import norm
if __name__ == '__main__':
# 总体标准差
std = 0.015
# 置信水平
alpha = 0.05
sample = [0.497,0.506,0.518,0.524,0.498,0.511,0.520,0.515,0.512]
# 样本均值
sample_mean = np.mean(sample)
# 统计量
z_statistics = (sample_mean - 0.5) / (std / math.sqrt(len(sample)))
z_left_value = norm(loc=0, scale=1).ppf(alpha / 2)
z_right_value = norm(loc=0, scale=1).ppf(1 - alpha / 2)
print("z_statistics: ", round(z_statistics, 2))
print("z_left_value: ", round(z_left_value, 2), ", z_right_value: ", round(z_right_value, 2))
# 计算p值
pval = norm(loc=0, scale=1).sf(abs(z_statistics)) * 2
if z_statistics > z_right_value or z_statistics < z_left_value:
print("reject null hypothesis, p value is: ", round(pval, 2))
else:
print("not reject null hypothesis, p value is: ", round(pval, 2))
运行结果:
z_statistics: 2.24
z_left_value: -1.96 , z_right_value: 1.96
reject null hypothesis, p value is: 0.02
2. 单样本单边检验
原假设 H 0 H_0 H0 | 备则假设 H 1 H_1 H1 | 拒绝域 |
---|---|---|
μ ≤ μ 0 \mu \leq \mu_0 μ≤μ0 | μ > μ 0 \mu > \mu_0 μ>μ0 | z > z α z > z_{\alpha} z>zα |
μ ≥ μ 0 \mu \geq \mu_0 μ≥μ0 | μ < μ 0 \mu < \mu_0 μ<μ0 | z < − z α z < -z_{\alpha} z<−zα |
还是以上面葡萄糖净重的例子,修改原假设和备则假设 H 0 : μ ≤ 0.5 k g H 1 : μ > 0.5 k g H_0: \mu \leq 0.5 kg \space\space H_1: \mu > 0.5kg H0:μ≤0.5kg H1:μ>0.5kg,此时该假设检验就变成了右侧检验。置信水平 α = 0.05 \alpha = 0.05 α=0.05。
代码实现:
import math
import numpy as np
from scipy.stats import norm
if __name__ == '__main__':
# 总体标准差
std = 0.015
# 置信水平
alpha = 0.05
sample = [0.497,0.506,0.518,0.524,0.498,0.511,0.520,0.515,0.512]
# 样本均值
sample_mean = np.mean(sample)
# 统计量
z_statistics = (sample_mean - 0.5) / (std / math.sqrt(len(sample)))
z_right_value = norm(loc=0, scale=1).ppf(1 - alpha)
print("z_statistics: ", round(z_statistics, 2))
print("z_right_value: ", round(z_right_value, 2))
# 计算p值
pval = norm(loc=0, scale=1).sf(abs(z_statistics))
if z_statistics > z_right_value:
print("reject null hypothesis, p value is: ", round(pval, 2))
else:
print("not reject null hypothesis, p value is: ", round(pval, 2))
运行结果:
z_statistics: 2.24
z_right_value: 1.64
reject null hypothesis, p value is: 0.01
3. 两样本z检验
设随机变量 X X X, Y Y Y分别服从参数为 ( μ 1 , δ 1 2 ) (\mu_1, \delta_1^2) (μ1,δ12), ( μ 2 , δ 2 2 ) (\mu_2,\delta_2^2) (μ2,δ22)的正太分布, X 1 , X 2 . . . X n 1 X_1,X_2...X_{n1} X1,X2...Xn1和 Y 1 , Y 2 . . . Y n 2 Y_1,Y_2...Y_{n2} Y1,Y2...Yn2分别为来自 X , Y X,Y X,Y的随机序列,则统计量 Z = ( X ‾ − Y ‾ ) − δ δ 1 2 n 1 + δ 2 2 n 2 Z=\frac{(\overline{X} - \overline{Y}) - \delta}{\sqrt{\frac{\delta_1^2}{n_1} + \frac{\delta_2^2}{n2}}} Z=n1δ12+n2δ22(X−Y)−δ服从标准正太分布,一般可以利用该统计量对两个总体均值之间的关系进行假设检验。
其中 X ‾ \overline{X} X, Y ‾ \overline{Y} Y分别为两样本的均值, δ = μ 1 − μ 2 \delta = \mu_1-\mu_2 δ=μ1−μ2 , n 1 n_1 n1, n 2 n_2 n2分别为两样本的容量。
原假设 H 0 H_0 H0 | 备则假设 H 1 H_1 H1 | 拒绝域 |
---|---|---|
μ 1 − μ 2 = δ \mu_1 - \mu_2 = \delta μ1−μ2=δ | μ 1 − μ 2 ≠ δ \mu_1 - \mu_2 \neq \delta μ1−μ2=δ | ∣ z ∣ > z α / 2 |z| > z_{\alpha/2} ∣z∣>zα/2 |
μ 1 − μ 2 ≤ δ \mu_1 - \mu_2 \leq \delta μ1−μ2≤δ | μ 1 − μ 2 > δ \mu_1 - \mu_2 > \delta μ1−μ2>δ | z > z α z > z_{\alpha} z>zα |
μ 1 − μ 2 ≥ δ \mu_1 - \mu_2 \geq \delta μ1−μ2≥δ | μ 1 − μ 2 < δ \mu_1 - \mu_2 < \delta μ1−μ2<δ | z < − z α z < -z_{\alpha} z<−zα |
假设某个学校学生的数学成绩服从正太分布,女生标准差为10,男生标准差是20。现采用随机的方法收集20名女生和20名男生的某次数学考试成绩,经过统计发现女生的平均分是70,男生的平均分为70。现在想知道该学校数学学科女生的平均分是否比男生的平均分高10分?
原假设:
H
0
:
μ
1
−
μ
2
≥
10
H_0: \mu_1 - \mu_2 \geq 10
H0:μ1−μ2≥10
备则假设:
H
0
:
μ
1
−
μ
2
<
10
H_0: \mu_1 - \mu_2 < 10
H0:μ1−μ2<10
代码实现:
import math
from scipy.stats import norm
if __name__ == '__main__':
# 女生与男生样本的均值
sample_mean1, sample_mean2 = 70,70
# 两样本容量
n1, n2 = 20, 20
# 女生与男生总体的标准差
std1, std2 = 10, 20
var1, var2 = std1**2, std2**2
# 置信度
alpha = 0.05
# 计算z统计量和拒绝域临界值
z_statistics = ((sample_mean1 - sample_mean2) - 10) / math.sqrt(var1 / n1 + var2 / n2)
z_left = norm(loc=0, scale=1).ppf(alpha)
print("z_statistics: ", round(z_statistics, 2), "z_left: ", round(z_left, 2))
pval = norm(loc=0, scale=1).cdf(z_statistics)
if z_statistics < z_left:
print("reject null hypothesis, p value is: ", round(pval, 2))
else:
print("not reject null hypothesis, p value is: ", round(pval, 2))
运行结果:
z_statistics: -2.0 z_left: -1.64
reject null hypothesis, p value is: 0.02