无论是打比赛还是在实际工程项目中,都会遇到数据缺失的情况,如果数据集较小,还能在 Excel 或者其他可视化软件大致看一下导致数据缺失的原因。但当数据集较大时,手工查看每个变量的缺失值是非常麻烦的一件事情。
数据探索和预处理也是任何数据科学或机器学习工作流中的重要步骤。缺失数据可能是处理真实数据集时最常见的问题之一,数据丢失的原因很多,包括传感器故障、数据过时、数据管理不当,甚至人为错误。丢失的数据可能以单个值、一个要素中的多个值或整个要素丢失的形式出现。
重要的是,在进行数据分析或机器学习之前,需要我们对缺失的数据进行适当的识别和处理。许多机器学习算法不能处理丢失的数据,需要删除整行数据,其中只有一个丢失的值,或者用一个新值替换(插补)。
混乱的数据集?m i s s i n g n o missingnomissingno 提供了一个灵活易用的缺失数据可视化和实用程序的小型工具集(基于 m a t p l o t l i b matplotlibmatplotlib 的,兼容 p a n d a s pandaspandas 数据源),使你能够快速获得你的数据集的完整性(或缺乏完整性)的可视化摘要。只要 p i p pippip 安装上 m i s s i n g n o missingnomissingno 就可以开始了。
pipinstallmissingno-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.com
missingno 包含了 4 44 种类型图示:
- matrix:m s n o . m a t r i x msno.matrixmsno.matrix空白性矩阵是一种数据密集显示图,可以直观的看到各个特征缺失数据分布情况,这种可视化图示最多可以容纳 50 5050 个 c o l u m n columncolumn,超过此范围的标签开始重叠或变得不可读;
- heatmap:数据列之前缺失相关性分析图,展示了一个变量的存在或不存在对另一个变量的存在有多强烈的影响
- dendrogram:通过树状图,您可以更全面地关联变量完成,揭示比 h e a t m a p heatmapheatmap 中可见的成对趋势更深的趋势。与m a t r i x matrixmatrix 图一样,在这种配置下最多只能显示 50 5050 个带标签的列。但是树状图只需翻转到水平配置即可更优雅地处理超大型数据集。
- bar:msno.bar 是按列对无效性数据的简单可视化;
msno.matrix是使用最多的方法(剩余的方法用得较少),能快速直观地看到数据集的完整性情况。以 2021年MathorCup 大数据挑战赛的二手车估价训练集为例,可视化结果如下:
# 读取训练集excel数据 查看首尾10行df_t=pd.read_excel("train_data.xlsx") df_t.head().append(df_t.tail()) plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文plt.rcParams['axes.unicode_minus'] =False# 显示负号plt.rcParams['figure.dpi'] =500# dpimsno.matrix(df_t)
使用 missingno 库可视化,快速了解有多少缺失数据存在、发生在哪里。右边的sparkline 总结了数据完整性的一般形状,并标出了数据集中具有最大和最小空白性的行。
每列特征缺失数据数量条形图可视化和打印统计结果:
missing=df_t.isnull().sum() missing=missing[missing>0] missing.sort_values(inplace=True) missing_label=missing.indexmissing_values=missing.valuesper_value= ["{:.2%}".format(i/30000) foriinmissing_values] missing_dic= {k: [v, z] fork, v, zinzip(list(missing_label), missing_values, per_value)} print(missing_dic) plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文# 可视化 水平柱形图fig, ax=plt.subplots(figsize=(6, 4), dpi=500) b=ax.barh(range(len(missing_label)), missing_values, color='blue', ec="r", lw=1.2, ) # 为横向水平的柱图右侧添加数据标签forrectinb: w=rect.get_width() ax.text(w+180, rect.get_y() +rect.get_height() /2, '%d'%int(w), ha='left', va='center', fontdict={ "family": "Times New Roman", "fontsize": 8 }) ax.set_ylim(bottom=0, top=14) # 设置Y轴纵坐标上的刻度线标签。ax.set_yticks(range(len(missing_label))) ax.set_yticklabels(missing_label) ax.tick_params(axis='y', direction='in', labelsize=8, length=0) forspinein ['top', 'right', "left", "bottom"]: ax.spines[spine].set_color('none') # 不需要X横坐标上的label标签plt.xticks(()) # 保存图片 展示showplt.savefig("./results/01 训练集缺失值情况.png", dpi=500) plt.show()
结果如下:
补充学习: