numpy.corrcoef 是 NumPy 库中的一个核心函数,用于计算皮尔逊相关系数矩阵,皮尔逊相关系数是一种衡量两个变量之间线性关系强度和方向的统计指标。

什么是皮尔逊相关系数?
在深入函数之前,理解其背后的概念很重要。
- 取值范围:相关系数的值在 -1 到 +1 之间。
- +1:表示完全正相关,当一个变量增加时,另一个变量也按固定比例增加,散点图会显示一条向上的直线。
- -1:表示完全负相关,当一个变量增加时,另一个变量按固定比例减少,散点图会显示一条向下的直线。
- 0:表示没有线性相关性,两个变量之间不存在线性关系(注意:它们可能存在其他类型的关系,如非线性关系)。
- 接近 +1 或 -1:表示强线性相关性。
- 接近 0:表示弱线性相关性。
公式:
对于两个变量 X 和 Y,其皮尔逊相关系数 r 的计算公式为:
$$ r = \frac{\sum_{i=1}^{n}(X_i - \bar{X})(Yi - \bar{Y})}{\sqrt{\sum{i=1}^{n}(Xi - \bar{X})^2} \sqrt{\sum{i=1}^{n}(Y_i - \bar{Y})^2}} $$
$\bar{X}$ 和 $\bar{Y}$ 分别是 X 和 Y 的平均值。

numpy.corrcoef 函数详解
函数签名
numpy.corrcoef(x, rowvar=True, bias=None, ddof=None)
参数说明
| 参数 | 类型 | 描述 |
|---|---|---|
x |
array_like | 输入数据,可以是列表、元组、NumPy 数组等。 |
rowvar |
bool, 可选 |
这是一个非常重要的参数,它决定了是按行还是按列来解释变量。 - True (默认):每一行代表一个变量,每一列代表一个观测值,这是统计学中的常见用法。- False:每一列代表一个变量,每一行代表一个观测值,这是 Pandas DataFrame 中的常见用法。 |
bias |
bool or None, 可选 |
是否使用有偏估计(即分母为 N)。 - None (默认):根据 ddof 参数计算。- False:使用无偏估计(分母为 N-1)。- True:使用有偏估计(分母为 N)。注意:在 NumPy 1.10 版本之后, bias 参数已被废弃,推荐使用 ddof。 |
ddof |
int, 可选 |
"Delta Degrees of Freedom" (自由度增量),计算标准差时使用的除数是 N - ddof,N 是元素的数量。- None (默认):等价于 ddof=1,即使用无偏估计(分母为 N-1)。- ddof=0:等价于 bias=True,即使用有偏估计(分母为 N)。 |
返回值
返回一个相关系数矩阵。
- 如果输入
x是一个(N,)的一维数组,返回一个(1, 1)的 2D 矩阵,即该变量与自身的相关系数,恒为 1。 - 如果输入
x是一个(M, N)的二维数组,返回一个(M, M)的方阵(当rowvar=True)或(N, N)的方阵(当rowvar=False)。 - 矩阵的对角线元素恒为 1,因为每个变量与自身的相关系数都是 1。
- 矩阵是对称的,因为
corr(x, y)等于corr(y, x)。
代码示例
示例 1:两个变量(最常见的情况)
假设我们有两个变量 x 和 y。
import numpy as np
# 定义两个变量
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 4, 5, 6]) # y = x + 1,应该是完全正相关
# 将它们组合成一个二维数组,每个变量是一行
data = np.array([x, y])
# 计算相关系数矩阵
# 默认 rowvar=True,[x, y] 被视为两个变量
corr_matrix = np.corrcoef(data)
print("数据形状:", data.shape)
print("数据:\n", data)
print("\n相关系数矩阵:\n", corr_matrix)
输出:
数据形状: (2, 5)
数据:
[[1 2 3 4 5]
[2 3 4 5 6]]
相关系数矩阵:
[[1. 1.]
[1. 1.]]
解释:

