文章大纲
咱们目前进入了一个大数据的时代。以我目前常常处理的医疗保健数据为例。前端
随着时间的推移医疗保健数据的生成速度愈来愈快,预计到2020年将达到35 ZB(1ZB大约是10的9次方TB)。不管是出于患者护理、研究仍是法律缘由,可以经济高效、安全地管理这些数据对医疗保健提供者来讲都愈来愈重要。python
医疗保健提供商必须可以摄取、存储和保护大量数据,包括临床、基因组、设备、财务、供应链和保险理赔等。web
本文尝试从数据 挖掘、分析的通常步骤入手,基于理论化的描述结合具体例子详细介绍挖掘分析建模以前数据处理的目的及方法论。正则表达式
数据分析的通常流程:算法
- 肯定目标
- 获取数据源
- 数据探索
- 数据预处理
- 挖掘分析建模
- 模型效果评价
借用一张同事绘制的图片
数据库
统一数据接入
数据接入,尤为是针对目前多元异构数据的(批处理数据、实时数据流式数据)接入,咱们称之为统一数据接入。安全
文章连接:统一数据接入实践分享svg
数据清洗的目的
数据清洗, 是整个数据分析过程当中不可缺乏的一个环节,其结果质量直接关系到模型效果和最终结论。在实际操做中,数据清洗一般会占据分析过程的50%—80%的时间。工具
数据清洗的目的从两个角度来说:oop
1、是为了解决数据质量问题
2、是让数据更适合作挖掘、展现、分析
解决数据质量问题
解决数据质量问题,其实就是为了确保如下几点:
针对每一点咱们分别来看
- 数据的完整性
例如人的属性中缺乏性别、年龄等
- 数据的惟一性
例如不一样来源的数据出现重复的状况,好比本次数据中咱们基本信息中的序号,有部分重复的数据。这个多是因为数据录入两次形成的。
- 数据的权威性
例如同一个指标出现多个来源的数据,且数值不同
- 数据的合法性
例如获取的数据与常识不符,年龄大于150岁
- 数据的一致性
例如不一样来源的不一样指标,实际内涵是同样的,或是同一指标内涵不一致
让数据更适合作挖掘、展现、分析
从这个角度讲,数据清洗的工做更偏向工程,不是咱们此次关注的重点.(有时间、有兴趣的话会后详细讨论,就不占用你们时间了。)
让数据更适合作挖掘、展现、分析,有如下一些手段对数据进行清洗。
- 高维度----不适合挖掘
思路:降维,方法包括但不限于:
主成分分析PCA
随机森林
- 维度过低----不适合挖掘
思路:抽象,方法包括但不限于:
各类汇总,平均、加总、最大、最小等
各类离散化,聚类、自定义分组等
- 无关信息----减小存储
解决方法:剔除字段
- 字段冗余
一个字段是其余字段计算出来的,会形成相关系数为1或者主成因分析异常
解决方法:剔除字段
- 多指标数值、单位不一样
如GDP与城镇居民人均收入数值相差过大
解决方法:归一化,方法包括但不限于:
最小-最大
零-均值
小数定标
数据清洗的步骤
第0步:数据导入及元数据处理
数据导入及元数据处理阶段主要主要关注两件事情:
1.了解数据量
经过了解数据量(批处理,仍是流式数据),将数据导入处理工具或者平台。一般来讲,数据量不大的状况建议使用数据库。
若是数据量大(千万级以上),可使用hadoop文本文件存储+Python操做的方式。
这个步骤对于批处理,文件交换的方式一般比较会引发问题是文件编码,推荐统一使用UTF-8编码。
2.了解元数据
这里包含两个部分:
一是看元数据,包括字段解释、数据来源、代码表等等一切描述数据的信息;若是数据是多维度的咱们要弄清楚数据之间的关联关系。
二是抽取一部分数据,使用人工查看方式,对数据自己有一个直观的了解,而且初步发现一些问题,为以后的处理作准备。
第一步:缺失值清洗
缺失值是最多见的数据问题,处理缺失值也有不少方法,我建议按照如下四个步骤进行:
一、肯定缺失值比例和范围
对每一个字段都计算其缺失值比例,而后按照缺失比例和字段重要性,分别制定策略,可用下图表示:
二、去除不须要的字段
这一步很简单,直接删掉便可……但强烈建议清洗每作一步都备份一下,或者在小规模数据上试验成功再处理全量数据,否则删错了会追悔莫及(多说一句,写SQL的时候delete必定要配where!)。
三、填充缺失内容
某些缺失值能够进行填充,方法有如下三种:
以业务知识或经验推测填充缺失值
以同一指标的计算结果(均值、中位数、众数等)填充缺失值
以不一样指标的计算结果填充缺失值
前两种方法比较好理解。关于第三种方法,举个最简单的例子:年龄字段缺失,可是有部分脱敏能够计算年龄的身份证号
四、从新获取数据
若是某些指标很是重要又缺失率高,那就须要和取数人员或业务人员了解,是否有其余渠道能够取到相关数据。
以上,简单的梳理了缺失值清洗的步骤,但其中有一些内容在实际工程应用中会更加复杂。
好比填充缺失值。不少讲统计方法或统计工具的书籍会提到相关方法。
第二步:格式内容清洗
若是数据是由系统日志而来,那么一般在格式和内容方面,会与元数据的描述一致。
而若是数据是由人工收集或用户填写而来,则有很大可能性在格式和内容上存在一些问题,简单来讲,格式内容问题有如下几类:
一、修正格式的统一
时间、日期、数值、全半角等显示格式不一致
这种问题一般与输入端有关,在整合多来源数据时也有可能遇到,将其处理成一致的某种格式便可。
二、修正内容类型的统一
内容中有不应存在的字符
某些内容可能只包括一部分字符,好比身份证号是数字+字母,中国人姓名是汉字(赵C这种状况仍是少数)。最典型的就是头、尾、中间的空格,也可能出现姓名中存在数字符号、身份证号中出现汉字等问题。
这种状况下,须要以半自动校验(正则表达式)半人工方式来找出可能存在的问题,并去除不须要的字符。
三、内容与该字段应有内容不符
姓名写了性别,身份证号写了手机号等等,均属这种问题。 但该问题特殊性在于:若是数据很重要那么不能简单的以删除来处理,由于成因有多是人工填写错误,也有多是前端没有校验,还有多是导入数据时部分或所有存在列没有对齐的问题,所以要详细识别问题类型。
格式内容问题是比较细节的问题,但不少分析失误都是栽在这个坑上,好比跨表关联或VLOOKUP失败(多个空格致使工具认为“陈丹奕”和“陈 丹奕”不是一我的)、统计值不全(数字里掺个字母固然求和时结果有问题)、模型输出失败或效果很差(数据对错列了,把日期和年龄混了,so……)。
所以,请各位务必注意这部分清洗工做,尤为是在处理的数据是人工收集而来,或者你肯定产品前端校验设计不太好的时候……
第三步:逻辑错误清洗
这部分的工做是去掉一些使用简单逻辑推理就能够直接发现问题的数据,防止分析结果走偏。主要包含如下几个步骤:
一、去重
有的分析师喜欢把去重放在第一步,但我强烈建议把去重放在格式内容清洗以后,缘由已经说过了(多个空格致使工具认为“陈丹奕”和“陈 丹奕”不是一我的,去重失败)。并且,并非全部的重复都能这么简单的去掉……
固然,若是数据不是人工录入的,那么简单去重便可。
二、去除异常值 outliar
一句话就能说清楚:
有人填表时候手抖,年龄200岁,这种的就要么删掉,要么按缺失值处理。这种值如何发现?
通常有两种手段:
- 基于统计与数据分布
最大值,最小值,分箱,分类统计,Pandas Value count
峰值偏度,是否是正态分布。
- 箱形图分析
三、修正矛盾内容
有些字段是能够互相验证的,举例:身份证号是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
相关资源
本文同步分享在 博客“shiter”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。