3. 缺失值可视化分析:使用 Matplotlib / Seaborn 绘制缺失值热力图与条形图

在完成缺失值统计与初步巡检后,可视化是快速定位缺失模式、判断缺失机制(MCAR / MAR / MNAR)最直观的手段。本节将使用 Matplotlib 与 Seaborn 绘制两种核心图表:缺失值热力图(展示特征间缺失共现关系)与 缺失值条形图(展示各特征缺失率排序)。

3.1 缺失值热力图:揭示特征间缺失共现模式

热力图通过颜色深浅反映两个特征同时缺失的样本比例,帮助发现缺失是否具有结构性关联(例如:特征 A 缺失时,特征 B 几乎必然缺失)。

应用场景:当热力图中出现深色方块(高共现缺失率)时,提示可能存在数据采集链路中断或业务规则导致的批量缺失,需优先排查数据源。

3.1.1 核心代码实现

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

# 构造缺失指示矩阵(1=缺失,0=非缺失)
def plot_missing_heatmap(df, figsize=(10, 8)):
    missing_indicator = df.isnull().astype(int)
    # 计算特征间缺失共现率矩阵
    co_occurrence = missing_indicator.T @ missing_indicator
    co_occurrence_rate = co_occurrence / len(df)
    
    plt.figure(figsize=figsize)
    sns.heatmap(
        co_occurrence_rate,
        annot=True,
        fmt='.2f',
        cmap='Reds',
        cbar_kws={'label': '缺失共现率'},
        linewidths=0.5,
        linecolor='white',
        square=True
    )
    plt.title('缺失值共现热力图 (Missing Co-occurrence Heatmap)', fontsize=14)
    plt.xlabel('特征')
    plt.ylabel('特征')
    plt.tight_layout()
    plt.show()

# 示例调用
# plot_missing_heatmap(df)

3.1.2 热力图解读指南

热力图颜色 共现率范围 业务含义 建议操作
浅色(接近白色) 0.00 – 0.05 两个特征缺失几乎独立 无需特殊处理
中等红色 0.05 – 0.30 存在一定共现趋势 检查数据采集逻辑
深红色 0.30 – 1.00 强共现缺失,可能同源 优先合并或删除冗余特征
注意:热力图对角线必然为 1.00(特征与自身的缺失共现率),解读时请忽略对角线,重点关注非对角线位置的深色方块。

3.2 缺失值条形图:快速定位高缺失率特征

条形图以缺失率降序排列,直观展示每个特征的缺失比例,帮助确定哪些特征需要重点处理(如删除、填充或建模预测)。

3.2.1 核心代码实现

def plot_missing_bar(df, figsize=(12, 6), top_n=None):
    missing_ratio = df.isnull().mean().sort_values(ascending=False)
    if top_n:
        missing_ratio = missing_ratio.head(top_n)
    
    plt.figure(figsize=figsize)
    colors = ['#e74c3c' if r > 0.5 else '#f39c12' if r > 0.2 else '#3498db' for r in missing_ratio.values]
    bars = plt.barh(range(len(missing_ratio)), missing_ratio.values, color=colors, edgecolor='white')
    
    plt.yticks(range(len(missing_ratio)), missing_ratio.index)
    plt.xlabel('缺失率')
    plt.title('特征缺失率排序条形图 (Missing Ratio Bar Chart)', fontsize=14)
    plt.xlim(0, 1.05)
    
    # 在条形末端标注百分比
    for i, (bar, ratio) in enumerate(zip(bars, missing_ratio.values)):
        plt.text(ratio + 0.01, i, f'{ratio:.1%}', va='center', fontsize=9)
    
    plt.tight_layout()
    plt.show()

# 示例调用
# plot_missing_bar(df, top_n=15)

3.2.2 条形图颜色编码规则

  • 红色(缺失率 > 50%):高缺失特征,建议删除或作为独立缺失指示变量。
  • 橙色(缺失率 20% – 50%):中等缺失特征,需结合业务判断填充策略。
  • 蓝色(缺失率 < 20%):低缺失特征,可直接用均值/中位数/众数填充。

3.3 缺失模式可视化流程

推荐分析顺序:
1. 先绘制 条形图,快速掌握各特征缺失率分布。
2. 再绘制 热力图,探索特征间缺失共现关系。
3. 结合两者结果,制定缺失值处理优先级与策略。
缺失值可视化分析流程 原始数据 DataFrame 计算缺失指示矩阵 (isnull) 缺失率条形图 降序排列各特征缺失率 缺失共现热力图 特征间缺失共现率矩阵 识别高缺失率特征 发现缺失共现模式 制定缺失处理策略

3.4 可视化结果与缺失机制推断

结合热力图与条形图,可初步推断缺失机制:

可视化特征 可能缺失机制 典型表现
条形图:缺失率集中在少数特征 MNAR(非随机缺失) 缺失与特征自身值相关
热力图:多个特征共现缺失 MAR(随机缺失) 缺失可由其他特征解释
条形图:各特征缺失率低且均匀 MCAR(完全随机缺失) 缺失与任何特征无关
实战建议:在 LightGBM 建模前,将缺失率 > 50% 的特征标记为“待删除候选”,将缺失共现率 > 0.3 的特征对进行合并或保留其一,避免引入冗余缺失噪声。