为什么要做数据清洗?

其实这里有两方面的原因:第一个是保质,也就是确保数据质量;第二个是提效,也就是提升分析效率。下文就从这两方面展开讲如何做数据清洗。

一、如何通过数据清洗来确保数据质量?

在数据清洗中,我们通常是要保证数据的完整性、准确性和一致性。

1、保证数据的完整性

在保证数据完整性方面,一个比较关键的问题就是对于缺失值的处理。当缺失的信息占比比较高的时候,我们利用已经获取的数据来分析得出的结论就不具备代表性。

那么,我们该如何处理缺失值?

其实这里有两类主要的方法,一类方法比较简单粗暴,直接忽略空值,适用于缺失值不多,或者相关性不太高的情况

那第二类方法,会更偏高级玩家一些,基本原则就是合理填充空值。常见的会使用属性的平均值,中位数或者众数去填充。

当我们获取的样本里,某一位女性的年龄属性出现了缺失,那这种时候我们可以使用所有样本的平均年龄来去填充这个缺失值,也可以使用所有女性样本的平均年龄去填充这个缺失值,还可以使用 使用一些决策树,或者是其他一些算法找出最可能的值进行填充。

Ps,其他需要我们注意的点:

第一点,除了处理缺失的问题,还有一个重复的问题,重复数据的处理方式比较简单,就是要删除。在数据设计的时候,要明确数据记录的主键,这样才能使得数据清洗的环节能够去判断是否存在重复的数据,进而去进行删除的处理。

第二点,就是如果我们获取的数据中出现了丢失的问题,那么是需要上溯到数据采集和回传的环节去找回的,丢失的数据是没有办法在数据清洗这个环节去进行处理的。

那最后一个,就是对于一些重要的字段,他们的覆盖率是需要在数据采集层面去保证的,在数据清洗的环节,如果存在大量的缺失,那我们也是很难去基于数据来做反推的。

2、保证数据的准确性

在确保数据准确性方面,关键要处理的是噪声数据,所谓噪声数据指的就是那些错误或异常的数据,也有可能是数据中存在的随机偏差。

对于噪声数据而言,主要的处理方法包括聚类、分箱和回归。

所谓聚类,简单的说,就是把数据划分为若干个类,每个类内的对象都是十分相似的,而类与类之间则有着比较明显的差距。

通过聚类分析,可以让我们监测出数据中存在的孤立点,并且去进行剔除,以防孤立点,对于我们最终的结果产生比较大的影响。

比如说一个极高的值或者一个极低的值,并不能很好的代表整体的水平,对于我们数据整体的平均值计算会有比较大的影响,而剔除掉这些孤立点或者说异常点以后得到的结果就更加准确了。

但是在某些场景下,我们也需要对孤立点和异常点进行单独抽取分析。

比如说,当我们去看游戏用户的付费情况的时候,有可能会发现极个别的用户付费金额很高,而其余的用户通常付费金额很低,或者是压根就没有付费,那么在这种情况下,我们并不能简单的去把那些付费极高的用户当成孤立点或者异常点去剔除掉,而恰恰是要把这部分用户的情况拉出来单独去分析,因为很有可能,这些用户才是真正对游戏产生高价值的那些用户。

后面的分箱和回归这两种方法,更多的是对于数据中存在的随机偏差去进行平滑,平滑以后的结果用于后续的算法建模往往能有更好的效果。

所谓分箱,其实就是要对于原始数据先进行一个排序,然后分到等深的箱中。

等深,指的是每个箱中数据的个数是一致的,然后,可以按照箱的平均值或者是中位数或者是边界进行平滑。

首先第一步,对这些数字进行依次排序:3,9,15,21,22,26,29,31,36。 接下来去把他们划分为3个等深的箱,每个箱中都包含3个数字:
我的第一个箱里数字就是3,9,15;
我的第二个相邻数字就是21,22,26,
我的第三个相邻数字就是29,31,36, 那么第三步,我可以使用箱的平均值,来去进行平滑。
那么对于第一个箱来说,我就平滑为了3个9;
而对于第二个箱来说,我就平滑为了3个23;
对于第三个向来说我就平滑为了3个32; 这样处理后9个不同的原始数据就变成了平滑后的9个数字,更方便建模和分析。

可能大家平时听的也会更多,回归指的就是使用回归函数去拟合数据来实现对数据的平滑处理。

比如说我的原始数据是很散的一些点,然后,我找到了一个函数,可以对于这些原始数据去进行一个较好拟合,那么这个时候我就会使用拟合以后的这个数据来去投入到我后续的分析建模过程中。

以上就介绍了聚类、分箱、回归3种噪声数据的处理方法,对于确保数据准确性方面还有2个点是我们需要注意的地方:

第一个是说我们在原始数据里可能会存在一些乱码,或者是一些不可见字符,那这种情况下,我们直接把这些脏数据删掉就可以了。

