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,表示特征与自身完全相关。
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()
注意:缺失比例条形图仅反映单变量的缺失情况,无法揭示特征间的缺失关联。当多个特征缺失比例均较高时,应结合热力图判断是否存在系统性缺失。
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 综合对比分析流程
在实际项目中,建议按照以下流程进行缺失值可视化分析:
- 第一步:计算整体缺失比例,使用
data.isnull().sum()快速扫描。 - 第二步:绘制缺失比例条形图,标记超过阈值的特征。
- 第三步:绘制缺失热力图,分析特征间缺失关联。
- 第四步:对高缺失率特征组进行缺失模式矩阵分析。
- 第五步:结合业务背景判断缺失机制,制定填充策略。
| 分析步骤 | 可视化工具 | 输出结论 |
|---|---|---|
| 1. 整体扫描 | 缺失比例条形图 | 高缺失率特征列表 |
| 2. 关联分析 | 缺失热力图 | 特征间缺失相关性 |
| 3. 模式识别 | 缺失模式矩阵/聚类图 | 缺失组合与聚类结构 |
| 4. 机制判断 | 综合以上图表 | MCAR / MAR / MNAR |
实战建议:当缺失比例超过 50% 时,建议优先考虑删除该特征;当缺失比例在 20%~50% 之间时,应结合缺失模式决定填充策略;当缺失比例低于 20% 时,可采用均值/中位数/众数填充或模型预测填充。