Pandas 相关性分析(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据分析领域,"相关性分析"如同一把钥匙,能够帮助我们揭示数据特征之间的隐藏关系。对于编程初学者和中级开发者来说,掌握 Pandas 相关性分析的核心方法,不仅能提升数据处理的效率,更能为后续的建模与决策提供关键依据。本文将通过循序渐进的方式,结合实际案例和代码示例,深入讲解如何使用 Pandas 进行相关性分析,并解析其背后的逻辑与应用场景。


数据准备与预处理:构建分析的基石

1. 数据集选择与加载

相关性分析的第一步是选择合适的结构化数据集。例如,我们以经典的鸢尾花(Iris)数据集为例,其包含花瓣长度、宽度和品种等特征。使用 Pandas 加载数据的代码如下:

import pandas as pd  
from sklearn.datasets import load_iris  

iris = load_iris()  
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)  
df['target'] = iris.target  

这段代码将数据转换为 Pandas DataFrame 格式,便于后续操作。

2. 数据清洗与标准化

在分析前,需处理缺失值和异常值。例如:

print(df.isnull().sum())  

此外,某些特征可能需要标准化(如不同量纲的特征),但需注意:

关键点:标准化(Standardization)与归一化(Normalization)的区别在于,前者将数据转换为均值为0、标准差为1的分布,而后者压缩到固定区间(如0-1)。相关性分析对标准化不敏感,但对量纲差异较大的数据可能需要先标准化。


计算相关系数:量化特征间的联系

1. 相关系数的类型与适用场景

相关性分析的核心是计算特征之间的相关系数。Pandas 提供了 corr() 方法,默认使用 皮尔逊相关系数(Pearson Correlation Coefficient)

pearson_corr = df.corr()  
print(pearson_corr)  

皮尔逊相关系数

  • 公式:$\rho_{X,Y} = \frac{cov(X,Y)}{\sigma_X \sigma_Y}$
  • 特点:衡量线性相关性,取值范围[-1,1]。
  • 适用场景:数据呈正态分布且关系近似线性。

其他方法的扩展

Pandas 还支持 斯皮尔曼(Spearman)肯德尔(Kendall) 系数:

spearman_corr = df.corr(method='spearman')  

kendall_corr = df.corr(method='kendall')  

比喻

  • 皮尔逊像“身高与体重”的线性关系,
  • 斯皮尔曼像“考试排名与课外活动时长”的单调趋势,
  • 肯德尔则像“评委对作品的排名一致性”。

2. 结果解读与阈值设定

假设我们得到以下简化后的相关系数矩阵:

sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
petal length (cm)0.8718-0.42021.00000.9629
  • 解读
    • 花瓣长度与花瓣宽度的皮尔逊系数为0.96,表明两者高度正相关。
    • 花瓣长度与花萼宽度的系数为-0.42,说明负相关但相关性较弱。
  • 阈值建议
    • |r| > 0.7:强相关,需深入分析
    • 0.4 ≤ |r| ≤ 0.7:中等相关
    • |r| < 0.4:弱相关

可视化:让结果“一目了然”

1. 热力图(Heatmap)

通过 Seaborn 库绘制热力图,直观展示相关系数:

import seaborn as sns  
import matplotlib.pyplot as plt  

plt.figure(figsize=(8,6))  
sns.heatmap(pearson_corr, annot=True, cmap='coolwarm')  
plt.title('Pearson Correlation Heatmap')  
plt.show()  

图示效果

  • 红色区域表示正相关,蓝色区域表示负相关,颜色深浅对应系数绝对值大小。

2. 散点图矩阵

进一步观察两两特征间的分布关系:

sns.pairplot(df, diag_kind='kde')  
plt.show()  

案例分析
在鸢尾花数据集中,花瓣长度与宽度的散点图呈现明显的正相关趋势,而花萼宽度与花瓣长度的散点则分布较散,验证了相关系数的结论。


实战案例:房价数据的相关性分析

数据集背景

假设我们有一个房价数据集,包含以下特征:

  • 房屋面积(sqft)
  • 房龄(years)
  • 房间数量(rooms)
  • 周边犯罪率(crime_rate)
  • 价格(price)

分析步骤

步骤1:加载数据

df_house = pd.read_csv('house_prices.csv')  

步骤2:计算并可视化

corr_matrix = df_house.corr()  
sns.heatmap(corr_matrix, annot=True)  

步骤3:结果分析

假设得到以下关键系数:

  • price 与 sqft:0.82(强正相关)
  • price 与 years:-0.65(中度负相关)
  • price 与 crime_rate:-0.32(弱负相关)

结论

  • 房屋面积是影响价格的最主要因素。
  • 房龄越新,价格越高,但相关性强度次于面积。
  • 犯罪率对价格的影响较弱,可能需结合其他因素综合判断。

进阶技巧与常见误区

1. 处理非线性关系

当特征间呈现非线性相关时,皮尔逊系数可能失效。例如,假设价格与房屋面积的关系符合二次曲线:

df_house['sqft_squared'] = df_house['sqft'] ** 2  
nonlinear_corr = df_house[['price', 'sqft_squared']].corr()  

此时需考虑:

  • 多项式回归斯皮尔曼系数来捕捉非线性趋势。

2. 多重共线性问题

若多个特征之间高度相关(如“房间数量”与“面积”),可能导致回归分析中的多重共线性。解决方案包括:

  • 删除冗余特征
  • 使用主成分分析(PCA)降维

3. 样本量与置信区间

小样本数据的相关系数可能不稳定。例如:

small_sample = df.sample(20)  
print(small_sample.corr())  

此时需结合统计检验(如 p-value)判断相关性是否显著。


结论与展望

通过本文的讲解,读者应能掌握以下核心内容:

  1. 如何使用 Pandas 计算三种常见相关系数
  2. 如何通过可视化工具快速解读结果
  3. 在实际案例中识别关键变量并规避常见误区

相关性分析不仅是数据分析的起点,更是构建预测模型、优化业务决策的重要工具。随着数据规模的扩大和算法的复杂化,掌握这一技能将为后续的机器学习、统计建模等进阶领域奠定坚实基础。

行动建议

  • 尝试用本文方法分析自己的数据集
  • 探索 pandas-profiling 库自动生成分析报告
  • 结合假设检验(如 scipy.stats)增强结果可靠性

数据分析之路永无止境,但每一步的积累都将为你的技术成长增添厚度。

最新发布