数据缺失值可视化利器-missingno

1,487 阅读6分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

背景

数据探索和预处理是任何数据科学或机器学习工作流中的重要步骤。在使用教程或训练数据集时,可能会出现这样的情况:这些数据集的设计方式使其易于使用,并使所涉及的算法能够成功运行。然而,在现实世界中,数据是混乱的!它可能有错误的值、不正确的标签,并且可能会丢失部分内容。

丢失数据可能是处理真实数据集时最常见的问题之一。数据丢失的原因很多,包括传感器故障、数据过时、数据管理不当,甚至人为错误。丢失的数据可能以单个值、一个要素中的多个值或整个要素丢失的形式出现。

重要的是,在进行数据分析或机器学习之前,需要我们对缺失的数据进行适当的识别和处理。许多机器学习算法不能处理丢失的数据,需要删除整行数据,其中只有一个丢失的值,或者用一个新值替换(插补)。

根据数据的来源,缺失值可以用不同的方式表示。最常见的是NaN(不是数字),但是,其他变体可以包括“NA”、“None”、“999”、“0”、“ ”、“-”。如果丢失的数据是由数据帧中的非NaN表示的,那么应该使用np.NaN将其转换为NaN(df.replace('', np.NaN))。

简介

missingno 提供了一个小型工具集,其中包含灵活且易于使用的缺失数据可视化实用程序,可让您快速直观地了解数据集的完整性。missingno基于matplotlib可视化,接受pandas数据源。这可以是条形图、矩阵图、热图或树状图的形式。

从这些图中,我们可以确定缺失值发生的位置、缺失的程度以及是否有缺失值相互关联。通常,缺失的值可能被视为没有贡献任何信息,但如果仔细分析,可能有潜在的描述。

安装

pip install missingno

加载样例数据集

这是一个纽约警察局机动车碰撞数据集的样本。本文的其余部分将从这个collisions数据集中提取。

import pandas as pd
collisions = pd.read_csv("https://raw.githubusercontent.com/ResidentMario/missingno-data/master/nyc_collision_factors.csv")

矩阵-matrix

msno.matrix 空值矩阵是一种数据密集型显示,可让您快速直观地在所有数据中挑选出样例。

import missingno as msno
%matplotlib inline
msno.matrix(collisions.sample(250))

image.png

乍一看,date, time、受伤的分布和第一影响因素似乎都是完整的,而地理信息似乎大多是完整的,但斑点更多。

右边的sparkline总结了数据完整性的一般形状,并指出了数据集中具有最大和最小零值的行。

这种可视化可以轻松地容纳多达50个带标签的变量。超过这个范围,标签开始重叠或变得不可读,默认情况下,大屏幕会省略它们。

如果您正在处理时间序列数据,则可以使用 freq 关键字参数指定周期性:

import numpy as np

null_pattern = (np.random.random(1000).reshape((50, 20)) > 0.5).astype(bool)
# 将所有的Flase转换为None
null_pattern = pd.DataFrame(null_pattern).replace({False: None})
msno.matrix(null_pattern.set_index(pd.period_range('1/1/2011', '2/1/2015', freq='M')) , freq='BQ')

image.png

条形图-bar

msno.bar是按列对空值进行简单可视化。

msno.bar(collisions.sample(1000))

image.png

您可以通过指定 log=True 切换到对数刻度。 bar用矩阵提供相同的信息,但格式更简单。

msno.bar(collisions.head(1000), log=True)

热力图-heatmap

missingno相关的热力图测量空值相关性,即以个变量的存在或不存在对另一个变量存在的影响程度。

msno.heatmap(collisions)

image.png

在本例中,似乎使用OFF STREET NAME变量归档的报告不太可能具有完整的地理数据。

空值相关性范围从-1(如果一个变量出现,另一个肯定不会)到0(变量出现或不出现对彼此没有影响)到1(如果一个变量出现,另一个肯定也会)。

始终是没有空值或始终是空值的变量没有任何有意义的相关性,因此会从可视化中默默地删除。

例如,在本例中,日期时间和受伤数列完全没有空值,则不出现在图中。

标记为<1>-1的条目具有接近于完全负或正的相关性,但仍然不完全如此,这表明数据集中有少量的记录是错误的(脏数据)。

例如,在这个数据集中,VEHICLE CODE TYPE 3CONTRIBUTING FACTOR VEHICLE 3之间的相关性<1,这表明,与我们的期望相反,有一些记录具有其中一个或另一个,但不是两者都有。这些情况需要特别注意。

热力图非常适用于找出变量对之间的数据完整性关系,但是当涉及到更大的关系时,它的解释力是有限的,并且它对超大数据集没有特别的支持。

树状图-dendrogram

树状图可以让你更充分地变量之间的相关性,揭示比相关性热力图中可见的两两之间的关系更深入的关系。

msno.dendrogram(collisions)

image.png

树状图使用分层聚类算法(由 scipy 提供)通过它们的空值相关性(根据二进制距离测量)将变量相互分类,将空值相关度很强的列分组在一起。

如果在零级将多个列组合在一起,则其中一列中是否存在空值与其他列中是否存在空值直接相关。树中的列越分离,列之间关联null值的可能性就越小。上图中最右侧的列(DATE、TIME、LOCATION、LATITUDE等)为一类,彼此的距离为 0(因为都没有缺失数据)。

在树的每个步骤中,根据哪个组合最小化其余群集的距离来对变量进行拆分。变量集越单调,它们的总距离越接近零,而它们的平均距离(y轴)越接近零。

要解释这个图表,请从自上而下的角度阅读。

以零距离连接在一起的簇叶可以完全预测另一个变量的存在。当另一个变量被填充时,一个变量可能总是空的。或者它们可能总是都不为空或者都是空的,依此类推。

在这个具体的例子中,树状图将所需的变量粘在一起,因此出现在每个记录中。

簇叶几乎分裂为零,但不分裂为零,彼此预测得很好,但仍不完美。

如果您自己对数据集的解释是,这些列实际上或应该在空值中相互匹配(例如,CONTRIBUTING FACTOR VEHICLE 2VEHICLE TYPE CODE 2应该匹配),则簇叶的高度以绝对值表示,记录“不匹配”或不正确归档的频率, 即如果你这么想的话,你需要填充或删除多少值。

与矩阵一样,在这种配置中最多只能显示50个带标签的列。然而,树状图通过简单地切换到水平配置,来更优雅地处理极大的数据集。

总结

在应用机器学习之前识别数据缺失值是数据质量工作的一个关键组成部分。本文通过使用missingno库可视化,以了解有多少缺失数据存在、发生在哪里,以及不同数据列之间的缺失值是否存在相关性。

参考文档