箱线图也称箱须图、箱形图、盒图,用于反映一组或多组连续型定量数据分布的中心位置和散布范围。箱形图包含数学统计量,不仅能够分析不同类别数据各层次水平差异,还能揭示数据间离散程度、异常值、分布差异等等。
1977年,美国著名数学家 John W. Tukey
首先在他的著作 《Exploratory Data Analysis》
中介绍了箱形图。
箱线图(Box Plot
)是通过数据集的四分位数形成的图形化描述,是一种非常简单,而且有效的可视化离群点的方法。
上下须为数据分布的边界,只要高于上须,或者是低于下须的数据点,都认为是离群点或异常值。
其中Q3-Q1表示四分位,上四分位数与下四分位数的差距又称四分位距(interquartile range, IQR
)。
箱体包含 50%
的数据,因此,箱子的高度在一定程度上反映了数据的波动程度。
有时候,样本数据中存在特别大或者特别小的异常值,这种离群的表现,导致箱子整体被压缩,反而凸显出来这些异常。
有时候,样本数据特别少,因此箱体受单个数据的影响被放大了。
箱形图最大的优点就是不受异常值的影响,能够准确稳定地描绘出数据的离散分布情况,同时也利于数据的清洗。
箱线图判断异常值的标准以四分位数和四分位距为基础,四分位数具有一定的耐抗性,多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不会影响箱形图的数据形状,箱线图识别异常值的结果比较客观。由此可见,箱线图在识别异常值方面有一定的优越性。
对于标准正态分布的样本,只有极少值为异常值。异常值越多说明尾部越重,自由度越小(即自由变动的量的个数)。
而偏态表示偏离程度,异常值集中在较小值一侧,则分布呈左偏态;异常值集中在较大值一侧,则分布呈右偏态。
同一数轴上,不同数据的箱线图并行排列,几批数据的中位数、尾长、异常值、分布区间等形状信息便昭然若揭。
但箱形图也有他的局限性。比如:
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 # 设置须的属性,如颜色、粗细、线的类型等; )
# 简单例子 import matplotlib.pyplot as plt x = [1,2,3,5,6,8,9,15] # 数据 plt.boxplot(x) # 默认垂直显示 plt.boxplot(x, vert=False) # 水平显示 plt.show()
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()
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()
plt.boxplot(x=df.values, labels=df.columns, whis=1.5) plt.show()
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代码)