Pandas计算相关性系数corr()方法详解与参数对比

洛溪
洛溪
发布时间:2026-10-15 | 5人浏览过
原创

本文详细介绍Pandas中计算相关性系数的corr()方法。涵盖相关性的定义、正负相关判断及系数范围[-1,1]。重点解析method参数的三种选项:pearson(线性)、kendall(分类/无序)和spearman(非线性),并通过一元二次方程示例对比各系数在非线性数据下的表现差异,强调相关性与因果性的区别。

在Pandas中,可以使用corr()方法来计算数据列之间的相关性系数。

相关性是指数据变量之间存在关联,彼此相互影响。

例如,若变量A与B存在相关性,则A的变化会对B产生一定影响,导致B随之发生相应变化。

  • 当A与B完全相等,或B可以通过A经过确定的数学计算得出时,两者表现为完全相关。
  • 若B由A和C共同计算得出,且A能解释B的大部分变化,则判定A与B为强相关。
  • 若B由A和C共同计算得出,但A仅能解释B的一小部分变化,则判定A与B为弱相关。
  • 若A与B之间没有任何关联,则判定为不相关。

当B与A存在相关性时,需进一步判断相关方向:

  • 若A增大导致B减小,则称为负相关。
  • 若A增大导致B也增大,则称为正相关。

相关性系数是用于量化相关性强弱的数值指标。

该系数的取值范围在[-1, 1]之间。绝对值越接近0,表示相关性越弱;绝对值越接近1,表示相关性越强。

具体而言,系数小于0表示负相关,大于0表示正相关。

为了演示计算过程,首先构造如下示例数据:

import pandas as pd

data = pd.DataFrame(
    data={
        'age': [2,7,10,16,20],
        'height': [70,90,143,166,178],
        'score': [98,37,103,76,53]
    }
)

接下来使用corr()方法计算相关性系数。

# 计算相关性系数的列 必须都是数值型的数据!
corr = data.loc[:, ["age","height"]].corr()        # 会计算两两列之间的相关性系数
print("corr\n", corr)
"""
corr
            age   height
age     1.00000  0.96043
height  0.96043  1.00000
"""

需要注意的是,变量与自身的相关性系数恒为1。

若要计算多列之间的两两相关性系数,操作如下:

corr = data.loc[:, ["age","height","score"]].corr()
print("corr\n", corr)
"""
corr
             age    height     score
age     1.000000  0.960430 -0.340053
height  0.960430  1.000000 -0.096782
score  -0.340053 -0.096782  1.000000
"""

Pandas中DataFrame.corr()方法支持以下参数配置。

DataFrame.corr(method='pearson', min_periods=1)

各参数的具体说明如下:

  • method:该参数可选值为{‘pearson’, ‘kendall’, ‘spearman’},用于指定计算方法。
  • pearson:Pearson相关系数用于衡量两个数据集是否呈线性关系,即针对线性数据计算相关系数;对于非线性数据,该方法的计算结果可能存在误差。
  • kendall:Kendall系数用于反映分类变量(无序序列)之间的相关性,适用于非正态分布的数据。
  • spearman:Spearman系数适用于非线性且非正态分布的数据相关性计算。
  • min_periods:指定计算相关系数时所需的最少样本数据量。
  • 返回值类型为DataFrame表格,包含各变量类型之间的相关系数矩阵。

为了区分不同参数之间的区别,我们进行如下实验验证:

from pandas import DataFrame
import pandas as pd
x=[a for a in range(100)]
#构造一元二次方程,非线性关系
def y_x(x):
    return 2*x**2+4
y=[y_x(i) for i in x]
 
data=DataFrame({'x':x,'y':y})
 
#查看下data的数据结构
data.head()
Out[34]: 
   x   y
0  0   4
1  1   6
2  2  12
3  3  22
4  4  36
 
data.corr()
Out[35]: 
          x         y
x  1.000000  0.967736
y  0.967736  1.000000
 
data.corr(method='spearman')
Out[36]: 
     x    y
x  1.0  1.0
y  1.0  1.0
 
data.corr(method='kendall')
Out[37]: 
     x    y
x  1.0  1.0
y  1.0  1.0

由于y值由函数构造得出,x与y的理论相关系数应为1。但从实验结果可知,Pearson系数针对非线性数据存在一定的误差,而Spearman和Kendall系数在此场景下表现更为准确。

需要特别说明的是,数据之间的相关关系并不等同于因果关系。即使相关系数为1,仅说明二者具备完全相关性,并不能推断y是x的结果或x导致y。

以上为个人经验分享,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表