七大数据陷阱之技术过失(上):数据整理中的问题

引言

许多著名运动员都曾坦言:我所做的不过是令自己精力充沛,技巧娴熟。同样的,虽然之前谈论了不少与数据科学相关的理论和思想, 但实际的数据工作也不外乎基础设施的性能优化,以及到各种到位的技术性操作,如模型,算法等工具和方法的运用得当。

上一系列中,我们从基本认知过程和认识论角度讨论了数据与现实的反映关系,涉及一些思辨的元素,略微有些枯燥。 从这一篇,开始进入数据处理的技术层面,这也是一般数据工作中被最先接触和了解的;甚至在一些小白眼里, 数据处理技术就是数据工作的全部,显然这是一种认知错误了。

相信大家都读过一些数据处理的书了, 有人称这个过程为倒腾数据,有的称为咀嚼数据,或者数据预处理,数据准备,等等,总之都是表明是在整理或清理数据—把数据整理成需要的格式以便于进一步分析。 但不得不说,这个过程实在不总是那么优雅,充满了各种槽点,我们来一一看下。

如何处理数据

如果我们将数据工作全程比喻成建造房屋,这些数据准备步骤有点像打地基,安装管道和电器之类的工作。 当一切都顺利完成,可能都感觉不到这些事情的存在;但如果这些事情没做好,你肯定不想住在这种房子里, 这是因为住在这里,即使对这些部分再进行修缮,也只会变得更加混乱和困难。

显然,数据整理步骤(一般包括数据清洗,组织和校对)是后续一系列工作的前提, 而且通常会占用大量的项目工作时间,一般行业认可的平均数字是,50%-80%.

讲真,在这些重要,耗时,并繁琐的步骤中,识别并学习如何避免的陷阱,对于数据工作这一步骤的成功乃至整个项目的顺利完成是非常关键的。

让我们先来看下数据整理的基本原则:

1、几乎每个数据集都是脏的,需要在某些方便进行情理,如规格或形式等
2、转换过程,如重新格式化,混合,加入,等等,是错误多发区
3、存在一些技巧,可以帮助我们规避上述两种错误

如果你同意这些原则,就应该认同在为数据分析做准备的前期工作中存在很多陷阱,但是这不意味着我们不能应对。 尽管这些数据整理的问题可能令人烦躁,处理的过程也可能很难看,但把这些东西整理一下还是很清爽的, 就像你的衣柜最终被整理好时的感觉一样。一定程度上,这也算是某种解脱吧。

脏数据陷阱

提起脏数据,不禁要问,到底怎么个“脏”法呢。实言告汝,真的是脏得千奇百怪,如拼写错误的文本值、日期格式问题、 不匹配的单位、缺失值、空值、不兼容的地理空间坐标格式,等等,不胜枚举。 正如ggplot2(R语言中的数据可视化包)的作者Hadley Wickham在他的R for Data Science一书中所阐述的—他修改了列夫·托尔斯泰( Leo Tolstoy)的一句名言:“整洁的数据集都是相似的, 但每一个凌乱的数据集都有其各自的凌乱之处。”

在网上,有些从*部门免费下载的公开数据会有特别脏的。 让我们使用一个有趣的数据集:汽车拖车数据。 美国马里兰州巴尔的摩市交通局提供了从2017年1月到2012年10月的61300多起拖车事件的数据。 下图显示了最早的拖车事件的前11列。如下图所示。七大数据陷阱之技术过失(上):数据整理中的问题

看到这个表格的数据,很常规的样子,似乎拖拽几次,摆弄一番就妥了。每一辆车都有生产年份(vehicleYear),拖车场的朋友们也记录了这个数据。 我想知道在巴尔的摩被拖走的汽车的大致生产年份在什么时候,就计算了这里数据的平均汽车年份,四舍五入,然后我得到的数字是23–显然这列数据有问题。

这看起来很奇怪。肯定不是1923年,2023年也不可能。这是怎么回事?平均车辆制造年份怎么会是23?于此我们先带着这个疑情。

让我们再仔细看看,就像平时处理数据一样。不难看出:车辆年份这个维度在从拖车场的人工记录到数字表格记录的处理过程中还是有变化的。

扫一眼电子表格中的vehicleYear列,就会发现有一些严重的问题:第一个值是99,大概是1999。下一个值是91,我们可以假设这辆车的年份很可能是1991年。 但是第三行4的值呢?似乎应该是2004年。此外,还有一个空白单元格和一个“?”: 前者或许是记录拖车的人没有记录,后者或许只是不知道车辆年份? 这些值可能有不止一种含义。

