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. 结合两者结果,制定缺失值处理优先级与策略。
1. 先绘制 条形图,快速掌握各特征缺失率分布。
2. 再绘制 热力图,探索特征间缺失共现关系。
3. 结合两者结果,制定缺失值处理优先级与策略。
3.4 可视化结果与缺失机制推断
结合热力图与条形图,可初步推断缺失机制:
| 可视化特征 | 可能缺失机制 | 典型表现 |
|---|---|---|
| 条形图:缺失率集中在少数特征 | MNAR(非随机缺失) | 缺失与特征自身值相关 |
| 热力图:多个特征共现缺失 | MAR(随机缺失) | 缺失可由其他特征解释 |
| 条形图:各特征缺失率低且均匀 | MCAR(完全随机缺失) | 缺失与任何特征无关 |
实战建议:在 LightGBM 建模前,将缺失率 > 50% 的特征标记为“待删除候选”,将缺失共现率 > 0.3 的特征对进行合并或保留其一,避免引入冗余缺失噪声。