【数学建模学习笔记】相关性分析

发布于:2025-09-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

用 Scipy 做相关性分析:零基础小白入门指南

如果你是刚接触数据分析的小白,不用怕!这篇总结会用最通俗的语言,带你搞懂 “相关性分析” 是什么、用 Scipy 怎么做,以及不同方法该怎么选。

一、先搞懂:什么是 “相关性分析”?

简单说,相关性分析就是看两个数据之间有没有 “关联”。比如:

  • 身高和体重:是不是身高越高,体重通常也越重?
  • 学习时间和考试分数:是不是学得越久,分数可能越高?

相关性有 “强度” 和 “方向”:

  • 强度:关联有多紧密?比如身高和体重的关联很强,而 “每天喝奶茶量” 和 “头发长度” 的关联就很弱;
  • 方向:是 “同增同减”(正相关,比如身高↑体重↑),还是 “一增一减”(负相关,比如 “运动时间↑体重↓”)。

我们接下来要学的 3 种方法,就是用数字(“相关系数”)来量化这种 “关联”—— 系数越接近 1 或 - 1,关联越强;越接近 0,关联越弱。

二、3 种常用相关性方法:怎么选、怎么用?

我们用 “身高 - 体重” 数据来举例(就是文中导入的 Excel 数据),先记住一个核心结论:不同方法对应不同的数据类型,选对方法才有用!

1. 皮尔逊相关系数:看 “线性关系”(最常用)

什么时候用?
  • 数据是 “连续型” 的(比如身高:176cm、164cm;体重:73kg、67kg,不是 “男 / 女”“好 / 中 / 差” 这种分类);
  • 两个数据的关系是 “线性的”(画成散点图,点大概沿着一条直线分布,比如身高越高体重越重,且趋势接近直线)。
怎么用 Scipy 计算?

代码很简单,核心就是调用pearsonr函数,输入两个要分析的变量(身高和体重):

# 从Scipy里导入皮尔逊相关系数的工具
from scipy.stats import pearsonr
# 计算身高和体重的皮尔逊相关系数
pearson_corr, _ = pearsonr(df['Height'], df['Weight'])
# 打印结果
print('皮尔逊相关系数:', pearson_corr)
结果解读:

文中算出的结果是0.886,接近 1,说明 “身高” 和 “体重” 是 “强正相关”—— 身高越高,体重通常也越重。

2. 斯皮尔曼秩相关系数:看 “单调关系”(不怕极端值)

什么时候用?
  • 数据不是严格的 “线性关系”,但有 “单调趋势”(比如 “年龄” 和 “收入”:30 岁前收入随年龄增长而增加,30 岁后增长变慢,但整体还是 “年龄↑收入↑”,这种趋势叫 “单调递增”);
  • 数据里有 “极端值”(比如大部分人体重 60-80kg,但有一个人 200kg,用皮尔逊会受影响,用斯皮尔曼就不怕);
  • 数据是 “排名型” 的(比如 “比赛名次”:1 名、2 名、3 名,不是具体数值)。
怎么用 Scipy 计算?

和皮尔逊类似,调用spearmanr函数就行:

# 从Scipy里导入斯皮尔曼相关系数的工具
from scipy.stats import spearmanr
# 计算身高和体重的斯皮尔曼相关系数
spearman_corr, _ = spearmanr(df['Height'], df['Weight'])
# 打印结果
print('斯皮尔曼秩相关系数:', spearman_corr)
结果解读:

文中算出的结果是0.877,也接近 1,说明 “身高” 和 “体重” 的 “单调正相关” 很强 —— 即使不考虑线性关系,整体趋势还是 “身高越高体重越重”。

3. Kendall Tau-b 系数:看 “分类变量的关联”(适合有序分类)

什么时候用?
  • 数据是 “有序分类变量”(比如 “满意度”:非常满意、满意、一般、不满意、非常不满意;“成绩等级”:A、B、C、D,这类数据有顺序,但不是具体数值);
  • 想知道两个分类变量之间的 “一致程度”(比如 “产品评分” 和 “购买意愿”:评分越高,购买意愿越强,这种一致的趋势)。
怎么用 Scipy 计算?

调用kendalltau函数:

# 从Scipy里导入Kendall Tau-b系数的工具
from scipy.stats import kendalltau
# 计算身高和体重的Kendall Tau-b系数
kendall_corr, _ = kendalltau(df['Height'], df['Weight'])
# 打印结果
print('Kendall Tau-b 系数:', kendall_corr)
结果解读:

文中算出的结果是0.705,还是正的且不低,说明从 “分类趋势” 看,身高和体重也有较强的正相关 —— 但比前两种方法的系数低,因为它更侧重 “分类一致性”,不是直接用数值计算。

三、怎么直观看相关性?用 “热力图”

光看数字可能没感觉,我们可以用 “热力图” 把相关性画出来,红色越浓代表正相关越强,蓝色越浓代表负相关越强。

怎么做热力图?

seaborn库(文中已导入),核心是先算 “相关矩阵”,再画图:

# 1. 计算相关矩阵(这里用皮尔逊,也可以换成spearman或kendall)
corr_matrix = df.corr(method='pearson')
# 2. 画热力图
plt.figure(figsize=(10, 8))  # 设置图的大小
sns.heatmap(
    corr_matrix, 
    annot=True,  # 在图上显示相关系数的数值
    cmap='coolwarm',  # 用红-蓝配色
    vmin=-1, vmax=1  # 颜色范围:-1(最强负相关)到1(最强正相关)
)
plt.show()  # 显示图

热力图能看到什么?

对于 “身高 - 体重” 数据,热力图上会显示一个格子,里面写着 0.886(皮尔逊系数),颜色是深红色 —— 一眼就能看出两者强正相关。

四、小白必记:3 种方法对比表

怕记混?直接看这个表,按 “数据类型” 选方法就行:

方法 核心用途 适合的数据类型 优点
皮尔逊相关系数 衡量 “线性关系” 强度 连续型数据(如身高、体重、分数) 计算简单,适合线性关系场景
斯皮尔曼秩相关系数 衡量 “单调关系” 强度 有序数据、有极端值的数据 不受极端值影响,适用范围广
Kendall Tau-b 系数 衡量 “有序分类变量” 的一致程度 有序分类数据(如等级、名次) 适合分类数据,结果易解释

五、总结:零基础怎么上手?

  1. 明确数据类型:先看你的数据是 “连续型”(如温度)、“有序分类”(如满意度)还是 “有极端值”;
  2. 选对方法:按上面的表格选皮尔逊、斯皮尔曼或 Kendall;
  3. 复制代码改参数:文中的代码可以直接用,只需要把df['Height']df['Weight']换成你的数据列名;
  4. 看结果:系数接近 1 或 - 1 就是强相关,接近 0 就是弱相关;
  5. 画热力图:更直观地展示相关性。

网站公告

今日签到

点亮在社区的每一天
去签到