数据集混乱?缺少值? missingno
提供了一个灵活且易于使用的缺失数据可视化和实用程序的小型工具集,可让您快速直观地了解数据集的完整性(或缺乏完整性)。只需pip install missingno
即可开始。
本快速入门使用 NYPD 机动车辆碰撞数据集数据集的示例。
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 ))
乍一看,日期、时间、受伤分布以及第一辆车的贡献因子似乎都已完整填充,而地理信息似乎基本完整,但参差不齐。
右侧的迷你图总结了数据完整性的一般形状,并指出了数据集中具有最大和最小空值的行。
该可视化可以轻松容纳多达 50 个标记变量。超过该范围标签开始重叠或变得不可读,并且默认情况下大显示屏会忽略它们。
如果您正在处理时间序列数据,则可以使用freq
关键字参数指定周期:
null_pattern = ( np . random . random ( 1000 ). reshape (( 50 , 20 )) > 0.5 ). astype ( bool )
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' )
bar
msno.bar
是按列显示无效性的简单可视化:
msno . bar ( collisions . sample ( 1000 ))
您可以通过指定log=True
切换到对数刻度。 bar
提供与matrix
相同的信息,但格式更简单。
heatmap
missingno
相关性热图衡量无效相关性:一个变量的存在或不存在对另一个变量的存在的影响有多大:
msno . heatmap ( collisions )
在此示例中,似乎使用OFF STREET NAME
变量提交的报告不太可能具有完整的地理数据。
无效相关性的范围为-1
(如果一个变量出现,则另一个变量肯定不出现)到0
(出现或不出现的变量相互之间没有影响)到1
(如果一个变量出现,则另一个变量肯定也会出现)。
使用的确切算法是:
import numpy as np
# df is a pandas.DataFrame instance
df = df . iloc [:, [ i for i , n in enumerate ( np . var ( df . isnull (), axis = 'rows' )) if n > 0 ]]
corr_mat = df . isnull (). corr ()
始终为满或始终为空的变量没有有意义的相关性,因此会默默地从可视化中删除 - 在这种情况下,例如完全填充的日期时间和受伤数字列不包括在内。
标记为<1
或>-1
的条目具有接近完全负或正的相关性,但仍不完全如此。这表明数据集中有少量记录是错误的。例如,在此数据集中, VEHICLE CODE TYPE 3
和CONTRIBUTING FACTOR VEHICLE 3
之间的相关性<1
,这表明与我们的预期相反,有一些记录具有其中之一,但不是两者兼有。这些情况需要特别注意。
热图非常适合找出变量对之间的数据完整性关系,但当涉及到较大的关系时,其解释能力有限,并且它对极大的数据集没有特别的支持。
dendrogram
树状图允许您更全面地关联变量完成,揭示比相关热图中可见的成对趋势更深入的趋势:
msno . dendrogram ( collisions )
树状图使用分层聚类算法(由scipy
提供)通过变量的无效相关性(以二进制距离测量)将变量彼此分类。在树的每一步,变量都会根据哪种组合最小化剩余簇的距离而被分割。变量集越单调,它们的总距离越接近于零,并且它们的平均距离(y 轴)也越接近于零。
使用的确切算法是:
from scipy . cluster import hierarchy
import numpy as np
# df is a pandas.DataFrame instance
x = np . transpose ( df . isnull (). astype ( int ). values )
z = hierarchy . linkage ( x , method )
要解释此图,请从自上而下的角度阅读它。以零距离连接在一起的簇叶完全可以预测彼此的存在——当另一个变量被填充时,一个变量可能总是为空,或者它们可能总是都被填充或都为空,等等。在这个具体示例中,树状图将所需的变量粘合在一起,因此出现在每个记录中。
簇叶的分裂接近于零,但不是零,可以很好地相互预测,但仍然不完美。如果您自己对数据集的解释是这些列实际上或应该彼此匹配(例如, CONTRIBUTING FACTOR VEHICLE 2
和VEHICLE TYPE CODE 2
应该匹配),那么簇叶的高度会告诉您,从绝对意义上讲,记录“不匹配”或错误归档的频率——也就是说,如果您愿意的话,您需要填写或删除多少个值。
与matrix
一样,在此配置中最多只能显示 50 个标记列。然而,通过简单地翻转到水平配置, dendrogram
可以更优雅地处理极大的数据集。
有关绘图的更多高级配置详细信息,请参阅此存储库中的CONFIGURATION.md
文件。
有关功能或错误报告的想法,请参阅问题。如果您有兴趣为此库做出贡献,请参阅此存储库中的CONTRIBUTING.md
文件中的详细信息。如果这样做,请记住, missingno
目前处于维护状态,因此虽然欢迎修复错误,但我不太可能审查或登陆任何新的主要库功能。