在处理数据样本时 一个重要的决策点是使用参数统计方法还是非参数统计方法。
参数统计方法假设数据具有已知的和特定的分布 通常是高斯分布。如果数据样本不是高斯的 则违反参数统计检验的假设 必须采用非参数统计方法。
您可以使用一系列技术来检查数据样本是否偏离高斯分布(称为正态检验)。
在本教程中 您将发现检查数据样本是否偏离正态分布和用于评估数据样本的一套技术的重要性。
完成本文后 您将了解
样本是否正常指示要与数据样本一起使用的统计方法的类型。与正常偏差相符合的图形方法 如直方图和Q-Q图.统计正态检验用于量化偏离正常值的偏差。 正态假设统计领域的很大一部分涉及到假设它是从高斯分布中提取的数据。
如果使用假设为高斯分布的方法 并且您的数据是从不同的分布中提取的 则发现可能会误导或明显错误。
有很多技术 你可以检查你的数据样本是高斯的 还是像高斯一样的 可以使用标准的技术 或者足够的非高斯来代替使用非参数的统计方法。
在为数据样本选择统计方法时 这是一个关键的决策点。我们可以将这一决定归纳如下
If Data Is Gaussian: Use Parametric Statistical Methods Else: Use Nonparametric Statistical Methods
还有一些中间点 我们可以假设数据是高斯的–足够使用参数方法 或者我们可以使用数据准备技术将数据转换成足够高斯的参数方法。
在机器学习项目中 您可能需要对数据样本进行以下三个主要方面的评估
在拟合模型的情况下 将数据输入到模型中。模型评价结果在模型选择的情况下。回归情况下模型预测的残差。在本教程中 我们将研究用于检查数据样本是否为高斯的两类技术
图解法 这些是绘制数据和定性地评估数据是否为高斯的方法。统计测验 这些方法计算数据的统计数据 并量化数据从高斯分布中提取的可能性。这类方法通常称为正态检验。
测试数据集在我们开始研究正常测试之前 让我们首先开发一个可以在本教程中使用的测试数据集。
我们将产生一个小的随机数样本从高斯分布中提取。
对于测试数据集的高斯随机数的选择意味着我们期望每个测试都能正确地识别出分布 然而 小样本的大小可能会在结果中引入一些噪声。
我们将使用randn() NumPy函数产生随机高斯数 其均值为0 标准差为1 即所谓的标准正态变量。然后 我们将它们移动到平均值为50 标准差为5。
下面列出了完整的示例。
from numpy.random import seed from numpy.random import randn from numpy import mean from numpy import std seed(1) data 5 * randn(100) 50 print( mean %.3f stdv %.3f % (mean(data), std(data)))
运行该示例将生成该示例并打印该示例的均值和标准差。
我们可以看到 在样本规模较小的情况下 均值和标准差是对真实的基本总体均值和标准差的合理但粗略的估计。
mean 50.303 stdv 4.426直观正态检验
我们可以创建数据图来检查它是否是高斯的。
这些检查是定性的 因此不如我们在下一节中计算的统计方法准确。尽管如此 它们是快速的 就像统计测试一样 在您可以调用数据样本之前 还必须对其进行解释。
在本节中 我们将研究两种常见的方法 用于直观地检查数据集是否是从高斯分布中提取的。
直方图图柱状图是一个简单而常用的图形 可以快速检查数据样本的分布情况。
在直方图中 数据被划分为一个预先指定的组 称为回收箱.然后 将数据排序到每个桶中 并保留每个桶中观察次数的计数。
图中显示了x轴上的垃圾箱 保持了它们的序号关系 以及y轴上每个垃圾箱中的计数。
一个样本的数据具有高斯分布的直方图图 显示熟悉的钟形。
属性创建直方图。Hist()matplotlib函数。默认情况下 从数据示例自动估计回收箱的数量。
下面列出了一个完整的示例 演示测试问题的直方图图。
from numpy.random import seed from numpy.random import randn from matplotlib import pyplot seed(1) data 5 * randn(100) 50 pyplot.hist(data) pyplot.show()
运行该示例将创建一个直方图图 显示每个bin中的观察数。
我们可以看到一个高斯形状的数据 虽然不是强烈熟悉的钟形 是一个粗略的近似。
分位数图另一个用于检查数据样本分布的流行绘图是分位数图、Q-Q图或qq图。
这个图产生了它自己的理想分布的样本 我们比较它 在这种情况下 高斯分布。理想样本被分成组(例如5) 称为分位数。样本中的每个数据点在相同的累积分布中与理想分布中的相似成员配对。
生成的点被绘制成散点图 在x轴上有理想化的值 y轴上有数据样本。
一个完美的匹配分布将显示从左下角45度的点线从左下角到右上角。通常会在情节上划一条线 以帮助明确这一期望。点与线的偏差表示与预期分布的偏差。
我们可以使用Qqart()statsmodel函数。该函数接受数据样本 默认情况下假设我们将其与高斯分布进行比较。我们可以通过设置线“论点”s‘.
下面提供了将测试数据集绘制为QQ图的完整示例。
from numpy.random import seed from numpy.random import randn from statsmodels.graphics.gofplots import qqplot from matplotlib import pyplot seed(1) data 5 * randn(100) 50 # q-q plot qqplot(data, line s ) pyplot.show()
运行该示例将创建QQ图 显示对角线上点的散点图 这与高斯分布中的样本的预期对角线模式非常吻合。
有一些小的偏差 特别是在图的底部 这是预期的小数据样本。
有许多统计测试 我们可以用它来量化一个样本的数据看上去是否像是从高斯分布中提取出来的。
每个测试做出不同的假设 并考虑数据的不同方面。
我们将在本节中查看3种常用的测试 您可以将这些测试应用到您自己的数据示例中。
在应用统计测试之前 必须知道如何解释结果。
每个测试至少会返回两件事
统计量 测试计算的数量 可在测试上下文中通过将其与临界值从测试统计量的分布来看。P值 用于解释测试 在这种情况下 样本是否是从高斯分布中提取的。每个测试计算一个特定于测试的统计信息。这种统计可以帮助解释结果 尽管它可能需要更深的统计能力和对具体统计测试的更深的了解。相反 p值可用于在实际应用中快速、准确地解释统计量。
测试假设样本是从高斯分布中提取的。从技术上讲 这被称为空假设 或H0。选择一个阈值级别称为alpha 通常为5%(或0.05) 用于解释p值。
在这些测试的SciPy实现中 您可以如下所示解释p值。
P α拒绝H0 不正常。P α拒绝H0 正常。这意味着 在一般情况下 我们正在寻找具有较大p值的结果 以确认我们的样本很可能是从高斯分布中提取的。
5%以上的结果并不意味着零假设是正确的。这意味着 考虑到现有的证据 这很可能是真实的。P值不是数据拟合高斯分布的概率 它可以被认为是一个帮助我们解释统计检验的值。
Shapiro-Wilk 测试这个 Shapiro-Wilk 对数据样本进行评估 并量化数据从高斯分布中提取的可能性 该分布以塞缪尔·夏皮罗和马丁·威尔克的名字命名。
在实践中 夏皮罗-威尔克检验被认为是一种可靠的常态测试 尽管有一些迹象表明 该测试可能适用于较小的数据样本 例如数千个或更少的观测数据。
这个夏皮罗()函数将计算给定数据集上的Shapiro-Wilk函数。该函数返回由测试计算的W统计量和p值.
下面列出了在DataSet上执行Shapiro-Wilk测试的完整示例。
from numpy.random import seed from numpy.random import randn from scipy.stats import shapiro seed(1) data 5 * randn(100) 50 stat, p shapiro(data) print( Statistics %.3f, p %.3f % (stat, p)) alpha 0.05 if p alpha: print( Sample looks Gaussian (fail to reject H0) ) else: print( Sample does not look Gaussian (reject H0) )
运行该示例首先计算数据样本上的测试 然后打印统计数据和计算的p值。
P值感兴趣 发现数据很可能是从高斯分布中提取的。
# (没有拒绝H0) Statistics 0.992, p 0.822D’Agostino’s K^2 Test
这个D‘Agostino K^2检验根据数据计算汇总统计数据 即峰度和偏度 以确定数据分布是否偏离了以拉尔夫·达戈斯蒂诺命名的正态分布。
偏斜是对一个分布向左或向右推多大的量化 这是对分布中不对称的一种度量。峰度量化分布在尾部的数量。这是一种简单而常用的正态性统计检验。D‘Agostino的K^2测试可通过规范检验()SciPy函数并返回测试统计量和p值。
下面列出了数据集中D’Agostino’s K^2 Test 测试的完整示例。
from numpy.random import seed from numpy.random import randn from scipy.stats import normaltest seed(1) data 5 * randn(100) 50 stat, p normaltest(data) print( Statistics %.3f, p %.3f % (stat, p)) alpha 0.05 if p alpha: print( Sample looks Gaussian (fail to reject H0) ) else: print( Sample does not look Gaussian (reject H0) )
运行示例 计算统计量并打印统计量和p值.
P值是针对5%的alpha值进行解释的 并发现测试数据集与正常值没有明显的偏差。
# (没有拒绝H0) Statistics 0.102, p 0.950Anderson-Darling Test
Anderson-Darling Test 是一种统计测试 可用于评估数据样本是否来自以Theodore Anderson和Donald Darling命名的许多已知数据样本之一。
它可以用来检查数据样本是否正常。该测试是一种更复杂的非参数拟合优度统计检验的修正版本 称为Kolmogorov-Smirnov试验.
一个特点是 它返回一个临界值列表 而不是单个p值。这可以为更彻底地解释结果提供基础。
这个Anderson() SciPy函数实现。它以数据样本和发行版的名称作为参数来对其进行测试。默认情况下 测试将检查高斯分布 (dist ’norm’)。
下面列出了在样本问题上计算Anderson-Darling测试的完整示例。
from numpy.random import seed from numpy.random import randn from scipy.stats import anderson seed(1) data 5 * randn(100) 50 result anderson(data) print( Statistic: %.3f % result.statistic) 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( %.3f: %.3f, data looks normal (fail to reject H0) % (sl, cv)) else: print( %.3f: %.3f, data does not look normal (reject H0) % (sl, cv))
运行该示例将计算测试数据集上的统计信息并打印临界值。
统计测试中的临界值是预定义的显着性边界范围 如果计算的统计量小于临界值 则无法拒绝H0。测试不只是单个p值 而是返回不同常用显着性级别范围的临界值。
如果计算出的检验统计量小于选定的显着性水平上的临界值 我们就可以通过拒绝空假设来解释结果。
我们可以看到 在每个显着性水平上 检验都发现数据服从正态分布。
Statistic: 0.220 15.000: 0.555, data looks normal (fail to reject H0) 10.000: 0.632, data looks normal (fail to reject H0) 5.000: 0.759, data looks normal (fail to reject H0) 2.500: 0.885, data looks normal (fail to reject H0) 1.000: 1.053, data looks normal (fail to reject H0)你应该用什么测试
我们已经进行了一些正常测试 但这并不是所有存在的测试。
你用哪种测试
我建议在适当的情况下 在您的数据上使用它们。
然后问题就变成了 你是如何解释结果的 如果测试结果不一致 他们经常会这么做呢
我有两点建议可以帮助你思考这个问题。
困难方法
由于许多不同的原因 您的数据可能是不正常的。每个测试都从一个稍微不同的角度来看 一个样本是否是从高斯分布中抽取的问题。
一个正常度测试失败意味着您的数据不正常。就这么简单。
您可以调查数据不正常的原因 或者使用数据准备技术使数据更加正常。
或者 您可以开始研究使用非参数统计方法 而不是参数方法。
简单方法
如果有些方法表明样本是高斯的 而有些则不是 那么也许可以将此作为数据类似于高斯的指示。
在许多情况下 您可以像对待高斯数据一样对待数据 并继续使用您选择的参数统计方法。
扩展本节列出了一些扩展教程的想法 您可能希望了解这些想法。
列出另外两个示例 说明您认为正常度测试在机器学习项目中可能有用的情况。开发您自己的设计数据集 并应用每个正常度测试。加载标准机器学习数据集 并将正态测试应用于每个实值变量。


