数据清洗:异常值识别和处理方法

异常数据识别

异常数据是数据分布的常态,处于特定分布区域之外的数据通常会被定义为异常或“噪音”。产生数据“噪音”的原因很多,例如业务运营操作、数据采集问题、数据同步问题等。对异常数据进行处理前,需要先辨别出哪些是真正的数据异常。

从数据异常的状态看分为两种:

  • 一种是“伪异常”,这些异常是由于特定的运营动作产生,其实正常反映了业务状态。
  • 一种是“真异常”,这些异常并不是由于特定的业务动作引起,而是客观反映了数据本身的分布异常。

如何判断异常值

对于有固定业务规则的可直接套用业务规则,而对于没有固定业务规则的,可以采用常见的数学模型进行判断。比如基于概率分布的模型(例如正态分布的标准差范围)、基于统计的方法(例如分位数法)、基于聚类的方法(例如KMeans)、基于分类的方法(例如KNN)、基于密度的方法(例如LOF)等。异常值的定义带有较强的主观判断色彩,具体需要根据实际情况选择。

示例如下:

# 导入pandas库
import pandas as pd  

# 生成异常数据,120较为异常
df = pd.DataFrame({'col1': [1, 120, 3, 5, 2, 12, 13],
                   'col2': [12, 17, 31, 53, 22, 32, 43]})
print(df)  

查看异常值:

# 通过Z-Score方法判断异常值,阙值设置为正负2,阙值的设置主要看业务需求或数学模型

# 复制一个用来存储Z-score得分的数据框,常用于原始对象和复制对象同时进行操作的场景
df_zscore = df.copy()  
cols = df.columns  
for col in cols: 
    df_col = df[col]  
    z_score = (df_col - df_col.mean()) / df_col.std()  # 计算每列的Z-score得分
    df_zscore[col] = z_score.abs() > 2  # 判断Z-score得分绝对值是否大于2,大于2即为异常值
print(df_zscore)  

丢弃处理

大多数数据挖掘工作中,异常值都会在数据的预处理过程中被认为是噪音而剔除,以避免其对总体数据的影响。

# 剔除异常值所在的行
print(df[df_zscore['col1'] == False])

以下任意一种场景,我们无需丢弃异常值:

  • 异常是由于业务特定运营动作产生。该异常是由业务部门的特定动作导致的,如果抛弃异常值将导致无法正确反映业务结果。
  • 异常检测模型的应用。异常检测模型是针对整体样本中的异常数据进行分析和挖掘,以便找到其中的规律,这种数据应用围绕异常值展开,异常数据本身是目标数据,因此不能直接丢弃。异常检测模型常用于客户异常识别、信用卡欺诈、贷款审批识别、药物变异识别、恶劣气象预测、网络入侵检测、流量作弊检测等。
  • 包容异常值的数据建模。如果数据算法和模型对异常值不敏感,那么即使不处理异常值也不会对模型本身造成负面影响。例如在决策树中,异常值本身就可以作为一种分裂节点。

 参考资料:《Python数据分析与数据化运营》宋天龙

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值