由于数据源在实际生活中千奇百怪,因此不经任何处理就进入数据库的数据很可能违背数据质量三要素的要求。用这样的数据在进行后续的数据挖掘,其可靠性更加堪忧。虽然在数据挖掘中,均有过程用于处理缺失数据或异常值,但是这不过是在避免建模的过拟合。如若希望尽可能小让缺失值、噪声等脏数据影响数据挖掘的结果,更有效的方法应是提高数据质量,即进行数据清理过程。
一句话解释版本:
数据清洗就是通过缺失值处理,噪声数据光滑,识别删除离散值等方法来提升数据质量的过程。
数据清洗是有数据预处理中的一个过程。所以其在数据分析与数据挖掘中的位置如下图所示。
数据清洗的步骤相对较为简单与清晰,有两个阶段:
第一步:偏差检测(Discrepancy Detection):即检查导致偏差的因素,并识别离散值与噪声值。
第二部:数据清洗(Data Cleansing):即处理缺失值与噪声。
偏差检测的目的是为了有效的开展数据清理工作。因此,就需要在此阶段明确缺失值与噪声为何存在,数据的质量如何,数据的字段是如何定义等信息。
数据检测的方法有这样几种:
首先,我们可以了解与数据源相关的问题,以此确定数据的质量、字段的性质。比如,我们可以通过回答这些问题来进行偏差检测:
其次,我们可以通过数据描述统计中的指标对数据进行初步探索,比如:
之后,我们可以考虑数据中是否存在依赖,即是否有属性之间存在线性关系或者相关关系。
质量好的数据有三个属性:唯一性、连续性、一致性。从这三个层面可以检验数据的偏差性。
即检验数据是否存在重复,给定属性的每个值都要不同于该属性的其他值。就是看有没有重复数据。熟悉数据库的伙伴们会知道,传统关系型数据库中,主键的一个作用就是避免重复并检验重复。设定了主键了表,不能存在重复数据。因此知道主键的是哪个属性的表可以直接通过SQL检测重复,比如,在不考虑效率等因素的傻瓜模式下,table中A是主键,其余字段有B,C。只要对比 select count(*) from table的结果与select count(*) from table group by A的结果是否一致即可,不一致,很可能就是有重复。
即属性的最低与最高值之间没有缺失值,有些值需要是唯一的。一般我在检验连续性时会特别关注这几个点:
一致性的检验与字段格式的说明有关,这里主要是检查数据的写入格式是否符合统一的规范,是否会存在字段过载等行为。在字段中,主要是一下三种类型:
对每个类型,都需要查看字段接口说明,检查格式的统一。
填补缺失值的方法有如下3大类:
可以删除带有缺失值的记录,也可直接删除有缺失值的属性。但在实际中不太有效,尤其是在缺失值变化多,跨多个自变量的情况下。
用人手工填写上确实的值,听上去就不实际且费时间。大数据的分析可以直接忽略这个方法。
这个方法是目前用的最为广泛的。顾名思义,用某些值自动填充缺失值。依照自动填充的值不同,可以分为如下几类:
噪声(Noise)是变量自带的随机误差。表现在数据分析中就是值方差/标准差。噪声一般通过盒型图或散点图来识别。
在数据中如果存在噪声过多,可能会因为个别离散值而使整个数据分析挖掘的效果降低。所以,我们希望能通过各种方法光滑数据,去除噪声。方法也有下面3类:
通过数据周围的值(临近值)来光滑有序数据。首先,将数据排序,其次将数据分入等频的箱中。将箱中的值统一替换成同样的指标值。因此,在分箱操作中,箱的宽度越大,光滑效果越明显。箱可以是等宽,也可自行定义。
这里通过指标的不同,分箱可以分为:
将有噪声的变量拟合为一条直线(线性回归)或一条曲线(曲线回归)。这里一般的方法就是运用一元线性回归或多元线性回归,拟合出一条线或多维平面。进而使得噪声数据可以被光滑的线或面代替。
通过聚类方法检测离群点。落在集群之外的值即为离群点,可以用集群的集中趋势指标代替或直接去除。
除了Python,R,SQL等语言,还有一些工具可以帮助进行数据清洗工作。