让我们暂停于此,考虑一下收集和存储此数据所涉及的过程。听一些在美国有拖车经历的人说过记录的一般方式:来一个记录员,拿个本子和笔,问答记录,至于记成什么样子,无从知道。 而且对于谁把这些信息输入了电脑,用什么软件生成了相关表格,更加无从得知。很多信息都在数据处理和转换中丢失了,很明显可以看出,多年前的历史数据也没有进行必要的备份。

当然,我们需要对拖车司机和拖车场的数据录入员表示理解。如果我必须像这样输入超过61,000行,错误也少不了。 那么,在定量的背景下,我们该如何处理和调整这个混乱拖车车辆的年份呢?请看下面的直方图,根据刚才谈及的数据集所作。七大数据陷阱之技术过失(上):数据整理中的问题

我们可以清楚地看到有两组,而且乍一看中间似乎没有什么东西。左边的第一组车辆年值在0到17之间。可以猜测这些车是在2000年到2017年之间制造的。第二组有vehicleYear值在82和99之间;很可能是在1982年到1999年之间建造的。再者这里,我们可以调整车辆年年份,在0到17岁之间的车辆年份数值加上2000年,19以上的年份加上2000年(按:这个分析报告最初是在2019年所作)。

数据经过调整后的图如下所示。七大数据陷阱之技术过失(上):数据整理中的问题

这个看起来好多了!但还没有结束。通常,第一次调整或校正是主体调整,还需要更多的微调。 正如我们可以用拖把拖地板,但有时需要回过头来用清洁剂来擦很难擦的污渍。这个数据集也需要如此处理。

如下图,我们可以看到修正后的车辆年直方图在左边有一个很长的尾巴。看起来好像什么都没有, 但实际上,1920(最初20)、1940(最初40)、1960(最初60)和1963(最初63)的单个值都有很短的条形图。 被拖走的真的是旧车吗?
七大数据陷阱之技术过失(上):数据整理中的问题

现在,可以很确定,“丰田Camray”(原表就是这么记的)实际上是丰田凯美瑞(Toyota Camry),不可能是1920年的,因为丰田公司1982年才开始生产这种车辆。 沃尔沃S40(VolvoS40)绝对不可能是从1940的,但是可以猜测这可能是S40里面的“40”的导致的。 吉普*人(JeepLiberty)不可能是1960年的,因为这种车生产于2002-2012年。 1963年的“凯迪拉克轿车德维尔(Cadillac SedanDeville)”很可能是1963年凯迪拉克轿车德维尔(Cadillac Sedan deVille),这个年份值应该是正确的。剩下的三个明显都是是错误的年份值,该怎么办呢?把它们过滤掉吗?是否需要做更多的研究找出它们实际的年份?能让他们保持原样吗?

这在很大程度上取决于分析工作的需要,以及这些价值是否会对研究产生显著影响。 正如我们稍后将讨论的,离群值会对平均值(算术平均值)产生很大的影响,因此应该慎重选择, 并且应该对所做的任何调整或任何明显错误的值留进行详细注释。

现在,先把这四个离群值保留在数据集中,重新计算平均车辆年份,经过四舍五入,为2005, 这似乎比23更合理,不是吗?移除这四个离群值只会使计算出的平均值每年改变千分之一,并且在四舍五入取整时,它会完全消失。 所以我觉得把这四个数字留在我的分析里,即使我很确定有些问题的,不过这对我从数据中发掘洞见(insight)没有实质性的影响。

说到这一洞见,不得不道个歉,刚才的例子有点无聊:平均拖车车辆年能告诉我们什么呢?虽然2005这个统计数据很有趣,但它有点误导人,时间跨度太大,会使得有些车不在目标范围。 比如,你可不能在2014年拖一辆2017年的别克。所以更有意义的是,每两年内获得平均车辆年份,然后跟踪这个平均值随时间的变化。 在接下来的章节中,我们将会有更多关于平均值的讨论。

无尽的拼法错误

不过,我们还是多谈谈“Camray”吧。这个错误的拼写为我们提供了一个窗口,让我们了解到这个数据集的另一个糟糕的方面,即Vehicle Make字段。我们看下这个字段,因为在理论上,它的取值范围应该比车辆模型字段更有限。大多数汽车(如本田-Honda)有许多车型(思域-Civic、雅阁- Accord等)。

结果显示,在我们的数据集中,Vehicle Make字段中实际上有899个不同的条目。下图的词云显示了前100个,按照数据集中条目总数(两个事件)进行字体大小显示。七大数据陷阱之技术过失(上):数据整理中的问题