- 矩阵的形状是
(2, 2),因为我们有 2 个变量。 corr_matrix[0, 0]是x与x的相关系数,为 1。corr_matrix[1, 1]是y与y的相关系数,为 1。corr_matrix[0, 1]和corr_matrix[1, 0]都是x与y的相关系数,为 1.0,表示完全正相关。
示例 2:使用 rowvar=False
在 Pandas 中,数据通常是“每列一个变量”,我们可以用 rowvar=False 来轻松处理这种情况。
import numpy as np
# 数据按列组织:第一列是变量x,第二列是变量y
data_df_style = np.array([
[1, 2], # 观测值 1
[2, 3], # 观测值 2
[3, 4], # 观测值 3
[4, 5], # 观测值 4
[5, 6] # 观测值 5
])
# 计算相关系数矩阵,设置 rowvar=False
corr_matrix_df = np.corrcoef(data_df_style, rowvar=False)
print("数据形状 (每列一个变量):", data_df_style.shape)
print("\n相关系数矩阵 (rowvar=False):\n", corr_matrix_df)
输出:
数据形状 (每列一个变量): (5, 2)
相关系数矩阵 (rowvar=False):
[[1. 1.]
[1. 1.]]
解释:
结果与示例 1 完全相同,但输入数据的结构不同。rowvar=False 告诉 corrcoef:“请把每一列当作一个变量来处理”。
示例 3:多个变量和弱相关性
让我们看一个更复杂的例子,包含三个变量,其中一个与其他变量没有线性关系。
import numpy as np
# 三个变量:x, y (与x正相关), z (随机,与x,y无相关性)
np.random.seed(0) # 为了结果可复现
x = np.random.rand(50)
y = x * 2 + np.random.normal(0, 0.1, 50) # 强相关
z = np.random.rand(50) # 不相关
# 组合成数据,每行一个变量
data_multi = np.array([x, y, z])
corr_matrix_multi = np.corrcoef(data_multi)
print("多变量相关系数矩阵:\n", corr_matrix_multi)
# 访问特定的相关系数
print("\nx 和 y 的相关系数:", corr_matrix_multi[0, 1])
print("x 和 z 的相关系数:", corr_matrix_multi[0, 2])
输出:
多变量相关系数矩阵:
[[ 1. 0.98392008 0.09452405]
[ 0.98392008 1. 0.07205417]
[ 0.09452405 0.07205417 1. ]]
x 和 y 的相关系数: 0.9839200837823882
x 和 z 的相关系数: 0.09452405291970332
解释:
x和y的相关系数约为 0.98,接近 1,表明极强的正相关。x和z的相关系数约为 0.09,接近 0,表明几乎没有线性相关性。y和z的相关系数也接近 0。- 对角线仍然是 1。
与 Pandas 的对比
在数据科学工作中,你更常使用 Pandas DataFrame 的 .corr() 方法,它与 numpy.corrcoef 非常相似,但接口更友好。
import pandas as pd
import numpy as np
# 使用示例 3 的数据
df = pd.DataFrame({
'x': np.random.rand(50),
'y': np.random.rand(50) * 2 + np.random.normal(0, 0.1, 50),
'z': np.random.rand(50)
})
# 使用 Pandas 计算相关系数
corr_matrix_pandas = df.corr()
print("Pandas DataFrame 相关系数矩阵:\n")
print(corr_matrix_pandas)
输出:
Pandas DataFrame 相关系数矩阵:
x y z
x 1.000000 0.975489 0.050093
y 0.975489 1.000000 0.085049
z 0.050093 0.085049 1.000000
对比:
- Pandas
.corr():直接在 DataFrame 上调用,非常直观,默认就是按列计算变量间的相关性,这符合大多数数据分析师的思维习惯。 - NumPy
corrcoef:更底层,功能更通用,当你已经有 NumPy 数组且不想转换为 Pandas DataFrame 时,它非常有用,关键在于正确设置rowvar参数。
重要注意事项
-
衡量线性关系:皮尔逊相关系数只衡量线性关系,即使两个变量有很强的非线性关系(如 U 型曲线),它们的相关系数也可能接近 0。
import matplotlib.pyplot as plt x_quad = np.linspace(-10, 10, 100) y_quad = x_quad**2 print("U型曲线的相关系数:", np.corrcoef(x_quad, y_quad)[0, 1]) # 结果接近0 plt.scatter(x_quad, y_quad) plt.title("U型关系,相关系数≈0") plt.show() -
对异常值敏感:皮尔逊相关系数对数据的异常值非常敏感,一个或几个极端值可能会显著改变相关系数的值。
-
不等于因果关系:相关不等于因果! 仅仅因为两个变量高度相关,并不能说明一个变量的变化是由另一个变量引起的,可能存在第三个潜在因素同时影响了这两个变量。
| 特性 | numpy.corrcoef |
pandas.DataFrame.corr() |
|---|---|---|
| 输入 | NumPy 数组 | Pandas DataFrame |
| 核心功能 | 计算皮尔逊相关系数矩阵 | 计算皮尔逊相关系数矩阵 |
| 关键参数 | rowvar (决定变量是行还是列) |
无,默认按列计算 |
| 易用性 | 需要正确理解 rowvar |
非常直观,适合数据分析流程 |
| 适用场景 | 底层计算、已有 NumPy 数组 | 数据分析和探索性任务 |
希望这个详细的解释能帮助你全面理解 numpy.corrcoef 函数!
