跳至主要内容

理解相关性:衡量数据中的关系

学习如何使用相关性识别变量之间的关系。了解不同类型的相关系数及其应用场景。
· 6分钟 阅读

使用 AI 探索

如果您已经学习过我们的协方差教程,您就知道它关注的是两个变量如何共同变化。相关性在此概念上更进一步,通过对度量进行标准化,使您能够在不同数据集之间比较关系。

在本指南中,您将了解什么是相关性(具体来说,我们将重点介绍最常见的皮尔逊相关系数)、它与协方差有何不同,以及如何使用 Python 和 R 计算并解读它。最后,我们还将介绍在不同场景下使用的不同类型的相关性。

想继续提升您的统计技能,别错过我们的Python 统计基础技能路径或R 语言统计学入门课程。

什么是相关性?

相关性衡量两个定量变量之间线性关系的强度和方向。它有助于您理解一个变量的变化如何与另一个变量的变化相关联。

正相关表示当一个变量增加时,另一个变量也倾向于增加。负相关表示当一个变量增加时,另一个变量倾向于减少。

让我列出关键要点:

  • 相关性量化两个变量共同变化的程度。
  • 相关系数的取值范围为 -1 到 1。
  • 取值为 1 表示完全正线性关系。
  • 取值为 -1 表示完全负线性关系。
  • 取值为 0 表示没有线性关系。

皮尔逊相关系数公式

如前所述,皮尔逊相关系数度量两个连续变量之间的线性关系。我还没提到的是:它假设数据为正态分布(更准确地说,它假设变量联合正态分布,即双变量正态性——其中有些微妙之处),并且对离群值敏感。皮尔逊相关系数记作r。

Pearson correlation coefficient formula

其中 xi 和 yi 为各个数据点,x 和 y 为其各自的均值。

在 Python 和 R 中计算皮尔逊相关系数

我们来看如何在 Python 和 R 中计算。

Python 中的相关性

您可以使用 scipy.stats 模块中的 pearsonr() 函数在 Python 中计算皮尔逊相关系数:

import numpy as np
from scipy.stats import pearsonr

# Temperature data in Celsius and corresponding Fahrenheit
temperature_celsius = np.array([0, 10, 20, 30, 40])
temperature_fahrenheit = np.array([32, 50, 68, 86, 104])  # Converted from Celsius

# Calculate Pearson correlation coefficient
correlation_coefficient, p_value = pearsonr(temperature_celsius, temperature_fahrenheit)
print("Pearson correlation coefficient:", correlation_coefficient)
Pearson correlation coefficient: 1.0
p-value: 0.0

输出显示 x_values 与 y_values 之间存在完全正线性关系(因为我们将 y 定义为 2x)。

R 中的相关性

在 R 中,您可以使用 cor() 函数:

temperature_celsius <- c(0, 10, 20, 30, 40)
temperature_fahrenheit <- c(32, 50, 68, 86, 104)  # Converted from Celsius

# Calculate Pearson correlation coefficient
correlation_coefficient <- cor(temperature_celsius, temperature_fahrenheit, method = "pearson")
print(correlation_coefficient)
[1] 1

该输出同样表明存在完全正线性关系,与之前一致。

相关矩阵

相关矩阵展示了数据集中多个变量两两之间的相关系数。它有助于探索多变量数据中的关系。

Python 中的相关矩阵

通常会以矩阵格式(如 pandas DataFrame)表示变量,并直接计算相关矩阵:

import pandas as pd

# Create a DataFrame with two perfectly correlated variables and one that isn't
data = pd.DataFrame({
    'temperature_celsius': [0, 10, 20, 30, 40],
    'temperature_fahrenheit': [32, 50, 68, 86, 104],  # Perfect linear transformation
    'ice_cream_sales': [100, 150, 200, 220, 230]      # Roughly increasing, not perfectly
})

# Calculate the Pearson correlation matrix
correlation_matrix = data.corr(method='pearson')
print(correlation_matrix)
                      temperature_celsius  temperature_fahrenheit  ice_cream_sales
temperature_celsius              1.000000                1.000000         0.993858
temperature_fahrenheit           1.000000                1.000000         0.993858
ice_cream_sales                  0.993858                0.993858         1.000000

该输出显示:

  • temperature_celsius 与 temperature_fahrenheit 之间存在完全正相关(如预期,与之前一致)。

  • ice_cream_sales 与 temperature_celsius 和 temperature_fahrenheit 都存在强但非完全的相关关系。

R 中的相关矩阵

在 R 中,您可以使用之前的 cor() 函数,对数据框或矩阵进行相同的操作:

# Create a data frame with two perfectly correlated variables and one unrelated
data <- data.frame(
  temperature_celsius = c(0, 10, 20, 30, 40),
  temperature_fahrenheit = c(32, 50, 68, 86, 104),  # Perfect conversion from Celsius
  ice_cream_sales = c(100, 150, 200, 220, 230)      # Generally increases, but not perfectly
)

