python实现假设检验-z检验

一. 什么是z检验

当总体服从正太分布 N ( μ , δ 2 ) N(\mu, \delta^2) N(μ,δ2)时,统计量 z = X ‾ − μ δ / n z = \frac{\overline{X} - \mu}{\delta/\sqrt{n}} z=δ/n Xμ服从标准正太分布,因此可以利用该统计量对样本均值 X ‾ \overline{X} X进行假设检验。这种检验方法称为 z z z检验法。

适用条件:

  1. 总体服从正态分布且方差已知,此时统计量 z = X ‾ − μ δ / n z = \frac{\overline{X} - \mu}{\delta/\sqrt{n}} z=δ/n Xμ
  2. 总体的方差未知,但样本量足够大,一般样本容量 n n n需要大于30,此时统计量 z = X ‾ − μ S / n z = \frac{\overline{X} - \mu}{S/\sqrt{n}} z=S/n Xμ

δ \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.4970.5060.5180.5240.4980.5110.5200.5150.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 (XY)δ服从标准正太分布,一般可以利用该统计量对两个总体均值之间的关系进行假设检验。

其中 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μ210
备则假设 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
  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值