相关性(Correlation)是统计学中用来衡量两个变量之间关系的一种指标。它描述了两个变量在多大程度上以及以何种方式共同变化。相关性可以帮助我们理解变量之间的依赖性和预测关系。
相关系数
相关性的常用指标是相关系数,通常取值在 -1 和 1 之间:
- 1 表示完全正相关:当一个变量增加时,另一个变量也以线性方式增加。
- 0 表示无相关性:两个变量之间没有线性关系。
- -1 表示完全负相关:当一个变量增加时,另一个变量以线性方式减少。
需要注意的是,相关系数仅衡量线性关系,如果两个变量之间存在非线性关系,相关系数可能无法准确反映其依赖性。
常用的相关系数
1. 皮尔逊相关系数(Pearson Correlation Coefficient)
- 计算线性关系的强度和方向。
- 公式:
- 要求:变量之间是线性关系,并且数据是连续的和正态分布的。
2. 斯皮尔曼秩相关系数(Spearman’s Rank Correlation Coefficient)
- 计算两个变量的秩序关系,不要求线性关系。
- 公式:
其中 是两个变量的秩之差, 是样本数量。
3. 肯德尔秩相关系数(Kendall’s Tau Coefficient)
- 衡量两个变量秩序关系的一致性。
- 公式:
其中 是一致对, 是不一致对, 和 是重复值的对数。
相关系数矩阵
假设我们有两个变量 和 ,使用 np.corrcoef(x, y)
计算相关系数矩阵,得到:
其中:
- 第一个元素 是 与 的相关系数,自相关性为 1。
- 第二个元素 是 与 的相关系数,即我们通常关心的相关系数 。
- 第三个元素 是 与 的相关系数,与 相同,即 。
- 第四个元素 是 与 的相关系数,自相关性为 1。
计算步骤
以皮尔逊相关系数为例,计算步骤如下:
- 计算每个变量的均值 和 。
- 计算每个数据点的偏差 和 。
- 计算偏差的乘积和 。
- 计算每个变量的偏差平方和 和 。
- 代入公式计算相关系数 。
示例
假设有以下数据:
x | y |
---|---|
1 | 2 |
2 | 3 |
3 | 5 |
4 | 4 |
5 | 6 |
计算皮尔逊相关系数:
-
计算均值:
-
计算偏差:
-
计算偏差乘积和:
-
计算 的偏差平方和:
-
计算 的偏差平方和:
-
计算相关系数:
Python 代码示例
import numpy as np
# 数据点
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 4, 6])
# 计算皮尔逊相关系数
correlation = np.corrcoef(x, y)[0, 1]
print(f'Pearson correlation coefficient: {correlation}')](<import numpy as np
# 数据点
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 4, 6])
# 计算相关系数矩阵
# np.corrcoef 返回一个相关系数矩阵,其中 [0, 0] 和 [1, 1] 是自相关系数,值为 1
# [0, 1] 和 [1, 0] 是 x 和 y 之间的相关系数
corr_matrix = np.corrcoef(x, y)
# 打印相关系数矩阵以便查看
print("Correlation matrix:")
print(corr_matrix)
# 提取 x 和 y 之间的相关系数
# 相关系数矩阵的 [0, 1] 位置上的值是 x 和 y 之间的皮尔逊相关系数
correlation = corr_matrix[0, 1]
print(f'Pearson correlation coefficient: {correlation}')>)
残差(Residual)
残差是实际值与预测值之间的差异,表示模型预测误差。对于每一个数据点 :
其中:
- 是第 个数据点的实际值。
- 是第 个数据点的预测值。
均方误差(Mean Squared Error, MSE)
均方误差是残差的平方的平均值,用于衡量模型的预测精度。它更重视大误差,因为误差被平方了。
其中:
- 是数据点的数量。
- 是第 个数据点的实际值。
- 是第 个数据点的预测值。
平均绝对误差(Mean Absolute Error, MAE)
平均绝对误差是残差绝对值的平均值,用于衡量模型的平均预测误差。它对大误差的敏感度较低,因为误差没有被平方。
其中:
- 是数据点的数量。
- 是第 个数据点的实际值。
- 是第 个数据点的预测值。
均方根误差(Root Mean Squared Error, RMSE)
均方根误差是均方误差(MSE)的平方根,用于衡量预测值与实际值之间的差异。RMSE 和 MSE 一样,对大误差比较敏感,因为误差被平方了。RMSE 的单位和原始数据的单位相同,使得其更容易解释。
其中:
- 是数据点的数量。
- 是第 个数据点的实际值。
- 是第 个数据点的预测值。
示例
假设有以下数据点的实际值和预测值:
实际值 | 预测值 |
---|---|
3 | 2.5 |
-0.5 | 0.0 |
2 | 2.1 |
7 | 8.1 |
我们可以计算残差、MSE、MAE 和 RMSE:
-
残差:
-
MSE:
-
MAE:
-
RMSE:
Python 代码示例
import numpy as np
# 实际值和预测值
y = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2.1, 8.1])
# 计算残差
residuals = y - y_pred
print("Residuals:", residuals)
# 计算MSE
mse = np.mean((y - y_pred) ** 2)
print("Mean Squared Error (MSE):", mse)
# 计算MAE
mae = np.mean(np.abs(y - y_pred))
print("Mean Absolute Error (MAE):", mae)
# 计算RMSE
rmse = np.sqrt(mse)
print("Root Mean Squared Error (RMSE):", rmse)
# Residuals: [ 0.5 -0.5 -0.1 -1.1]
# Mean Squared Error (MSE): 0.43
# Mean Absolute Error (MAE): 0.55
# Root Mean Squared Error (RMSE): 0.6557438524302003