Pandas 相关性分析(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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.4202 | 1.0000 | 0.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)判断相关性是否显著。
结论与展望
通过本文的讲解,读者应能掌握以下核心内容:
- 如何使用 Pandas 计算三种常见相关系数
- 如何通过可视化工具快速解读结果
- 在实际案例中识别关键变量并规避常见误区
相关性分析不仅是数据分析的起点,更是构建预测模型、优化业务决策的重要工具。随着数据规模的扩大和算法的复杂化,掌握这一技能将为后续的机器学习、统计建模等进阶领域奠定坚实基础。
行动建议:
- 尝试用本文方法分析自己的数据集
- 探索
pandas-profiling
库自动生成分析报告 - 结合假设检验(如
scipy.stats
)增强结果可靠性
数据分析之路永无止境,但每一步的积累都将为你的技术成长增添厚度。