一文速学-Pandas异常值检测及处理操作各类方法详解+代码展示

1,740 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

此篇博客基于Jupyter之上进行演示,本篇博客的愿景是希望我或者读者通过阅读这篇博客能够学会方法并能实际运用,而且能够记录到你的思想之中。希望读者看完能够提出错误或者看法,博主会长期维护博客做及时更新。纯分享,希望大家喜欢。 为方便展示效果创建一个DataFrame:

data = {'name': ['user1', 'user2', 'user3', 'user4','user5','user6','user7','user8','user9','user10'],
        'old': [21, 21, 20, 19, 23,22,18,19,35,4],
        'weight':[121,122,132,135,128,124,129,133,162,73]
        }
columns1=['name', 'old','weight']
index1=['id1', 'id2', 'id3','id4','id5','id6','id7','id8','id9','id10']
df1= pd.DataFrame(data,columns=columns1,index=index1)
df1

图片.png 异常值检测目前有四种比较常见的处理方法:

  • MAD异常值识别
  • 百分位异常值识别
  • 3sigma异常值识别
  • Z-Score异常值识别

1.MAD异常值识别法

MAD的全称为median absolute deviation,意为绝对中位差。MAD是一种采用计算各观测值与平均值的距离总和的检测离群值的方法。

其MAD计算公式为:MAD=median(\left | X_{i}-median(X) \right |)

例如如果我们想检测old特征这一列的数据时,运用MAD检测方法可以分为六步进行: 第一步:得到该列的中位数MA:

x=df1['old'].median()

第二步:让该列的数据减去中位数

Se=df1['old']-x

图片.png 第三步:得到该列的绝对值

Se=abs(Se)

图片.png

第四步: 求出绝对值化后的此列的中位数MC

MC=Se.median()

第六步:使用初始列的中位数加减MAD的倍数:MA\pm n*MAD,一般倍数为2.5,超出此范围的数值被认为是异常值。

Low=x-2.5*MAD
Up=x+2.5*MAD
df1=df1[(df1['old']>=Low)&(df1['old']<=Up)]
df1

图片.png

这样就筛选完成,把所有的异常值去除了。 

 总体代码为:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = {'name': ['user1', 'user2', 'user3', 'user4','user5','user6','user7','user8','user9','user10'],
        'old': [21, 21, 20, 19, 23,22,18,19,35,4],
        'weight':[121,122,132,135,128,124,129,133,162,73]
        }
columns1=['name', 'old','weight']
index1=['id1', 'id2', 'id3','id4','id5','id6','id7','id8','id9','id10']
df1= pd.DataFrame(data,columns=columns1,index=index1)
MA=df1['old'].median()
Se=df1['old']-MA
Se=abs(Se)
MC=Se.median()
Low=x-2.5*MAD
Up=x+2.5*MAD
df1=df1[(df1['old']>=Low)&(df1['old']<=Up)]

二、Z-score异常值识别

Z-score是一维或低维特征空间中的参数异常检测方法。该技术假定数据服从高斯分布,异常值是分布尾部的数据点,因此远离数据的平均值。该方法也可进行数据标准化: 其公式为Z_{i}=\frac{x_{i}-\mu }{\delta },距离的远近取决于使用公式计算的归一化数据点Z_{i}的设定阈值Z_{thr},其中x_{i}为数据点,\mu为特征数据的平均值,\delta是特征数据的标准偏差。将所有的数据值经过标准化处理后,判断其绝对值是否大于Z_{thr}\left | Z_{i} \right |>Z_{thr}。 目标还是和第一种方法一样删去“old”列中异常值

 第一步:对该列进行Z-score标准化:

lamda=df1['old'].mean()
sigma=df1['old'].std()
df1['old']=df1['old'].astype(float)
df1['old']=(df1['old']-lamda)/sigma

图片.png 第二步:绝对值转换后,根据设定Z_{thr}进行筛选

df1=df1[df1['old']<1.5]

图片.png 这样既进行了数据标准化也筛选了数据

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见