我们目前进入了一个大数据的时代。以我目前经常处理的医疗保健数据为例。
随着时间的推移医疗保健数据的生成速度越来越快,预计到2020年将达到35 ZB(1ZB大约是10的9次方TB)。无论是出于患者护理、研究还是法律原因,能够经济高效、安全地管理这些数据对医疗保健提供者来说都越来越重要。
医疗保健提供商必须能够摄取、存储和保护大量数据,包括临床、基因组、设备、财务、供应链和保险理赔等。
本文尝试从数据 挖掘、分析的一般步骤入手,基于理论化的描述结合具体例子详细介绍挖掘分析建模之前数据处理的目的及方法论。
数据分析的一般流程:
- 确定目标
- 获取数据源
- 数据探索
- 数据预处理
- 挖掘分析建模
- 模型效果评价
数据接入,尤其是针对目前多元异构数据的(批处理数据、实时数据流式数据)接入,我们称之为统一数据接入。
文章链接:统一数据接入实践分享
数据清洗, 是整个数据分析过程中不可缺少的一个环节,其结果质量直接关系到模型效果和最终结论。在实际操作中,数据清洗通常会占据分析过程的50%—80%的时间。
数据清洗的目的从两个角度来讲:
一、是为了解决数据质量问题
二、是让数据更适合做挖掘、展示、分析
解决数据质量问题,其实就是为了确保以下几点:
针对每一点我们分别来看
例如人的属性中缺少性别、年龄等
例如不同来源的数据出现重复的情况,比如本次数据中我们基本信息中的序号,有部分重复的数据。这个可能是由于数据录入两次造成的。
例如同一个指标出现多个来源的数据,且数值不一样
例如获取的数据与常识不符,年龄大于150岁
例如不同来源的不同指标,实际内涵是一样的,或是同一指标内涵不一致
从这个角度讲,数据清洗的工作更偏向工程,不是我们这次关注的重点.(有时间、有兴趣的话会后详细讨论,就不占用大家时间了。)
让数据更适合做挖掘、展示、分析,有以下一些手段对数据进行清洗。
思路:降维,方法包括但不限于:
主成分分析PCA
随机森林
思路:抽象,方法包括但不限于:
各种汇总,平均、加总、最大、最小等
各种离散化,聚类、自定义分组等
解决方法:剔除字段
一个字段是其他字段计算出来的,会造成相关系数为1或者主成因分析异常
解决方法:剔除字段
如GDP与城镇居民人均收入数值相差过大
解决方法:归一化,方法包括但不限于:
最小-最大
零-均值
小数定标
数据导入及元数据处理阶段主要主要关注两件事情:
1.了解数据量
通过了解数据量(批处理,还是流式数据),将数据导入处理工具或者平台。通常来说,数据量不大的情况建议使用数据库。
如果数据量大(千万级以上),可以使用hadoop文本文件存储+Python操作的方式。
这个步骤对于批处理,文件交换的方式通常比较会引起问题是文件编码,推荐统一使用UTF-8编码。
2.了解元数据
这里包含两个部分:
一是看元数据,包括字段解释、数据来源、代码表等等一切描述数据的信息;如果数据是多维度的我们要弄清楚数据之间的关联关系。
二是抽取一部分数据,使用人工查看方式,对数据本身有一个直观的了解,并且初步发现一些问题,为之后的处理做准备。
缺失值是最常见的数据问题,处理缺失值也有很多方法,我建议按照以下四个步骤进行:
1、确定缺失值比例和范围
对每个字段都计算其缺失值比例,然后按照缺失比例和字段重要性,分别制定策略,可用下图表示:
2、去除不需要的字段
这一步很简单,直接删掉即可……但强烈建议清洗每做一步都备份一下,或者在小规模数据上试验成功再处理全量数据,不然删错了会追悔莫及(多说一句,写SQL的时候delete一定要配where!)。
3、填充缺失内容
某些缺失值可以进行填充,方法有以下三种:
以业务知识或经验推测填充缺失值
以同一指标的计算结果(均值、中位数、众数等)填充缺失值
以不同指标的计算结果填充缺失值
前两种方法比较好理解。关于第三种方法,举个最简单的例子:年龄字段缺失,但是有部分脱敏可以计算年龄的身份证号
4、重新获取数据
如果某些指标非常重要又缺失率高,那就需要和取数人员或业务人员了解,是否有其他渠道可以取到相关数据。
以上,简单的梳理了缺失值清洗的步骤,但其中有一些内容在实际工程应用中会更加复杂。
比如填充缺失值。很多讲统计方法或统计工具的书籍会提到相关方法。
如果数据是由系统日志而来,那么通常在格式和内容方面,会与元数据的描述一致。
而如果数据是由人工收集或用户填写而来,则有很大可能性在格式和内容上存在一些问题,简单来说,格式内容问题有以下几类:
1、修正格式的统一
时间、日期、数值、全半角等显示格式不一致
这种问题通常与输入端有关,在整合多来源数据时也有可能遇到,将其处理成一致的某种格式即可。
2、修正内容类型的统一
内容中有不该存在的字符
某些内容可能只包括一部分字符,比如身份证号是数字+字母,中国人姓名是汉字(赵C这种情况还是少数)。最典型的就是头、尾、中间的空格,也可能出现姓名中存在数字符号、身份证号中出现汉字等问题。
这种情况下,需要以半自动校验(正则表达式)半人工方式来找出可能存在的问题,并去除不需要的字符。
3、内容与该字段应有内容不符
姓名写了性别,身份证号写了手机号等等,均属这种问题。 但该问题特殊性在于:如果数据很重要那么不能简单的以删除来处理,因为成因有可能是人工填写错误,也有可能是前端没有校验,还有可能是导入数据时部分或全部存在列没有对齐的问题,因此要详细识别问题类型。
格式内容问题是比较细节的问题,但很多分析失误都是栽在这个坑上,比如跨表关联或VLOOKUP失败(多个空格导致工具认为“陈丹奕”和“陈 丹奕”不是一个人)、统计值不全(数字里掺个字母当然求和时结果有问题)、模型输出失败或效果不好(数据对错列了,把日期和年龄混了,so……)。
因此,请各位务必注意这部分清洗工作,尤其是在处理的数据是人工收集而来,或者你确定产品前端校验设计不太好的时候……
这部分的工作是去掉一些使用简单逻辑推理就可以直接发现问题的数据,防止分析结果走偏。主要包含以下几个步骤:
1、去重
有的分析师喜欢把去重放在第一步,但我强烈建议把去重放在格式内容清洗之后,原因已经说过了(多个空格导致工具认为“陈丹奕”和“陈 丹奕”不是一个人,去重失败)。而且,并不是所有的重复都能这么简单的去掉……
当然,如果数据不是人工录入的,那么简单去重即可。
2、去除异常值 outliar
一句话就能说清楚:
有人填表时候手抖,年龄200岁,这种的就要么删掉,要么按缺失值处理。这种值如何发现?
一般有两种手段:
最大值,最小值,分箱,分类统计,Pandas Value count
峰值偏度,是不是正态分布。
3、修正矛盾内容
有些字段是可以互相验证的,举例:身份证号是1101031980XXXXXXXX,然后年龄填18岁。在这种时候,需要根据字段的数据来源,来判定哪个字段提供的信息更为可靠,去除或重构不可靠的字段。
逻辑错误除了以上列举的情况,还有很多未列举的情况,在实际操作中要酌情处理。另外,这一步骤在之后的数据分析建模过程中有可能重复,因为即使问题很简单,也并非所有问题都能够一次找出,我们能做的是使用工具和方法,尽量减少问题出现的可能性,使分析过程更为高效。
这一步说起来非常简单:把不要的字段删了。
但实际操作起来,有很多问题,例如:
把看上去不需要但实际上对业务很重要的字段删了;
某个字段觉得有用,但又没想好怎么用,不知道是否该删;
一时看走眼,删错字段了。
前两种情况我给的建议是:如果数据量没有大到不删字段就没办法处理的程度,那么能不删的字段尽量不删。第三种情况,请勤备份数据……
如果你的数据有多个来源,那么有必要进行关联性验证。
例如,你有汽车的线下购买信息,也有电话客服问卷信息,两者通过姓名和手机号关联,那么要看一下,同一个人线下登记的车辆信息和线上问卷问出来的车辆信息是不是同一辆,如果不是(别笑,业务流程设计不好是有可能出现这种问题的!),那么需要调整或去除数据。
严格意义上来说,这已经脱离数据清洗的范畴了,而且关联数据变动在数据库模型中就应该涉及。但我还是希望提醒大家,多个来源的数据整合是非常复杂的工作,一定要注意数据之间的关联性,尽量在分析过程中不要出现数据之间互相矛盾,而你却毫无察觉的情况。
python Pandas Profiling 一行代码EDA 探索性数据分析
近年来,随着相关算法的日趋成熟,决定一个项目是否成功的关键因素逐渐从算法本身变成了“数据探索+数据预处理”这个部分。
有句话说的好:
数据和特征工程决定了学习的上限
模型和调参等只不过是竭尽所能去逼近这个上限
数据预处理的主要步骤:数据清理、数据集成、数据规约和数据变换。
参考1:https://www.zhihu.com/question/22077960
参考3:https://zhuanlan.zhihu.com/p/20571505
参考4:https://zhuanlan.zhihu.com/p/54172870
https://blog.csdn.net/jiazericky/article/details/80322225
https://blog.csdn.net/walterudoing/article/details/51782704