好玩的人工智能
快乐的深度学习

极端异常值的检测

你在整理统计公司人的收入情况,手一抖,不小心把某个人的月薪26249变成262490了,某个人的月薪16895变成1689.5了。于是变成了如下的情况:

incomes=[25590, 23306, 26780, 29463, 22485, 262490, 24985, 1689.5, 17700, 18257, 24132, 21479, 19304, 16511, 18573, 26606, 20917, 19394, 24322, 28383, 16478, 29062, 23232, 17580, 26804, 28500, 25018, 24001, 27530, 27459, 22776, 19835, 16475, 15201, 28801, 19509, 19098, 17993, 15131, 26187, 25022, 27430, 19114, 18295, 25365, 23550, 20413, 19335, 21286, 22911]

有时候数据集中会包含一个或多个数值异常大或异常小的值,这样的极端值称为异常极端值(outlier)。这在现实数据集中是很有可能发生的,如数据录入错误、测量错误、试验错误、数据处理错误等。异常值的存在当然对数据统计产生很多不良的影响,例如降低数据统计的说服力和可信度。

因此,我们首先想到的是把异常值检测出来。这里就需要用到排序,利用排序,将数据从小到大进行排列。然后将数据进行等分。如果分成2部分,那这个数就是中位数。如果分为4部分,那这个数就叫四分位数。注意,这不是美式足球(橄榄球)中的四分位;四分位数不止一个,是3个,即通过3个四分位数将数据分为了4个数量上相等的部分。

这3个四分位数分别用Q1,Q2,Q3表示。你可能并不陌生,股票市场中,经常有Q1财报,Q2财报,Q3财报,Q4财报的说法,指的是四个季度的财报情况,一年4个季度,也是四等分。

那么,对于上面的数据,怎样计算Q1,Q2,Q3呢?可以利用pandas的describe函数。

import pandas as pd
four = pd.Series(data).describe()
print(four)
print('Q1= {0}, Q2= {1}, Q3={2}'.format(four['25%'],four['50%'],four['75%']))

输出结果:

count 50.000000
mean 26835.150000
std 34372.619505
min 1689.500000
25% 19102.000000
50% 22843.500000
75% 26037.750000
max 262490.000000
dtype: float64
Q1= 19102.0, Q2= 22843.5, Q3= 26037.75

可以看出,pandas的describe函数不仅能得出数据集的样本数量,均值,标准差,最小值、最大值,以及3个四分位数,即在数据25%,50%,75%位置的数。我们通常把Q3-Q1的差值称为四分位距(interquartile range,IQR),或四分差。

那什么是异常极端值呢,用如下计算公式:

Q1 = four['25%']
Q3 = four['75%']
IQR = Q3 - Q1

upper = Q3 + 1.5 * IQR
lower = Q1 - 1.5 * IQR

print(upper, lower)

输出结果:

36441.375 8698.375

高于upper或者低于lower的值都属于异常极端值。

画出图像如下:

incomes = pd.DataFrame(incomes)
import seaborn as sns
import matplotlib.pyplot as plt

sns.boxplot(data=incomes, palette="Set1")
plt.show()

很容易发现标为黑色菱形的这2个极端值。那这个计算极端值的1.5是怎么得来的呢,这是统计学中经过大量分析和经验积累得出的标准,一般情况不做调整。

未经允许不得转载:零点智能 » 极端异常值的检测
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

零点智能 人工智能社区,加Q群:469331966

投稿&建议&加Q群