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