做者:Mochoupython
来源:恒生LIGHT云社区数据库
在当前大数据的背景下,数据处理占了极大的份额,就像一个西红柿作成西红柿炒鸡蛋,须要通过调料整合,菜料清洗,饭菜加工等等才能发布到生产,不,发送到餐桌。app
这里简单分享一下我对数据清洗的理解,其具备很重要的地位,否则面对着脏乱差的西红柿炒鸡蛋,没人愿意下口。函数
一份未经清洗过的数据通常会存在这些不符合分析要求的问题:好比重复,错误,空值,异常数据等,对于错误数据,由于是业务源头问题,好比性别明明是男却成了女,这些咱们没法处理,只能从源端进行规范,就像顾客想吃河南的西红柿,厨房里进的只有山东的,这个厨师没办法解决,只能通知进货商更改。故咱们只对另外三个问题进行清洗修改,必须申明一点,全部的清洗都要基于实际业务来作,好比重复,可能业务要的就是重复,你给人家洗掉了,就产生了问题大数据
一 . 重复
若是实际业务不要重复值,重复值能够直接删除,好比数据库里能够在整合合并时用union而不是union all ,不支持union的能够用主键分组排序取第一个url
row_number() over (partition by .. order by..desc) as..
若是也不支持row_number,,,那好好活着吧。.net
其余语言也都有相似的去重函数,如python能够直接用drop_duplicates()code
二 . 缺失
缺失也就是空值,须要明确一点,‘空’有两种状况,一种是真正的对象为空,即null,一种是空值,即xxx='',因此咱们处理这些空值时须要分两种状况,一种是xxx is null, 一种是length(trim(xxx))=0。对象
空值处理通常是填补,这个根据实际业务须要来作,通常来说,blog
- 空值数量比较小时能够填补上连续值的某一个,好比平均数,中位数等;
- 空值较多时,占了五成以上,能够考虑使用众数来填补;
- 空值占了绝大部分,这个时候就不必再用原有的数据,能够本身造数据,生成一个指示哑变量,参与后续的建模须要。
前面已经说过在数据库里怎么处理,这里说下在python里如何处理
# 列出空值在每一个列所占的比重 # df是数据集,col.size是当前数据的行数 df.apply(lambda col:sum(col.isnull())/col.size) # 用均值填补,使用pandas包里的fillna df.col1.fillna(df.col1.mean())
三 . 噪声值
噪声值是指数据中与其余数值相比差别比较大的值,也有的叫离群点等,好比年龄里出来几个150以上的。噪声值会严重干扰模型结果,使结论不真实或偏颇。因此必需要清除这些噪声值,经常使用的方法:对于单变量的有盖帽法,分箱法,多变量的有聚类法。
- 盖帽法
咱们都学过正态分布,对于均值上下三倍标准差范围外的记录值加一块的几率才为0.01%,故咱们能够把这些外围数据替换为各自的均值上下三倍标准差值,即为盖帽法
数据库里能够用case when来替换,python能够写一个函数
def cap(x,quantile=[0.01,0.99]): '''盖帽法处理异常值 Args: x:是series列,连续变量 quantile:上下分位数范围,这里写为0.01和0.99 ''' # 生成分位数,Q01,Q99分别是百分之一分位点和百分之99分位点 Q01,Q99=x.quantile(quantile).values.tolist() # 替换异常值为制定的分位数 if Q01 > x.min(): x = x.copy() x.loc[x < Q01] = Q01 if Q99 < x.max(): x = x.copy() x.loc[x > Q99] = Q99 return(x)
- 分箱法
分箱法经过考察数据的“近邻”来光滑有序数据的值,有序值分布到一些箱中,经过取各个箱子的特定值如最值,均值,中位数等,这个值就是这个箱子的值,而后置定标准评判这些箱子的值好坏,从而判断各个箱子是好的仍是坏的,坏的箱子须要特殊处理。分箱法分为等深分箱:每一个分箱样本量一致,等宽分箱:每一个分箱取值范围一致。
好比一组数 1 2 66 8 9 2 1 4 6,先排序 1 1 2 2 4 6 8 9 66,再分为三个箱子 箱子A:1 1 2 箱子B:2 4 6 箱子C:8 9 66
咱们这里取箱子的平均数,则A为1.3 B为4 C为27.3 很明显这个C值远远大于这组数据的均值和中位数,因此C箱子是坏箱子,则能够集中处理C里的数据
- 聚类法
前面介绍的都是单变量,多变量的异常值处理须要用到聚类法。
它的思想是正常值都拥有类似的标签,好比前面好的西红柿颜色都是红润的,口感都是酸甜的,表皮都是完整的等等,而坏的西红柿则拥有异于“他人”的特征,好比味道怪异。故咱们能够把数据对象分为多个集合,在同一个集合里的对象有较高的类似度,而不一样的集合之间的对象差异较大。聚类分析能够经过这些不一样的集合挖掘出孤立点,这些孤立点每每就是异常数据。