白话大数据:数据预处理之术(上篇)
数据预处理是数据化工作中非常重要的一部分,但是很多人往往会对如何处理感到迷惑。而本文的作者就为我们仔细介绍了如何进行数据预处理。
随着互联网流量红利的逐渐消退,各公司之间的竞争形势日益严峻,企业正在不断寻找提高利润率、降低成本、提高产出价值的有效方法,而数据化经营已经逐渐成为各企业的关键武器。作为产品经理,相信你经常会得到公司的各种经营数据,但你是否会因为如下情况而烦恼:
- 关键数据出现缺失值(NaN)
- 异常数据无法判断是否存在价值
- 重复数据的信息冗余
- 非数值型的数据无法处理(如学历)
- 数据样本差异量非常大(如A样本有 10W+ B样本只有 100)
等等如上问题都会影响你的数据工作结果的有效性。今天我们就来讲一讲如何利用数据预处理解决如上问题。数据预处理是数据工作中最为重要的环节,它直接决定了后期所有数据工作的质量和价值输出。主要包括:数据清洗、数据转换、数据降维、数据抽样等。本篇将主要围绕针对脏数据的数据清洗进行展开。
数据清洗- 寻找根源
每当我们遇到脏数据时,处理这些脏数据最理想方法就是找出引起这些脏数据的原因,并从源头上进行解决。脏数据主要来源来自以下几个方面:
- 采集失误因素
- 人为故意因素
- 自然因素
无论是传统模式还是互联网,数据定义、采集、测量、处理规则是由人来规定的。而在这个过程中,数据采集者因为一些无意的人为错误会导致数据出现异常。
二战期间,美国统计学家沃德教授被授命研究如何降低战机被击落的可能性。他经过采集回归的战机数据发现:飞机的机翼是最容易被击中的部分,而飞机的尾部则是被击中最少的部分。根据当时的航空技术,机器的装甲只能局部加强,那你会选择加强机翼还是加强尾部?
似乎从数据上来看答案是显而易见的——加强机翼,可真的是这样嘛?沃德教授并不这样认为,因为在数据采集时已经存在了采集异常。回归的飞机机尾部分很少中弹,并不是它不会真的中弹,而是可能一旦中弹后,就无法返航也就无法进入数据集。
后来军方动用敌后工作人员重新去采集飞机的残骸,发现中弹的部位果然如沃德教授所预料,主要集中在尾部位置。
正如案例所示,采集失误通常依靠求助数据专家来诊断数据采集过程中存在的业务漏洞来进行解决。
第二个脏数据来源主要是人为故意因素。这个相信你一定不会陌生,因为互联网经常会面对一个问题就是数据造假。
数据造假,是指通过刷单、刷量、刷分、搬运原创内容等,影响消费者的决定,为商家赢得更多生意,平台也可给投资人一份好看的数据,因而数据造假已成为行业的大问题,甚至成为许多点评类网站的“潜规则”。
针对人为故意因素,通常需要依靠数据采集者自己的行业沉淀来进行识别解决,以下提供几种识别方法:
- 通过横向,即寻找相同业务的公司进行数据对比,寻找数据异常差异。
- 通过纵向,即寻找数据提供方过往的数据报表,寻找数据的异常波动。
- 通过内部,即通过和数据提供方内部成员交流,寻找数据异常的原因。
第三个脏数据的来源是自然因素,针对自然非人为因素我们通常才会进入数据处理的流程。
数据清洗 – 缺失值处理
数据清洗顾名思义,主要就是将不合格的数据进行整理,通过去除异常、纠正错误、补足缺失来让数据集满足分析的需求。整个过程中数据清洗处理的一般就是缺失值、重复值和异常值。我们先来说说缺失值的处理,将之前我们先来介绍下常用的数据集结构。
可以看出我们通常用行来表示数据记录(如用户),而用列来表示相应属性(如性别、年龄)。缺失值的两种情况相信你已经猜到:
- 一是行记录的缺失,即数据记录的丢失;
- 二是列记录的缺失,即数据记录中的某些属性值出现空缺。
数据记录的丢失通常无法找回,所以一般缺失值处理仅针对属性值的缺失进行处理。我们先来讲下第一种处理方式,就是不处理。
你内心肯定在想,什么鬼?不处理也是一种方式?
没错,这的确是一个预处理的方式,因为有时候数据分析及应用有时候对缺失值是存在容忍性的,比如在进行数据降维处理的时候(有兴趣的朋友可以去了解下PCA)。很多属性值其实对数据分析的结果相关性非常小,这些属性值的缺失并不会对分析结果带来任何影响,那我们完全可以采用不处理的方式来对待。那如果出现不能用这种方式的情况时该怎么解决?这里我们介绍第二种方法,删除。
删除顾名思义就是直接删除有缺失值的数据记录。是不是有一种畅快淋漓的感觉?但这种方法明显存在它的缺陷,当出现以下情况的时候,用删除并不合理:
- 大量的数据记录都或多或少存在属性缺失(如超过 30 %)
- 存在属性缺失的数据记录都是同一类(如80%的男性用户均没有年龄信息)
如上两种情况都会导致通过数据集推断出的结论会存在不准确,因为大量携带有用信息的数据记录已被遗弃,于是我们有了第二点方法,即填补。
填补是我们更为常用的一种处理方式。填补就是通过一定的方法将存在缺失属性的数据记录进行补全。通常可以采用如下方法:
- 利用其余数据记录的属性进行填补:比如针对缺失年龄属性的用户数据记录,我们可以采用提取所有用户的年龄进行均值,中位数,众数等方法进行填补。
- 专家/用户填补:针对某些少量且具有重要意义的数据(特别是创业期),直接咨询行业专家或用户本人来帮助进行数据填补。
- 利用当前数据记录的其余属性进行填补:比如针对缺失年龄属性的用户数据记录,我们已知学历为本科,工作经验为3年,那我们可以大致推断出该用户的年龄。
是不是觉得掌握不处理、删除以及填补这三个方法后就可以完美的解决缺失值的问题了?其实我们少考虑了一种特殊情况,就是我们无法通过填补的方法去补全数据记录的缺失属性并且这些数据记录又无法进行删除。这时候我们往往会采用第四种方法,即保留并转化。
我们将缺失值也视为一种类型,比如性别除了男、女外,缺失的用户均记录为未知。在数据分析时这类用户将会作为一个特殊群体参与分析。
数据清洗 – 重复值处理
终于我们过五关斩六将,解决了缺失值这个老大难,这时候我们遇到了第二个问题重复值。你定睛一看,这不是刚学会了删除嘛,现学现用直接删除掉重复值是不是就可以了?的确,大部分情况下我们都会使用这种方式,也就是所谓的去重。但一定要注意,有些场景我们是不能随意去去重的,如以下两种:
- 重复异常
- 样本不均衡
我们先来说说重复异常。一般情况下,我们使用数据是用来分析的,直接去重不会对分析结果带来影响。但一旦我们决定使用数据来监控业务风险时,重复数据就不能随意忽略,比如同一个 IP 在一段时间内连续获取了多次短信验证码。这个重复记录可能说明了相应短信验证码的业务出现了重大的规则问题,而且可能遭受了竞争对手的恶意攻击。因此,这些重复数据不能随意去除,产品经理可以通过这些重复值来发现自己设计的产品漏洞,并配合相关团队最大限度的降低给公司带来的损失。
样本不均衡指的是不同类别的样本量差距非常大,比如我们希望分析性别对用户下决策的影响,可女性用户有10000条数据样本,而男性仅有100条样本数据。这样严重分布不均衡的数据样本将让我们很难从从中提取规律;即使勉强提取,也很容易导致过拟合问题(即分析结果仅对当前的样本生效)。针对这些情况,数据分析者有时会同过不同的方法进行重复采样,来增加样本的多样性。所以通过这种方法处理完样本不均衡问题后,数据集中本身就会充斥大量的重复记录,此时我们不能针对数据进行去重操作。
数据清洗 – 异常值
最后我们再来谈谈异常值,它主要是在常见数据分布之外存在的数据噪音。通常而言在数据分析工作中,我们都会直接删除异常的数据记录(删除真的是一个好手段),分析公司员工平均收入的时候会掐头去尾就是这个道理。但和重复值一样,有些情况下我们是不能直接删除异常的数据记录的,而要采用第二种处理方式,保留。
先来说第一个场景,异常值来自业务部门特定的活动产生,比如运营部门于618进行了促销推广活动。由于促销活动导致营销数据突增,这种异常情况,我们通常称之为 ‘伪异常’。这种异常数据如果删除反而会无法评价本次活动的效果。
再来说说第二个场景,利用异常数据发现新的数据规律。很多情况下异常数据是具有时效性的,在当前的情况下,由于数据样本有限一些长尾的数据类型将被定义为异常值。这些异常值如果直接进行抛弃,将会是数据样本的巨大损失。针对此类异常数据我们应当进行保留归档,等异常数据体量足够时即可提炼出相应规律,最终达到扩展数据模型边界的目的。
在汉朝的时候我们国家就已经有过太阳黑子的记载了,但当时我们只是将它作为一种异常现象,并未给予持续关注。
而伽利略是第一个用望远镜看天空的人,他也是第一个用望远镜观测到黑子的人。这里说伽利略,并不是因为这件事,更重要的是从他开始,欧洲的天文学家开始对太阳黑子进行科学的记录了。虽然当时他们也不知道黑子到底是什么,但是都会进行客观记录,不只是记录时间,还会记录大小,出现在太阳的什么位置,甚至还会把太阳黑子的样子直接画出来。
后来天文学家鲁道夫·沃夫,他把从伽利略开始的太阳黑子记录都收集了起来,在这两百多年的记录中也发现了11年的周期。到此,天文学家才确定了太阳黑子活动是有周期性的。
同样这种方式也可以在信用卡欺诈、异常订单规律查找、流量作弊检验等互联网风控方面进行应用。
小结
面对脏数据我们首先要去追寻问题出现的原因,在确保数据来源没有问题后。针对缺失值我们通常会采用:不处理、填补、删除、保留并转化,而针对重复值和异常值我们通常会采用删除和保留。作为数据产品经理,我们要从数据预处理的阶段就参与其中,结合公司的业务需要合理的针对数据集预处理给出产品方案,帮助公司更有效的进行决策。
以上是数据预处理的上篇数据清洗,后面我们将会继续聊聊数据转换、数据降维、数据抽样。我是Pirate,一名高级数据产品经理,正在努力用用白话说大数据给你听。
作者:Pirate,用白话说大数据给你听。
本文由 @Pirate 原创发布于人人都是产品经理,未经许可,禁止转载
题图来自 Unsplash,基于 CC0 协议
很受用,希望大神出一下用Python做数据处理的教程。
Python 虽然已经是比较好理解的交互式语言,但对产品经理还是会有一定压力的,所以文章内基本就不写如何用Python进行数据处理啦。作为产品经理能理解数据实现的业务逻辑基本已经能够满足工作需求啦 😎