异常数据是数据分布的常态,处于特定分布区域之外的数据通常会被定义为异常或“噪音”。产生数据“噪音”的原因很多,例如业务运营 *** 作、数据采集问题、数据同步问题等。对异常数据进行处理前,需要先辨别出哪些是真正的数据异常。
从数据异常的状态看分为两种:
- 一种是“伪异常”,这些异常是由于特定的运营动作产生,其实正常反映了业务状态。
- 一种是“真异常”,这些异常并不是由于特定的业务动作引起,而是客观反映了数据本身的分布异常。
如何判断异常值
对于有固定业务规则的可直接套用业务规则,而对于没有固定业务规则的,可以采用常见的数学模型进行判断。比如基于概率分布的模型(例如正态分布的标准差范围)、基于统计的方法(例如分位数法)、基于聚类的方法(例如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数据分析与数据化运营》宋天龙
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)