数据摘要提供了一种便捷的方式,仅用几个统计值就能描述数据样本中的所有值。
均值和标准差用于总结服从高斯分布的数据,但如果您的数据样本不服从高斯分布,这些值可能没有意义,甚至可能产生误导。
在本教程中,您将学习用于描述数据样本分布的五数概括法,而无需假设特定的数据分布。
完成本教程后,您将了解:
- 数据摘要(如计算均值和标准差)仅对高斯分布有意义。
- 五数概括法可用于描述任何分布的数据样本。
- 如何在 Python 中计算五数概括法。
通过我的新书《机器学习统计学》,启动您的项目,书中包含分步教程以及所有示例的Python 源代码文件。
让我们开始吧。

如何在 Python 中为您的数据计算5数概括法
照片由 Masterbutler 提供,保留部分权利。
教程概述
本教程分为4个部分,它们是:
- 非参数数据摘要
- 五数概括法
- 如何计算五数概括法
- 五数概括法的应用
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
非参数数据摘要
数据摘要技术提供了一种使用几个关键度量来描述数据分布的方法。
最常见的数据摘要示例是为服从高斯分布的数据计算均值和标准差。仅凭这两个参数,您就可以理解并重现数据的分布。数据摘要可以压缩少至数十个、多至数百万个的个体观测值。
问题在于,您不能轻易地为不服从高斯分布的数据计算均值和标准差。技术上讲,您可以计算这些量,但它们无法总结数据分布;实际上,它们可能会产生很大的误导。
对于不服从高斯分布的数据,您可以使用五数概括法来总结数据样本。
五数概括法
五数概括法,或简称5数概括法,是一种非参数的数据摘要技术。
它有时也被称为 Tukey 5数概括法,因为是由 John Tukey 推荐的。它可以用来描述任何分布的数据样本。
作为一种通用的标准摘要,5数概括法提供了恰到好处的细节量。
— 第37页, 《理解稳健与探索性数据分析》,2000年。
五数概括法涉及计算5个摘要统计量,即:
- 中位数 (Median):样本中的中间值,也称为第50百分位数或第2四分位数。
- 第1四分位数 (1st Quartile):第25百分位数。
- 第3四分位数 (3rd Quartile):第75百分位数。
- 最小值 (Minimum):样本中的最小观测值。
- 最大值 (Maximum):样本中的最大观测值。
四分位数是在一个点上的观测值,它有助于将排序后的数据样本分成四个大小相等的部分。中位数,或第2四分位数,将排序后的数据样本分成两部分,而第1和第3四分位数则将这两半各自分成四分之一。
百分位数是在一个点上的观测值,它有助于将排序后的数据样本分成100个大小相等的部分。四分位数通常也表示为百分位数。
四分位数和百分位数都是秩统计量的例子,可以对任何分布的数据样本进行计算。它们用于快速总结分布中有多少数据位于给定观测值之前或之后。例如,分布的中位数前后各有一半的观测值。
请注意,四分位数也在箱形图中计算,这是一种以图形方式总结数据样本分布的非参数方法。
如何计算五数概括法
计算五数概括法需要从数据样本中找到每个四分位数以及最小和最大观测值。
如果排序后的数据样本中没有特定的值对应四分位数,例如当观测值数量为偶数而我们试图找到中位数时,我们可以计算最接近的两个值的平均值,比如中间的两个值。
我们可以使用 NumPy 的 percentile() 函数在 Python 中计算任意百分位数。我们可以用这个函数来计算第1、第2(中位数)和第3四分位数。该函数接受一个观测值数组和一个浮点数(范围为0到100)来指定要计算的百分位数。它还可以接受一个百分位数列表来同时计算多个百分位数;例如:
1 |
quartiles = percentile(data, [25, 50, 75]) |
默认情况下,如果需要,该函数将计算观测值之间的线性插值(平均值),例如在对具有偶数个值的样本计算中位数时。
NumPy 的 min() 和 max() 函数可用于返回数据样本中的最小值和最大值;例如:
1 |
data_min, data_max = data.min(), data.max() |
我们可以将所有这些结合起来。
下面的示例生成一个从0到1的均匀分布中抽取的数据样本,并使用五数概括法对其进行总结。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 计算5数概括法 from numpy import percentile from numpy.random import rand # 生成数据样本 data = rand(1000) # 计算四分位数 quartiles = percentile(data, [25, 50, 75]) # 计算最小值/最大值 data_min, data_max = data.min(), data.max() # 打印5数概括法 print('Min: %.3f' % data_min) print('Q1: %.3f' % quartiles[0]) print('Median: %.3f' % quartiles[1]) print('Q3: %.3f' % quartiles[2]) print('Max: %.3f' % data_max) |
运行该示例会生成数据样本并计算五数概括法来描述样本分布。
我们可以看到,观测值的分布与我们的预期相近,第25百分位数为0.277,第50百分位数为0.532,第75百分位数为0.766,分别接近理想值0.25、0.50和0.75。
1 2 3 4 5 |
最小值:0.000 Q1: 0.277 中位数:0.532 Q3: 0.766 最大值:1.000 |
五数概括法的应用
五数概括法可以用于任何分布的数据样本。
这包括具有已知分布的数据,例如高斯分布或类高斯分布。
我建议始终计算五数概括法,只有在您能确定数据所属的分布时,才转向特定分布的摘要统计量,例如高斯分布的均值和标准差。
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 描述机器学习项目中可以计算五数概括法的三个例子。
- 生成一个具有高斯分布的数据样本并计算五数概括法。
- 编写一个函数,为任何数据样本计算5数概括法。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 《理解稳健与探索性数据分析》, 2000.
API
文章
总结
在本教程中,您学习了用于描述数据样本分布的五数概括法,而无需假设特定的数据分布。
具体来说,你学到了:
- 数据摘要(如计算均值和标准差)仅对高斯分布有意义。
- 五数概括法可用于描述任何分布的数据样本。
- 如何在 Python 中计算五数概括法。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
一如既往的好文章。在进一步探索数据之前,了解这些非常重要的概念。继续加油,Jason!
谢谢,很高兴对您有帮助。
写得很好的文章,Python 能够处理一些统计数据并计算各种统计操作的结果。
谢谢。
我很高兴在这里学到知识
我很高兴这些材料对您有帮助。
我想知道如何(在 Python 中)检查数据具有哪种分布(高斯或非高斯),您能提供一个例子吗?
提前感谢
是的,请看这里
https://machinelearning.org.cn/a-gentle-introduction-to-normality-tests-in-python/
我购买了您的PDF书籍(《机器学习的统计方法》)——它很棒,我正在学习
很多东西。我的问题是:在总结数据集时,我如何获得第25百分位数的计数(观测数量)?
谢谢你,Chris。
您可以使用 numpy.percentile() 函数
https://docs.scipy.org.cn/doc/numpy/reference/generated/numpy.percentile.html
我在关于使用自助法计算置信区间的章节中给出了使用此函数的示例。
Jason,你在这里的工作做得非常棒!再次感谢你!
谢谢。
谢谢 Jason 提供如此有用和有帮助的教程。
这是我尝试用来查找四分位数的代码行,显然我们可以使用0和100来找到数据的最小值和最大值。
quartiles = percentile(data, [0, 25, 50, 75, 100])
不错。
你好,Jason Brownlee,
Jason,如果我在分位数中修改了一些数据,并且存在一些异常值和偏度。然而,中位数不在其中,我该如何得到中位数?
诚挚地,
Muawiya
也许可以直接计算中位数。
我认为 numpy.percentile 没有正确计算四分位数,因为它们实际上是从列表中挑选数字,而不是计算实际值。相关链接:https://stackoverflow.com/a/53551756
谢谢分享,这与该函数的文档不符。
嗨,Jason,关于离散变量数据的五数概括法我有一个疑问。
根据您对概率的介绍,我理解在这种情况下众数会给出期望值。我是否可以这样理解:离散变量的5数概括法将基于每个离散值的出现次数?
那么第50四分位数是众数,最小值是出现次数最少的值,最大值是出现次数最多的值,以此类推?
嗨 Soren……请澄清“我是否可以这样理解……”的意思。这能让我们更好地帮助你。
嗨 James,
当然,我基本上是在问如何为离散变量计算5数概括法。我的理解是,既然在这种情况下第50四分位数是众数,那么其他四分位数也应类似地计算。
我希望您能确认这一点。
顺便说一下,我没有收到邮件通知说我的问题有了回复。如果能有这个功能就太好了。