首页 > pandas 阅读数:28

pandas异常值的处理

在数据分析中,除了常见的重复值和缺失值外,还会遇到一类非正常的数据,即异常值。所谓异常值,就是在数据集中存在不合理的值,又称离群点。例如,年龄为负数,成绩大于 100 或小于零,商品评分超出 5 分或商品日销售量远远超过年销售量等,都属于异常值。

从集合角度来看,异常值即离群点。因此,为了处理异常值,首先是判别数据集中是否存在离群点,然后再对离群点的数据进行处理。

判别数据集中异常值的方法

1) 散点图分析

通过绘制数据集中某些属性值的散点图,可观察这些属性值中的数据是否存在超出正常范围的离群点,从而发现数据集中的异常值。

2) 简单统计分析

对数据集中的属性值进行描述性的统计,从中可发现哪些数据是不合理的。例如,年龄属性值的区间规定为 [0:150],如果数据集样本中的年龄值不在该区间范围内,则表示该样本的年龄属性属于异常值。

3) 3σ 原则

3σ 原则是指当数据服从正态分布时,根据正态分布的定义可知,距离平均值 3σ 之外的概率为 P(|X-μ|>3σ)≤0.003,这属于极小概率事件,在默认情况下,可以认定距离超过平均值 3σ 的样本是不存在的。因此,当样本距离平均值大于 3σ 时,则认定该样本为异常值。

4) 箱线图分析

箱线图提供了一个识别异常值的标准,即大于或小于箱线图设定的上下界的数值即为异常值。箱线图上节已经学过。

在箱线图上定义了上四分位和下四分位,上四分位设置为U,表示所有样本中只有 1/4 的数值大于 U;同理,下四分位设置为 L,表示所有样本中只有 1/4 的数值小于 L。同时,设置上四分位与下四分位的插值为 IQR,即 IQR=U-L,那么,上界为 U+1.5IQR,下界为 L-1.5IQR。箱线图在选取异常值方面比较客观,在识别异常值方面有一定的优越性。

异常值的处理方法

常用的异常值处理方法有以下4种:
  • 删除含有异常值的记录;
  • 将异常值视为缺失值,按照缺失值的处理方法来处理;
  • 用平均值来修正异常值;
  • 对异常值不处理。

在异常值处理时,有些异常值可能含有有用信息,因此,如何判定和处理异常值,需视情况而定。在数据量较多时,可用散点图和描述性的统计来查看数据基本情况,发现异常值,并借助箱线图进行监测。

【例 1】现有一个餐厅销售数据表 sale.xls,在该数据表中有日期和销量两列数据,要求分析该数据表中销量数据的异常值,并将异常值用销量数据的中位数替换。

数据分析思路:首先读取 sale.xls 文件中的数据,并对销量数据进行描述性的统计分析。通过描述性的统计分析发现异常值,然后,运用散点图寻找异常值,最后,将异常值用销量数据的中位数替换。

其示例代码 test1.py 如下。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入数据
data = pd.read_excel('d:/data/sale.xls')
#通过描述性的统计发现异常值
print(data.describe())
#通过散点图发现6个异常值
data1=data.T
#得到日期数据
date=data1.values[0]
#得到销量数据
sale=data1.values[1]
#绘制散点图
plt.plot(date,sale,'o')
plt.show()
#将异常值用中位数替换
data['销量'][(data['销量'] < 400) | (data['销量'] > 5000)] = 2655.85

通过销售数据散点图寻找异常值,其散点图如图 1 所示。

销售数据散点图
图 1:销售数据散点图