数学建模学习-相关系数分析(Correlation Analysis)教程(39)
目录
写在最前
注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码,很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体使用时,同学们要根据实际情况选择是否在论文中添加可视化图片。
系列教程计划持续更新,同学们可以免费订阅专栏,内容充足后专栏可能付费,提前订阅的同学可以免费阅读,同时相关代码获取可以关注博主评论或私信。
一、相关系数简介
相关系数是统计学中用于衡量两个变量之间线性相关程度的指标。在数学建模中,相关系数分析是一个非常重要的工具,它可以帮助我们:
- 发现变量之间的关系
- 量化变量之间的相关程度
- 为后续建模提供依据
- 验证模型的有效性
本教程将介绍两种最常用的相关系数:Pearson相关系数和Spearman相关系数。
二、Pearson相关系数
2.1 理论基础
Pearson相关系数(皮尔逊相关系数)是最常用的一种相关系数,用于衡量两个变量之间的线性相关程度。其计算公式为:
r = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − 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ˉ)
其中:
- r r r 是Pearson相关系数
- x i x_i xi, y i y_i yi 是两个变量的观测值
- x ˉ \bar{x} xˉ, y ˉ \bar{y} yˉ 是两个变量的平均值
- n n n 是样本数量
2.2 特点
-
取值范围:[-1, 1]
- r = 1 表示完全正相关
- r = -1 表示完全负相关
- r = 0 表示无线性相关
-
优点:
- 计算简单,易于理解
- 能够很好地描述线性关系
- 广泛应用于各个领域
-
局限性:
- 只能衡量线性相关关系
- 对异常值敏感
- 要求数据符合正态分布
三、Spearman相关系数
3.1 理论基础
Spearman相关系数(斯皮尔曼相关系数)是一种秩相关系数,它通过计算两个变量的秩次之间的Pearson相关系数来衡量两个变量之间的相关性。计算公式为:
ρ = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) \rho = 1 - \frac{6\sum d_i^2}{n(n^2-1)} ρ=1−n(n2−1)6∑di2
其中:
- ρ \rho ρ 是Spearman相关系数
- d i d_i di 是第i个观测值的两个变量的秩次差
- n n n 是样本数量
3.2 特点
-
取值范围:[-1, 1],与Pearson相关系数相同
-
优点:
- 不要求数据符合正态分布
- 对异常值不敏感
- 可以衡量非线性的单调关系
-
局限性:
- 信息利用不如Pearson充分
- 计算相对复杂
- 只能衡量单调关系
四、环境准备
4.1 所需库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
4.2 依赖安装
pip install numpy pandas matplotlib seaborn scipy
五、代码实现
5.1 数据准备
# 生成示例数据
np.random.seed(42)
n = 100
# 生成正相关数据
x1 = np.random.normal(0, 1, n)
y1 = x1 * 0.8 + np.random.normal(0, 0.2, n)
# 生成负相关数据
x2 = np.random.normal(0, 1, n)
y2 = -x2 * 0.8 + np.random.normal(0, 0.2, n)
# 生成非线性相关数据
x3 = np.random.uniform(-3, 3, n)
y3 = x3**2 + np.random.normal(0, 1, n)
5.2 相关系数计算和可视化
def plot_correlation(x, y, title, filename):
"""绘制散点图并计算相关系数"""
pearson_corr, _ = stats.pearsonr(x, y)
spearman_corr, _ = stats.spearmanr(x, y)
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.5)
plt.title(f'{title}\nPearson相关系数: {pearson_corr:.3f}\nSpearman相关系数: {spearman_corr:.3f}')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.savefig(f'images/{filename}.png')
plt.close()
5.3 实际应用示例
# 创建示例数据的数据框
df = pd.DataFrame({
'身高': np.random.normal(170, 10, 100), # 身高数据
'体重': np.random.normal(65, 8, 100), # 体重数据
'年龄': np.random.normal(30, 5, 100), # 年龄数据
'收入': np.random.normal(10000, 2000, 100) # 收入数据
})
# 添加一些相关性
df['体重'] = df['身高'] * 0.5 + df['体重'] * 0.5
df['收入'] = df['年龄'] * 0.3 + df['收入'] * 0.7
# 计算相关系数矩阵
pearson_matrix = df.corr(method='pearson')
spearman_matrix = df.corr(method='spearman')
六、结果分析
6.1 正相关示例
[外链图片转存中…(img-ts84cVQ4-1737432346264)]
在正相关示例中,我们可以看到:
- 数据点呈现明显的正相关趋势
- Pearson相关系数和Spearman相关系数都接近0.8
- 两种相关系数的值非常接近,说明这种线性关系被很好地捕捉到了
6.2 负相关示例
[外链图片转存中…(img-z6eflNBl-1737432356443)]
在负相关示例中,我们可以观察到:
- 数据点呈现明显的负相关趋势
- 两个相关系数都接近-0.8
- 负相关关系被准确地量化了
6.3 非线性相关示例
[外链图片转存中…(img-AGxrWUFW-1737432366380)]
在非线性相关示例中:
- 数据点呈现明显的二次函数关系
- Pearson相关系数接近0,因为它只能捕捉线性关系
- Spearman相关系数的绝对值较大,因为它能够捕捉非线性的单调关系
6.4 相关系数矩阵分析
Pearson相关系数矩阵
[外链图片转存中…(img-3T0Xatd5-1737432376923)]
Spearman相关系数矩阵
从相关系数矩阵中,我们可以观察到:
- 身高和体重呈现较强的正相关关系(约0.75-0.79)
- 年龄和收入之间存在弱负相关关系
- 其他变量之间的相关性较弱
七、应用建议
-
选择合适的相关系数:
- 如果确信变量之间是线性关系,优先使用Pearson相关系数
- 如果数据不符合正态分布或存在异常值,考虑使用Spearman相关系数
- 在探索性分析中,建议同时使用两种相关系数进行对比
-
结果解释:
- |r| < 0.3:弱相关
- 0.3 ≤ |r| < 0.5:中等相关
- 0.5 ≤ |r| < 0.8:强相关
- |r| ≥ 0.8:极强相关
-
注意事项:
- 相关不等于因果
- 要结合实际背景解释相关性
- 注意样本量的影响
- 警惕虚假相关
八、总结
相关系数分析是数学建模中的基础工具,它能帮助我们:
- 发现数据中的关联关系
- 为建模提供依据
- 验证模型的合理性
在实际应用中,建议:
4. 结合多种相关系数
5. 配合可视化分析
6. 注意数据的特点
7. 考虑实际背景
同学们如果有疑问可以私信答疑,如果有讲的不好的地方或可以改善的地方可以一起交流,谢谢大家。