背景
这张图展示了文献中使用的斯皮尔曼相关系数矩阵热图,以揭示各变量之间的相关性。但是相对于来说较为简洁,于是接下来对这种斯皮尔曼相关系数矩阵热图进行美化扩展
斯皮尔曼相关系数
斯皮尔曼相关系数(Spearman's Rank Correlation Coefficient)是用于衡量两个变量之间的单调关系的一种非参数统计方法,它基于排名数据,不需要数据满足正态分布,因此适合于非线性关系的数据分析
斯皮尔曼相关系数的计算步骤
-
将原始数据进行排名:对两个变量的所有数据分别按大小进行排名,得到两个排名序列 和
-
计算差值 :对于每个样本点,计算排名之间的差值
-
计算斯皮尔曼相关系数:用以下公式计算斯皮尔曼相关系数 :
其中, 是排名差值, 是数据的样本量
斯皮尔曼相关系数的取值范围
斯皮尔曼相关系数 的取值范围在-1到1之间:
- 表示两个变量的排名完全一致,即完全正相关
- 表示两个变量的排名完全相反,即完全负相关
- 表示两个变量之间无相关性
应用场景
斯皮尔曼相关系数适用于以下情况:
- 变量之间的关系不是线性关系但呈现单调性
- 数据为分类数据或非正态分布的连续数据
- 数据存在异常值,使用斯皮尔曼相关系数可以减少异常值的影响
代码实现
数据读取
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('2024-10-28-公众号Python机器学习AI.xlsx')
设置图形参数、读取 Excel 文件数据并抑制警告,为后续数据分析和可视化做好准备
绘图形式1
# 创建斯皮尔曼相关系数矩阵
corr = df.corr(method='spearman')
# 创建图形
fig, ax = plt.subplots(figsize=(10, 8), dpi=1200)
cmap = plt.cm.viridis
norm = plt.Normalize(vmin=-1, vmax=1)
# 初始化一个空2024-10-28-公众号Python机器学习AI的可绘制对象用于颜色条
scatter_handles = []
# 循环绘制气泡图和数值
for i in range(len(corr.columns)):
for j in range(len(corr.columns)):
if i > j: # 对角线左下部2024-10-28-公众号Python机器学习AI分,只显示气泡
color = cmap(norm(corr.iloc[i, j])) # 根据相关系数获取颜色
scatter = ax.scatter(i, j, s=np.abs(corr.iloc[i, j]) * 1000, color=color, alpha=0.75)
scatter_handles.append(scatter) # 保存scatter对象用于颜色条
elif i < j: # 对角2024-10-28-公众号Python机器学习AI线右上部分,只显示数值
color = cmap(norm(corr.iloc[i, j])) # 数值的颜色同样基于相关系数
ax.text(i, j, f'{corr.iloc[i, j]:.2f}', ha='center', va='center', color=color, fontsize=10)
else: # 对角线部分,显示空白
ax.scatter(i, j, s=1, color='white')
# 设置坐标轴标签
ax.set_xticks(range(len(corr.columns)))
ax.set_xticklabels(corr.columns, rotation=45, ha='right', fontsize=10)
ax.set_yticks(range(len(corr.columns)))
ax.set_yticklabels(corr.columns, fontsize=10)
# 添加颜色条
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([]) # 仅用于显示颜色条
fig.colorbar(sm, ax=ax, label='Correlation Coefficient')
# 添加标题和布局调整
plt.tight_layout()
plt.savefig("Bubble Heatmap with Color Mapping for Bubbles and Numbers.pdf", format='pdf', bbox_inches='tight')
#2024-10-28-公众号Python机器学习AI
plt.show()
首先计算相关系数矩阵,然后以气泡大小和颜色表示左下角的相关性强度,同时在右上角显示具体数值,图例用颜色条表示相关系数范围
改进绘图形式1
在原有气泡图的基础上增加了显著性分析,计算了每对变量之间的显著性水平(p 值),并在图中用星号标记出显著相关的变量对p < 0.05 表示 *,p < 0.01 表示 **),星号数量表示显著性强弱,使图表不仅展示相关系数的大小,还能识别哪些相关性具有统计上的显著性,从而提供更深入的数据解读,代码获取:如果您希望获取本文展示的改进版代码,请添加作者微信联系获取
绘图形式2
import seaborn as sns
# 计算斯皮尔曼相关系数矩阵
corr = df.corr(method='spearman')
# 创建 PairGrid
g = sns.PairGrid(df)
# 左下角绘制2024-10-28-公众号Python机器学习AI散点图
g.map_lower(sns.scatterplot)
# 对角线绘制直方图
g.map_diag(sns.histplot, kde=True)
# 右上角显示斯皮尔曼相关系数
for i, j in zip(*np.triu_indices_from(corr, 1)):
g.axes[i, j].annotate(f'corr:{corr.iloc[i, j]:.2f}', (0.5, 0.5),
textcoords='axes fraction', ha='center', va='center', fontsize=20)
# 保2024-10-28-公众号Python机器学习AI存并显示图表
plt.savefig("Spearman_Correlation_PairGrid.pdf", format='pdf', bbox_inches='tight')
plt.show()
使用Seaborn的PairGrid生成了一个多变量可视化图表,以展示数据集中各变量对的斯皮尔曼相关系数。左下角的图表显示各变量对的散点图,帮助观察变量间的分布趋势;对角线上绘制各变量的直方图,并添加核密度估计曲线,用于展示每个变量的分布形状;右上角则显示每对变量的相关系数值,以便于直观了解各变量之间的相关性强度
改进绘图形式2
改进了多变量相关性可视化,通过在对角线上绘制直方图、下三角区域显示散点图、上三角区域展示相关系数热图,并添加全局色条,全面展示了数据的分布特征和变量间的斯皮尔曼相关性,增强了图表的直观性和解读性,代码获取:如果您希望获取本文展示的改进版代码,请添加作者微信联系获取
往期推荐
SCI图表复现:利用小提琴图折线图综合展示训练集、验证集、测试集模型性能对比
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现 Nature 图表可视化——基于模型残差分析与显著性检验的模型解释
微信号|deep_ML
欢迎添加作者微信进入Python、ChatGPT群
进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考