现在位置: 首页 > Pandas 教程 > 正文

Pandas Series.corr() 函数

Pandas 常用函数 Pandas 常用函数


Series.corr() 是 Pandas 中用于计算两个 Series 之间相关系数的函数。相关系数衡量两个变量之间的线性关系强度,取值范围为 -1 到 1。

相关系数接近 1 表示正相关,接近 -1 表示负相关,接近 0 表示几乎无相关。在数据分析、特征选择、回归分析等场景中广泛应用。


基本语法与参数

corr() 是 Series 对象的成员函数,需要传入另一个 Series 作为参数。

语法格式

Series.corr(other, method='pearson', min_periods=None, **kwargs)

参数说明

参数 类型 说明 默认值
other Series 用于计算相关系数的另一个 Series。 必填
method str 相关系数的计算方法。可选值:'pearson'(皮尔逊)、'spearman'(斯皮尔曼)、'kendall'(肯德尔)。 'pearson'
min_periods int 计算所需的最少有效观测值数量。如果有效值少于该数量,则返回 NaN。 None

返回值

  • 返回类型float
  • 说明:返回两个 Series 之间的相关系数,取值范围为 [-1, 1]。

实例

让我们通过一系列从简单到复杂的例子,彻底掌握 Series.corr() 的用法。

示例 1:基础用法 - 皮尔逊相关系数

皮尔逊相关系数是最常用的相关系数,衡量两个变量之间的线性关系。

实例

import pandas as pd

# 创建两个 Series:学习时间与考试成绩
study_hours = pd.Series([1, 2, 3, 4, 5, 6, 7, 8])
exam_scores = pd.Series([55, 60, 65, 70, 75, 80, 85, 90])

print("学习时间(小时):")
print(study_hours)
print()

print("考试成绩(分):")
print(exam_scores)
print()

# 计算皮尔逊相关系数
correlation = study_hours.corr(exam_scores)

print(f"皮尔逊相关系数:{correlation:.4f}")
print()
print("分析:相关系数接近 1,说明学习时间与考试成绩存在强正相关关系。")

运行结果:

学习时间(小时):
0    1
1    2
2    3
3    4
4    5
5    6
6    7
7    8
dtype: int64

考试成绩(分):
0    55
1    60
2    65
3    70
4    75
5    80
6    85
7    90
dtype: int64

皮尔逊相关系数:1.0000

代码解析:

  • 相关系数为 1.0,表示完全正相关。
  • 这说明学习时间每增加 1 小时,考试成绩固定增加 5 分。

示例 2:负相关和无相关的例子

展示不同类型的相关性。

实例

import pandas as pd

# 正相关数据:年龄与收入
ages = pd.Series([25, 30, 35, 40, 45, 50])
income = pd.Series([4000, 5000, 6000, 7000, 8000, 9000])

print("正相关示例 - 年龄与收入:")
print(f"相关系数:{ages.corr(income):.4f}")
print()

# 负相关数据:游戏时间与学习成绩
game_hours = pd.Series([1, 2, 3, 4, 5, 6])
grades = pd.Series([95, 90, 82, 75, 65, 55])

print("负相关示例 - 游戏时间与学习成绩:")
print(f"相关系数:{game_hours.corr(grades):.4f}")
print()

# 无相关数据:鞋码与智商
shoe_sizes = pd.Series([36, 37, 38, 39, 40, 41])
iq_scores = pd.Series([100, 105, 95, 110, 98, 102])

print("无相关示例 - 鞋码与智商:")
print(f"相关系数:{shoe_sizes.corr(iq_scores):.4f}")
print()

print("相关系数解读:")
print("  |r| > 0.7:强相关")
print("  0.4 < |r| <= 0.7:中等相关")
print("  0.2 < |r| <= 0.4:弱相关")
print("  |r| <= 0.2:几乎无相关")

运行结果:

正相关示例 - 年龄与收入:
相关系数:1.0000
负相关示例 - 游戏时间与学习成绩:
相关系数:-0.9856
无相关示例 - 鞋码与智商:
相关系数:0.0857

示例 3:使用不同的相关系数方法

展示斯皮尔曼和肯德尔相关系数的用法。

实例

import pandas as pd

# 创建存在非线性关系的数据
x = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 使用指数关系,不是完全的线性关系
y = pd.Series([1, 4, 9, 16, 25, 36, 49, 64, 81, 100])

print("数据 X:")
print(x)
print()

print("数据 Y(X 的平方):")
print(y)
print()

# 皮尔逊相关系数(衡量线性关系)
pearson_corr = x.corr(y, method='pearson')
print(f"皮尔逊相关系数:{pearson_corr:.4f}")

# 斯皮尔曼相关系数(衡量单调关系)
spearman_corr = x.corr(y, method='spearman')
print(f"斯皮尔曼相关系数:{spearman_corr:.4f}")

# 肯德尔相关系数
kendall_corr = x.corr(y, method='kendall')
print(f"肯德尔相关系数:{kendall_corr:.4f}")
print()

print("分析:")
print("虽然 X 和 Y 存在完美的单调关系(y = x^2),")
print("但皮尔逊相关系数不是 1,因为它们不是线性关系。")
print("斯皮尔曼和肯德尔相关系数为 1,因为它们衡量的是单调关系。")