第二个想强调的点是我们数据中属性值,它往往都有一些规定的格式。

比如说手机号需要是十一位的数字等,那么这种情况下,我们可以基于规则来对于属性做一个校验,不正常的时候可以统一标记为非法或者把它置为空值,再参考我们刚刚讲到的缺失值的处理方法。

三、保证数据的一致性

确保数据一致性的方法是要构建统一的数据模型来实现字段命名、字段格式、字段口径含义的一致,然后再通过配置规则来检验逻辑的一致性。

例如,当是否健康这个字段的值为健康的时候,体温这个字段的数值则一定要小于等于37 3,对于逻辑一致性来说,可以根据实际的数据情况来配置不同的检验规则。

下面我就以一个例子来具体说明如何解决指标一致性的问题。要解决指标一致性的问题,关键是要对指标的定义进行标准化,从而来保证数据的一致性。

首先,我们可以根据数据的实际情况,将数据划分为一个个的数据域。

业务过程和维度所构成的数据主题集合。
业务过程指的是一个个不可拆分的业务动作或者是行为,业务过程之下可以进一步的去定义指标。典型的业务过程,比如说用户的注册登录网民的浏览,点击等等。
而维度则是进行业务数据分析的角度,比如时间,地域都是我们用来分析的维度,特别是时间维度几乎是所有业务都需要的。

那么通过这样的一个框架,我们就可以对整个数据分析中涉及到的指标进行一个标准化的定义。

派生指标,叫做最近三十天会员在无线端的登录次数。

二、如何通过数据清洗来提升数据分析的效率?

数据清洗可以进一步的去规范数据的格式降低数据的体量,从而降低分析发掘的成本,对于分析挖掘效率也能有一个提升。

那这里方法主要包括对数据进行离散化、规范化,以及通过构建数据立方体或者是数据抽样的方式来去降低这种数据的体量。

1、数据离散化

首先给大家介绍数据离散化的方法,所谓数据离散化指的是将属性值域划分为区间,使用区间的编号,替代原始的属性值,从而减少属性值的个数。

这里主要有两种情况,第一种是对于序数或者是连续值这类属性去进行离散化。

比如说,当我们在计算机价格分布的时候,如果我们直接使用手机的原始价格分布结果可能会非常的琐碎,所以这里我们可以将手机价格按每一千作为一个档去进行划分,例如1000以下、1000-2000、2000-3000等等,那么这样划分我们就可以比较清晰地看出用户使用的手机价格段的一个分布情况了。

第二种是对于名称这类属性去进行离散化,而对于名称为属性的离散化也分两种具体的情况:

第一种是如果名称类型的属性值有高低顺序。

比如需要统计设备CPU的型号,虽然这个是一个名称类型的属性值,但是实际上不同型号的CPU是有性能的高下之分的,那么在这种情况下,我们就可以将CPU的型号映射到CPU的档位上,从而实现名称了离散化。

而第二种是无序的名称类型的属性值,则可以根据业务理解或者是专业知识来进行分类使用,更高层面的概念来替代底层的具体属性值。

比如省份,这也是一个无序的名称类型的属性值,但我们可以在更高的层面上划分为华东,华北,华南,西北等区域,通过这样的方式,其实也实现了一个名称的离散化。

2、数据规范

所谓数据规范化指的是将数据按比例缩放,使之落入一个小的特定区间,由此将数据统一转换为适合分析挖掘的形式。

常用的数据规范化方法有三种,分别是最小-最大规范化,Z-Score规范化和小数定标规范化。

最小-最大规范化是对原始数据进行线性变换;
Z-Score规范化是基于原始数据的均值和标准差进行数据转化,不受数据最小值和最大值的限制,具备较好的通用性;
而小数定标规范化,是通过移动小数点位置进行数据转化,移动位数依赖于最大绝对值。

3、降低数据体量

如何降低数据体量,直接给大家介绍两种常用的方法,第一是数据立方体,第二是数据抽样。

数据立方体指的是在全量数据中,针对感兴趣的属性维度字段来做group by(根据一定的规则进行分组),然后使用count或者sum进行汇总,从而形成一个数据立方体。

那么第二种方法,就是数据抽样的方法,这种方法就是使用有代表性的样本数据,而非全量数据来进行分析、挖掘。在抽样的时候,既可以使用完全的随机抽样,也可以根据实际的分析场景酌情抽样。

比如说,如果我们想计算一年的日均数据,在我们不做抽样的情况下,我们需要计算一年每天的数据,然后再去取一个平均,但是为了提升效率,我们可以采取每个月只抽取七天的方式,这样我们就可以将365天的计算任务减少到84天。

以上内容整理自友盟学院分享的课程,也欢迎访问友盟学院,以视频的方式更直观的了解及学习大数据领域相关知识内容。


友盟学院 - 深度解析数据采集与清洗那些事儿


数据清洗数据可视化技术 数据清洗方案设计_数据清洗数据可视化技术