Pearson 相关系数的可视化辅助判断和怎么用
flyfish
Pearson 相关系数 是一种用于衡量两个连续型变量之间线性相关程度的统计量。其定义为两个变量协方差与标准差的乘积的比值。公式如下:
r
=
∑
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
(
x
i
−
x
ˉ
)
2
∑
(
y
i
−
y
ˉ
)
2
r = \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum (x_i - \bar{x})^2 \sum (y_i - \bar{y})^2}}
r=∑(xi−xˉ)2∑(yi−yˉ)2∑(xi−xˉ)(yi−yˉ)
其中:
-
x i x_i xi 和 y i y_i yi 分别是变量 X 和 Y 的观测值。
-
x ˉ \bar{x} xˉ 和 y ˉ \bar{y} yˉ 分别是 X 和 Y 的均值。
取值范围为 [-1, 1]:
-
1 表示完全正相关。
-
-1 表示完全负相关。
-
0 表示无线性相关。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 生成样本数据
np.random.seed(0)
x = np.random.randn(100)
y1 = 2 * x + np.random.randn(100) # 正相关
y2 = -2 * x + np.random.randn(100) # 负相关
data = pd.DataFrame({'x': x, 'y1': y1, 'y2': y2})
# 绘图
plt.figure(figsize=(12, 6))
# 正相关
plt.subplot(1, 2, 1)
sns.regplot(x='x', y='y1', data=data, scatter_kws={'color': 'blue'}, line_kws={'color': 'red'})
plt.title('Positive Correlation')
# 负相关
plt.subplot(1, 2, 2)
sns.regplot(x='x', y='y2', data=data, scatter_kws={'color': 'blue'}, line_kws={'color': 'red'})
plt.title('Negative Correlation')
plt.show()
在零均值化处理之后,Pearson 相关系数的计算公式与 Cosine 相似度的计算公式本质上变得相同
可视化辅助判断相关性
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics.pairwise import cosine_similarity
# 生成样本数据
np.random.seed(0)
x = np.random.randn(100)
y1 = 2 * x + np.random.randn(100) # 正相关
y2 = -2 * x + np.random.randn(100) # 负相关
y = 0.5 * x**2 + np.random.randn(100) # 非线性相关
data = pd.DataFrame({'x': x, 'y1': y1, 'y2': y2, 'y': y})
# 绘图
plt.figure(figsize=(18, 6))
# 正相关
plt.subplot(1, 3, 1)
sns.regplot(x='x', y='y1', data=data, scatter_kws={'color': 'blue'}, line_kws={'color': 'red'})
plt.title('Positive Correlation')
# 负相关
plt.subplot(1, 3, 2)
sns.regplot(x='x', y='y2', data=data, scatter_kws={'color': 'blue'}, line_kws={'color': 'red'})
plt.title('Negative Correlation')
# 非线性相关
plt.subplot(1, 3, 3)
sns.scatterplot(x='x', y='y', data=data, color='blue')
plt.title('Nonlinear Correlation')
plt.show()
# 热图(Heatmap)
corr_matrix = data.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Matrix Heatmap')
plt.show()
# 散点图矩阵(Pair Plot)
sns.pairplot(data)
plt.show()
# 计算 Pearson 相关系数与 Cosine 相似度
x_mean = x - np.mean(x)
y_mean = y1 - np.mean(y1)
pearson_corr = np.corrcoef(x, y1)[0, 1]
cosine_sim = cosine_similarity([x_mean], [y_mean])[0, 0]
print(f'Pearson 相关系数: {pearson_corr}')
print(f'Cosine 相似度: {cosine_sim}')
Pearson 相关系数与Cosine 相似度 的比较
Pearson 相关系数
Pearson 相关系数衡量的是两个变量之间的线性相关性,具体公式为:
r
=
∑
(
x
i
−
x
ˉ
)
(
y
i
−
y
ˉ
)
∑
(
x
i
−
x
ˉ
)
2
∑
(
y
i
−
y
ˉ
)
2
r = \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum (x_i - \bar{x})^2 \sum (y_i - \bar{y})^2}}
r=∑(xi−xˉ)2∑(yi−yˉ)2∑(xi−xˉ)(yi−yˉ)其中,
x
i
x_i
xi 和
y
i
y_i
yi 是变量
X
X
X 和
Y
Y
Y 的观测值,
x
ˉ
\bar{x}
xˉ 和
y
ˉ
\bar{y}
yˉ 分别是
X
X
X 和
Y
Y
Y 的均值。
Pearson 相关系数的取值范围是 [-1, 1]:
-
1 表示完全正相关。
-
-1 表示完全负相关。
-
0 表示没有线性相关性。
Cosine 相似度
Cosine 相似度主要用于衡量两个向量在向量空间中的方向相似度,公式为:
Cosine Similarity
=
∑
x
i
y
i
∑
x
i
2
∑
y
i
2
\text{Cosine Similarity} = \frac{\sum x_i y_i}{\sqrt{\sum x_i^2 \sum y_i^2}}
Cosine Similarity=∑xi2∑yi2∑xiyi
取值范围是 [0, 1]:
-
1 表示两个向量完全同向。
-
0 表示两个向量完全不相关。
当向量经过零均值化处理后,对两个变量 X X X 和 Y Y Y 进行零均值化处理(即将它们的均值减去),那么 Pearson 相关系数和 Cosine 相似度是相等的。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 生成样本数据
np.random.seed(0)
x = np.random.randn(100)
y = 2 * x + np.random.randn(100)
# 0 均值化
x_mean = x - np.mean(x)
y_mean = y - np.mean(y)
# 计算 Pearson 相关系数
pearson_corr = np.corrcoef(x, y)[0, 1]
# 计算 Cosine 相似度
cosine_sim = cosine_similarity([x_mean], [y_mean])[0, 0]
print(f'Pearson 相关系数: {pearson_corr}')
print(f'Cosine 相似度: {cosine_sim}')
Pearson 相关系数: 0.9006752160894267
Cosine 相似度: 0.9006752160894267
Pearson 相关系数的使用条件
-
线性关系:
Pearson 相关系数适用于度量两个变量之间的线性关系。如果变量之间的关系是非线性的,Pearson 相关系数可能无法准确反映它们的相关性。 -
连续变量:
适用于连续型变量。对于分类变量或离散型变量,应该使用其他相关性度量方法,如 Spearman 相关系数或 Kendall 相关系数。 -
正态分布:
变量应该大致符合正态分布。如果变量显著偏离正态分布,可以考虑进行数据变换(如对数变换)或使用非参数方法(如 Spearman 相关系数)。 -
独立性:
变量应该是独立的。相关系数度量的是两个变量之间的关系,而不是因果关系。因此,两个变量的独立性是一个基本假设。 -
方差不为零:
变量的方差不应该为零。如果一个变量的方差为零,那么所有观测值都是相同的,无法计算相关性。
Pearson 相关系数的使用注意事项
-
敏感性:
Pearson 相关系数对异常值非常敏感。少量的异常值可能会显著影响相关系数的值,因此在计算相关系数之前,应处理异常值(如删除或平滑处理)。 -
线性相关性:
Pearson 相关系数只能度量线性相关性。如果两个变量之间存在复杂的非线性关系,Pearson 相关系数可能无法准确反映它们的相关性。应结合散点图等可视化手段来判断是否存在线性关系。 -
范围限制:
Pearson 相关系数的取值范围在 [-1, 1] 之间。绝对值接近 1 表示强线性相关性,接近 0 表示弱线性相关性。然而,接近 0 的相关系数并不一定意味着变量之间没有关系,可能存在非线性关系。 -
数据清洗:
在计算相关系数之前,需对数据进行清洗,包括处理缺失值、异常值和确保数据满足正态分布等条件。 -
样本大小:
Pearson 相关系数的可靠性依赖于样本大小。较小的样本可能导致不稳定的相关系数,因此需要足够大的样本量以获得可靠的估计。 -
因果关系:
Pearson 相关系数只能反映变量之间的相关性,不能推断因果关系。即使两个变量之间存在高相关性,也不能直接说明一个变量导致了另一个变量的变化。