人人社区!

数据预处理 之 数据清洗(Data Cleaning)



 本文主要介绍了数据清洗在机器学习建模中的关键作用,包括数据清洗的定义、目标、方法和常见操作。数据清洗旨在提升数据质量,确保唯一性、完整性、一致性和有效性。文中详细阐述了如何检查和处理重复、缺失、异常和错误数据,以及使用Python、R、SQL等工具进行数据清洗的实践技巧。


简介

本篇主要介绍机器学习建模中数据预处理步骤的数据清洗(Data Cleaning)部分。在本篇中,会对数据清洗的定义、目的以及清洗数据的方法进行讲解。


 



一句话概括版

数据清洗就是通过检查并处理无关数据、重复数据、空数据、异常数据、错误数据等来全面提升数据质量的过程。


 


数据清洗的定义

数据清洗(Data Cleaning)是数据预处理的一部分,这个步骤从建模初期的特征加工就需要开始进行,并且这个步骤的成功与否会直接影响建模的效果。英文有句话叫“Garbage in, garbage out”,意思就是输入(的数据)是垃圾,输出(的数据)也是垃圾。对数据不加以清洗与规范就跑出的模型,大概率也是无法使用的。因此,我们才需要在建模初期,就对需要加工的数据进行数据检测与数据清洗,以保证数据的质量。


所以,数据清洗的过程可以简单理解为提高数据质量的过程。在数据清洗的过程中,需要有效的识别那些错误的、无效的、重复的、缺失的数据,并对其进行处理,最终提高数据质量的唯一性、完整性、一致性、有效性与准确性的要求。


 


 


数据清洗的目标与数据质量

前面已经说过,数据清洗的目标就是提高数据质量,因此,我们这里有必要理解一下什么才算是好的数据质量。




如上图所示,好的数据质量需要满足以下四个标准:


唯一性:不存在无意义的重复数据


完整性:数据完整且连续


一致性:数据在多数据源中意义一致


有效性:这里主要指数据在分析的时间点是有效,而非过期或失效数据


准确性:数据合理、准确,并符合数据类型的标准


而数据清理会从逐一从上面这四个角度审查数据,以提升并优化数据质量。


 


 

数据清洗的方法

下面,我们会从提升唯一性、完整性、一致性、有效性与准确性这5个维度讲解数据清洗的检查方法:


数据唯一性

数据的唯一性要求一个字段或多个字段的组合在整个数据集中必须唯一。它检验数据是否存在重复,并要求给定属性的每个值都要不同于该属性的其他值,简单说就是看有没有重复数据。


在日常的建模工作中,数据唯一性检验主要针对预测主体进行,举例来说,比如模型需要预测有可能进行购买的客户,那么就有必要对客户数据进行唯一性的检测。


一般在客户的系统中,客户会有客户号,但是这个客户号与客户身份证、客户手机等用于身份信息识别的字段很可能不是一对一的关系,因为一个客户可以有多个手机号,客户的身份证号也可能因为错误录入或更换等等发生变更(如15位改18位),因此就很有必要对客户号进行唯一性的识别,并且去除重复的客户,只保留最新的信息。这里,数据清洗需要验证客户号的生成逻辑,并将客户号与身份证、手机号、会员ID等信息进行匹配后去重,保留最新的特征后,再形成最终的客户ID,在此基础上加工样本,以保证数据的唯一性。 


数据完整性

数据完整性主要核查数据的空值、缺失值的情况。需要注意的是,数据的空值与缺失值不是一个意思,在数据库里缺失值一般用“NULL”或者“NA”表示,而空值则为“”,在检测某个字段是否完整时,需要将两个条件都写上,以免有些字段中数据为空的没有被检查出来。


此外,还有一些字段,会用特殊的符号,如“Unknown”,“未知”或者特定的代码来表示数据的缺失。这种情况下,需要对数据字典进行阅读,并了解字段中特定的码值与字符是否具有特殊的含义。 


数据一致性

数据一致性要考察不同数据源中字段的意义是否相符。这里涉及到一个建模中常常遇到的问题,大多数场景下,项目的建模工作需要在企业级的大数据平台或者数据仓库中寻找数据,并加工特征,这时候会发现一个很头疼的问题,一个字段可能在很多表中存在,字段的名字一样,但是在不同表中的取值却不同。


比如说,常常遇到的情况是,一个叫“订单金额”的字段,在3张表中有3个不同的实际意义:


表A中指:客户每个订单的原始金额


表B中指:客户每个订单的金额经过当月汇率转换后的人民币金额


表C中指:客户当日的订单金额汇总


这种时候,如果没有实际去探查数据源,很有可能会取错数据,并最终加工出错误的特征。


其实,如果一个企业有很好的数据设计、码表规范体系与命名规范,数据不一致的情况会大大减少,但实际情况中,企业的数据质量与数据规范极有可能不那么完善,而我们也不可能等待企业将数据质量提升至完美时才开始分析或建模。因此,就需要在特征加工的初期,多阅读数据字典与ETL的调度文档,明确隐含在字段名称下的数据真实意义。


数据有效性

这里提到的有效性其实更多的是指在分析的时间节点,数据是否有效。


举个例子来说,预测问题是:会员在未来是否会进行产品的购买。这里面预测的对象是“会员”。会员可以注册,也可以注销。在筛选数据时,需要删除那些已经注销会员的客户,这部分数据就是无效的数据。


再举个例子,我们要提取某企业的柜员数量,这时候我们需要剔除分析时间点时已经离职的柜员数。


在企业级的数据库中,一般会有字段专门用于标识记录的有效性。在进行数据分析时,需要阅读数据字典并进行足够的前期数据调研,保证写入模型的数据是有效的。


数据准确性

