Pandas 相关性

相关性是一个统计概念,它量化了两个变量相互关联的程度。

在 Pandas 中,可以使用 corr() 函数计算相关性。

让我们看一个例子。

import pandas as pd

# create dataframe
data = {
    "Temperature": [22, 25, 32, 28, 30],
    "Ice_Cream_Sales": [105, 120, 135, 130, 125]
}

df = pd.DataFrame(data)

# calculate correlation matrix print(df.corr())

输出

                 Temperature  Ice_Cream_Sales
Temperature         1.000000         0.923401
Ice_Cream_Sales     0.923401         1.000000

在本例中,我们在 DataFrame df 上使用了 corr() 方法来计算列之间的相关系数。

输出是一个相关矩阵,显示了 DataFrame 中所有列对之间的相关系数。在本例中,只有两列,所以矩阵是2x2

在这里,TemperatureIce_Cream_Sales 之间的相关系数为0.923401,这是一个正值。这表明随着温度的升高,冰淇淋的销量也随之增加。

对角线上的系数值为1.000000,表示每列与其自身的关联度。


正相关和负相关

正相关是指两个变量之间的一种关系,它们都倾向于朝着同一方向变化。当一个变量增加时,另一个变量也倾向于增加;当一个变量减少时,另一个变量也倾向于减少。

Graph Showing Positive Correlation Between Temperature and Ice Cream Sales
正相关

在上图中,我们可以清楚地看到,随着温度的升高,冰淇淋的销量也在增加。我们可以说温度和冰淇淋销量之间存在正相关。

另一方面,负相关是指两个变量之间的一种关系,它们倾向于朝着相反的方向变化。当一个变量增加时,另一个变量倾向于减少,反之亦然。

Graph Showing Negative Correlation Between Temperature and Coffee Sales
负相关

在上图中,随着温度的升高,咖啡的销量在下降。我们可以说温度和咖啡销量之间存在负相关。


示例:两列之间的相关性

我们可以指定要计算相关性的列,而不是查找整个相关矩阵。

import pandas as pd

# create dataframe
data = {
    "Temperature": [22, 25, 32, 28, 30],
    "Ice_Cream_Sales": [105, 120, 135, 130, 125]
}

df = pd.DataFrame(data)

# calculate correlation coefficient correlation = df['Temperature'].corr(df["Ice_Cream_Sales"])
print(correlation)

输出

0.9234007664064656

在本例中,我们计算了 TemperatureIce_Cream_Sales 之间的相关性。

执行此操作的语法是

df['column1'].corr(df['column2'])

示例:缺失值

DataFrame 可能包含缺失值(NaN)。corr() 函数会完全忽略包含 NaN 值的行。

import pandas as pd
import numpy as np

# create a dataframe
data = {
    "Temperature": [22, 25, 32, 28, 30],
    "Coffee_Sales": [158, 145, np.nan, np.nan, 140]
}

df = pd.DataFrame(data)

# calculate correlation between Temperature and Ice_Cream_sales
correlation1 = df["Temperature"].corr(df["Coffee_Sales"])

print("With NaN values")
print(df)
print(f"correlation = {correlation1}")
print()

# remove missing values
df.dropna(inplace=True)

# calculate correlation between Temperature and Ice_Cream_sales
correlation2 = df["Temperature"].corr(df["Coffee_Sales"])

print("Without NaN values")
print(df)
print(f"correlation = {correlation2}")
print()

输出

With NaN values
   Temperature  Coffee_Sales
0           22         158.0
1           25         145.0
2           32           NaN
3           28           NaN
4           30         140.0
correlation = -0.923177938058926

Without NaN values
   Temperature  Coffee_Sales
0           22         158.0
1           25         145.0
4           30         140.0
correlation = -0.923177938058926

请注意,相关值在删除 NaN 值之前和之后是相同的。这意味着 corr() 会完全忽略 NaN 值。

我们使用了 NumPy 库来生成 NaN 值。


Pandas 中的相关性方法

我们可以使用 Pandas 中的三种不同方法来计算相关性

  • Pearson 方法(默认):评估两个连续变量之间的线性关系
  • Kendall 方法:衡量两个测量量之间的序数关联
  • Spearman 方法:评估两个连续变量或有序变量之间的单调关系

默认情况下,corr() 计算 Pearson 相关系数,它衡量两个变量之间的线性关系。


示例:Pearson、Kendall 和 Spearman 方法

import pandas as pd

# create dataframe
data = {
    "Temperature": [22, 25, 32, 28, 30],
    "Ice_Cream_Sales": [105, 120, 135, 130, 125]
}

df = pd.DataFrame(data)

# calculate different correlation coefficients pearson = df['Temperature'].corr(df["Ice_Cream_Sales"]) kendall = df['Temperature'].corr(df["Ice_Cream_Sales"], method='kendall') spearman = df['Temperature'].corr(df["Ice_Cream_Sales"], method='spearman')
# display different correlation coefficient print(f"Pearson's Coefficient: {pearson}") print(f"Kendall's Coefficient: {kendall}") print(f"Spearman's Coefficient: {spearman}")

输出

Pearson's Coefficient: 0.9234007664064656
Kendall's Coefficient: 0.7999999999999999
Spearman's Coefficient: 0.8999999999999998

在此,Pearson 系数的数值最高,这表明相关性主要是线性的。


完美、良好和差的相关性

我们可以将相关值解释为

完美相关

完美的正相关意味着,一个变量的每一次增加,另一个变量都会相应地增加,以系数 +1 表示。

完美的负相关,用 -1 表示,意味着一个变量的增加会导致另一个变量成比例地减少。

Graph Showing
完美的负相关

良好的相关性

良好的相关性范围可以从 0.5 到 0.9(正或负),通常表示变量之间存在很强的关系,但并不意味着关系是完美的。

Graph Showing
良好的负相关

差的相关性

差的相关性通常接近于零,这表明两个变量之间没有关系或任何形式的依赖关系。

Graph Showing
差的相关性

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战