Python | KS检验以及其余非参数检验的实现
1 什么是KS检验
定义:检验一个分布f(x)与理论分布g(x)【比如正态分布】是否一致,或两个观测值分布是否有显著差异的检验方法
- 优点:本质上是一种非参数检验方法,无需对数据进行分布假定,尤其是小样本量时经常使用
- 缺点:但代价是当检验的数据分布符合特定的分布时,KS检验的灵敏度没有对应的检验(比如t检验)来的高。
2 KS检验分类?
根据定义,KS检验可以分为两大类:
- 第一种:检验指定数列是否服从特定分布(比如正态分布)
- 第二种:检验指定两个数列是否服从相同分布
对应的原假设和备择假设分别为:
第一种:
H0:指定数列服从特定分布
H1:指定数列不服从特定分布
第二种:
H0:两个数列分布一致
H1:两个数列分布不一致
检验统计量:
D = max|f(x)-g(x)|
当实际检验统计量D>D(n,α) 则拒绝原假设,否则不拒绝;或者使用P值进行判断
3 KS检验的Python实现
3.1 检验指定的数列是否服从正态分布
from scipy.stats import kstest
import numpy as np
x = np.random.normal(0,1,1000)
test_stat = kstest(x, 'norm')
test_stat
KstestResult(statistic=0.03366055793439415, pvalue=0.2026106842514801)
P值大于显著性水平,不拒绝原假设,说明指定数列服从正态分布
from scipy.stats import kstest
import numpy as np
x = np.random.binomial(0,1,1000)
test_stat = kstest(x, 'norm')
test_stat
KstestResult(statistic=0.5, pvalue=1.064517291557782e-231)
P值小于显著性水平,拒绝原假设,说明指定数列不服从正态分布
3.2 检验指定的两个数列是否服从相同分布
from scipy.stats import ks_2samp
beta=np.random.beta(7,5,1000)
norm=np.random.normal(0,1,1000)
ks_2samp(beta,norm)
KstestResult(statistic=0.573, pvalue=5.500890404235437e-152)
P值小于显著性水平,拒绝原假设,说明两个数列分布不一致
from scipy.stats import ks_2samp
beta=np.random.beta(7,5,1000)
norm=np.random.beta(7,5,1000)
ks_2samp(beta,norm)
KstestResult(statistic=0.048, pvalue=0.19957365535779528)
P值大于显著性水平,不拒绝原假设,说明两个数列分布一致
4 其余的非参数检验
4.1 Wilcoxon符号秩检验(t检验的非参数版本)
from scipy import stats
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
stats.wilcoxon(x,y)
WilcoxonResult(statistic=0.0, pvalue=0.0625)
P值大于显著性水平,不拒绝原假设,说明两个数列在当前显著性水平下中位数一致
from scipy import stats
x = [1.26, 0.34, 0.70, 1.75, 50.57, 1.55, 0.08, 0.42, 0.50, 3.20, 0.15, 0.49, 0.95, 0.24, 1.37, 0.17, 6.98, 0.10, 0.94, 0.38]
y = [2.37, 2.16, 14.82, 1.73, 41.04, 0.23, 1.32, 2.91, 39.41, 0.11, 27.44, 4.51, 0.51, 4.50, 0.18, 14.68, 4.66, 1.30, 2.06, 1.19]
stats.wilcoxon(x,y)
WilcoxonResult(statistic=58.0, pvalue=0.082550048828125)
stats.ttest_ind(x, y)
Ttest_indResult(statistic=-1.2494667131530823, pvalue=0.2191358879608406)
t检验和W检验都不拒绝原假设,认为两总体均值和中位数相等
4.2 Kruskal-Wallis H检验(方差分析的非参数版本)
from scipy import stats
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
stats.kruskal(x, y)
KruskalResult(statistic=0.2727272727272734, pvalue=0.6015081344405895)
P值大于显著性水平,不拒绝原假设,说明两组数列在当前显著性水平下中位数一致
4.3 Mann-Whitney秩检验
from scipy import stats
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
stats.mannwhitneyu(x, y)
MannwhitneyuResult(statistic=10.0, pvalue=0.33805165701157347)
P值大于显著性水平,不拒绝原假设,说明两组数列在当前显著性水平下中位数一致
5 参考
- https://www.cnblogs.com/arkenstone/p/5496761.html
- https://blog.csdn.net/ljzology/article/details/80407704
- https://www.cnblogs.com/chaosimple/p/4090456.html
- https://blog.csdn.net/github_38486975/article/details/88985748