You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制仅展示相关系数≥0.5阈值的强相关变量相关性矩阵

高维变量强相关性可视化方案

你原有代码存在两处问题:

  • seaborn导入语句和相关性计算语句写连,存在语法错误
  • 掩码逻辑完全写反:mask = (np.abs(c) >= 0.5) 是将相关系数绝对值≥0.5的强相关区域全部隐藏,反而展示了弱相关部分,和需求完全相反

以下是三种可直接落地的展示方案,均默认仅展示相关系数绝对值≥0.5的强相关关系:


方案1:过滤弱相关的优化版热力图

该方案保留全部100个变量的轴位置,仅隐藏弱相关、对角线自相关、上三角重复内容,适合需要全局查看所有变量强相关分布的场景。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 计算相关性矩阵
corr = df_train_new.corr()
# 生成组合掩码:隐藏上三角重复值 + 隐藏|r|<0.5的弱相关 + 隐藏对角线自相关(r=1)
mask = np.triu(np.ones_like(corr, dtype=bool)) | (np.abs(corr) < 0.5) | np.eye(len(corr), dtype=bool)

plt.figure(figsize=(24, 20), dpi=100)
sns.heatmap(
    corr,
    mask=mask,
    cmap='RdYlGn_r',
    vmax=1, vmin=-1,
    center=0,
    square=True,
    linewidths=0.5,
    cbar_kws={"shrink": 0.6, "label": "相关系数"},
    annot=False, # 变量数量多,关闭数值标注避免画面糊成一团
    xticklabels=True,
    yticklabels=True
)
plt.xticks(rotation=90, fontsize=8)
plt.yticks(rotation=0, fontsize=8)
plt.title('|r|≥0.5 强相关关系热力图', fontsize=14)
plt.tight_layout()
plt.show()
  • 效果说明:图中空白位置代表两个变量不存在强相关关系,色块颜色越深代表相关性越强,可快速定位哪些变量几乎和其他变量无强关联。

方案2:强相关变量关联网络图

该方案自动过滤掉无任何强相关关系的孤立变量,仅保留存在强关联的变量,以网络连线的形式展示相关关系,适合快速定位高度相关的变量聚类团。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx

corr = df_train_new.corr()
# 提取所有满足阈值的强相关变量对,避免重复提取
corr_pairs = []
for i in range(len(corr.columns)):
    for j in range(i+1, len(corr.columns)):
        corr_val = corr.iloc[i, j]
        if abs(corr_val) >= 0.5:
            corr_pairs.append((corr.columns[i], corr.columns[j], corr_val))

# 构建关联网络
G = nx.Graph()
for u, v, w in corr_pairs:
    G.add_edge(u, v, weight=abs(w), corr=w)

plt.figure(figsize=(20, 20), dpi=100)
pos = nx.spring_layout(G, seed=42, k=0.3)
# 节点大小和关联变量数挂钩
node_size = [G.degree(node)*100 for node in G.nodes()]
nx.draw_networkx_nodes(G, pos, node_size=node_size, node_color='#f0f0f0', edgecolors='#333')

# 正相关用绿色线、负相关用红色线,线宽和相关系数大小挂钩
pos_edges = [(u,v) for u,v,d in G.edges(data=True) if d['corr']>0]
neg_edges = [(u,v) for u,v,d in G.edges(data=True) if d['corr']<0]
pos_width = [d['weight']*3 for u,v,d in G.edges(data=True) if d['corr']>0]
neg_width = [d['weight']*3 for u,v,d in G.edges(data=True) if d['corr']<0]
nx.draw_networkx_edges(G, pos, edgelist=pos_edges, width=pos_width, edge_color='#2ca02c', alpha=0.6)
nx.draw_networkx_edges(G, pos, edgelist=neg_edges, width=neg_width, edge_color='#d62728', alpha=0.6)

# 添加变量名标签
nx.draw_networkx_labels(G, pos, font_size=9)
plt.axis('off')
plt.title('强相关变量关联网络(绿=正相关/红=负相关,线越粗相关性越强)', fontsize=14)
plt.tight_layout()
plt.show()
  • 效果说明:聚成一团的节点就是互相高度相关的变量组,节点越大代表和它存在强相关的变量越多。

方案3:强相关对排序列表

如果需要精确读取相关系数数值,可直接将所有强相关对整理为结构化表格,适合做精确的变量筛选。

import pandas as pd

# 整理为DataFrame并按相关性强度排序
corr_df = pd.DataFrame(corr_pairs, columns=['变量1', '变量2', '相关系数'])
corr_df['相关系数绝对值'] = corr_df['相关系数'].abs()
corr_df = corr_df.sort_values('相关系数绝对值', ascending=False).reset_index(drop=True)

# 打印Top20最强相关对,可导出为csv留存
print(corr_df.head(20))
# corr_df.to_csv('强相关变量对列表.csv', index=False, encoding='utf-8-sig')

小提示:如果展示时强相关关系仍然过多,可将阈值从0.5上调至0.6或0.7,优先查看相关性更高的变量对,避免信息过载。

内容的提问来源于stack exchange,提问作者Student Guess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:54:26