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

相关推荐
cainiao08060521 分钟前
Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新
java·大数据·开发语言
瑞雪兆丰年兮26 分钟前
数学实验(Matlab符号运算)
开发语言·算法·matlab·数学实验
chxii28 分钟前
6.2字节流
java·开发语言
八股文领域大手子44 分钟前
Java死锁排查:线上救火实战指南
java·开发语言·面试
Code_流苏1 小时前
《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
python·深度学习·ner·预训练语言模型·关系抽取·统计机器学习·标注方式
点云SLAM1 小时前
Python中列表(list)知识详解(2)和注意事项以及应用示例
开发语言·人工智能·python·python学习·数据结果·list数据结果
国强_dev1 小时前
任意复杂度的 JSON 数据转换为多个结构化的 Pandas DataFrame 表格
开发语言·python
o(╥﹏╥)1 小时前
绑定 SSH key(macos)
开发语言·git·学习·macos
伊织code1 小时前
PyTorch API 7 - TorchScript、hub、矩阵、打包、profile
人工智能·pytorch·python·ai·矩阵·api
小龙Guo1 小时前
QT+opencv实现卡尺工具找圆、拟合圆
开发语言·qt·opencv