Python学习笔记:异常值检测之箱线图
一、介绍
箱线图也称箱须图、箱形图、盒图,用于反映一组或多组连续型定量数据分布的中心位置和散布范围。箱形图包含数学统计量,不仅能够分析不同类别数据各层次水平差异,还能揭示数据间离散程度、异常值、分布差异等等。
1977年,美国著名数学家 John W. Tukey
首先在他的著作 《Exploratory Data Analysis》
中介绍了箱形图。
箱线图(Box Plot
)是通过数据集的四分位数形成的图形化描述,是一种非常简单,而且有效的可视化离群点的方法。
上下须为数据分布的边界,只要高于上须,或者是低于下须的数据点,都认为是离群点或异常值。
- 下四分位数:25%分位点所对应的值(Q1)
- 中位数:50%分位点对应的值(Q2)
- 上四分位数:75%分位点所对应的值(Q3)
- 上须:Q3+1.5(Q3-Q1)
- 下须:Q1-1.5(Q3-Q1)
其中Q3-Q1表示四分位,上四分位数与下四分位数的差距又称四分位距(interquartile range, IQR
)。
箱体包含 50%
的数据,因此,箱子的高度在一定程度上反映了数据的波动程度。
-
有时候,样本数据中存在特别大或者特别小的异常值,这种离群的表现,导致箱子整体被压缩,反而凸显出来这些异常。
-
有时候,样本数据特别少,因此箱体受单个数据的影响被放大了。
二、价值
箱形图最大的优点就是不受异常值的影响,能够准确稳定地描绘出数据的离散分布情况,同时也利于数据的清洗。
1.直观明了地识别数据中的异常值
箱线图判断异常值的标准以四分位数和四分位距为基础,四分位数具有一定的耐抗性,多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不会影响箱形图的数据形状,箱线图识别异常值的结果比较客观。由此可见,箱线图在识别异常值方面有一定的优越性。
2.利用箱线图判断数据的偏态和尾重
对于标准正态分布的样本,只有极少值为异常值。异常值越多说明尾部越重,自由度越小(即自由变动的量的个数)。
而偏态表示偏离程度,异常值集中在较小值一侧,则分布呈左偏态;异常值集中在较大值一侧,则分布呈右偏态。
3.利用箱线图比较数据的形状
同一数轴上,不同数据的箱线图并行排列,几批数据的中位数、尾长、异常值、分布区间等形状信息便昭然若揭。
4.其他局限性
但箱形图也有他的局限性。比如:
- 不能精确地衡量数据分布的偏态和尾重程度;
- 对于批量比较大的数据,反映的信息更加模糊以及用中位数代表总体评价水平有一定的局限性;
三、plt.boxplot详解
plt.boxplot(x, # 指定要绘制箱线图的数据
notch=None, # 是否是凹口的形式展现箱线图,默认非凹口;
sym=None, # 指定异常点的形状,默认为+号显示;
vert=None, # 是否需要将箱线图垂直摆放,默认垂直摆放;
whis=None, # 指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
positions=None, # 指定箱线图的位置,默认为[0,1,2…];
widths=None, #指定箱线图的宽度,默认为0.5;
patch_artist=None,# 是否填充箱体的颜色;
meanline=None, # 是否用线的形式表示均值,默认用点来表示;
showmeans=None, # 是否显示均值,默认不显示;
showcaps=None, # 是否显示箱线图顶端和末端的两条线,默认显示;
showbox=None, # 是否显示箱线图的箱体,默认显示;
showfliers=None, # 是否显示异常值,默认显示;
boxprops=None, # 设置箱体的属性,如边框色,填充色等;
labels=None, # 为箱线图添加标签,类似于图例的作用;
flierprops=None, # 设置异常值的属性,如异常点的形状、大小、填充色等;
medianprops=None, # 设置中位数的属性,如线的类型、粗细等;
meanprops=None, # 设置均值的属性,如点的大小、颜色等;
capprops=None, # 设置箱线图顶端和末端线条的属性,如颜色、粗细等;
whiskerprops=None # 设置须的属性,如颜色、粗细、线的类型等;
)
四、Python实操画图
1.简单例子
# 简单例子
import matplotlib.pyplot as plt
x = [1,2,3,5,6,8,9,15] # 数据
plt.boxplot(x) # 默认垂直显示
plt.boxplot(x, vert=False) # 水平显示
plt.show()
2.同时画多个
import matplotlib.pyplot as plt
x = [1,2,3,5,6,8,9,15] # 数据
y = [3,5,7,9,5,1,2]
z = [5,1,3,4,7]
plt.boxplot((x, y, z), labels=('x', 'y', 'z'))
plt.show()
3.数据框画图——Pandas自带
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame({
'a':range(10),
'b':range(12, 22),
'c':np.random.randint(1, 10, 10)
})
df.boxplot() # 按列画图
df.plot.box(title='Box Plot') # 也可以 设置标题
plt.show()
4.数据框换图——matplotlib
plt.boxplot(x=df.values, labels=df.columns, whis=1.5)
plt.show()
5.另外一个例子
import matplotlib.pyplot as plt
# 设置中文和负号正常显示
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
# 设置图形的显示风格
plt.style.use('ggplot')
# 绘图:daily_Ionset_r_c1_predicted的箱线图
# 数据
x = [1200, 1300, 1400, 500,1500, 1600, 1700, 1800, 1900, 2000, 2100,4000]
# 画图
plt.boxplot(x=x,
patch_artist=True, # 箱体颜色
showmeans=True, # 均值
boxprops = {'color':'black', 'facecolor':'#9999ff'}, # 设置箱体属性,填充色和边框色
flierprops = {'marker':'o','markerfacecolor':'red','color':'black'}, # 设置异常值属性,点的形状、填充色和边框色
meanprops = {'marker':'D','markerfacecolor':'indianred'}, # 设置均值点的属性,点的形状、填充色
medianprops = {'linestyle':'--','color':'orange'}) # 设置中位数线的属性,线的类型和颜色
# 设置y轴范围
plt.ylim(0, 5000)
# 保存
plt.savefig(r'./xxx.png', bbox_inches='tight') # 裁剪掉图表多余的空白区域
# 显示
plt.show()
参考链接:不会数学统计没关系——5分钟教你轻松掌握箱线图 | 图表家族#24
参考链接:数据清洗之异常值处理的常用方法
参考链接:5分钟包你搞懂箱形图分析!
参考链接:用python绘制箱线图
参考链接:箱线图(Python代码)