如前一节所述,计算相关系数为我们提供了数值变量对之间线性关联的精确数值。然而,当处理包含大量数值特征的数据集时,仅仅查看相关值表格可能会让人难以招架。很难快速了解关联的整体结构或找出最强的关联。这就是图形表示变得特别有用的地方。热力图是一种出色的工具,用于可视化数字矩阵,其中单个值由颜色表示。在双变量分析中,我们经常使用热力图来可视化数值变量的相关矩阵。这能同时提供多变量之间关系的即时、直观概览。为什么用热力图表示相关性?假设您有10个数值变量。计算每对变量之间的相关性会产生 $10 \times 10 = 100$ 个相关值(尽管它是对称的,所以包含对角线在内共有 $10 + (9 \times 10 / 2) = 55$ 个唯一值)。手动比较这55个值效率低下。热力图通过以下方式解决了这个问题:信息浓缩: 它以紧凑的视觉格式呈现整个相关矩阵。突出模式: 强正相关(接近+1)、强负相关(接近-1)和弱相关(接近0)通过颜色强度很容易区分。促进比较: 它能够快速视觉比较不同变量对之间的相关强度。识别潜在问题: 高度相关变量的聚集(潜在多重共线性)变得一目了然。创建相关矩阵在能够可视化之前,我们需要相关矩阵本身。Pandas DataFrame为此提供了一个便捷的.corr()方法。假设您有一个包含数值数据的DataFrame df:# 如有必要,只选择数值列 numerical_df = df.select_dtypes(include=['int64', 'float64']) # 计算相关矩阵 correlation_matrix = numerical_df.corr() # 显示矩阵(可选,但有助于验证) print(correlation_matrix)这个correlation_matrix是一个DataFrame,其索引和列都是来自numerical_df的数值变量名称,单元格中的值是这些变量之间的皮尔逊相关系数。用Seaborn生成热力图Seaborn库,它构建在Matplotlib之上,提供了一个专为此目的设计的简单函数heatmap()。import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np # 样本数据常用 # --- 样本数据生成 --- # 在实际情况中,您将使用已加载的DataFrame 'df' np.random.seed(42) data = np.random.rand(100, 5) columns = ['Feature_A', 'Feature_B', 'Feature_C', 'Feature_D', 'Feature_E'] df = pd.DataFrame(data, columns=columns) # 为演示引入一些相关性 df['Feature_B'] = df['Feature_B'] + df['Feature_A'] * 0.6 + np.random.rand(100) * 0.2 df['Feature_D'] = df['Feature_D'] - df['Feature_C'] * 0.7 + np.random.rand(100) * 0.15 df['Feature_E'] = df['Feature_E'] + df['Feature_A'] * 0.4 - df['Feature_C'] * 0.3 + np.random.rand(100)*0.1 # --- 样本数据结束 --- # 选择数值列(如果尚未完成) numerical_df = df.select_dtypes(include=['float64', 'int64']) # 计算相关矩阵 correlation_matrix = numerical_df.corr() # 设置图表大小以提高可读性 plt.figure(figsize=(8, 6)) # 生成热力图 sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f") # 添加标题 plt.title('数值特征的相关矩阵') # 显示图表 plt.show()Image 19 我们来分析一下sns.heatmap()中使用的重要参数:correlation_matrix:这是主要输入,一个包含相关值的Pandas DataFrame。annot=True:这会在热力图单元格上直接显示相关系数值。强烈推荐此项,以便进行精确理解。cmap='coolwarm':这设置了颜色映射。'coolwarm'是相关性分析的好选择,因为它是一种发散型配色:它使用冷色(如蓝色)表示负相关,暖色(如红色)表示正相关,以及中性色(白色/浅灰色)表示接近零的相关性。还有许多其他颜色映射可用(例如,'viridis'、'plasma'、'RdBu_r')。fmt=".2f":这会格式化注释文本(如果annot=True则显示的数字),使其显示两位小数。解读热力图生成的热力图提供了视觉概览:颜色强度: 每个单元格中颜色的强度和色调表示相关性的强弱和方向。请参照热力图旁边的颜色条图例。在'coolwarm'颜色图中,深红色表示强正相关,深蓝色表示强负相关,接近白色的浅色表示弱相关。对角线: 从左上到右下的对角线始终显示相关性为1(完全正相关),因为任何变量都与其自身完全相关。这些单元格通常是根据颜色映射的极端值而最亮或最暗的。对称性: 热力图沿主对角线对称,因为变量A与变量B之间的相关性与变量B与变量A之间的相关性相同($Corr(A, B) = Corr(B, A)$)。标注: 如果annot=True,每个单元格中的数值会给出精确的相关系数。识别模式: 注意对角线以外的亮色/暗色方块。这些表明存在相互高度相关的一组变量。另外,寻找主要为一种颜色的行或列,这表示某个变量与许多其他变量存在强关联(正或负)。这是一个使用Plotly进行交互式模拟的例子,模拟类似输出:{"layout": {"title": "相关性热力图", "xaxis": {"tickangle": -45, "side": "bottom"}, "yaxis": {"autorange": "reversed"}, "coloraxis": {"colorscale": [[0.0, "#4263eb"], [0.5, "#e9ecef"], [1.0, "#f03e3e"]], "cmin": -1, "cmax": 1, "colorbar": {"title": "相关性"}}}, "data": [{"type": "heatmap", "z": [[1.00, 0.65, 0.05, 0.02, 0.38], [0.65, 1.00, -0.08, -0.05, 0.31], [0.05, -0.08, 1.00, -0.72, -0.31], [0.02, -0.05, -0.72, 1.00, 0.09], [0.38, 0.31, -0.31, 0.09, 1.00]], "x": ["Feature_A", "Feature_B", "Feature_C", "Feature_D", "Feature_E"], "y": ["Feature_A", "Feature_B", "Feature_C", "Feature_D", "Feature_E"], "hoverongaps": false, "text": [["1.00", "0.65", "0.05", "0.02", "0.38"], ["0.65", "1.00", "-0.08", "-0.05", "0.31"], ["0.05", "-0.08", "1.00", "-0.72", "-0.31"], ["0.02", "-0.05", "-0.72", "1.00", "0.09"], ["0.38", "0.31", "-0.31", "0.09", "1.00"]], "texttemplate": "%{text}", "hoverinfo": "x+y+z"}]}一个可视化五种特征相关矩阵的热力图。红色表示正相关,蓝色表示负相关,较浅的色调表示较弱的相关。标注显示了具体的关联系数。注意特征C和特征D之间存在强负相关(-0.72),以及特征A和特征B之间存在强正相关(0.65)。热力图提供了一种有效的方法,可以快速评估数值数据中的相关结构。它们是数据分析的常见组成部分,有助于指导特征选择,识别建模中潜在的多重共线性,并有助于更好地了解变量之间如何关联。