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

数据清洗:异常值识别和处理方法,第1张

异常数据识别

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

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

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

如何判断异常值

对于有固定业务规则的可直接套用业务规则,而对于没有固定业务规则的,可以采用常见的数学模型进行判断。比如基于概率分布的模型(例如正态分布的标准差范围)、基于统计的方法(例如分位数法)、基于聚类的方法(例如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])

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

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/791358.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存