箱形图简介
箱形图(英文:Boxplot),又是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。箱形图于1977年由美国著名统计学家约翰·图基(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。
四分位数
四分位数(Quartile)是统计学中分位数的一种,即把所有数值由小到大分成四等份,处于三个分割点位置的数值就是四分位数。
- 第一四分位数($Q_1$):也称下四分位数(Lower Quartile),等于该样本中所有数值由小到大排列后第25%的数字。
- 第二四分位数($Q_2$):也称中位数(Middle Quartile or Median),等于该样本中所有数值由小到大排列后第50%的数字。
- 第三四分位数($Q_3$):也称上四分位数(Upper Quartile),等于该样本中所有数值由小到大排列后第75%的数字。
$Q_3$和$Q_1$的差距称为四分位距(Inter Quartile Range,IQR):
$${\Delta}Q=Q_3-Q_1$$
上界/下界
上界/下界,英文名为Upper Whisker和Lower Whisker,有时又被称为最大值和最小值,但是这样容易引起误解,因为它们并非数据集里面的最大值或最小值,而是去除所有离群值和极端值之后的最小值和最大值。它们定义和计算方式如下:
$$\text{Lower Whisker}=Q_1-1.5{\Delta}Q$$
$$\text{Upper Whisker}=Q_3+1.5{\Delta}Q$$
离群值与极端值
离群值(mild outlier)和极端值(extreme outlier)有时统称为离群值或异常值(outlier)。再理解离群值和极端值之前我们先要理解内限和外限:
- 内限:$Q_1-1.5{\Delta}Q$和$Q_3+1.5{\Delta}Q$
- 外限:$Q_1-3{\Delta}Q$和$Q_3+3{\Delta}Q$
处于内限以外位置的点表示的数据都是异常值,其中在内限与外限之间的异常值为温和的异常值mild outliers,在外限以外的为极端的异常值extreme outliers。
箱形图的Python实现
matplotlib.pyplot.boxplot()
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=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, manage_ticks=True, autorange=False, zorder=None, *, data=None)
参数说明:
- x:数组或者向量序列,指定要绘制箱线图的数据
- notch:是否是凹口箱线图,默认为否。凹口表示中值附近的置信区间
- sym:指定异常点的形状,默认是+号显示
- vert:是否需要将箱线图垂直摆放,默认垂直摆放
- whis:指定上下须跟上下四分位的距离,默认是5倍四分位差
- positions:指定箱线图的位置,默认为[0,1,2…]
- widths:设置每个框的宽度,标量或者序列,默认5
- patch_artist:默认是用二维线性绘制(Line2D artist)
- bootstrap:是否为凹口位置的中位数设置置信区间
- usermedians:设置每个元素的中位数,默认由matplotlib计算
- conf_intervals:置信区间
- meanline:是否用线的形式表示均值,默认用点来表示
- showmeans:是否显示均值,默认不显示
- showcaps:是否显示箱线图顶端和末端的两条线,默认显示
- showbox:是否显示箱线图的箱体,默认显示
- showfliers:是否显示异常值,默认显示
- boxprops:设置箱体的属性,如边框色,填充色等
- labels:为箱线图添加标签,类似于图例的作用
- filerprops:设置异常值的属性,如异常点的形状、大小、填充色等
- medianprops:设置中位数的属性,如线的类型、粗细等
- meanprops:设置均值的属性,如点的大小、颜色等
- capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等
- whiskerprops:设置须的属性,如颜色、粗细、线的类型等
- manage_ticks:调整tick的位置,默认True
- autorange:是否用线的形式来表示均值,默认是点
- zorder:设置箱线图的zorder
参考链接:matplotlib.pyplot.boxplot.html#matplotlib.pyplot.boxplot
代码示例:
import matplotlib.pyplot as plt import pandas as pd #添加成绩表 plt.style.use("ggplot") plt.rcParams['axes.unicode_minus'] = False plt.rcParams['font.sans-serif'] = ['SimHei'] #新建一个空的DataFrame df = pd.DataFrame() df["英语"] = [76,90,97,71,70,93,86,83,78,85,81] df["经济数学"] = [65,95,51,74,78,63,91,82,75,71,55] df["西方经济学"] = [93,81,76,88,66,79,83,92,78,86,78] df["计算机应用基础"] = [85,78,81,95,70,67,82,72,80,81,77] plt.boxplot(x=df.values, labels=df.columns, whis=1.5) plt.show()
pandas.DataFrame.boxplot()
DataFrame.boxplot(column=None, by=None, ax=None, fontsize=None, rot=0, grid=True, figsize=None, layout=None, return_type=None, **kwds)
参数说明:
- column:默认为None,输入为str或由str构成的list,其作用是指定要进行箱型图分析的列
- by:默认为 None,str or array-like,其作用为 pandas 的 groupby,通过指定 by=‘columns’,可进行多组合箱型图分析
- ax:matplotlib.axes.Axes 的对象,没有太大作用
- fontsize:箱型图坐标轴字体大小
- rot:箱型图坐标轴旋转角度
- grid:箱型图网格线是否显示
- figsize:箱型图窗口尺寸大小
- layout:必须配合 by 一起使用,类似于 subplot 的画布分区域功能
- return_type:指定返回对象的类型,默认为 None, 可输入的参数为‘axes’, ‘dict’, ‘both’,当与 by 一起使用是,返回的对象为 Series 或 array (for return_type=None)
- **kwds:All other plotting keyword arguments to be passed to matplotlib.pyplot.boxplot().
使用示例:
import matplotlib.pyplot as plt import pandas as pd # 添加成绩表 plt.style.use("ggplot") plt.rcParams['axes.unicode_minus'] = False plt.rcParams['font.sans-serif'] = ['SimHei'] # 新建一个空的 DataFrame df = pd.DataFrame() df["英语"] = [76, 90, 97, 71, 70, 93, 86, 83, 78, 85, 81] df["经济数学"] = [65, 95, 51, 74, 78, 63, 91, 82, 75, 71, 55] df["西方经济学"] = [93, 81, 76, 88, 66, 79, 83, 92, 78, 86, 78] df["计算机应用基础"] = [85, 78, 81, 95, 70, 67, 82, 72, 80, 81, 77] df.boxplot() plt.show()
seaborn.boxplot()
seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, ax=None, **kwargs)
参数说明:
- x:指定 x 轴的分类名称
- y:指定 y 轴的分类名称
- hue:指定第二次分类的数据类别(用颜色区分)
- data:数组或数组列表
- order:显式指定指定第二次分类顺序
- hue_order:显式指定分类顺序
- orient:设置图的绘制方向(垂直或水平),v 或者 h
- color:matplotlib 颜色
- palette:调色板名称,list 类别或者字典,用于对数据不同分类进行颜色区别
- saturation:控制用于绘制颜色的原始饱和度的比例。通常大幅填充在轻微不饱和的颜色下看起来更好,如果您希望绘图颜色与输入颜色规格完美匹配可将其设置为 1。
- width:不使用色调嵌套时完整元素的宽度,或主要分组变量一个级别的所有元素的宽度。
- dodge:若设置为 True 则沿着分类轴,将数据分离出来成为不同色调级别的条带,否则,每个级别的点将相互叠加
- fliersize:用于表示异常值观察的标记的大小。
- linewidth:设置构图元素的线宽度
- whis:控制在超过高低四分位数时 IQR 的比例,因此需要延长绘制的触须线段。超出此范围的点将被识别为异常值。
- ax:matplotlib 轴,可选
- **kwargs:pyplot.boxplot() 中的其他参数
参考链接:seaborn.boxplot
使用示例:
import matplotlib.pyplot as plt import pandas as pd import seaborn as sns # 添加成绩表 plt.style.use("ggplot") plt.rcParams['axes.unicode_minus'] = False plt.rcParams['font.sans-serif'] = ['SimHei'] # 新建一个空的 DataFrame df = pd.DataFrame() df["英语"] = [76, 90, 97, 71, 70, 93, 86, 83, 78, 85, 81] df["经济数学"] = [65, 95, 51, 74, 78, 63, 91, 82, 75, 71, 55] df["西方经济学"] = [93, 81, 76, 88, 66, 79, 83, 92, 78, 86, 78] df["计算机应用基础"] = [85, 78, 81, 95, 70, 67, 82, 72, 80, 81, 77] sns.boxplot(data=df) plt.show()