• python实现假设检验-t检验


    一. 什么是t检验

    设总体 X ∼ N ( μ , δ 2 ) X\sim N(\mu,\delta^2) XN(μ,δ2),其中 μ , δ 2 \mu, \delta^2 μ,δ2未知,统计量 t = X ‾ − μ S / n t = \frac{\overline{X} - \mu}{S/\sqrt{n}} t=S/n Xμ服从标准正太分布,可以利用该统计量对总体均值 μ \mu μ进行假设检验,这种检验方法称为 t t t检验法。

    适用条件:总体服从正态分布且方差未知;样本容量较小,一般小于30。

    二. 常见t检验的实现
    1. 单样本t检验
    原假设 H 0 H_0 H0备则假设 H 1 H_1 H1拒绝域
    μ ≤ μ 0 \mu \leq \mu_0 μμ0 μ > μ 0 \mu > \mu_0 μ>μ0 t > t α ( n − 1 ) t > t_\alpha(n - 1) t>tα(n1)
    μ ≥ μ 0 \mu \geq \mu_0 μμ0 μ < μ 0 \mu < \mu_0 μ<μ0 t < − t α ( n − 1 ) t < -t_\alpha(n - 1) t<tα(n1)
    μ = μ 0 \mu = \mu_0 μ=μ0 μ ≠ μ 0 \mu \neq \mu_0 μ=μ0 ∣ t ∣ > t α / 2 ( n − 1 ) |t| > t_{\alpha/2}(n - 1) t>tα/2(n1)

    某元件的寿命 X X X服从参数为 N ( μ , δ 2 ) N(\mu, \delta^2) N(μ,δ2)的正太分布, μ , δ \mu,\delta μ,δ未知,现抽取10个元件测得元件的寿命的平均值为240小时,标准差为50,问是否有理由认为元件总体的平均寿命大于225小时?

    因为总体的方差 δ \delta δ未知,且样本量小于10,因此需要使用 t t t检验,设置信水平 α = 0.05 \alpha = 0.05 α=0.05
    H 0 : u ≥ 225   H 1 : u < 225 H_0: u \geq 225\space H_1: u < 225 H0:u225 H1:u<225

    代码实现:

    from scipy.stats import t
    import math
    
    if __name__ == '__main__':
        n = 10
        sample_mean = 240
        sample_std = 50
        alpha = 0.05
    
        t_statistic = (sample_mean - 225) / (sample_std / math.sqrt(n))
        t_left = t(n - 1).ppf(alpha)
        print("t_left:", round(t_left, 3), "t_statistic:", round(t_statistic, 3))
    
        pval = t(n - 1).cdf(t_statistic)
        if t_statistic < t_left:
            print("reject null hypothesis, pval is", round(pval, 3))
        else:
            print("not reject null hypothesis, pval is", round(pval, 3))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    运行结果:

    t_left: -1.833 t_statistic: 0.949
    not reject null hypothesis, pval is 0.816
    
    • 1
    • 2
    2. 配对t检验

    配对t检验一般用于比较同一研究对象处理前与处理后的效果比较,又称为重复测量设计下均值差异的检验。比如医学上药物效果的检验。

    原假设 H 0 H_0 H0备则假设 H 1 H_1 H1拒绝域
    μ D ≤ 0 \mu_D \leq 0 μD0 μ D > 0 \mu_D > 0 μD>0 t > t α ( n − 1 ) t > t_\alpha(n - 1) t>tα(n1)
    μ D ≥ 0 \mu_D \geq 0 μD0 μ D < 0 \mu_D < 0 μD<0 t < − t α ( n − 1 ) t < -t_\alpha(n - 1) t<tα(n1)
    μ D = 0 \mu_D = 0 μD=0 μ D ≠ 0 \mu_D \neq 0 μD=0 ∣ t ∣ > t α / 2 ( n − 1 ) |t| > t_{\alpha/2}(n - 1) t>tα/2(n1)

    某研究者为了研究新型降压药的效果,现收集了8名高血压患者服药前和服药后的血压数据。

    高血压患者12345678
    服药前137135132151132150142145
    服药后124129135144123142142134
    差值136-3798011

    现在想知道该药物对高血压患者是否有明显效果?

    要想验证药物是否有效,只需要验证服药前与服药后差异值的均值与0的关系,如果差值小于等于0则说明药物对高血压没有效果,反之则证明有效。设置信水平 α = 0.05 \alpha = 0.05 α=0.05
    μ D : u ≤ 0   H 1 : μ D > 0 \mu_D: u \leq 0\space H_1: \mu_D > 0 μD:u0 H1:μD>0

    代码实现:

    from scipy.stats import t
    import math
    import numpy as np
    
    if __name__ == '__main__':
    
        diff = [13, 6, -3, 7, 9, 8, 0, 11]
        diff_mean = np.mean(diff)
        diff_std = np.std(diff, ddof=1)
        diff_length = len(diff)
        alpha = 0.05
    
        t_statistic = diff_mean / (diff_std / math.sqrt(diff_length))
        t_right = t(diff_length - 1).ppf(1 - alpha)
        print("t_right:", round(t_right, 3))
        print("t_statistic:", round(t_statistic, 3))
    
        pval = t(diff_length - 1).sf(t_statistic)
        if t_statistic > t_right:
            print("reject null hypothesis, pval is", round(pval, 3))
        else:
            print("not reject null hypothesis, pval is", round(pval, 3))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    运行结果:

    t_right: 1.895
    t_statistic: 3.341
    reject null hypothesis, pval is 0.006
    
    • 1
    • 2
    • 3

    拒绝原假设,因此说明该药物对降压有明显效果。

    3. 两样本t检验

    X 1 , X 2 . . . X n 1 X_1,X_2...X_{n1} X1,X2...Xn1是来自正太总体 N ( μ 1 , δ 1 2 ) N(\mu_1, \delta_1^2) N(μ1,δ12)的样本, Y 1 , Y 2 . . . Y n 2 Y_1,Y_2...Y_{n2} Y1,Y2...Yn2是来自正太总体 N ( μ 2 , δ 2 2 ) N(\mu_2, \delta_2^2) N(μ2,δ22)的样本,且两样本独立, μ 1 , μ 2 , δ 1 2 , δ 2 2 \mu_1,\mu_2,\delta_1^2,\delta_2^2 μ1,μ2,δ12,δ22均未知。统计量 ( X ‾ − Y ‾ ) − δ S w 1 n 1 + 1 n 2 \frac{(\overline{X} - \overline{Y}) - \delta}{S_w\sqrt{\frac{1}{n_1} + \frac{1}{n_2}}} Swn11+n21 (XY)δ服从 t ( n 1 + n 2 − 2 ) t(n_1 + n_2 - 2) t(n1+n22)的分布。

    其中 X ‾ , Y ‾ \overline{X},\overline{Y} X,Y分别为两样本的均值, n 1 , n 2 n_1,n_2 n1,n2为两样本的容量, δ = μ 1 − μ 2 \delta = \mu_1 - \mu_2 δ=μ1μ2, S w 2 = ( n 1 − 1 ) S 1 2 + ( n 2 − 1 ) S 2 2 n 1 + n 2 − 2 S_w^2=\frac{(n_1 - 1)S_1^2 + (n_2 - 1)S_2^2}{n_1 + n_2 - 2} Sw2=n1+n22(n11)S12+(n21)S22, S w = S w 2 S_w = \sqrt{S_w^2} Sw=Sw2

    两样本t检验主要用来对两个总体的均值之间的关系做假设检验。

    原假设 H 0 H_0 H0备则假设 H 1 H_1 H1拒绝域
    μ 1 − μ 2 ≤ δ \mu_1 - \mu_2 \leq \delta μ1μ2δ μ 1 − μ 2 > δ \mu_1 - \mu_2 > \delta μ1μ2>δ t > t α ( n 1 + n 2 − 2 ) t > t_\alpha(n_1 + n_2- 2) t>tα(n1+n22)
    μ 1 − μ 2 ≥ δ \mu_1 - \mu_2\geq \delta μ1μ2δ μ 1 − μ 2 < δ \mu_1 - \mu_2 < \delta μ1μ2<δ t < t α ( n 1 + n 2 − 2 ) t < t_\alpha(n_1 + n_2- 2) t<tα(n1+n22)
    μ 1 − μ 2 = δ \mu_1 - \mu_2 = \delta μ1μ2=δ μ 1 − μ 2 ≠ δ \mu_1 - \mu_2 \neq \delta μ1μ2=δ ∣ t ∣ > t α / 2 ( n 1 + n 2 − 2 ) |t| > t_{\alpha/2}(n_1 + n_2- 2) t>tα/2(n1+n22)

    一家香水的制造商共有两条生产线,现在对两条生产线进行抽样,A生产线抽取18个样本,样本均值为80,样本标准差为5,B生产线抽取20个样本,样本均值为76,样本标准差为4。问这两条生产线所生产的香水的平均分量是否相同?

    α = 0.05 \alpha = 0.05 α=0.05的水平下做出如下假设:
    H 0 : μ A − μ B = 0    H 1 : μ A − μ B ≠ 0 H_0:\mu_A - \mu_B = 0\space\space H_1:\mu_A - \mu_B \neq 0 H0:μAμB=0  H1:μAμB=0

    代码实现:

    from scipy.stats import t
    import math
    
    if __name__ == '__main__':
    
        n1 = 18
        n2 = 20
        sample_mean1 = 80
        sample_mean2 = 76
        sample_std1 = 5
        sample_std2 = 4
        alpha = 0.05
    
        sw = math.sqrt(((n1 - 1) * sample_std1**2 + (n2 - 1) * sample_std2**2) / (n1 + n2 - 2))
        t_statistic = (sample_mean1 - sample_mean2) / (sw * math.sqrt(1 / n1 + 1/ n2))
        t_left = t(n1 + n2 - 2).ppf(alpha/2)
        t_right = t(n1 + n2 - 2).ppf(1 - alpha/2)
        print("t_left:", round(t_left, 3), "t_right:", round(t_right, 3))
        print("t_statistic:", round(t_statistic, 3))
    
        if t_statistic >= t_right:
            pval = t(n1 + n2 -2).sf(t_statistic) * 2
        else:
            pval = 2 * t(n1 + n2 - 2)
    
        if t_statistic < t_left or t_statistic > t_right:
            print("reject null hypothesis, pval is", round(pval, 3))
        else:
            print("not reject null hypothesis, pval is", round(pval, 3))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    运行结果:

    t_left: -2.028 t_right: 2.028
    t_statistic: 2.736
    reject null hypothesis, pval is 0.01
    
    • 1
    • 2
    • 3
  • 相关阅读:
    C++ 不同继承之间的的关系
    进程环境变量
    某市住房公积金管理中心领导莅临创邻科技考察指导
    Spring整合Junit单元测试
    使用Nginx搭建流媒体
    R语言使用dt函数生成t分布密度函数数据、使用plot函数可视化t分布密度函数数据(t Distribution)
    Vue2 01 前端核心分析、HelloVue
    HTML5 介绍
    [框架设计之道(二)]设备、任务设置及业务流程
    vue cli 打包、生产环境http-proxy-middleware代理
  • 原文地址:https://blog.csdn.net/cl2010abc/article/details/137116974