一. 什么是t检验
设总体 X ∼ N ( μ , δ 2 ) X\sim N(\mu,\delta^2) X∼N(μ,δ2),其中 μ , δ 2 \mu, \delta^2 μ,δ2未知,统计量 t = X ‾ − μ S / n t = \frac{\overline{X} - \mu}{S/\sqrt{n}} t=S/nX−μ服从标准正太分布,可以利用该统计量对总体均值 μ \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α(n−1) |
μ ≥ μ 0 \mu \geq \mu_0 μ≥μ0 | μ < μ 0 \mu < \mu_0 μ<μ0 | t < − t α ( n − 1 ) t < -t_\alpha(n - 1) t<−tα(n−1) |
μ = μ 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(n−1) |
某元件的寿命 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:u≥225 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))
运行结果:
t_left: -1.833 t_statistic: 0.949
not reject null hypothesis, pval is 0.816
2. 配对t检验
配对t检验一般用于比较同一研究对象处理前与处理后的效果比较,又称为重复测量设计下均值差异的检验。比如医学上药物效果的检验。
原假设 H 0 H_0 H0 | 备则假设 H 1 H_1 H1 | 拒绝域 |
---|---|---|
μ D ≤ 0 \mu_D \leq 0 μD≤0 | μ D > 0 \mu_D > 0 μD>0 | t > t α ( n − 1 ) t > t_\alpha(n - 1) t>tα(n−1) |
μ D ≥ 0 \mu_D \geq 0 μD≥0 | μ D < 0 \mu_D < 0 μD<0 | t < − t α ( n − 1 ) t < -t_\alpha(n - 1) t<−tα(n−1) |
μ 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(n−1) |
某研究者为了研究新型降压药的效果,现收集了8名高血压患者服药前和服药后的血压数据。
高血压患者 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
服药前 | 137 | 135 | 132 | 151 | 132 | 150 | 142 | 145 |
服药后 | 124 | 129 | 135 | 144 | 123 | 142 | 142 | 134 |
差值 | 13 | 6 | -3 | 7 | 9 | 8 | 0 | 11 |
现在想知道该药物对高血压患者是否有明显效果?
要想验证药物是否有效,只需要验证服药前与服药后差异值的均值与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:u≤0 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))
运行结果:
t_right: 1.895
t_statistic: 3.341
reject null hypothesis, pval is 0.006
拒绝原假设,因此说明该药物对降压有明显效果。
3. 两样本t检验
设 X 1 ,