在做数据分析时,我们免不了要检查数据中的异常值,但是什么样的数据算作异常呢。有人说很大或者很小的值,那到底多大多小的值算异常。箱型图就可以很好的解决这个问题。我们都知道折线图、柱状图等,但很少使用过箱型图。关于箱型图,百度百科的解释为:
箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的最大值、最小值、中位数和两个四分位数;然后, 连接两个四分位数画出箱子;再将最大值和最小值与箱子相连接,中位数在箱子中间。
通过定义可以看出,箱型图可以很好的展示数据的基本分布情况,而且可以很方便的检测出数据中的异常值。
我们先介绍两种箱型图的实现方式,再详解箱型图含义,最后结合Kaggle数据集看看如何使用。
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
得到的箱型图如下:
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()
图形如下:
水平展示的效果如下:
我们结合例子来讲解图形所代表的意思,例子来源于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。从而得到下限和上限。在上下限之外的点就是异常点。如下图所示:
我们通过箱型图来检测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()
得到图形:
我们可以看出,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