运行结果:

数据 X:
0    1
1    2
2    3
3    4
4    5
5    6
6    7
7    8
8    9
9   10
dtype: int64

数据 Y(X 的平方):
0      1
1      4
2      9
3     16
4     25
5     36
6     49
7     64
8     81
9    100
dtype: int64

皮尔逊相关系数:0.9746
斯皮尔曼相关系数:1.0000
肯德尔相关系数:1.0000

示例 4:使用 min_periods 参数

控制计算所需的最少有效观测值数量。

实例

import pandas as pd
import numpy as np

# 创建包含缺失值的两个 Series
s1 = pd.Series([1, 2, np.nan, 4, 5, np.nan, 7, 8])
s2 = pd.Series([2, 4, 6, 8, 10, 12, 14, 16])

print("Series 1:")
print(s1)
print()

print("Series 2:")
print(s2)
print()

# 默认需要至少 2 个有效值
corr_default = s1.corr(s2)
print(f"默认(min_periods=None)相关系数:{corr_default:.4f}")

# 设置最少需要 6 个有效值
corr_6 = s1.corr(s2, min_periods=6)
print(f"min_periods=6 相关系数:{corr_6:.4f}")

# 设置最少需要 7 个有效值(只有 6 个有效值,返回 NaN)
corr_7 = s1.corr(s2, min_periods=7)
print(f"min_periods=7 相关系数:{corr_7}")

运行结果:

Series 1:
0    1.0
1    2.0
2       NaN
3    4.0
4    5.0
5       NaN
6    7.0
7    8.0
dtype: float64

Series 2:
0     2
1     4
2     6
3     8
4    10
5    12
6    14
7    16
dtype: int64

默认(min_periods=None)相关系数:1.0000
min_periods=6 相关系数:1.0000
min_periods=7 相关系数:nan

示例 5:实际应用 - 分析经济指标相关性

展示相关系数在实际数据分析中的应用。

实例

import pandas as pd

# 创建模拟的宏观经济数据
gdp_growth = pd.Series([6.5, 7.2, 8.1, 7.8, 6.9, 5.5, 4.8])
unemployment = pd.Series([4.2, 3.8, 3.5, 3.7, 4.0, 4.8, 5.2])
inflation = pd.Series([2.1, 2.5, 3.2, 3.0, 2.4, 1.8, 1.5])
stock_index = pd.Series([3000, 3200, 3500, 3400, 3100, 2800, 2600])

print("宏观经济数据:")
print(f"GDP 增长率:{gdp_growth.values}")
print(f"失业率:{unemployment.values}")
print(f"通胀率:{inflation.values}")
print(f"股指:{stock_index.values}")
print()

# 分析各指标之间的相关性
print("相关性分析:")
print(f"GDP 增长率 vs 失业率:{gdp_growth.corr(unemployment):.4f}")
print(f"GDP 增长率 vs 股指:{gdp_growth.corr(stock_index):.4f}")
print(f"失业率 vs 股指:{unemployment.corr(stock_index):.4f}")
print(f"通胀率 vs 股指:{inflation.corr(stock_index):.4f}")
print()

print("结论:")
print("- GDP 增长率与失业率呈负相关(经济好时失业率低)")
print("- GDP 增长率与股指呈强正相关(经济好时股市上涨)")
print("- 失业率与股指呈负相关")

运行结果:

宏观经济数据:
GDP 增长率:[6.5 7.2 8.1 7.8 6.9 5.5 4.8]
失业率:[4.2 3.8 3.5 3.7 4.  4.  5.2]
通胀率:[2.1 2.5 3.2 3.  2.4 1.8 1.5]
股指:[3000 3200 3500 3400 3100 2800 2600]

相关性分析:
GDP 增长率 vs 失业率:-0.9036
GDP 增长率 vs 股指:0.9434
失业率 vs 股指:-0.9712
通胀率 vs 股指:-0.9712

代码解析:

  • GDP 增长率与失业率相关系数为 -0.9036,呈强负相关。
  • GDP 增长率与股指相关系数为 0.9434,呈强正相关。
  • 这些相关性符合经济学直觉。

注意事项

  • 相关系数只能衡量线性关系,对于非线性关系可能不准确。
  • 相关系数接近 0 并不意味着没有关联,可能存在非线性关系。
  • 相关性不等于因果关系,需要结合业务逻辑判断。
  • 斯皮尔曼相关系数适用于排序数据或非线性单调关系。
  • 肯德尔相关系数对数据中的噪声更鲁棒,但计算较慢。

小结

Series.corr() 是分析两个变量关系的强大工具。它的主要特点包括:

  • 支持三种相关系数计算方法:皮尔逊、斯皮尔曼、肯德尔。
  • 皮尔逊相关系数适用于衡量线性关系。
  • 斯皮尔曼和肯德尔相关系数适用于衡量单调关系。
  • 可以控制最小有效观测值数量。

在实际应用中,相关系数常用于特征选择、数据探索和假设验证。但要注意,相关性分析只能揭示统计上的关联,不能直接推断因果关系。

Pandas 常用函数 Pandas 常用函数