数据准确性是数据质量中最难考察的一项,它要求进行清洗后的数据是准确、合理以及规范的。这就要求数据清洗基于如下几个点进行检查:


是否存在异常值


是否存在无效或无表达意义的数据


是否存在错误数据


在数据仓库中,数据主要以数值型、字符型或日期型格式进行存储。对这三种类型的字段,都可以进行数据有效性检验:


数值型数据(如DECIMAL,INTEGER):


检查数据的最大值与最小值是否在合理的区间中


0值是否具有数据表达意义,如果没有,那么0值比例为多少,是否可看做缺失值


负值是否存在,其存在是否合理


对于标志类的字段(类似布尔型字段),是否存在除了0或1之外的值


字符型数据(如VARCHAR,CHAR):


数据位数长度是否符合规范(如身份证号是否为15或18位)


对于有码值的字段,码值是否均为填写范围内的值(如性别代码除了F、M之外是否存在不明意义的码值)


是否存在错误或意义不明的数据(如姓名填写为“aaaaaa”)


是否存在意义不明的特殊符号,如@、#、¥、%等


日期型数据(如DATE,TIMESTAMP):


检查日期的最大值与最小值是否在合理的区间中


日期格式是否正确,如定义为“YYYY-MM-DD”还是“DD/MM/YYYY”


对于“1900/01/01”这种日期,需要知道是否有意义,还是仅仅代表缺失值


对于过大的日期,如“3000/01/01”,需要确定是否为拉链数据未关链的代表,还是仅仅为错误数据


上面这些检查项仅仅是针对单独字段进行检测,在实际的数据清洗过程中,还可以进行跨字段的检验。下面举一些简单的跨字段检验方法:


订单日期不能早于收货日期


近30天的交易金额不能大于近90天的交易金额


客户当前理财资产不能大于客户当前总资产


具体要怎么进行跨字段的验证,还需要结合实际的建模场景。


 


 


数据清洗的常见操作

经过上面步骤发现的数据问题,可以使用下面这几种常见的操作进行处理:


删除


更正


填充


平滑




数据删除

对于重复的数据,需要直接去重保留一条记录。


对于输入错误的数据、一般在数据占比不大的情况下,可以选择直接删除。


对于缺失数据,虽然也可以选择删除处理,但是但在实际中不太有效,尤其当缺失值跨多个自变量,且空值率较高的情况下,不建议直接删除。


数据更正

对于部分格式错误的数据(如日期格式不规范、数据没有补0,或者数据中有无用的空格),我们可以批量更正数据,将错误数据或者不标准格式的数据进行修正。


数据填充

数据填充一般适用于缺失值的处理。


数据填充有以下几种方法:


全局常量填充:用同一个常量替换所有的缺值。比如分类型的缺失值可以用“Unknown”填充,数值型的数据可以用“0”、‘空’填充。但是用全局常量填充的方法经常会造成被替换的常量值本身成为了影响模型判断的重要变量,从而影响结果的准确度。

中心度量填充:数据描述统计的知识中,提到数据集中趋势有呈现数据整体趋势的作用。因此,可以通过取属性的平均值、中位数、众数等指标,来填充缺失值。

同组均值填充:这个方法需要参考有缺失值记录的其他属性值。将数据按照其他属性分类做Group By,统计有缺失值一列的平均数或中位数等指标,并用其替换缺失值。用这种方法时,可以参考给定一种类型下的数据的分布,若数据skewness绝对值很大,或许中位数是更好的选择。

最有可能值填充:这种方法其实就是用样本中的已有变量(X)来预测有缺失值的变量(Y)。比如,可以用回归或者朴素贝叶斯等预测缺失值应该填写什么。但是,并不是所有都能适用此种方法。在数据表中,比如如果有缺失值的属性是主键(PrimaryKey),像是身份证号之类的,就不要企图通过模型预测了。尽管如此,这种方法仍然在数据清理中被应用的最广

数据平滑

数据平滑可以很好的处理异常值数据,即对噪声数据进行光滑。


噪声(Noise)是变量自带的随机误差。表现在数据分析中就是值方差/标准差。噪声一般通过盒型图或散点图来识别。在数据中如果存在噪声过多,可能会因为个别离散值而使整个数据分析挖掘的效果降低。所以,我们希望能通过各种方法光滑数据,去除噪声。方法也有下面3类:


无监督分箱:通过数据周围的值(临近值)来光滑数据。首先,将数据排序,其次将数据分入等频或等宽的箱中。将箱中的值统一替换成同样的指标值。因此,在分箱操作中,箱的宽度越大,光滑效果越明显。箱可以是等宽,也可自行定义。这里通过指标的不同,分箱可以分为:


箱均值光滑:即用每个箱中数据的平均值替换箱中每一个值。


箱中位数光滑:即用每个箱中数据的中位数值替换箱中每一个值。


箱边界光滑:即定义箱中的最大和最小值为边界值,用最近的那个边界值替换箱中每一个值。


回归(Regression):将有噪声的变量拟合为一条直线(线性回归)或一条曲线(曲线回归)。这里一般的方法就是运用一元线性回归或多元线性回归,拟合出一条线或多维平面。进而使得噪声数据可以被光滑的线或面代替。


离群点分析(Outlier Analysis):通过聚类方法检测离群点。落在集群之外的值即为离群点,可以用集群的集中趋势指标代替或直接去除。


 

数据清洗的工具

除了Python,R,SQL等语言,还有一些工具可以帮助进行数据清洗工作。


数据清洗工具(Data Scrubbing Tool):检查与纠正数据中错误,用于分析与模糊匹配。如Potter's Wheel.

数据审计工具(Data Auditing Tool):发现相关性,数据偏差,识别离群点

数据迁移工具(Data Migration Tool):ETL。



                           


回复
回复 楼主
顶部