广告

Python数据分析必学:如何用corr()计算变量相关性(Pandas/NumPy实战案例)

理解相关性与corr()的基本原理

相关性与线性关系

在数据分析中,相关性用来定量描述两个变量共同变化的方向和强度。最常见的是 皮尔逊相关系数(r),其取值范围在 -1 到 1 之间,正相关表示变量一起上升,负相关表示一个上升另一个下降,而数值越接近 ±1,相关性越强。

当数据呈现线性关系时,相关系数能较好地反映变量之间的依赖程度;但如果存在明显的非线性关系或离群值,相关性很可能被误解。因此,在计算相关性之前,通常需要先进行散点图观察和异常值处理,以确保结论的稳健性。

Python数据分析必学:如何用corr()计算变量相关性(Pandas/NumPy实战案例)

相关性分析的核心在于判断两个变量在多大程度上同步变化,这也是许多数据分析任务(如特征选择、降维、共线性诊断)的基础步骤。

corr() 的基本使用

在 Python 的 Pandas 库中,DataFrame.corr() 是计算数值型列之间成对相关性的常用方法。默认方法pearson,返回一个对称的数值矩阵,矩阵的行列对应被比较的变量。

该方法会在两列都存在非缺失值的观测下计算相关系数,因此缺失值会影响样本量,需要在使用前关注数据清洗情况。

下面的示例演示从构造数据到得到相关矩阵的完整流程:

import pandas as pd
import numpy as np# 构造一个简单的 DataFrame,包含缺失值
df = pd.DataFrame({'A': [1.0, 2.1, 3.0, np.nan, 5.2],'B': [5.0, 4.8, 3.2, 2.9, 1.0],'C': [2.0, 2.1, 5.1, 7.0, 11.0]
})# 计算皮尔逊相关矩阵
corr_matrix = df.corr(method='pearson')
print(corr_matrix)

在Pandas中使用corr()进行变量相关性分析

相关矩阵的含义与输出解读

Pandas 中,DataFrame.corr() 会返回数值列之间的 相关系数矩阵,矩阵的对角线全为 1,且矩阵为对称。对变量组合越接近 1 或 -1,表示相关性越强;接近 0 表示相关性较弱。

解读相关矩阵时,需要关注潜在的 多重共线性、特征之间的线性关系以及是否存在显著的对称性模式,这些信息对后续建模有直接影响。

通过一个矩阵视图,我们可以快速识别哪些特征彼此高度相关,从而在特征工程阶段做出更合理的决策。

不同方法的应用场景

Pandas 的 method 参数 提供了多种相关性度量,常用的有 'pearson''spearman''kendall'Pearson 假设线性关系,适用于线性相关性分析;SpearmanKendall 在数据存在非线性单调关系时更稳健。

以下代码展示如何在同一个数据集上比较不同相关性度量的结果,帮助理解方法间的差异:

import pandas as pd
import numpy as npnp.random.seed(42)
df = pd.DataFrame({'A': np.random.normal(0, 1, 100),'B': np.random.normal(0, 1, 100),'C': np.random.normal(0, 1, 100)
})# 相关矩阵(默认 pearson)
mat_pearson = df.corr()
print(mat_pearson)# 两个特征之间的相关性
r_ab = df['A'].corr(df['B'], method='pearson')
print('A 与 B 的皮尔逊相关系数:', r_ab)# 使用 Spearman 方法
mat_spearman = df.corr(method='spearman')
print(mat_spearman)

NumPy 与可视化在相关性分析中的实战案例

使用 NumPy 计算相关矩阵

除了 Pandas,NumPy 的 np.corrcoef 也能计算相关性矩阵。该函数直接对二维数组进行运算,rowvar 参数决定变量是否在行中。对于 DataFrame,通常先将数值列提取为二维数组再调用。

通过 NumPy 的方法,我们可以在不依赖 Pandas 的情况下获得全局相关性矩阵,便于与其他数值运算无缝集成。

从数据框到可视化的完整流程

将数据框中的数值列筛选出来,转换为 NumPy 数组,然后计算相关矩阵,并结合可视化工具呈现,能够更直观地发现强相关或弱相关的特征组合。

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt# 示例数据(与上面的 df 结构类似)
np.random.seed(0)
df = pd.DataFrame({'A': np.random.normal(0, 1, 150),'B': np.random.normal(0, 1, 150),'C': np.random.normal(0, 1, 150)
})# Pandas 相关矩阵
corr_pd = df.corr()# NumPy 相关矩阵
arr = df[['A','B','C']].to_numpy()
corr_np = np.corrcoef(arr, rowvar=False)print('Pandas 相关矩阵:\\n', corr_pd)
print('NumPy 相关矩阵:\\n', corr_np)# 可视化
plt.figure(figsize=(6,5))
sns.heatmap(corr_pd, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Pandas 相关矩阵热力图')
plt.show()
# 也可以直接用 NumPy 的矩阵进一步可视化
plt.figure(figsize=(6,5))
sns.heatmap(corr_np, annot=True, cmap='coolwarm', vmin=-1, vmax=1,xticklabels=['A','B','C'], yticklabels=['A','B','C'])
plt.title('NumPy 相关矩阵热力图')
plt.show()

广告

后端开发标签