# Calculate the correlation matrix
correlation_matrix <- cor(data, method = "pearson")
print(correlation_matrix)
                      temperature_celsius temperature_fahrenheit ice_cream_sales
temperature_celsius                 1.00                   1.00            0.99
temperature_fahrenheit              1.00                   1.00            0.99
ice_cream_sales                     0.99                   0.99            1.00

该 R 输出与 Python 示例一致,包括:

  • temperature_celsius 与 temperature_fahrenheit 之间的完全正相关。

  • ice_cream_sales 与 temperature_celsius 或 temperature_fahrenheit 之间的强相关关系。

这种矩阵视图特别有助于识别潜在的回归中的多重共线性,或为诸如PCA等降维技术选择变量。

相关性与其他度量

我们看到相关性反映线性关联。现在,让我们谨慎地区分它与一些听起来类似的概念。

相关性 vs. 协方差

相关性和协方差都衡量两个变量如何共同变化,但它们在两个方面不同:尺度和可解释性。

  • 协方差指示线性关系的方向,但无法以标准化的方式反映其强度。其数值取决于变量的计量单位,因而难以在不同数据集间比较。

  • 相关性通过除以变量的标准差对协方差进行标准化,得到介于 -1 与 1 之间的无量纲数值。

相关性 vs. 决定系数 R-squared

R-squared(R²),即决定系数,也容易与相关性混淆。我尤其在分析师尝试解读模型性能时见过这种情况。

  • 相关性(皮尔逊的r)衡量两个变量之间线性关系的强度与方向。

  • R-squared表示在线性回归模型中,一个变量中可由另一个变量预测的方差比例。在简单线性回归中,它等于皮尔逊r的平方。

相关性 vs. 因果性

切勿将相关性等同于因果性!这是一个常见错误。

  • 相关性只表明两个变量共同变化,并不能解释原因。因此它是描述性的,而非解释性的。相关性可能源于巧合、混杂变量或反向因果。

  • 因果性意味着一个变量的变化直接导致另一个变量的变化。关于因果性的讨论应放在受控实验或因果推断技术的语境中。

相关性分析中的常见挑战与错误

务必要注意分析人员常见的误区:

  • 相关不代表因果。我们已讨论过这一点。
  • 离群值会扭曲相关系数。
  • 非线性关系可能无法通过皮尔逊相关系数很好地反映。
  • 相关系数同样对数据取值范围敏感。

其他类型的相关系数

本文介绍了皮尔逊相关系数,因为它直接建立在协方差概念之上,是实践中最常用的度量。但现在让我们看看其他类型。

斯皮尔曼秩相关系数(ρ)

斯皮尔曼秩相关使用秩次值来评估单调关系的强度和方向。它是非参数的,适用于有序数据或非线性但趋势一致的情况。

Spearman rank correlation coefficient formula

其中:

  • di​ = 各观测值秩次之差
  • n = 观测数量

肯德尔秩相关系数(τ)

肯德尔秩相关同样使用秩次衡量单调关系,但基于一致对与不一致对的数量。它在存在并列秩和小样本时更稳健。

Kendall tau coefficient formula

其中:

  • C = 一致对的数量(在两个变量中排序相同的成对观测)
  • D = 不一致对的数量(在两个变量中排序不同的成对观测)
  • n = 观测数量

结论

希望本文对您有所帮助。正如您所见,相关性是理解变量之间关系的基础性数据分析工具。

请务必继续学习我们的课程。我推荐我们的Python 统计基础技能路径,或R 语言统计学入门课程,作为很好的下一步。

Josef Waples

作者

Josef Waples

我是数据科学编辑,曾为科学期刊发表的研究论文撰稿。我的兴趣领域包括线性代数、统计学、R 等相关主题。

Correlation 常见问题

相关性与协方差有什么区别?

协方差衡量两个变量如何共同变化;而相关性对该度量进行了标准化,从而可以在不同数据集间进行比较。相关性同时给出关系的强度与方向,且取值被限定在 -1 到 1 之间。

我该使用哪种相关系数:皮尔逊、斯皮尔曼还是肯德尔?

当您的数据是连续且近似正态分布并存在线性关系时,使用皮尔逊相关;当数据是有序型,或关系为单调但不一定线性时,选择斯皮尔曼相关;当数据集较小且并列秩较多,或您需要更稳健的非参数度量时,肯德尔相关更合适。

如何在 Python 和 R 中计算皮尔逊相关系数?

在 Python 中,使用 scipy.stats 的 pearsonr()。在 R 中,使用 cor() 函数并设置 method = "pearson"。二者均返回介于 -1 与 1 之间的数值。

相关系数能否表明变量之间存在因果关系?

不能。相关性不代表因果性。即使两个变量强相关,也不意味着其中一个导致另一个。混杂变量或巧合也可能产生较高的相关性。

相关性分析中应避免哪些常见错误?

常见陷阱包括:将相关误判为因果、忽视离群值的影响、在非线性关系上使用皮尔逊相关,以及把弱相关解读为有意义。此外,还需考虑数据的取值范围与尺度。

主题