一、定义
箱形图(英文:Box plot),又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。在各种领域也经常被使用,常见于品质管理,快速识别异常值。
- 箱形图最大的优点就是不受异常值的影响,能够准确稳定地描绘出数据的离散分布情况,同时也利于数据的清洗。
二、五大因“数”
我们一组序列数为例:12,15,17,19,20,23,25,28,30,33,34,35,36,37讲解这五大因“数”
1、下四分位数Q1
(1)确定四分位数的位置。Qi所在位置=(n+1)/4,其中i=1,2,3。n表示序列中包含的项数。
(2)根据位置,计算相应的四分位数。
例中:
Q1所在的位置=(14+1)/4=3.75,
Q1=0.25×第三项+0.75×第四项=0.25×17+0.75×19=18.5;
2、中位数(第二个四分位数)Q2
中位数,即一组数由小到大排列处于中间位置的数。若序列数为偶数个,该组的中位数为中间两个数的平均数。
例中:
Q2所在的位置=2(14+1)/4=7.5,
Q2=0.5×第七项+0.5×第八项=0.5×25+0.5×28=26.5
3、上四分位数Q3
计算方法同下四分位数。
例中:
Q3所在的位置=3(14+1)/4=11.25,
Q3=0.75×第十一项+0.25×第十二项=0.75×34+0.25×35=34.25。
4、上限
上限是非异常范围内的最大值。
四分位距IQR=Q3-Q1
上限=Q3+1.5IQR
5、下限
下限是非异常范围内的最小值。
下限=Q1-1.5IQR
其他情况说明:
计算四分位数首先要确定Q1、Q2、Q3的位置(n表示数字的总个数):
- Q1的位置=(n+1)/4
- Q2的位置=(n+1)/2
- Q3的位置=3(n+1)/4
对于数字个数为奇数的,其四分位数比较容易确定。例如,数字“5、47、48、15、42、41、7、39、45、40、35”共有11项,由小到大排列的结果为“5、7、15、35、39、40、41、42、45、47、48”,计算结果如下:
- Q1的位置=(11+1)/4=3,该位置的数字是15。
- Q2的位置=(11+1)/2=6,该位置的数字是40。
- Q3的位置=3(11+1)/4=9,该位置的数字是45。
而对于数字个数为偶数的,其四分位数确定起来稍微繁琐一点。例如,数字“8、17、38、39、42、44”共有6项,位置计算结果如下:
- Q1的位置=(6+1)/4=1.75
- Q2的位置=(6+1)/2=3.5
- Q3的位置=3(6+1)/4=5.25
这时的数字以数据连续为前提,由所确定位置的前后两个数字共同确定。例如,Q2的位置为3.5,则由第3个数字38和第4个数字39共同确定,计算方法是:38+(39-38)×3.5的小数部分,即38+1×0.5=38.5。该结果实际上是38和39的平均数。
同理,Q1、Q3的计算结果如下:
- Q1 = 8+(17-8)×0.75=14.75
- Q3 = 42+(44-42)×0.25=42.5
三、python代码
示例1
#首先导入基本的绘图包
import matplotlib.pyplot as plt
import numpy as np
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["python程序设计"]=[85,78,81,95,70,67,82,72,80,81,77]
#用matplotlib来画出箱型图
plt.boxplot(x=df.values,labels=df.columns,whis=1.5)
plt.show()
#用pandas自带的画图工具更快
df.boxplot()
plt.show()
示例2
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
# 防止乱码
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
x = np.array([12,15,17,19,20,23,25,28,30,33,34,35,36,37])
plt.boxplot(x)
plt.xticks([1],["箱线图"])
plt.ylabel("数值")
plt.title("普通箱线图")
plt.grid(axis="y",ls=":",lw=1,color="gray",alpha=0.4)
plt.show()