假设检验(Hypothesis testing),作为统计学的一项重要模块,是用来判断样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。假设检验需要事先对总体参数或分布形式作出某种假设,然后利用样本信息来判断原假设是否成立。一般假设检验分为参数检验和非参数检验,其运用逻辑上的反证法,依据统计上的小概率原理来实现。假设检验分为原假设H0和备择假设H1。
本文将借助Python的Scipy模块,实现目前主流的19种假设检验方法,主要包括:
1.正态分布检验Shapiro-Wilk Test (W检验)
D'Agostino's K2 Test (normal Test)
Anderson-Darling Test
2. 相关性检验Pearson 相关系数
Spearman 等级相关系数
Kendall 等级相关系数
Chi-square Test 卡方检验
3. 参数检验单样本t检验
两样本t检验 (方差齐性使用levene检验)
配对样本t检验
方差分析(Anasis Of Variance, ANOVA)
4. 非参数检验Mann-Whitney U Test (曼惠特尼U检验)
Wilcoxon Signed-Rank Test
Kruskal-Wallis H Test (K-W检验)
Friedman Test (弗里德曼检验)
Kolmogorv-Smirnov Test (K-S检验)
5. 时间序列平稳性检验Augmented Dickey-Fuller Unit Root Test (单位根检验)
Kwiatkowski-Phillips-Schmidt-Shin Test
6. Q-Q图
1 正态分布检验
1.1 Shapiro-Wilk Test (W检验)
Shapiro-Wilk检验,用于检验样本数据是否来自服从正态分布的总体。 在实际应用中,W 检验被认为是一个可靠的正态性检验,但是也有人认为该检验更适用于较小的数据样本(数千个观测值以内)。
使用前提:各样本观察值为独立同分布(iid)的。
原假设H0:样本数据服从正态分布
结果解释:当p值小于某个显著性水平α(如0.05),则认为样本不是来自正态分布的总体,否则承认样本来自正态分布的总体。方法包:from scipy.stats import shapiro
from scipy.stats import shapiro
data = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
stat, p = shapiro(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('不能拒绝原假设,样本数据服从正态分布')
else:
print('不服从正态分布')
# output
stat=0.895, p=0.193
不能拒绝原假设,样本数据服从正态分布
shapiro(np.random.randn(10))
stat, p = shapiro(np.random.randn(10))
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('不能拒绝原假设,样本数据服从正态分布')
else:
print('不服从正态分布')
# output
stat=0.958, p=0.767
不能拒绝原假设,样本数据服从正态分布
1.2 D'Agostino's K2 Test (normal Test)
D'Agostino's K2检验,用于检验样本数据是否来自服从正态分布的总体。是通过计算样本数据的峰度和偏度,来判断其分布是否偏离正态分布。偏度是对数据分布对称性的测度,衡量数据分布是否左偏或右偏。峰度是对数据分布平峰或尖峰程度的测度,它是一种简单而常用的正态性统计检验量。
使用前提:各样本观察值为独立同分布(iid)的。
原假设H0:样本数据服从正态分布。
结果解释:当p值小于某个显著性水平α(如0.05),则认为样本不是来自正态分布的总体,否则承认样本来自正态分布的总体。方法包:from scipy.stats import normaltest
# D'Agostino's K^2 Normality Test
from scipy.stats import normaltest
data = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
stat, p = normaltest(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('不能拒绝原假设,样本数据服从正态分布')
else:
print('不服从正态分布')
# output
stat=3.392, p=0.183
不能拒绝原假设,样本数据服从正态分布
1.3 Anderson-Darling Test
Anderson检验,用于检验样本数据是否服从某一已知分布。该检验修改自一种更复杂的非参数的拟合良好的检验统计(Kolmogorov-Smirnov Test)。SciPy中的anderson()函数实现了Anderson-Darling检验,函数参数为样本数据及要检验的分布名称,默认情况下,为'norm'正态分布,还支持对'expon'指数分布,'logistic'分布,以及'gumbel'耿贝尔分布的检验,它会返回一个包含不同显著性水平下的p值的列表,而不是一个单一的p值,因此这可以更全面地解释结果。
使用前提:各样本观察值为独立同分布的。
原假设H0:样本数据服从某一已知分布。
结果解释:当p值小于某个显著性水平α(如0.05),则认为样本不是来自正态分布的总体,否则承认样本来自正态分布的总体。方法包:from scipy.stats import anderson
# Anderson-Darling Normality Test
from scipy.stats import anderson
data = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
result = anderson(data)
print('stat=%.3f' % (result.statistic)) # 统计量
print("临界值:",result.critical_values) # P值
print("显著性水平:",result.significance_level) # 显著性水平
for i in range(len(result.critical_values)):
sl, cv = result.significance_level[i], result.critical_values[i]
if result.statistic < result.critical_values[i]: #统计量小于临界值
print('显著性水平为%.2f时,P值为%.1f,不能拒绝原假设,样本数据服从正态分布' % (sl/100, cv))
else:
print('显著性水平为%.2f时,P值为%.1f, 拒绝原假设,样本数据不服从正态分布' % (sl/100, cv))
# output
stat=0.424
临界值: [0.501 0.57 0.684 0.798 0.95 ]
显著性水平: [15. 10. 5. 2.5 1. ]
显著性水平为0.15时,P值为0.5,不能拒绝原假设,样本数据服从正态分布
显著性水平为0.10时,P值为0.6,不能拒绝原假设,样本数据服从正态分布
显著性水平为0.05时,P值为0.7,不能拒绝原假设,样本数据服从正态分布
显著性水平为0.03时,P值为0.8,不能拒绝原假设,样本数据服从正态分布
显著性水平为0.01时,P值为0.9,不能拒绝原假设,样本数据服从正态分布
2 相关性检验
2.1 Pearson 相关系数
Pearson相关系数,用