Press "Enter" to skip to content

大数据之路 ——(一)算法建模中的数据清洗

作者:Mochou

 

来源:恒生LIGHT云社区

 

在当前大数据的背景下,数据处理占了极大的份额,就像一个西红柿做成西红柿炒鸡蛋,需要经过调料整合,菜料清洗,饭菜加工等等才能发布到生产,不,发送到餐桌。

 

这里简单分享一下我对数据清洗的理解,其具有很重要的地位,不然面对着脏乱差的西红柿炒鸡蛋,没人愿意下口。

 

一份未经清洗过的数据一般会存在这些不符合分析要求的问题:比如重复,错误,空值,异常数据等,对于错误数据,因为是业务源头问题,比如性别明明是男却成了女,这些我们无法处理,只能从源端进行规范,就像顾客想吃河南的西红柿,厨房里进的只有山东的,这个厨师没办法解决,只能通知进货商更改。故我们只对另外三个问题进行清洗修改,必须申明一点,所有的清洗都要基于实际业务来做,比如重复,可能业务要的就是重复,你给人家洗掉了,就产生了问题

 

 

一 . 重复

 

如果实际业务不要重复值,重复值可以直接删除,比如数据库里可以在整合合并时用union而不是union all ,不支持union的可以用主键分组排序取第一个

 

row_number() over (partition by .. order by..desc) as..

 

如果也不支持row_number,,,那好好活着吧。

 

其他语言也都有类似的去重函数,如python可以直接用drop_duplicates()

 

二 . 缺失

 

缺失也就是空值,需要明确一点,‘空’有两种情况,一种是真正的对象为空,即null,一种是空值,即xxx=”,所以我们处理这些空值时需要分两种情况,一种是xxx is null, 一种是length(trim(xxx))=0。

 

空值处理一般是填补,这个根据实际业务需要来做,一般来讲,

空值数量比较小时可以填补上连续值的某一个,比如平均数,中位数等;
空值较多时,占了五成以上,可以考虑使用众数来填补;
空值占了绝大部分,这个时候就没必要再用原有的数据,可以自己造数据,生成一个指示哑变量,参与后续的建模需要。

前面已经说过在数据库里怎幺处理,这里说下在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里的数据

聚类法

前面介绍的都是单变量,多变量的异常值处理需要用到聚类法。

 

它的思想是正常值都拥有相似的标签,比如前面好的西红柿颜色都是红润的,口感都是酸甜的,表皮都是完整的等等,而坏的西红柿则拥有异于“他人”的特征,比如味道怪异。故我们可以把数据对象分为多个集合,在同一个集合里的对象有较高的相似度,而不同的集合之间的对象差别较大。聚类分析可以通过这些不同的集合挖掘出孤立点,这些孤立点往往就是异常数据。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注