外观
使用热力图进行缺失数据分析
Missing Data Analysis with Heatmaps

真实世界的数据集几乎总是存在缺失值。在大多数情况下,我们事先并不知道值为什么缺失。
但了解一下缺失值可能存在的多种原因是有好处的:
- 完全随机缺失(MCAR):值本身真正地缺失,与该观测或任何其他观测都没有关系。
- 随机缺失(MAR):数据由于另一个可观测变量而缺失。例如,我们可能观察到缺失值的百分比因其他变量的不同而存在显著差异。
- 非随机缺失(MNAR):这个比较棘手。当缺失变量中存在明确的规律时,就会发生 MNAR。然而,它与我们在数据中能观察到的任何特征都无关。事实上,它可能取决于某个未被观测到的特征。而找出缺失的原因,对于后续的分析、插补和建模可能极其有用。假设我们有一个商店的每日销售数据集,其中包含以下信息:

- 星期和日期
- 商店开门和关门时间
- 顾客数量
- 总销售额
- 开门和关门时的账户余额
我们并不知道缺失值的原因。在这里,进行 EDA(探索性数据分析)时,许多人会按如下方式计算逐列的缺失频率:

上表只是突出显示了每一列中缺失值的数量。更具体地说,我们了解到:
- 与其它列相比,有两列的缺失值相对较多。
- 开门和关门时间两列的缺失值数量相同(53)。
这是它提供的唯一信息。然而,这种方法的问题在于,它隐藏了许多关于缺失值的重要细节,例如:
- 它们在数据集中的具体位置。
- 缺失值的周期性(如果有的话)。
- 缺失值在列之间的相关性等。
……而这些对于理解缺失的原因可能极其有用。换言之,上表更像是汇总统计(statistical),很少能描绘真实情况。为什么呢?
我们在本书的统计(statistical)部分讨论过这一点。

但下面是我如何用热力图(heatmap)来丰富我的缺失值分析。把前面讨论的缺失值表与下面的缺失值热力图做一下对比:

白色竖线描绘了缺失值在特定列中的位置。现在,立刻就能看出:
- 开门和关门时间列中的值是周期性缺失的。
- 开门和关门时间列中的缺失值是相关的。
- 其他列中的缺失值似乎是(虽然未必)完全随机缺失的。对开门时间的进一步分析让我们发现,该商店在星期天总是不营业:
- 现在,我们知道了为什么数据集中的开门和关门时间会缺失。这一信息在插补时会很有帮助。这种特定情形属于“随机缺失(MAR)”。本质上,正如我们上面所见,缺失是由另一个可观测列的值所驱动的。既然我们知道了原因,就可以使用 kNN 插补或 MissForest 技术来插补这些值,我们在本书的 ML 部分讨论过这些(MissForest 和 kNN imputation)。
