如何绘制仅展示相关系数≥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
相关产品推荐
相关产品推荐

