用 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 系数 | 衡量 “有序分类变量” 的一致程度 | 有序分类数据(如等级、名次) | 适合分类数据,结果易解释 |
五、总结:零基础怎么上手?
- 明确数据类型:先看你的数据是 “连续型”(如温度)、“有序分类”(如满意度)还是 “有极端值”;
- 选对方法:按上面的表格选皮尔逊、斯皮尔曼或 Kendall;
- 复制代码改参数:文中的代码可以直接用,只需要把
df['Height']
和df['Weight']
换成你的数据列名; - 看结果:系数接近 1 或 - 1 就是强相关,接近 0 就是弱相关;
- 画热力图:更直观地展示相关性。