单样本T检验-ttest_1samp

1
2
3
4
5
from scipy import stats
import numpy as np
np.random.seed(7654567)
rvs = stats.norm.rvs(loc=5,scale=10,size=(100,2)) # 均值为5,方差为10
r

检验两列数的均值与1和2的差异是否显著

1
2
3
4
stats.ttest_1samp(rvs, [1, 2])   
# 分别显示两列数的t统计量和p值。
# 由p值分别为0.042和0.018,
# 当p值小于0.05时,认为差异显著,即第一列数的均值不等于1,第二列数的均值不等于2。
Ttest_1sampResult(statistic=array([3.71134343, 2.85084277]), pvalue=array([0.00034072, 0.00530677]))

不拒绝原假设——均值等于5

1
stats.ttest_1samp(rvs, 5.0)
Ttest_1sampResult(statistic=array([-0.01631806, -0.25538594]), pvalue=array([0.98701349, 0.79895486]))

拒绝原假设——均值不等于5

1
stats.ttest_1samp(rvs, 0.0)
Ttest_1sampResult(statistic=array([4.6432588 , 4.92166191]), pvalue=array([1.05510059e-05, 3.42688414e-06]))

第一行数均值等于5,第二行数均值不等于0
axis=0按列运算,axis=1按行运算

1
stats.ttest_1samp(rvs.T,[5.0,0.0],axis=1)
Ttest_1sampResult(statistic=array([-0.01631806,  4.92166191]), pvalue=array([9.87013492e-01, 3.42688414e-06]))

两独立样本t检验-ttest_ind

生成数据

1
2
3
4
np.random.seed(12345678)
#loc:平均值 scale:方差
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)
rvs2 = stats.norm.rvs(loc=5,scale=10,size=500)

当两总体方差相等时,即具有“方差齐性”,可以直接检验
不拒绝原假设——两总体均值相等

1
stats.ttest_ind(rvs1,rvs2)
Ttest_indResult(statistic=0.26833823296238857, pvalue=0.788494433695651)

当不确定两总体方差是否相等时,应先利用levene检验,检验两总体是否具有方差齐性。

1
stats.levene(rvs1, rvs2)
LeveneResult(statistic=0.9775501222315258, pvalue=0.323044034693146)

p值远大于0.05,认为两总体具有方差齐性。

如果两总体不具有方差齐性,需要将equal_val参数设定为“False”。

需注意的情况:

如果两总体具有方差齐性,错将equal_var设为False,p值变大

1
stats.ttest_ind(rvs1,rvs2, equal_var = False)
Ttest_indResult(statistic=0.26833823296238857, pvalue=0.7884945274950106)

两总体方差不等时,若没有将equal_var参数设定为False,则函数会默认equal_var为True,这样会低估p值

1
2
3
rvs3 = stats.norm.rvs(loc=5, scale=20, size=500)
stats.ttest_ind(rvs1, rvs3, equal_var = False)
# 正确的p值
Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.6414964624656874)
1
2
stats.ttest_ind(rvs1, rvs3)
# 被低估的p值
Ttest_indResult(statistic=-0.46580283298287956, pvalue=0.6414582741343561)

当两样本数量不等时,equal_val的变化会导致t统计量变化
rvs1:来自总体——均值5,方差10,样本数500
rvs4:来自总体——均值5,方差20,样本数100
两总体不具有方差齐性,应设定equal_var=False

1
2
3
rvs4 = stats.norm.rvs(loc=5, scale=20, size=100)
stats.ttest_ind(rvs1, rvs4)
# 错误的t统计量
Ttest_indResult(statistic=-0.9988253944278285, pvalue=0.3182832709103878)
1
stats.ttest_ind(rvs1, rvs4, equal_var = False) # 错误的t统计量
Ttest_indResult(statistic=-0.6971257058465435, pvalue=0.4871692772540187)

不同均值,不同方差,不同样本量的t检验
错误的检验:未将equal_var设定为False

1
2
rvs5 = stats.norm.rvs(loc=8, scale=20, size=100)
stats.ttest_ind(rvs1, rvs5)
Ttest_indResult(statistic=-1.467966985449067, pvalue=0.14263895620529113)

正确的检验:

1
stats.ttest_ind(rvs1, rvs5, equal_var = False)
Ttest_indResult(statistic=-0.9436597361713308, pvalue=0.3474417033479409)

配对样本t检验

1
np.random.seed(12345678)

不拒绝原假设,认为rvs1 与 rvs2 所代表的总体均值相等

1
2
3
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)
rvs2 = (stats.norm.rvs(loc=5,scale=10,size=500) + stats.norm.rvs(scale=0.2,size=500))
stats.ttest_rel(rvs1,rvs2)
Ttest_relResult(statistic=0.24101764965300979, pvalue=0.8096404344581155)

拒绝原假设,认为rvs1 与 rvs3所代表的总体均值不相等

1
2
rvs3 = (stats.norm.rvs(loc=8,scale=10,size=500) + stats.norm.rvs(scale=0.2,size=500))
stats.ttest_rel(rvs1,rvs3)
Ttest_relResult(statistic=-3.9995108708727924, pvalue=7.308240219166128e-05)