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),那么这些特征之间存在多重共线性问题。在回归分析中,多重共线性会导致模型的不稳定性和预测不准确。可以通过删除或合并相关性较高的特征来解决多重共线性问题。

相关推荐
pianmian110 分钟前
python二级每日十题(1)
开发语言·python
爱康代码11 分钟前
【C语言精选函数结构体代码题】
c语言·开发语言
SongYuLong的博客1 小时前
C# WPF编程-边框控件(Border)
开发语言·c#·wpf
活跃家族1 小时前
Python的类和对象(4)
linux·开发语言·python
谷晓光2 小时前
python打印输出到文件
java·linux·python
L_cl6 小时前
【Python 算法零基础 1.线性枚举】
python·算法
apcipot_rain8 小时前
【密码学——基础理论与应用】李子臣编著 第四章 SM4分组密码算法 课后习题
python·密码学
无名之逆9 小时前
Hyperlane:Rust 生态中的轻量级高性能 HTTP 服务器库,助力现代 Web 开发
服务器·开发语言·前端·后端·http·面试·rust
江沉晚呤时9 小时前
使用 .NET Core 实现 RabbitMQ 消息队列的详细教程
开发语言·后端·c#·.netcore
大模型铲屎官9 小时前
从零精通机器学习:线性回归入门
开发语言·人工智能·python·算法·机器学习·回归·线性回归