橘智橘智
FakeOrange
预计阅读时间:1分钟58秒

如何判断数据分布?Kolmogorov-Smirnov 检验的实用指南

面向初学者的 KS 检验入门

0
0


前言



本文属于搬运内容,向原作者:Gianluca Malato 致敬。原文链接在文章末尾。



如何判断数据分布?Kolmogorov-Smirnov 检验的实用指南



数据科学家常常需要评估数据的分布情况。我们已经了解过 Shapiro-Wilk 正态性检验,那么对于非正态分布的数据又该如何处理呢?这时 Kolmogorov-Smirnov 检验(简称 KS 检验)可以派上用场。



为什么需要检查分布?



数据科学家经常需要解决数据分布检查的问题。处理样本时,需要验证它们是否符合正态分布、对数正态分布,或者判断两个数据集是否来自同一分布。这种需求在机器学习中的训练集和测试集划分时非常常见。


例如,您可能想知道从总体中抽取的样本是否在统计学上类似于总体本身,或者从同一总体抽取的多个样本是否相互相似。


所有这些问题有一个共同点:需要将样本的分布与另一个样本或已知的概率分布进行比较。


这正是 Kolmogorov-Smirnov 检验的用武之地。



Kolmogorov-Smirnov 检验



KS 检验有两种版本,每种对应不同的原假设:


  • 样本来源于一个给定的概率分布。


  • 两个样本来源于同一个概率分布。


第一种是 单样本 KS 检验,第二种是 双样本 KS 检验


两种检验方法都通过比较样本(或样本集)的累积分布函数(CDF)与给定的累积分布函数来进行。数学上,通过计算这些分布之间的距离来生成一个统计量,并用这个统计量来计算 p 值。


尽管在 p 值的计算上存在一定的近似性问题,并且可能受到异常值的影响,这些检验仍然是数据科学家工具箱中非常有用的工具。



Python 示例



我们以一个示例来说明 KS 检验的用法。首先,生成两个数据集,分别来自正态分布和均匀分布。数据集的大小可以不同。


import numpy as np 

# 生成数据集
x = np.random.normal(size=100) 
y = np.random.uniform(size=200)



单样本 KS 检验



我们想检验数据集 x 是否来自正态分布或均匀分布。为此,需要导入我们要检验的分布的累积分布函数以及 SciPy 提供的 ks_1samp 函数。


from scipy.stats import ks_1samp, norm, uniform


检查数据集 x 是否符合正态分布:


ks_1samp(x, norm.cdf) 
# 输出: KstestResult(statistic=0.05164007841056789, pvalue=0.9398483559210086)


p 值很大,因此我们无法拒绝原假设,即数据集来自正态分布。


检查数据集 x 是否符合均匀分布:


ks_1samp(x, uniform.cdf) 
# 输出: KstestResult(statistic=0.5340516556530323, pvalue=3.580965283851709e-27)


p 值非常小,因此我们可以拒绝原假设,即数据集不来自均匀分布,这符合预期。



双样本 KS 检验



对于双样本检验,我们可以导入 ks_2samp 函数并比较两个数据集的分布。


from scipy.stats import ks_2samp 

ks_2samp(x, y) 
# 输出: KstestResult(statistic=0.53, pvalue=9.992007221626409e-16)


p 值非常小,说明两组数据的分布显著不同,这也符合我们对数据集的构造预期。



结论



Kolmogorov-Smirnov 检验是数据科学中强大的工具,能够判断数据是否来自特定分布,或两个数据集是否具有相同的分布。尽管 p 值的计算存在一定的近似性问题,但只要正确使用,它将为数据分析提供宝贵的见解。



原文链接

评论