箱型图:
箱形图(Box plot),又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因图形如箱子,且在上下四分位数之外常有线条像胡须延伸出去而得名。
对于离散变量在数据分析和数据展示的时候使用条形图和饼图完成数据的可视化工作,那么对于数值型变量,也有很多可视化的方法,例如箱线图、直方图、折线图、面积图、散点图等等。箱线图一般用来展现数据的分布(如上下四分位值、中位数等),同时,也可以用箱线图来反映数据的异常情况。
箱型图主要包含六个数据节点,将一组数据从大到小排列,分别计算出上边缘,上四分位数Q3,中位数,下四分位数Q1,下边缘,还有异常值。
- 下边缘值:数据集中不包括任何异常值的最低数据点
- 下四分位数Q1:是数据集下半部分的中位数。
- 中位数media:数据集中的中间值
- 上四分位数Q3:数据集上半部分的中位数
- 上边缘: 数据集中不包括任何异常值的最高数据点
- 四分位距(IQR) :上下四分位数之间的距离
箱型图通常包括两个部分,一个箱和一组须线。箱从Q1到Q3绘制,中间画一条水平线表示中位数。边缘(晶须)可以以多种方式定义。
-
在最直接的方法中,下边缘(晶须)的边界是数据集的最小值,上边缘(晶须)的边界是数据集的最大值。
-
边缘(晶须)边界的另一个流行选择是基于 1.5IQR 值。从上四分位数(Q3)上方,测量出IQR的1.5倍的距离为上边缘;从下四分位数(Q1)下方,测量出IQR的1.5倍距离为下边缘
在matplotlib中对于箱型图的绘制采用1.5倍IQR的方式进行绘制,如下图所示
Q1-1.5IQR Q1 median Q3 Q3+1.5IQR
|-----:-----|
o |--------| : |--------| o o
|-----:-----|
异常值 <-----------> 异常值
IQR
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:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
-
positions:指定箱线图的位置,默认为[0,1,2…];
-
widths:指定箱线图的宽度,默认为0.5;
-
patch_artist:是否填充箱体的颜色;
-
meanline:是否用线的形式表示均值,默认用点来表示;
-
showmeans:是否显示均值,默认不显示;
-
showcaps:是否显示箱线图顶端和末端的两条线,默认显示;
-
showbox:是否显示箱线图的箱体,默认显示;
-
showfliers:是否显示异常值,默认显示;
-
boxprops:设置箱体的属性,如边框色,填充色等;
-
labels:为箱线图添加标签,类似于图例的作用;
-
filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
-
medianprops:设置中位数的属性,如线的类型、粗细等;
-
meanprops:设置均值的属性,如点的大小、颜色等;
-
capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;
-
whiskerprops:设置须的属性,如颜色、粗细、线的类型等;
boxplot的详细定义:
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.boxplot.html
示例说明:
通过产生一组随机数进行示例说明
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
"""
设置随机数生成器的种子,使每次生成的随机数相同方便后续的复现
"""
np.random.seed(19900108)
"""
生成随机数randomData,以及异常数据outlier_low,outlier_high
rand()返回的随机数是大于等于 0 及小于 1 的均匀分布随机实数
ones()返回为1的随机数
"""
randomData= np.random.rand(50) * 100
outlier_high = np.random.rand(10) * 100 + 100
outlier_low = np.random.rand(10) * -100
"""
数据拼接,将上面产生的三组随机数进行拼接
"""
data = np.concatenate((randomData,flier_high, flier_low))
fig,ax = plt.subplots(figsize=(10,10))
#创建箱型图
ax.boxplot(data)
plt.show()
运行结果:
扩展应用
多组数据
在实际的数据分析中需要进行多组数据的对比分析,在箱型图实例说明的基础上进一步说明多组数据箱型图的绘制
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
"""
font:设置中文
unicode_minus:显示负好
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
"""
设置随机数生成器的种子,使每次生成的随机数相同方便后续的复现
"""
np.random.seed(19900108)
"""
生成三组随机数进行多组数据的展示
numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量
"""
data_1 = np.random.normal(100, 10, 200)
data_2 = np.random.normal(70, 30, 200)
data_3 = np.random.normal(80, 20, 200)
data_to_plot=[data_1,data_2,data_3]
fig,ax = plt.subplots(figsize=(10,10))
#创建箱型图
ax.boxplot(data_to_plot)
plt.show()
运行结果:
水平显示
为了方便观察,在数据分析时常常需要将数据进行水平显示
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
"""
font:设置中文
unicode_minus:显示负好
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
"""
设置随机数生成器的种子,使每次生成的随机数相同方便后续的复现
"""
np.random.seed(19900108)
"""
生成三组随机数进行多组数据的展示
numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量
"""
data_1 = np.random.normal(100, 10, 200)
data_2 = np.random.normal(70, 30, 200)
data_3 = np.random.normal(80, 20, 200)
data_to_plot=[data_1,data_2,data_3]
fig,ax = plt.subplots(figsize=(10,10))
#创建箱型图
ax.boxplot(data_to_plot,vert=False)
plt.title("水平箱型图")
plt.show()
颜色填充
在进行填充色彩的时候需要将patch_artist(是否填充箱体的颜色)设置为true,对于颜色填充可以通过下面两种方式进行处理:
- 指定箱型图的填充颜色,通过props来设置各种填充的颜色(如red、green、blue、pink等构造字典数据结构)
https://matplotlib.org/stable/gallery/color/named_colors.html 参照各种颜色 - 设置各个属性 pmatplotlib.pyplot.setp
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
"""
设置随机数生成器的种子,使每次生成的随机数相同方便后续的复现
"""
np.random.seed(19900108)
"""
生成随机数data
numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量
"""
data = np.random.normal(70, 40, 1000)
fig,axes=plt.subplots(1,2,figsize=(16,9))
#方式一:通过设置props来填充各种颜色
"""
boxprops:设置箱体的属性,如边框色,填充色等;
filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;
medianprops:设置中位数的属性,如线的类型、粗细等;
meanprops:设置均值的属性,如点的大小、颜色等;
capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;
whiskerprops:设置须的属性,如颜色、粗细、线的类型等;
"""
axes[0].boxplot(data, patch_artist=True,
boxprops=dict(facecolor="green", color="red"),
capprops=dict(color="blue"),
whiskerprops=dict(color="teal"),
flierprops=dict(color="black", markeredgecolor="black"),
medianprops=dict(color="orange"),
meanprops=dict(color="brown"),
)
#方式二:设置各个属性
"""
通过setp函数设置各个属性
"""
box = axes[1].boxplot(data,patch_artist=True)
c={"boxes":"red","fliers":"black","medians":"orange","means":"brown","caps":"blue","whiskers":"teal"}
for item in ['boxes','fliers', 'medians','means', 'caps','whiskers',]:
plt.setp(box[item], color=c[item])
plt.setp(box["boxes"], facecolor="green")
plt.setp(box["fliers"], markeredgecolor="black")
plt.show()
运行结果:
如上如所示两种方式都可以完成对于箱型图中颜色的填充操作。
提琴图和箱型图
提琴图 (Violin Plot) 用于显示数据分布及其概率密度。这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。跟箱形图类似,但是在密度层面展示更好。
提琴图通过violinplot函数进行绘制,具体接口和官网介绍如下:
matplotlib.pyplot.violinplot(dataset, positions=None, vert=True, widths=0.5, showmeans=False, showextrema=True, showmedians=False, quantiles=None, points=100, bw_method=None, *, data=None)[source]
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.violinplot.html
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
"""
font:设置中文
unicode_minus:显示负号
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
"""
设置随机数生成器的种子,使每次生成的随机数相同方便后续的复现
"""
np.random.seed(19900108)
"""
生成随机数data
numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量
"""
data = np.random.normal(70, 40, 1000)
fig,axes=plt.subplots(1,2,figsize=(16,9))
#绘制箱型图
axes[0].boxplot(data)
axes[0].set_title("箱型图")
#绘制小提琴图
axes[1].violinplot(data,showmeans=True, showmedians=True)
axes[1].set_title("小提琴图")
plt.show()
运行结果:
总结:
在实际数据分析的过程中,箱型图带来的价值和意义
- 直观明了地识别数据批中的异常值。
数据中的异常值值得关注,不加剔除地把异常值包括进数据的计算分析过程中,对结果会带来不良影响;重视异常值的出现,分析其产生的原因,常常成为发现问题进而改进决策的契机。 - 对于多维度的数据对比和分析。
不同维度的数据箱形图并行排列,不同维度数据的中位数、尾长、异常值、分布区间等形状信息便一目了然。 - 判断数据批的偏态和尾重。
对比标准正态分布、不同自由度的t分布和非对称分布数据的箱形图的特征,可以发现:对于标准正态分布的大样本,只有 0.7%的值是异常值,中位数位于上下四分位数的中央,箱形图的方盒关于中位线对称。选取不同自由度的t分布的大样本,代表对称重尾分布,当t分布的自由度越小,尾部越重,就有越大的概率观察到异常值。
通过箱形图,可以查看有关数据的基本分布信息,例如中位数,平均值,四分位数,以及最大值和最小值,但不会显示数据在整个范围内的分布,因此可以通过提琴图可以进一步的了解数据的分布状态以及概率密度。在实际的数据分析中可以结合箱型图和提琴图进行数据的分析。