数据分析:异常值检测--箱型图

在做数据分析时,我们免不了要检查数据中的异常值,但是什么样的数据算作异常呢。有人说很大或者很小的值,那到底多大多小的值算异常。箱型图就可以很好的解决这个问题。我们都知道折线图、柱状图等,但很少使用过箱型图。关于箱型图,百度百科的解释为:

箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的最大值、最小值、中位数和两个四分位数;然后, 连接两个四分位数画出箱子;再将最大值和最小值与箱子相连接,中位数在箱子中间。

通过定义可以看出,箱型图可以很好的展示数据的基本分布情况,而且可以很方便的检测出数据中的异常值。

我们先介绍两种箱型图的实现方式,再详解箱型图含义,最后结合Kaggle数据集看看如何使用。

1.pandas实现

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = np.random.randn(3,4)
df = pd.DataFrame(df)
df.boxplot()

这里用的pandas自带的绘图方法,其实就是matplotlib。df的数据内容为:

	    0            1	        2	        3
0	-0.803730	2.666505	1.668437	-2.542154
1	0.996711	0.532948	1.484964	-0.452487
2	-1.036156	0.127020	-0.381138	-0.688037

得到的箱型图如下:

2.matplotlib实现

import matplotlib.pyplot as plt
import numpy as np
 
all_data = [np.random.normal(0, std, 100) for std in range(1, 4)]
 
fig = plt.figure(figsize=(8,6))
 
plt.boxplot(all_data,
            notch=False, # 是否用盒子形状
            sym='rs',    # 用红色矩形展示异常值
            showmeans=True,#展示均值点
            patch_artist=False,#是否要填充色
            meanline=False,#展示均值线
            widths=0.5,#设置箱盒宽度
            vert=True)   #垂直展示图形
 
plt.xticks([y+1 for y in range(len(all_data))], ['x1', 'x2', 'x3'])
plt.xlabel('measurement x')
t = plt.title('Box plot')
plt.show()

图形如下:

t

水平展示的效果如下:

f

3.图形详解

我们结合例子来讲解图形所代表的意思,例子来源于MBA智库百科,链接在文末。我们有如下数据:

2710 2755 2850 | 2880 2880 2890 | 2920 2940 2950 | 3050 3130 3325  

计算Q1,Q2,Q3,

Q1 = (2850 + 2880) / 2 = 2865 

Q2 = (2890 + 2920) / 2 = 2905

Q3 = (2950 + 3050) / 2 = 3000

也就是说,中位数是2905,第一个四分位数(也叫下四分位数)Q1 = 2865,第三个四分位数(也叫上四分位数)Q3 = 3000。有了四分位数Q1和Q3,可以算出四分位数全距IQR = Q3 − Q1。从而得到下限和上限。在上下限之外的点就是异常点。如下图所示:

f

4.实际应用

我们通过箱型图来检测Kaggle数据集Give Me Some Credits中的异常值。先看代码:

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('/dataset/cs-training.csv')
#查看数据集中的如下几列数据
data = data[['NumberOfTime30-59DaysPastDueNotWorse','NumberOfTimes90DaysLate','NumberOfTime60-89DaysPastDueNotWorse','age']]

#使用pandas绘制
plt.figure(figsize=(10,5))
data.boxplot(sym='r*',vert=False,patch_artist=True,meanline=False,showmeans=True)
plt.show()

得到图形:

e

我们可以看出,age的取值有一个明显的异常点0。另外三列也有明显的异常点,97和98。对于这样的异常值直接删除即可。是不是很方便、很直观。箱型图简直就是数据分析中的异常值检测的神器。

参考资料:

https://matplotlib.org/gallery/pyplots/boxplot_demo_pyplot.html#sphx-glr-gallery-pyplots-boxplot-demo-pyplot-py

http://blog.topspeedsnail.com/archives/737

https://wiki.mbalib.com/wiki/%E7%AE%B1%E7%BA%BF%E5%9B%BE

猜你喜欢

转载自blog.csdn.net/opp003/article/details/84959020