Pandas Series.corr() 函数
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,说明学习时间与考试成绩存在强正相关关系。")
# 创建两个 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:几乎无相关")
# 正相关数据:年龄与收入
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 = 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}")
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_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 常用函数