顾名思义,数据清洗就是把“脏”的“洗掉”,是发现和纠正数据文件中可识别的错误的过程,如检查数据一致性,处理无效值和缺失数据等。针对原始数据中所出现的数据问题以及业务需求的不同,数据清洗所采取的方法和策略同样会有较大的差别。
数据清洗通常需要遵循先后顺序,首先对原始数据进行缺失处理,去除/补全有缺失的数据,接着进行错误数据处理,然后是重复数据处理,最后对数据进行不一致性处理。在汇聚多个维度、多个来源、多种结构的数据之后就可以进行数据清洗,也就是对数据进行抽取、转换和集成加载。在这个过程中,除了更正、修复系统中的一些错误数据之外,更多的是对数据进行归并整理,并储存到新的存储介质中。下面提供几个通用的做法,这些做法在实践中被证明是有效的。
有空缺数据的清洗
理想情况下,数据集中的每条记录都应该是完整的。然而在现实世界中,存在大量的不完整数据。造成数据缺失的原因很多,包括人工输入时疏忽而漏掉,或者在填写调查问卷时调查对象不乐意公开的某些信息等。在实际应用中,有的空缺也是合理的,并不意味着数据有错误,例如在设计和填写学生信息表时,允许学生兴趣爱好一栏为空。对于某些不允许出现空缺的属性,一旦出现了空缺则很可能导致数据出现严重偏差,例如“学生所在班级”属性出现空缺,则在分析每个班级的学生情况时将出现“数据不能为空”的异常情况。对于有空缺数据的清洗,应根据空缺值属性的重要程度而采取不同的处理方法,对于某些关键属性更多的是采取忽略元组的做法。所谓元组,通常是指描述某种对象的数据;在关系数据库中,元组就是行。对于某些非关键属性,若缺少的数据量并不多,可以采取人工填写空缺值的方法。人工填写的值通常根据业务情况以及上下文估算得到。例如,少量学生的年龄缺空,根据业务系统是服务于大学新生的特点,则可以将空缺处一律填写为“18岁”。当然,对于大批量数据出现空缺的情况,可以通过编写SQL语句或者应用程序进行处理;如果数据量为海量,则需要使用大数据平台,可以使用一个全局变量填充空缺值,也可以使用属性的平均值、中间值、最大值、最小值或更为复杂的概率统计函数值来填充空缺值,还可以用回归、贝叶斯形式化方法的基于推理的工具或决策树来填充缺失值。
噪声数据的消除
所谓噪声数据,是指数据集中的干扰数据,或对场景描述不准确的数据,是一种出现在某属性上的随机误差或变异的数据。实际应用中的数据基本上是有干扰的。例如,信用卡发放数据过程可能存在以下错误:
▶标记错误:应该发卡的客户标记成不发卡,或者两个数据相同的客户一个发卡一个不发卡。
▶输入错误:用户的数据本身就有错误,例如年收入少写一个0、性别写反了等。
以上这些错误将给信用卡发放数据带来噪声数据。对噪声数据的处理方法通常是:
▶分箱(Binning)方法:通过考察属性值的周围值来平滑属性的值。属性值被分布到一些等深或等宽的“箱”中,用箱中属性值来替换“箱”中的属性值。具体有按箱平均值平滑、按箱边界平滑两种方法。
▶回归(Regression)方法:用一个函数拟合数据来平滑数据。线性回归涉及找出拟合两个属性(或变量)的“最佳”直线,使得一个属性可以用来预测另一个。多元线性回归是线性回归的扩充,其中涉及的属性多于两个,并且数据拟合到一个多维曲面。
▶离群点分析(Outlier Analysis):可以通过聚类来检测离群点。聚类将类似的值组织成群或“簇”。直观地,落在簇集合之外的值被视为离群点。
不一致数据的处理
不一致数据主要体现为数据不满足完整性约束,可以通过分析数据字典、元数据等,或者梳理数据之间的关系来进行修正。不一致数据往往是因为缺乏一套数据标准而产生的,也与对相关标准没有很好地遵守有一定关系。有些数据不一致,可以使用其他材料人工加以更正。例如,数据输入时的错误可以使用纸上的记录加以更正。知识工程工具也可以用来检测违反限制的数据。比如,知道属性间的函数依赖,可以查找违反函数依赖的值。此外,数据集成也可能产生数据不一致。
重复数据的清洗
理想情况下,对于一个实体,数据库中应该有一条与之对应的记录。然而,在实际中数据可能存在数据输入重复的问题。在消除数据集中的重复记录时,首要的问题是如何判断两条记录是否重复。这需要比较记录的相关属性,根据每个属性的相似度和属性的权重,加权平均后得到记录的相似度。如果两条记录的相似度超过了某一阈值,则认为这两条记录是指向同一实体的记录;反之,则认为是指向不同实体的两条记录。
重复数据的检测算法可以细分为基于字段匹配的算法、递归的字段匹配算法、Smith Waterman算法、基于编辑距离的字段匹配算法和改进余弦相似度函数。重复数据的处理可以按规则去重,编写一系列的规则对重复情况复杂的数据进行去重。例如不同渠道来的客户数据,可以通过相同的关键信息进行匹配,合并去重。目前,消除重复记录的基本思想是“排序和合并”,先将数据库中的记录排序,然后通过比较邻近记录是否相似来检测记录是否重复。消除重复记录的算法主要有近邻排序算法、优先队列算法和多趟近邻排序。
检测数据集中重复记录,其常用的方法是基于近邻排序算法。该算法的基本思想是:将数据集中的记录按指定的关键字排序,并在排序后的数据集上移动一个固定大小的窗口,通过检测窗口里的记录来判定它们是否匹配,以此减少比较记录的次数。具体来说,主要步骤如下:
▶生成关键字:通过抽取数据集中相关属性的值为每个实体生成一个关键字。
▶数据排序:按上一步生成的关键字为数据集中的数据排序。尽可能使潜在的重复记录调整到一个近邻的区域内,以将记录匹配的对象限制在一定的范围之内。
▶合并:在排序的数据集上依次移动一个固定大小的窗口,数据集中每条记录仅与窗口内的记录进行比较。如果窗口的大小包含 m 条记录,则每条新进入窗口的记录都要与先前进入窗口的 m -1条记录进行比较,以检测重复记录。在下一个窗口中,当最先进入窗口的记录滑出窗口后,窗口外的第一条记录移入窗口,且把此条记录作为下一轮的比较对象,直到数据集的最后位置。