一、什么是线性相关系数
线性相关系数,又称皮尔逊相关系数(Pearson Correlation Coefficient),是衡量两个变量之间线性关系强度和方向的统计量。它的数学定义如下:
给定两个变量 XXX 和 YYY,其相关系数 rrr 定义为:
r=∑i=1n(xi−xˉ)(yi−yˉ)∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2 r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2} \sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} r=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
其中 xˉ\bar{x}xˉ 和 yˉ\bar{y}yˉ 分别是 XXX 和 YYY 的均值。
二、如何判断线性相关性
相关系数 rrr 的取值范围是 [−1,1][-1, 1][−1,1]:
- r = 1:完全正相关
- r = -1:完全负相关
- r = 0:线性无关
- 0.7 ≤ |r| < 1:强相关
- 0.4 ≤ |r| < 0.7:中等相关
- 0 < |r| < 0.4:弱相关
三、实例分析
让我们使用实际数据集来展示线性相关系数的应用。
1. 环境准备
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
2. 正相关案例:房价数据分析
使用波士顿房价数据集分析房屋面积与价格的关系:
# 使用California housing数据集代替(波士顿数据集已被弃用)
from sklearn.datasets import fetch_california_housing
# 加载数据
housing = fetch_california_housing()
df_housing = pd.DataFrame(housing.data, columns=housing.feature_names)
df_housing['Price'] = housing.target
# 分析房屋平均房间数与房价的关系
x = df_housing['AveRooms']
y = df_housing['Price']
# 计算相关系数
correlation = x.corr(y)
print(f"房间数与房价的相关系数: {correlation:.4f}")
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.5)
plt.xlabel('平均房间数')
plt.ylabel('房价(十万美元)')
plt.title(f'房间数与房价的关系(r = {correlation:.3f})')
# 添加趋势线
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x, p(x), "r--", alpha=0.8)
plt.show()
3. 负相关案例:汽车数据分析
使用汽车燃油效率数据集:
# 使用内置的汽车数据
from sklearn.datasets import load_iris
import pandas as pd
# 创建模拟汽车数据(重量与燃油效率)
np.random.seed(42)
car_weight = np.random.normal(1500, 300, 200) # 汽车重量(kg)
# 燃油效率与重量负相关
fuel_efficiency = 35 - 0.015 * car_weight + np.random.normal(0, 2, 200)
df_cars = pd.DataFrame({
'Weight': car_weight,
'Fuel_Efficiency': fuel_efficiency
})
# 计算相关系数
correlation = df_cars['Weight'].corr(df_cars['Fuel_Efficiency'])
print(f"汽车重量与燃油效率的相关系数: {correlation:.4f}")
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(df_cars['Weight'], df_cars['Fuel_Efficiency'], alpha=0.6)
plt.xlabel('汽车重量 (kg)')
plt.ylabel('燃油效率 (km/L)')
plt.title(f'汽车重量与燃油效率的关系(r = {correlation:.3f})')
# 添加趋势线
z = np.polyfit(df_cars['Weight'], df_cars['Fuel_Efficiency'], 1)
p = np.poly1d(z)
plt.plot(df_cars['Weight'], p(df_cars['Weight']), "r--", alpha=0.8)
plt.show()
4. 无相关案例:随机数据
# 生成两个独立的随机变量
np.random.seed(100)
random_x = np.random.normal(0, 1, 500)
random_y = np.random.normal(0, 1, 500)
# 计算相关系数
correlation = np.corrcoef(random_x, random_y)[0, 1]
print(f"两个随机变量的相关系数: {correlation:.4f}")
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(random_x, random_y, alpha=0.5)
plt.xlabel('随机变量 X')
plt.ylabel('随机变量 Y')
plt.title(f'两个独立随机变量的关系(r = {correlation:.3f})')
plt.show()
5. 综合分析:多变量相关性热图
# 使用鸢尾花数据集进行综合分析
from sklearn.datasets import load_iris
iris = load_iris()
df_iris = pd.DataFrame(iris.data, columns=iris.feature_names)
# 计算相关系数矩阵
correlation_matrix = df_iris.corr()
# 绘制热图
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0,
square=True, linewidths=1, cbar_kws={"shrink": 0.8})
plt.title('鸢尾花数据集特征相关性热图')
plt.show()
# 输出相关系数解释
print("相关性分析:")
for i in range(len(correlation_matrix)):
for j in range(i+1, len(correlation_matrix)):
r = correlation_matrix.iloc[i, j]
feature1 = correlation_matrix.index[i]
feature2 = correlation_matrix.columns[j]
if abs(r) >= 0.7:
strength = "强"
elif abs(r) >= 0.4:
strength = "中等"
else:
strength = "弱"
direction = "正" if r > 0 else "负"
print(f"{feature1} 与 {feature2}: {direction}{strength}相关 (r={r:.3f})")
6. 相关性的统计显著性检验
def correlation_significance_test(x, y, alpha=0.05):
"""
检验相关系数的统计显著性
"""
r, p_value = stats.pearsonr(x, y)
print(f"相关系数 r = {r:.4f}")
print(f"p-value = {p_value:.4f}")
if p_value < alpha:
print(f"在 {alpha} 显著性水平下,相关性显著")
else:
print(f"在 {alpha} 显著性水平下,相关性不显著")
return r, p_value
# 应用到之前的数据
print("房间数与房价相关性检验:")
correlation_significance_test(x, y)
四、注意事项
-
线性相关系数只能衡量线性关系:即使相关系数接近0,也不代表两个变量之间没有关系,可能存在非线性关系。
-
异常值的影响:相关系数对异常值敏感,在计算前应该检查并处理异常值。
-
样本量的影响:小样本可能导致相关系数不稳定,需要进行显著性检验。
-
相关不等于因果:高相关系数并不意味着因果关系。
五、实用建议
在实际应用中,建议:
- 先通过散点图直观了解数据分布
- 计算相关系数量化关系强度
- 进行显著性检验确认结果可靠性
- 结合专业知识解释相关性的实际意义
通过以上分析,我们可以看到线性相关系数是数据分析中的重要工具,能够帮助我们快速了解变量间的线性关系,为进一步的数据建模和决策提供依据。