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

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


前言

使用Pandas进行数据预处理时需要了解Pandas的基础数据结构Series和DataFrame。若是还不清楚的可以再去看看我之前的三篇博客详细介绍这两种数据结构的处理方法:

一文速学-数据分析之Pandas数据结构和基本 *** 作代码

DataFrame行列表查询 *** 作详解+代码实战

DataFrame多表合并拼接函数concat、merge参数详解+代码 *** 作展示

以上三篇均为基础知识,没有比较难的实战,比较容易学会。

首先说明一点,关于包含在异常值里面的空值和重复值均有两篇博客专门详细介绍了处理他们的方法:

一文速学-Pandas处理重复值 *** 作各类方法详解+代码展示

一文速学-Pandas处理缺失值 *** 作各类方法详解

该篇博客主要详解异常值检测方法以及检测后的修改方法。

此篇博客基于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

 

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

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

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

其MAD计算公式为:。

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

第一步:得到该列的中位数MA:

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

 20.5

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

Se=df1['old']-x

 

 第三步:得到该列的绝对值

Se=abs(Se)

 

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

MC=Se.median()

 1.5

 第五步:将MC转化为MAD,MAD=MC*1.4826

MAD=MC*1.4826

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

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

 

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

 总体代码为:

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_{thr}" src="https://latex.codecogs.com/gif.latex?%5Cleft%20%7C%20Z_%7Bi%7D%20%5Cright%20%7C%3EZ_%7Bthr%7D" />。

目标还是和第一种方法一样删去“old”列中异常值

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

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

 

 第二步:绝对值转换后,根据设定进行筛选

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

 

 这样既进行了数据标准化也筛选了数据

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存