数据清洗---缺失值处理

来源:互联网 发布:在线课堂网站源码 编辑:程序博客网 时间:2024/04/30 12:45

清洗数据如同洗菜,做过的都知道,是一件既耗体力又耗精力的工作。数据量大时候,只能借助python或R语言来实现。数据量小时,就靠excel了,速度嘛。当然零零碎碎的数据清洗,代码都不值当写的时候,就靠人肉了。


为什么需要清洗数据?



我们拿到的数据,无论是结构化的、半结构化的还是非结构化的数据,都是一个天生的畸形儿,从出生的那一刻就带来一身“疾病”。常常面临的问题主要包括,但不仅仅是,以下问题:


  • 数据不完整

    经常遇见比如人物属性字段值:性别,姓名,年龄,学历等,有缺失情况。一条记录,常常不是缺胳膊就是少腿,你还不能直接把它枪毙掉。


  • 数据有重复

    所有字段的值都相等的重复值是一定要剔除的,根据不同业务场景,有时还需要选取其中几个字段进行去重操作。


  • 数据不合法

    如果一条招聘数据的招聘人数字段,值出现负数,或者是999这样明显不符合常理的数据,便认为其是“不合法”的数据。应该清洗掉,或者是通过一定的规则,比如使用平均值来填充。


  • 数据不一致

    在数据来源有多个时,比如既有来自百度的数据,又有来自google的数据。对于同一个主体,其同一个属性值不同,就需要核实数据源准确性。确定最终使用来源。


缺失值怎么处理?



1.删除含有缺失值的记录

理论上讲,主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的记录删除,比如dataframe可以使用dropna方法来实现删除缺失值。

df.dropna(axis=0, how='all')

# 删除所有字段值均为空值的行

df.dropna(axis=0, how='any')

# 删除任何一个字段值为空值的行

df.dropna(axis=1, how='all')

# 删除任何一个字段值为空值的列

df.dropna(axis=1, how='any')

# 删除任何一个字段值为空值的列


2.插补缺失值 

它的思想来源是以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。在数据挖掘中,面对的通常是大型的数据库,它的属性有几十个甚至几百个,因为一个属性值的缺失而放弃大量的其他属性值,这种删除是对信息的极大浪费,所以产生了以可能值对缺失值进行插补的思想与方法。常用的有如下几种方法。

(1)均值插补。数据的属性定性数据和定量数据。如果缺失值是定量的,就以该字段存在值的平均值来插补缺失的值;如果缺失值是定性的,就根据统计学中的众数原理,用该属性的众数(即出现频率最高的值)来补齐缺失的值。 

(2)利用同类均值插补。它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。如果在以后统计分析中还需以引入的解释变量和Y做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。 

(3)极大似然估计(Max Likelihood ,ML)。在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。使用前提:大样本,并且有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。 


3.实践中容易遇见的问题及解决方案

有时候会遇到这种问题,明明数据中存在NaN,却无法识别出来。也就是说使用dropna删不掉空值。解决的办法是:

test[pd.isnull(test['高管id']) == True]

a. pd.isnull可以判断一个series的每个值是否为空值,返回索引

b. 再用pd.isnull返回的逻辑值取出对应的每一行数据

c. 把test取出的这个子集拿出来



长按识别下方二维码,关注“数据分析师手记”,与三月桑一起学习数据分析