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
  • 21
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值