这个词云只显示了拖车最多的前100个车型标识。还有799个在整个列表中,我们找到了道奇-Dodge, 但也有Dode、Dodg、Dodg3e、Dodgfe、Dfdge、Dpdge等等。 更别提其他的雪佛兰(Chevrolet),最逗是把Peterbutt写成Peterbilt。

但说真的,我们该怎么处理这么大的一个烂摊子呢? 我们怎么可能知道在哪段时间内被拖走的最常见的车辆是什么呢?

OpenRefine是一个非常有用的工具,可以免费下载,可用于标识和快速组合列中的类似值,还有其他方便的功能。用OpenRefine打开数据集, 并执行一个在汽车制造领域的聚类功能,在key collision method与ngram-fingerprint选择功能,ngram的大小的设为1,这样就可很快得到每辆车有多少错误值 (按:该软件操作实质上在执行一个文本聚类的算法,感兴趣的同学可以下载安装体验一下)
七大数据陷阱之技术过失(上):数据整理中的问题

这个特定的算法找到了113个不同的类要合并,可以在滚动页面时逐一查审查。 强烈推荐这样做,因为这样会发现算法并不完美。 例如,它想为Dodger和Dodge创建一个集群,并建议将Suzuui(显然是Suzuki的拼写错误)合并到Isuzu类中七大数据陷阱之技术过失(上):数据整理中的问题

我们还注意到在下图中Open Refine建议我们为大众汽车(Volkswagen)创建一个独特的集群,对吧?如果你像我第一次那样认为这没什么错, 就会忽略一个事实,那就是这组中四个不同的值都是拼写错误的Volkswagen。 如果滚动一下,会发现算法为正确的拼写建议了一个单独的组,这时候可以进行纠正。 如果这样做,会发现在数据集中有36种不同的拼写方式Volkswagen。
七大数据陷阱之技术过失(上):数据整理中的问题

利用ngram-fingerprint算法快速搜索明显的缺失值,如下图,可以有效地将vhicleMake字段中的不同值从899个减少到仅507个。这大大降低了复杂度。但是我们做完了吗七大数据陷阱之技术过失(上):数据整理中的问题

这也很费劲了,但是想象一下,如果必须为vehicleMake字段筛选所有的899个不同的值,那将更加痛苦。 至少,聚类算法将这个数字大致减少到一半。

在对列表进行了大约半小时的检查, 并手动修复了一些明显不正确的条目,这些条目是没有被聚类算法有效分组的,最后得到了336个不同的Vehicle Make值。请注意,我最终还是得到了一些有趣的条目,比如burning Car、Pete、Rocket,以及这个领域的一大堆数字,所以依然并不完美,但已经比刚开始的时候干净多了。

但那又怎样?值得吗?它是如何影响我们的分析的?下图是该数据集数据清理前后的拖车事件的数量,取前25。七大数据陷阱之技术过失(上):数据整理中的问题

值得注意的是,前两名的汽车制造商本田(Honda )和福特(Ford)仍在前两名, 但分别增长了2454辆(增长46%)和1685辆(增长36%), 在榜单上的位置可能没有改变,但数值上有重大提升。

并不是所有上榜的在榜单上的位置都保持不变。丰田(Toyota)从第4位上升到第3位,雪佛兰(Chevrolet)从第3位下降到第4位。 两者的数量都增加了几千。值得注意的是,Jeep从第15位跃至第10位,而最初甚至没有进入前25位的大众, 经过聚类、合并和数据清理,最终排名至第11位。

可见,对于该数据集,脏数据字段的清理会对我们的分析产生实质性的改变。 以此可以避免一些严重的误解,包括在巴尔的摩哪些车辆被拖得最多,以及哪些品牌的车被拖走的还不算多。

到这里,文章的篇幅已经很长了,下一篇会以这个数据为例,继续讨论如何在适当的时候停止数据整理过程。

想获取更多内容,请关注海数据实验室公众号。

本期分享到这里,我们会每天更新内容,咱们下期再见,期待您的再次光临。有什么建议,比如想了解的知识、内容中的问题、想要的资料、下次分享的内容、学习遇到的问题等,请在下方留言。如果喜欢请关注。七大数据陷阱之技术过失(上):数据整理中的问题七大数据陷阱之技术过失(上):数据整理中的问题

社群推荐:
更多有关数据分析的精彩内容欢迎加入海数据在线数据分析交流群,有什么想法或者疑问都可在里面提出,与同行零距离交流,共同成长进步,请识别下面二维码加火星小海马微信,邀你进群。七大数据陷阱之技术过失(上):数据整理中的问题