3. 缺失值可视化分析

缺失值可视化是特征回放对比分析中不可或缺的环节。通过图形化手段,可以快速识别缺失模式、缺失比例以及变量间的缺失关联性,为后续填充策略提供数据支撑。本节将系统讲解如何使用 Matplotlib 与 Seaborn 绘制缺失值热力图、缺失比例条形图以及缺失模式分析图。

3.1 缺失值热力图

缺失值热力图用于展示数据集中各特征之间缺失值的共现关系。当两个特征同时缺失的频率较高时,说明它们可能存在某种关联机制(如设备故障导致一组传感器同时失效)。

图表类型 核心用途 适用场景
缺失热力图 显示特征间缺失值的相关性 多变量缺失模式识别、传感器数据、问卷调查
缺失比例条形图 展示每个特征的缺失百分比 快速定位高缺失率特征、阈值筛选
缺失模式图 展示样本级别的缺失组合模式 小样本数据、缺失结构探索

关键参数说明:缺失热力图通常基于缺失指示矩阵(0/1 矩阵)计算相关系数。使用 sns.heatmap() 时,建议设置 cmap='viridis' 或 cmap='coolwarm',并添加 annot=True 显示数值。

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

# 构造示例数据
np.random.seed(42)
data = pd.DataFrame({
    'feature_a': np.random.randn(100),
    'feature_b': np.random.randn(100),
    'feature_c': np.random.randn(100),
    'feature_d': np.random.randn(100),
    'feature_e': np.random.randn(100)
})

# 人为引入缺失值
data.loc[0:20, 'feature_a'] = np.nan
data.loc[10:35, 'feature_b'] = np.nan
data.loc[15:40, 'feature_c'] = np.nan
data.loc[50:70, 'feature_d'] = np.nan
data.loc[60:85, 'feature_e'] = np.nan

# 构建缺失指示矩阵
missing_matrix = data.isnull().astype(int)

# 计算缺失相关性
missing_corr = missing_matrix.corr()

# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(missing_corr, annot=True, cmap='coolwarm',
            vmin=-1, vmax=1, center=0,
            linewidths=0.5, linecolor='white',
            cbar_kws={'label': '缺失相关系数'})
plt.title('缺失值热力图 - 特征间缺失相关性', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()

解读技巧:热力图中颜色越接近红色(正值),表示两个特征同时缺失的频率越高;越接近蓝色(负值),表示一个特征缺失时另一个特征倾向于不缺失。对角线始终为 1,表示特征与自身完全相关。

缺失热力图结构示意 feat_a feat_b feat_c feat_d feat_e feat_a feat_b feat_c feat_d feat_e 1.00 0.72 0.65 -0.12 -0.08 0.72 1.00 0.58 -0.05 0.03 0.65 0.58 1.00 -0.18 -0.10 -0.12 -0.05 -0.18 1.00 0.45 -0.08 0.03 -0.10 0.45 1.00 强正相关 (0.6~1.0) 中等正相关 (0.3~0.6) 负相关 / 弱相关

3.2 缺失比例条形图

缺失比例条形图以直观的柱状形式展示每个特征的缺失百分比,是数据清洗前最常用的诊断工具之一。通过该图可以快速识别需要重点关注的高缺失率特征。

# 计算每个特征的缺失比例
missing_ratio = data.isnull().mean().sort_values(ascending=False) * 100

# 绘制条形图
plt.figure(figsize=(10, 5))
bars = plt.bar(missing_ratio.index, missing_ratio.values,
               color=['#e74c3c' if v > 20 else '#3498db' for v in missing_ratio.values],
               edgecolor='white', linewidth=0.8)

# 添加数值标签
for bar, val in zip(bars, missing_ratio.values):
    plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1,
             f'{val:.1f}%', ha='center', va='bottom', fontsize=11, fontweight='bold')

plt.axhline(y=20, color='#f39c12', linestyle='--', linewidth=1.5, label='阈值线 (20%)')
plt.title('各特征缺失比例分布', fontsize=14, fontweight='bold')
plt.ylabel('缺失比例 (%)')
plt.xlabel('特征名称')
plt.legend()
plt.tight_layout()
plt.show()

注意:缺失比例条形图仅反映单变量的缺失情况,无法揭示特征间的缺失关联。当多个特征缺失比例均较高时,应结合热力图判断是否存在系统性缺失。

缺失比例条形图示意 0% 25% 50% 75% 100% 阈值 20% 38.0% feat_c 26.0% feat_b 21.0% feat_a 15.0% feat_e 8.0% feat_d

3.3 缺失模式分析

缺失模式分析通过矩阵图或聚类图展示样本级别的缺失组合模式。常用的工具有 missingno 库的 matrix() 和 dendrogram() 函数,以及 Seaborn 的 clustermap()。

3.3.1 缺失模式矩阵图

矩阵图中每一行代表一个样本,每一列代表一个特征。白色表示数据存在,黑色表示缺失。通过观察行的黑白模式,可以识别出常见的缺失组合。

import missingno as msno

# 绘制缺失模式矩阵图
msno.matrix(data, figsize=(10, 6), color=(0.2, 0.4, 0.6))
plt.title('缺失模式矩阵图', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()

3.3.2 缺失模式聚类图

聚类图在矩阵图的基础上,对样本和特征进行层次聚类,使相似的缺失模式聚集在一起,便于发现结构性缺失。

# 绘制缺失模式聚类图
msno.dendrogram(data, figsize=(10, 6))
plt.title('缺失模式聚类图', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()

缺失模式分类:

  • 完全随机缺失 (MCAR):缺失与任何变量无关,缺失模式图中无明显聚集。
  • 随机缺失 (MAR):缺失依赖于其他观测变量,聚类图中会出现明显的模式块。
  • 非随机缺失 (MNAR):缺失依赖于缺失变量本身,通常需要领域知识辅助判断。

3.4 综合对比分析流程

在实际项目中,建议按照以下流程进行缺失值可视化分析:

  1. 第一步:计算整体缺失比例,使用 data.isnull().sum() 快速扫描。
  2. 第二步:绘制缺失比例条形图,标记超过阈值的特征。
  3. 第三步:绘制缺失热力图,分析特征间缺失关联。
  4. 第四步:对高缺失率特征组进行缺失模式矩阵分析。
  5. 第五步:结合业务背景判断缺失机制,制定填充策略。
分析步骤 可视化工具 输出结论
1. 整体扫描 缺失比例条形图 高缺失率特征列表
2. 关联分析 缺失热力图 特征间缺失相关性
3. 模式识别 缺失模式矩阵/聚类图 缺失组合与聚类结构
4. 机制判断 综合以上图表 MCAR / MAR / MNAR

实战建议:当缺失比例超过 50% 时,建议优先考虑删除该特征;当缺失比例在 20%~50% 之间时,应结合缺失模式决定填充策略;当缺失比例低于 20% 时,可采用均值/中位数/众数填充或模型预测填充。