Python Pandas(9):Pandas 相关性分析

1 什么是相关性?

相关性分析是数据分析中常见且重要的一步,它帮助我们理解数据中不同变量之间的关系。在 Pandas 中,数据相关性分析是通过计算不同变量之间的相关系数来了解它们之间的关系。数据相关性是一项重要的分析任务,它帮助我们理解数据中各个变量之间的关系。Pandas 提供了多种方法来计算和分析数据的相关性,常见的相关性方法包括皮尔逊相关系数(Pearson)、斯皮尔曼等级相关系数(Spearman)以及肯德尔秩相关系数(Kendall)。

以下相关性方法可以帮助我们揭示变量之间的线性关系、非线性关系或单调关系:

  • 皮尔逊相关系数:衡量变量之间的线性关系,适用于数值型变量。
  • 斯皮尔曼等级相关系数:衡量变量之间的单调关系,适用于数值型和顺序型变量。
  • 肯德尔秩相关系数:衡量变量之间的秩次关系,适用于小样本数据。
  • 相关性矩阵:用来查看各个变量之间的相关性。
  • 热图:一种有效的可视化方式,可以帮助我们直观地查看变量之间的相关性。

相关性表示两个或多个变量之间的关系强度和方向。根据相关性的数值,可以判断变量之间的关系。

  • 正相关:当一个变量增加时,另一个变量也增加。例如,身高和体重之间可能存在正相关关系。
  • 负相关:当一个变量增加时,另一个变量减少。例如,气温和取暖的使用量之间可能存在负相关关系。
  • 无相关性:两个变量之间没有明确的关系。

相关性的数值范围通常在 -1 到 1 之间:

  • 1:完全正相关
  • -1:完全负相关
  • 0:没有线性相关性
  • 接近 1 或 -1:表示强相关
  • 接近 0:表示弱相关

2 Pandas 中计算相关性的方法

Pandas 提供了 DataFrame.corr()DataFrame.cov() 方法来计算相关性和协方差。Pandas 使用 corr() 方法计算数据集中每列之间的关系。

复制代码
df.corr(method='pearson', min_periods=1)
  • method (可选): 字符串类型,用于指定计算相关系数的方法。默认是 'pearson',还可以选择 'kendall'(Kendall Tau 相关系数)或 'spearman'(Spearman 秩相关系数)。
  • min_periods (可选): 表示计算相关系数时所需的最小观测值数量。默认值是 1,即只要有至少一个非空值,就会进行计算。如果指定了 min_periods,并且在某些列中的非空值数量小于该值,则相应列的相关系数将被设为 NaN。

df.corr() 方法返回一个相关系数矩阵,矩阵的行和列对应数据框的列名,矩阵的元素是对应列之间的相关系数。常见的相关性系数包括 Pearson 相关系数和 Spearman 秩相关系数:

2.1 Pearson 相关系数

Pearson 即皮尔逊相关系数,用于衡量了两个变量之间的线性关系强度和方向,它的取值范围在 -1 到 1 之间,其中 -1 表示完全负相关,1 表示完全正相关,0 表示无线性相关。皮尔逊相关系数用于衡量两个变量之间的线性关系,计算公式为:

Pandas 可以使用 corr() 方法计算数据框中各列之间的 Pearson 相关系数。

python 复制代码
import pandas as pd

# 示例数据
data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}

df = pd.DataFrame(data)

# 计算皮尔逊相关系数
correlation = df.corr(method='pearson')
print(correlation)

corr() 方法计算了每对变量之间的皮尔逊相关系数。method='pearson' 是默认方法,表示计算皮尔逊相关系数。可以看到,HeightWeightAge 都有很强的正相关性。

2.2 斯皮尔曼等级相关系数(Spearman Correlation)

斯皮尔曼相关系数用于衡量两个变量的单调关系(无论是线性还是非线性),它是基于变量的排名计算的。斯皮尔曼相关系数的取值范围与皮尔逊相关系数相同:-1 到 1。

python 复制代码
import pandas as pd

# 示例数据
data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}

df = pd.DataFrame(data)

# 计算斯皮尔曼等级相关系数
spearman_correlation = df.corr(method='spearman')
print(spearman_correlation)

method='spearman' 会计算斯皮尔曼等级相关系数。在这个示例中,由于数据是线性增长的,斯皮尔曼相关系数与皮尔逊相关系数相同。

2.3 肯德尔秩相关系数(Kendall Correlation)

肯德尔秩相关系数也用于衡量变量之间的单调关系,它是通过计算两个变量排名之间的一致性来得出的。肯德尔相关系数的计算较为复杂,适用于较小的数据集。

python 复制代码
import pandas as pd

# 示例数据
data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}

df = pd.DataFrame(data)

# 计算肯德尔秩相关系数
kendall_correlation = df.corr(method='kendall')
print(kendall_correlation)

method='kendall' 会计算肯德尔秩相关系数。在这种情况下,数据的变化是单调的,因此计算结果与皮尔逊和斯皮尔曼相同。

3 相关性热图(Correlation Heatmap)

为了更直观地呈现相关性矩阵,可以使用热图(Heatmap)来可视化各个变量之间的相关性。使用 seaborn 库绘制相关性热图是一个常见的做法。安装 Seaborn:

python 复制代码
pip install seaborn
python 复制代码
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 示例数据
data = {
    'Height': [150, 160, 170, 180, 190],
    'Weight': [45, 55, 65, 75, 85],
    'Age': [20, 25, 30, 35, 40]
}
df = pd.DataFrame(data)
# 绘制相关性热图
plt.figure(figsize=(8, 6))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt='.2f', vmin=-1, vmax=1)
plt.title('Correlation Heatmap')
plt.show()

sns.heatmap() 绘制相关性热图,annot=True 表示在热图上显示数值,cmap='coolwarm' 设置颜色范围,vmin=-1, vmax=1 限制颜色范围为 -1 到 1。

python 复制代码
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 创建一个示例数据框
data = {'A': [1, 2, 3, 4, 5], 'B': [5, 4, 3, 2, 1]}
df = pd.DataFrame(data)

# 计算 Pearson 相关系数
correlation_matrix = df.corr()
# 使用热图可视化 Pearson 相关系数
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.show()

4 相关性分析中的应用

在机器学习建模中,相关性分析常常用于特征选择。通过分析不同特征之间的相关性,可以帮助我们选择与目标变量最相关的特征,并去除与其他特征高度相关的冗余特征,从而提高模型的表现和效率。

如果两个或多个特征之间的相关性非常高(接近 1 或 -1),那么这些特征之间存在多重共线性问题。在回归分析中,多重共线性会导致模型的不稳定性和预测不准确。可以通过删除或合并相关性较高的特征来解决多重共线性问题。

相关推荐
Learner19 小时前
Python数据类型(四):字典
python
White-Camellia19 小时前
Pandas多个数据表合并(merge)
pandas
odoo中国20 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
Jelena1577958579220 小时前
Java爬虫api接口测试
python
代码N年归来仍是新手村成员21 小时前
【Java转Go】即时通信系统代码分析(一)基础Server 构建
java·开发语言·golang
踩坑记录21 小时前
leetcode hot100 3.无重复字符的最长子串 medium 滑动窗口(双指针)
python·leetcode
Z1Jxxx21 小时前
01序列01序列
开发语言·c++·算法
沐知全栈开发21 小时前
C语言中的强制类型转换
开发语言
关于不上作者榜就原神启动那件事1 天前
Java中大量数据Excel导入导出的实现方案
java·开发语言·excel
坚定学代码1 天前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai