如何通过相关性分析判断变量间的关系?有哪些常用的相关性分析方法? 📅 2026/7/1 20:33:02 相关性分析判断变量间关系的方法核心思路相关性分析的目标是回答一个问题变量 X 变化时变量 Y 是否也跟着变化变化方向和程度如何分析流程 1. 明确变量类型连续/离散/有序/分类 2. 绘制散点图直观观察关系形态 3. 选择合适的相关系数计算方法 4. 判断统计显著性p值 5. 注意相关 ≠ 因果一、常用方法总览方法适用变量类型关系类型系数范围典型场景Pearson连续 vs 连续线性-1 ~ 1身高 vs 体重Spearman有序/连续 vs 有序/连续单调含非线性-1 ~ 1排名 vs 排名Kendall有序 vs 有序小样本/大量并列单调-1 ~ 1评委评分一致性偏相关连续 vs 连续控制干扰变量线性-1 ~ 1控制年龄后收入vs消费点二列二分类 vs 连续线性-1 ~ 1性别 vs 收入Phi 系数二分类 vs 二分类关联-1 ~ 1是否吸烟 vs 是否患病Cramér’s V分类 vs 分类关联0 ~ 1地区 vs 偏好品牌Eta分类 vs 连续非线性关联0 ~ 1教育水平 vs 收入二、各方法详解1. Pearson 皮尔逊相关系数最常用衡量两个连续变量之间的线性关系。Σ(xi - x̄)(yi - ȳ) r ───────────────────── √Σ(xi - x̄)² × √Σ(yi - ȳ)²前提条件两个变量都是连续型关系大致线性散点图呈椭圆分布近似正态分布无显著异常值解读| |r| 值 | 强度 ||—|—|| 0.0 ~ 0.1 | 几乎无关 || 0.1 ~ 0.3 | 弱相关 || 0.3 ~ 0.5 | 中等相关 || 0.5 ~ 0.7 | 强相关 || 0.7 ~ 1.0 | 极强相关 |importscipy.statsasstats r,pstats.pearsonr(df[height],df[weight])print(fPearson r {r:.3f}, p {p:.4f})关键Pearson 只能捕捉线性关系。如果 X 和 Y 是 U 型曲线关系Pearson 可能接近 0 但实际关系很强。2. Spearman 斯皮尔曼相关系数基于排名计算衡量单调关系不限于线性。将原始值转为排名 → 对排名计算 Pearson何时选 Spearman 而非 Pearson数据非正态分布存在异常值基于排名对异常值鲁棒有序变量评分等级、排名关系是单调的但不是线性的rho,pstats.spearmanr(df[study_hours],df[exam_rank])print(fSpearman rho {rho:.3f}, p {p:.4f})3. Kendall 肯德尔相关系数也是基于排名但计算逻辑不同——衡量一致对的比例。何时选 Kendall小样本n 30数据中存在大量并列排名相同值多需要更保守的估计tau,pstats.kendalltau(df[judge1_rank],df[judge2_rank])print(fKendall tau {tau:.3f}, p {p:.4f})Pearson vs Spearman vs Kendall 对比PearsonSpearmanKendall关系类型线性单调单调对异常值敏感鲁棒鲁棒并列值处理不适用近似处理精确处理统计功效最高中等较低更保守典型场景正态连续数据非正态/排名小样本/多并列4. 偏相关分析控制一个或多个干扰变量后的净相关。场景收入和消费的相关是真实的吗还是因为年龄同时影响了两者 偏相关 剔除年龄影响后收入与消费的纯相关importpingouinaspg# 控制 age 后分析 income 与 consumption 的偏相关resultpg.partial_corr(datadf,xincome,yconsumption,covarage)print(result)5. 分类变量的关联分析# 卡方检验 Cramérs V分类 vs 分类fromscipy.statsimportchi2_contingencyimportnumpyasnp tablepd.crosstab(df[region],df[brand_preference])chi2,p,dof,expectedchi2_contingency(table)# Cramérs Vntable.sum().sum()kmin(table.shape)-1vnp.sqrt(chi2/(n*k))print(fCramérs V {v:.3f})# Phi 系数2×2 表特例# Eta分类 vs 连续三、分析实战步骤Step 1先画图importseabornassnsimportmatplotlib.pyplotasplt# 散点图 — 直观判断关系形态sns.scatterplot(datadf,xx,yy)plt.show()# 相关性热力图 — 多变量总览sns.heatmap(df.corr(),annotTrue,cmapRdBu_r,center0)plt.show()散点图形态与选择⚽⚽⚽ 线性正相关 → Pearson ⚽⚽⚽ ⚽ ⚽ 单调非线性 → Spearman ⚽ ⚽ ⚽⚽ ⚽ ⚽ U型曲线 → Pearson ≈ 0 ⚽⚽⚽⚽ 但实际有强关系需转换或用其他方法 ⚽ ⚽ ⚽⚽⚽⚽⚽⚽ 无规律 → 确实无关Step 2检验正态性# Shapiro-Wilk 检验stat,pstats.shapiro(df[variable])print(fp {p:.4f})# p 0.05 → 近似正态可用 Pearson# 或 Q-Q 图stats.probplot(df[variable],plotplt)plt.show()Step 3选择方法并计算变量类型判断流程 连续 vs 连续 ├── 正态 线性 → Pearson ├── 非正态 / 非线性 → Spearman └── 小样本 多并列 → Kendall 有序 vs 有序 → Spearman / Kendall 分类 vs 分类 → 卡方检验 Cramérs V / Phi 分类 vs 连续 → Eta / 点二列相关 连续 vs 连续需控制干扰→ 偏相关Step 4判断显著性r,pstats.pearsonr(x,y)ifp0.05:print(相关性显著)else:print(相关性不显著可能是随机波动)# 大样本注意n 500 时极微弱相关也可能显著# 此时重点关注效应量|r| 值而非 p 值四、常见陷阱1. 相关 ≠ 因果冰淇淋销量 ↑ 和 溺水人数 ↑ 相关性很高 但不是吃冰淇淋导致溺水 真正原因是气温 ↑同时推高了两边2. Pearson 只捕捉线性# X 和 Y 完美的 U 型关系# Pearson r ≈ 0但实际关系极强# 解决先看散点图再决定方法3. 异常值的影响# 一个极端值就能把 Pearson r 从 0.1 拉到 0.8# 解决改用 Spearman或剔除/缩尾异常值后重算4. 大样本的 p 值幻觉n 10000 时r 0.03 可能 p 0.001显著 但 |r| 0.03 意味着关系极弱实际无意义 结论显著性 ≠ 重要性必须同时看效应量5. 伪相关A 和 B 相关可能因为 C 同时影响了两者 解决偏相关分析控制 C 后看 A 和 B 是否仍相关五、速查总结判断变量关系 1. 先画散点图 → 看形态线性/单调/无规律/非线性 2. 判变量类型 → 连续/有序/分类 3. 选方法 连续×连续 正态线性 → Pearson 连续×连续 非正态 → Spearman 有序×有序 小样本 → Kendall 分类×分类 → Cramérs V 需控制干扰 → 偏相关 4. 看两个数|r|强度 p显著性 5. 牢记相关 ≠ 因果Pearson ≠ 唯一答案