用python进行KS检验

简介

Kolmogorov-Smirnov test(KS检验)是一种重要的非参数检验方法,应用非常广泛,比如之前介绍的数据库CMap,其核心算法就是借鉴KS检验。

KS检验是一种统计检验方法,其通过比较两样本的频率分布、或者一个样本的频率分布与特定理论分布(如正态分布)之间的差异大小来推论两个分布是否来自同一分布。

实现方法:

R 代码:

ks.test(x)
#其中x为“a numeric vector of data values”,也就是数值型向量。

Python 代码:

from scipy import stats
stats.kstest(rvs, cdf, args=(),…)
#其中rvs可以是数组、生成数组的函数或者scipy.stats里面理论分布的名字
#cdf可以与rvs一致。若rvs和cdf同是数组,则是比较两数组的分布是否一致;一个是数组,另一个是理论分布的名字,则是看样本是否否和理论分布
#args是一个元组,当rvs或者cds是理论分布时,这个参数用来存储理论分布的参数,如正态分布的mean和std。

遇到的问题:

在实际问题中,有一组大小一万的数组,长这样:

test=[4949.58940397, 4712.41059603, 4426.70198675, 4427.8807947 ,
       4695.1192053 , 4929.2384106 , 4403.08609272, 4606.33112583,
       4599.23178808, 4523.54966887, 4551.41721854, 4784.89403974,……]

想看一下这组数据是否符合正态分布,直接使用上述python代码后,发现没有报错,却得到这样的结果:

Input: stats.kstest(test, 'norm')
Out: KstestResult(statistic=1.0, pvalue=0.0)

结果肯定有问题,通过看kstest函数的原始文档,发现之前有个参数被忽略,也就是args

args
tuple, sequence, optional
Distribution parameters, used if rvs or cdf are strings or callables.

解决方法

然后通过添加相应的args参数,即期望的正态分布的平均值和标准差

Input: stats.kstest(test, 'norm',args=(test.mean(),test.std())
Output: KstestResult(statistic=0.005777479839093713, pvalue=0.8923049615924274)

结果正常了!可见欲速则不达,论认真读函数说明文档的重要性(lll¬ω¬)。

参考资料:

python scipy.stats.kstest
R ks.test
数据分析之正态分布检验及python实现

posted @ 2020-10-11 18:04  LittleFaith  阅读(16165)  评论(0编辑  收藏  举报