一般的相关系数热力图通常用于展示变量之间的相关性强弱,但它们不直接支持在热力图上显示显著性水平(如星号或颜色标记),具体来说:
- 一般热力图:一般使用像 seaborn 或 matplotlib 这样的库来创建,它们通过颜色编码来显示相关系数的大小,通常使用数字标注在每个格子内
- 显著性标记的需求:在科研和统计分析中,除了显示相关性本身外,还常常需要展示哪些相关系数在统计上显著不同于零(例如,显著性水平为0.05或更高),这种需求是为了进一步解释相关性的真实性和稳健性
- 实现显著性标记:为了在热力图上添加显著性标记,需要额外的代码来计算相关系数的显著性,并在热力图上以符号或颜色的形式进行标注,这需要在相关性分析之外进行额外的统计分析和代码编写,以确保显著性水平的正确显示
代码实现
数据生成
import pandas as pd
import numpy as np
import seaborn as sns
from scipy.stats import pearsonr
import matplotlib.pyplot as plt
# 生成具有10个特征的数据
np.random.seed(0)
data = np.random.rand(100, 10)
columns = [f'feature_{i+1}' for i in range(10)]
df = pd.DataFrame(data, columns=columns)
计算相关系数及显著性P值
# 计算相关系数矩阵和显著性p值矩阵
corr_matrix = df.corr()
p_values = pd.DataFrame(np.zeros((10, 10)), columns=columns, index=columns)
for i in range(10):
for j in range(10):
if i == j:
p_values.iloc[i, j] = 0
else:
_, p_value = pearsonr(df.iloc[:, i], df.iloc[:, j])
p_values.iloc[i, j] = p_value
绘制热力图
plt.figure(figsize=(10, 10))
sns.set(font_scale=1.2)
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.xticks(rotation=45)
plt.title('Correlation coefficient heat map')
plt.show()
这是一般的热力图,它不会显示相关系数的显著性结果
绘制带有显著性标记的相关系数热力图
# 创建相关系数热力图
plt.figure(figsize=(10, 10))
sns.set(font_scale=1.2)
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")
# 添加P值标记
for i in range(len(np.array(p_values))):
for j in range(len(np.array(p_values))):
if i != j: # 跳过对角线上的元素
if np.array(p_values)[i, j] < 0.01:
plt.text(j + 0.5, i + 0.25, "**", horizontalalignment='center', verticalalignment='center', fontsize=16, color='black')
elif np.array(p_values)[i, j] < 0.05:
plt.text(j + 0.5, i + 0.25, "*", horizontalalignment='center', verticalalignment='center', fontsize=16, color='black')
plt.xticks(rotation=45)
plt.title('Correlation Coefficient Heatmap with Significance Levels')
plt.show()
在相关系数热力图的基础上,使用双星号 ** 标记显著性水平小于0.01的相关系数,使用单星号 * 标记显著性水平在0.01到0.05之间的相关系数,帮助观察者理解哪些相关性是在统计学上显著的
往期推荐
论文可视化设计:掌握 Seaborn 15 种精美数据可视化
微信号 | deep_ML
欢迎添加作者微信进入Python、ChatGPT群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考