数据清洗的经验与教训 Data Cleaning-36大数据
作者:Yiqin Fu
小学的时候我统计过同学里有多少要订课间牛奶:每人分别需要什么口味和什么大小,应收多少钱。最后这份按照座位排序的表格要和一张学号表格按照同学姓名对应起来,并计算每种口味订购数量和每人应收款。过程中我遇到了很多困难,例如有同学订了多种口味,有同学的信息被登记到了别的同学那一行——这应该是我最早的数据清洗经历。那时候遇到的问题现在也不断遇到,只是手动复制粘贴一个 40 行 4 列的 Excel 表格比现在做的简单很多。
下面是我在犯了很多错误后总结的教训,写下来做笔记提醒自己,或许也可以给大家启发。
时间计划
数据收集、整理通常占整个研究 70% – 90% 的时间。一定在计划的时候要给足时间,安排好整理数据同时可以做的其他事项(写出文章基本框架、阅读文献等)。
准备工作
把原始数据单独保存在一个文件夹里,永远不要改动,标记它们的来源(开源网站?自己抓取?自己收集?数据库购买?)。在处理数据前,一定要想好你处理后的数据如何能和原始数据对应起来,例如通过变量名或者标识符(identifier)。 这个步骤很重要,因为如果你发现最终数据有误,还能通过变量名或标识符找到错误的源头。
在开始处理数据前,把数据结构了解清楚。最好把下列问题的答案写在一个文档里:你有哪几个数据集,分别叫什么名字、长什么样(几行几列,单位是什么:是个人-每年层面的数据,还是国家-每月的数据);你的目标是什么(合并?算每个子集的中位数?统一单位?合并或统一单位的目的又是什么?为什么我的研究要求我这么做?);要用的变量叫什么名字,输出的变量叫什么名字、长什么样,怎样应用到接下来的分析中。
以上步骤听起来很简单,甚至没有做的必要。但是数据集多了、处理内容复杂了以后,很容易弄混变量名,忘记最终目的(即“这个清洗过的数据集到底和我最终研究目的有什么关系”)。如果你的项目牵扯到第三方(例如公司或政府数据提供方),研究战线会拖得很长,可能你一月处理好数据集 A,三月调查公司才把数据集 B 给你,你看了一眼 B 发现又需要数据集 C。等你五月开始合并 A、B、C 的时候,你已经忘记 A 到底是用来做什么的了。
写清楚变量与步骤在个人项目中已经非常重要,在合作项目中当然必不可少。多人合作中弄错变量含义、弄混文件版本是常见且头疼的问题。
过程中
不管是多小的数据集,千万不要手动在 Excel 或者 TXT 编辑器里面手动修改数据,因为这些软件不会自动记录你做过的编辑,时间久了你可能会忘记自己做过什么。如果非要手动修改,建议在一个文档里完整写下你改动的内容。通常只有批量手动录入数据才会需要 Excel。
确认观测值名称(即第一列内容)是独特的。通常观测值名称都没有重复(比如国家名、个人证件号码等),但有些情况下观测值可能会重名(比如城市名、人名)。这时候你需要加上自己的标识符,以免后期做聚合、合并的时候出错。
经常检查数据类(data types,例如 numeric/character/logical/factor)。数据类如果不对,通常你的命令无法执行,软件会报错。但有时候恰好可以执行,软件也不会报错。这时候如果你没有检查数据类,很可能就带着错误的数据进入下一行运算。类似的情况在 Excel 里很常见,例如 Excel 会自动把一些数据变成日期格式,你不在意的话最后输出就错了。当然,数据分析软件比 Excel 好的地方是你随时都可以撤销命令。
小心处理“无数据”(NA)。一定要搞清楚你的软件如何对待“无数据”(NA)——有的软件在运算、合并的时候会自动忽略 NA 且不给你提醒,这个做法在很多科学研究里是错的,所以你得手动检查数据集里是否有 NA,并告诉软件应该怎样处理它们。另外,NA 在很多软件里都是逻辑(logical)而不是字符(character)类数据。如果你要键入或者判断 NA,一定要用逻辑 NA 而不是字符 NA。
合并数据集前,一定要了解清楚不同种“合并”(merge)命令的区别,且要想一个方法来检查合并是否成功。合并是非常容易出错的步骤,即使你用的命令是正确的,也会因为数据本身的小问题而失败。举个简单的例子,一个没有标题行的数据集,它的第一行在某些软件中会默认被当做标题行,在合并的时候会被忽略,这样你的结果可能就少一行。再或者你用来合并的那一列,原始数据有拼写错误或不同写法(英式美式拼写、繁体简体),合并后的结果就不会是你想要的。总之,在合并前一定要想一个方法来检测合并成功与否,例如检查行数列数,看看数据集里哪里有 NA 等等。数据分析软件输出了结果,并不代表你的合并就是正确的。
不要只看了数据集前几行,就以为每一行的数据都长这样。举个例子,如果数据的第一列是地名(“某某区”),你运行了“查看数据前几行”这个命令,发现这几行第一列的长度都是 3(“朝阳区”、“静安区”),就以为每一行第一列的长度都是 3。接下来,你用到一些关于变量长度的命令——如果第一列有的长度不是 3,输出结果就会有错。正确方法应该是先检查待处理的数据是否都遵循你假设的规则,不管是通过运行命令检验(“第一列有哪些值的长度不等于 3”)还是通过从常识思考(“有没有超过三个字的地名”)。
处理后
查找异常数据!收工前,一定要通过做图或者写命令来检查异常数据,例如比中位值高出很多的、比前一年的值低很多的。发现异常数据后首先要看原始数据,通常是你在合并等复杂步骤中出了错。但我也遇到过原始数据出错的情况,所以即使你的异常数据符合原始数据,也一定要再想一想——如果异常数据违背常识(例如人口一年内翻倍、收入是其他地区几分之一),那要求证数据来源。
End.
转载请注明来自36大数据(36dsj.com): 36大数据 » 数据清洗的经验与教训 Data Cleaning