相关性是衡量两个变量之间关联程度的指标。
当两个变量都具有良好且已知的正态分布时,计算和解释相关性很容易。当我们不知道变量的分布时,我们必须使用非参数秩相关方法。
在本教程中,您将了解用于量化具有非正态分布的变量之间关联的秩相关方法。
完成本教程后,您将了解:
- 秩相关方法如何工作以及可用的方法。
- 如何在Python中计算和解释Spearman秩相关系数。
- 如何在Python中计算和解释Kendall秩相关系数。
立即开始您的项目,阅读我的新书《机器学习统计学》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。
教程概述
本教程分为4个部分,它们是:
- 秩相关
- 测试数据集
- 斯皮尔曼等级相关 (Spearman's Rank Correlation)
- 肯德尔等级相关 (Kendall's Rank Correlation)
秩相关
相关性是指两个变量的观测值之间的关联。
变量可能具有正相关,这意味着随着一个变量的值增加,另一个变量的值也随之增加。相关性也可能是负的,这意味着随着一个变量的值增加,另一个变量的值减小。最后,相关性可能是中性的,这意味着变量不相关。
相关性量化了这种关联,通常作为-1到1之间的度量,分别表示完全负相关和完全正相关。计算出的相关性被称为“相关系数”。然后可以解释此相关系数来描述度量。
请参阅下表以帮助解释相关系数。

相关系数及其解释的表格
摘自《非统计学家的非参数统计:分步方法》。
具有正态分布的两个变量之间的相关性可以使用标准方法(如Pearson相关性)进行计算。此过程不能用于不具有正态分布的数据。相反,必须使用秩相关方法。
秩相关是指通过使用值的序数关系而不是具体值来量化变量之间关联度的方法。序数数据是指具有标签值并具有顺序或秩关系的数据;例如:“低”、“中”和“高”。
可以为实值变量计算秩相关。这是通过首先将每个变量的值转换为秩数据来完成的。这是将值排序并分配整数秩值的地方。然后可以计算秩相关系数以量化两个秩变量之间的关联。
由于不假定值的分布,因此秩相关方法被称为无分布相关或非参数相关。有趣的是,秩相关度量通常用作其他统计假设检验的基础,例如确定两个样本是否可能来自相同(或不同)的总体分布。
秩相关方法通常以开发该方法的研究者或研究者的名字命名。秩相关方法的四个示例如下:
- Spearman秩相关。
- Kendall秩相关。
- Goodman和Kruskal秩相关。
- Somers秩相关。
在接下来的部分中,我们将仔细研究两种更常见的秩相关方法:Spearman和Kendall。
测试数据集
在演示秩相关方法之前,我们必须先定义一个测试问题。
在本节中,我们将定义一个简单的双变量数据集,其中每个变量都来自均匀分布(例如,非正态分布),并且第二个变量的值取决于第一个变量的值。
具体来说,从均匀分布中抽取1000个随机浮点值样本,并将其缩放到0到20的范围。从0到10之间的均匀分布中抽取1000个随机浮点值样本,并将其添加到第一个样本的值中以创建关联。
1 2 3 |
# 准备数据 data1 = rand(1000) * 20 data2 = data1 + (rand(1000) * 10) |
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 生成相关变量 from numpy.random import rand from numpy.random import seed from matplotlib import pyplot # 设定随机数生成器种子 seed(1) # 准备数据 data1 = rand(1000) * 20 data2 = data1 + (rand(1000) * 10) # 绘图 pyplot.scatter(data1, data2) pyplot.show() |
运行示例会生成数据样本,并将点绘制在散点图上。
我们可以清楚地看到每个变量都具有均匀分布,并且通过图的左下角到右上角的对角线分组,可以看到变量之间的正相关。

来自均匀分布的关联变量的散点图
斯皮尔曼等级相关 (Spearman's Rank Correlation)
Spearman秩相关以Charles Spearman的名字命名。
它也可以称为Spearman相关系数,并用小写希腊字母rho(p)表示。因此,它可能被称为Spearman的rho。
这种统计方法通过单调函数(即递增或递减的关系)量化秩变量关联的程度。作为统计假设检验,该方法假定样本不相关(不拒绝H0)。
Spearman秩序相关是一种统计程序,旨在衡量两个变量在测量序数尺度上的关系。
— 第124页,《非统计学家的非参数统计:分步方法》,2009年。
Spearman秩相关的直观理解是,它使用秩值而不是实际值来计算Pearson相关性(例如,参数相关度量)。Pearson相关性是两个变量之间协方差(或观测值与均值的预期差)的计算,由两个变量的方差或散布进行归一化。
可以使用Python中的spearmanr() SciPy函数来计算Spearman秩相关。
该函数接受两个实值样本作为参数,并返回-1到1之间的相关系数和用于解释系数显著性的p值。
1 2 |
# 计算spearman相关性 coef, p = spearmanr(data1, data2) |
我们可以演示在测试数据集上计算Spearman秩相关。我们知道数据集中变量之间存在很强的关联,并且我们期望Spearman检验能够找到这种关联。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 计算两个变量之间的spearman相关性 from numpy.random import rand from numpy.random import seed from scipy.stats import spearmanr # 设定随机数生成器种子 seed(1) # 准备数据 data1 = rand(1000) * 20 data2 = data1 + (rand(1000) * 10) # 计算spearman相关性 coef, p = spearmanr(data1, data2) print('Spearmans correlation coefficient: %.3f' % coef) # 解释显著性 alpha = 0.05 if p > alpha: print('Samples are uncorrelated (fail to reject H0) p=%.3f' % p) else: print('Samples are correlated (reject H0) p=%.3f' % p) |
运行示例会计算测试数据集中两个变量之间的Spearman相关系数。
统计检验报告了0.9的强正相关。p值接近于零,这意味着在假设样本不相关的情况下观察到数据的可能性非常小(例如95%置信度),我们可以拒绝样本不相关的零假设。
1 2 |
Spearmans相关系数:0.900 样本相关(拒绝H0)p=0.000 |
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
肯德尔等级相关 (Kendall's Rank Correlation)
Kendall秩相关以Maurice Kendall的名字命名。
它也称为Kendall相关系数,系数通常被称为小写希腊字母tau(t)。反过来,该检验可能被称为Kendall的tau。
该检验的直观理解是,它计算两个样本之间匹配或一致排名的数量的归一化得分。因此,该检验也称为Kendall一致性检验。
Kendall秩相关系数可以使用Python中的kendalltau() SciPy函数进行计算。该检验接受两个数据样本作为参数,并返回相关系数和p值。作为统计假设检验,该方法假定(H0)两个样本之间没有关联。
1 2 |
# 计算kendall相关性 coef, p = kendalltau(data1, data2) |
我们可以演示在测试数据集上的计算,我们期望报告显著的正相关。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 计算两个变量之间的kendall相关性 from numpy.random import rand from numpy.random import seed from scipy.stats import kendalltau # 设定随机数生成器种子 seed(1) # 准备数据 data1 = rand(1000) * 20 data2 = data1 + (rand(1000) * 10) # 计算kendall相关性 coef, p = kendalltau(data1, data2) print('Kendall correlation coefficient: %.3f' % coef) # 解释显著性 alpha = 0.05 if p > alpha: print('Samples are uncorrelated (fail to reject H0) p=%.3f' % p) else: print('Samples are correlated (reject H0) p=%.3f' % p) |
运行示例会将Kendall相关系数计算为0.7,这是高度相关的。
p值接近于零(并显示为零),与Spearman检验一样,这意味着我们可以放心地拒绝样本不相关的零假设。
1 2 |
Kendall相关系数:0.709 样本相关(拒绝H0)p=0.000 |
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 列出在机器学习项目中计算非参数相关系数可能很有用的三个示例。
- 更新每个示例,以计算来自非正态分布的不相关数据样本之间的相关性。
- 加载标准机器学习数据集,并计算所有变量之间的成对非参数相关性。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 非统计学家的非参数统计:分步方法, 2009.
- 应用非参数统计方法,第四版,2007年。
- 秩相关方法, 1990.
API
文章
- 维基百科上的非参数统计
- 维基百科上的秩相关
- 维基百科上的斯皮尔曼等级相关系数
- 维基百科上的Kendall秩相关系数
- 维基百科上的Goodman和Kruskal的gamma
- 维基百科上的Somers’ D
总结
在本教程中,您了解了用于量化具有非正态分布的变量之间关联的秩相关方法。
具体来说,你学到了:
- 秩相关方法如何工作以及可用的方法。
- 如何在Python中计算和解释Spearman秩相关系数。
- 如何在Python中计算和解释Kendall秩相关系数。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
你好,Jason!
我正在开始进行一些机器学习项目,我有一个疑问。
我可以使用这些秩相关来为机器学习项目选择属性吗?
哪种最适合此用途?
谢谢!您的博客对我改进机器学习领域非常有帮助!
是的,试试看。
有许多方法可以为机器学习选择特征,尝试几种方法,然后选择能使模型获得最佳性能的方法。
没有最好的方法,只有许多不同的方法可以尝试解决您的问题。
谢谢!
嗨,Jason!
我从您的文章中获得了大量信息。
您是否有关于强化学习的示例或文章?
目前还没有,也许将来会有。
嗨,Jason,
您关于机器学习和数据科学的文章有助于我提高数据编码技能和整体数据科学能力。
非常感谢
Yusuf
很高兴听到这个消息。
嗨,Jason,
继续努力,伙计。
我喜欢您的博客。
它对我的帮助很大。
谢谢,
Yaser
谢谢。
嗨,Jason,
您的文章非常有帮助,并且写得清晰易懂。非常感谢您分享您的知识。
Shirshendu Roy
谢谢。
Jason – 我已经清理、准备、处理和标准化了我的数据集(用于回归问题),并有兴趣进行更正式的特征选择技术,并计划如下:
无标准化
– 带有VIF分数的常规相关矩阵
– LASSO
– 非参数秩相关
我的问题是,如果我想将Pearson相关性作为另一个参考点,是否建议在标准化数据集后对其进行标准化?或者这是否必要?我是否想太多了?
一如既往,您的宝贵建议和快速回复非常感谢。
我在Python和Excel中得到的spearsman相关值不同,原因是什么?
也许是测试实现方式上的差异?
你好,Jason Brownlee。
感谢您通过这个博客提供帮助。
我有一个包含50行和21列的数据集。
50行表示观测值,前20列(例如f1, f2, ... f20)是特征,最后一列是类别(只有0和1)。
我能否使用特征(例如f1)列与类别列之间的秩相关来指定该特征最适合分类?
如果输入变量是分类变量,您可以使用卡方检验来查找与输出变量相关的输入变量。
通常,特征选择方法可以给您一些关于什么可能有用的大致 ধারণা,但不能给出“最佳”特征,我在这里解释得更详细
https://machinelearning.org.cn/faq/single-faq/what-feature-selection-method-should-i-use
感谢您的及时回复。
我的意图是
二元分类存在许多现有特征(在我工作领域(信号))。如果我生成一个新特征,我如何证明我的新特征比现有特征更好或更差?
分别在包含新特征的模型和不包含新特征的模型之间进行拟合,并比较模型结果。
如果包含新特征的模型优于不包含新特征的模型,则该特征会增加价值/技能。
嗨,Jason,
感谢另一篇有用的文章。
我注意到人们随意使用Pearson样本相关性,因此我一直有兴趣澄清其用法。维基百科文章声称,在参数设置中(即对于双变量正态分布),它具有极好的特性 — 它是MLE,因此渐近一致且有效,并且也渐近无偏 — 但只要样本量足够大,它仍然是渐近无偏的。此外,如果变量是i.i.d.,它是有效的。
我理解您在文章开头提到的意思,即在非参数设置中我们需要其他估计量。但假设维基百科文章的内容是准确的,即使在这种情况下,Pearson样本相关性似乎仍然是关联的有用度量。我对这个领域还比较陌生,i.i.d.似乎是一个相对较弱的假设(或者至少是我们实际上经常隐式使用的),而且我们的样本量通常足够大。因此,我们可以在没有任何参数假设的情况下获得无偏性和一致性。
也许这些特性有时不够好。Pearson相关性是否还有其他问题需要我们注意?维基百科文章还指出,当分布是重尾时,这是一个问题。您能否澄清一下?
非常感谢。
是的,如果一个或另一个变量的分布是非正态的(完全或在一定程度上),则可以使用更弱的基于秩的方法。
https://machinelearning.org.cn/how-to-calculate-nonparametric-rank-correlation-in-python/
感谢快速回复。但那个链接指向这个页面。
哎呀,我读了评论,但没有读上下文。抱歉。
不过陈述仍然有效。一旦参数方法的预期被打破,我们就转向基于秩的方法。
没关系!感谢您的时间和关注。
非常有用的信息..我发现Spearman相关性很好,现在我想知道如何在Python中拟合一个分布(统计)模型到我的数据?您遇到过这种情况吗?谢谢
是的,如果它不是标准分布,您可以使用密度估计方法,如高斯混合或核密度。
我希望很快能有一些关于这个主题的帖子。
谢谢Jason,继续做好工作!我有一个数据集,其中每个数据点(行)都有四个不同的属性A、B、C和D。我测试了这里提到的所有相关性,只发现B和D之间存在正相关。您能否帮助我拟合分布模型到我的数据集,以便我可以从分布中重采样以进行模拟?我将非常感谢并承认您的帮助。
也许可以探索使用核密度估计器?
谢谢Jason,只是一个快速的问题,我尝试了scipy包中的高斯kde,引用:https://docs.scipy.org.cn/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html;但是当我尝试使用kernel.resample()进行重采样时,我得到了不在我的原始数据集中的值(例如,负值),尽管我原始数据集中的所有值都是正数且大于等于0。我该如何只重采样在我的原始数据集范围(min,max)内的值?谢谢
也许可以尝试sklearn的实现,它非常容易使用。
https://scikit-learn.cn/stable/modules/density.html
你好,Jason Brownlee。
您提供的材料非常出色。
通过您的帖子,我们知道如何轻松使用它们,即使您自己可能也知道。
非常感谢。
我在相关性方面有一个小疑问。
如果我们有五组数据,例如A1、A2、A3、A4和A5。
A1和A2之间的相关性是C12
A1和A3之间的相关性是C13
A1和A4之间的相关性是C14
A1和A5之间的相关性是C15
如何组合所有这些相关性(C12、C13、C14和C15)值来传达A1与其他组元素高度相关?
谢谢。
您可以对成对相关性求和。总和最大的变量相关性最高。
嗨,Jason,
非常感谢您的帖子。我有一个带有标称变量的无监督数据集。我可以使用这些方法来处理我的数据集吗?
非常感谢。
我相信可以,也许可以试试?
嗨,Jason,
您根据通常分布的数据集(即参数)解释了Spearman和Kendall的秩方法,但实际上这两种方法主要用于非参数(非高斯分布),而不是正态分布数据。我说得对吗?如果我错了或遗漏了什么,请纠正我。因为我们已经使用Pearson相关系数来处理正态分布的数据。
谢谢
它们是数据非正态时的秩相关方法。
嗨,Jason,
非常感谢您的文章,它们非常有帮助。关于将Spearman相关性用于特征选择,我有几个问题。我的数据集有很多非高斯数值变量,并且我试图预测一个数值目标。所以我认为Spearman是合适的。但是在使用Spearman之前,我是否需要将数值独立变量转换为秩数据?还是Spearman算法会自动处理?如果是前者,我该如何将数值数据转换为Python中的秩数据?
另外,对于非高斯数值独立变量,除了使用Spearman之外,您认为是否可以使用log和缩放处理数据,然后使用Pearson是否合适?
谢谢!
Bach
这可能对特征选择的统计方法更有帮助。
https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/