Box plot (箱形图) 中 quartile (四分位数)原理,及python_matplotlib中Q1和Q3定义的不同
1. 首先介绍Boxplot(箱形图)的定义,这里参考:Understanding Boxplots,非常精彩的一篇介绍boxplot的博文。
该图片显示的即是一个boxplot的基本组成部分, 它由5个基本数值决定,即 最小值 (minimum); 下四分位数 (first quartile, Q1); 中值或中位数 (median), 或第二个四分位数 (second quartile, Q2); 上四分位数 (third quartile, Q3); 最大值 (maximum)。
其它定义:四分位间距 (interquartile range, IQR), 表示下四分位数Q1和上四分位数Q3的间距; 盒须 (wiskers), 上图中蓝色的延伸线,长度为1.5*IQR, 分为两段,分别是Q1延伸至minimum, Q3延伸至maximum; 离群值 (outliers), 上图中绿色的点,表示小于minimum的值和大于maximum的值。
这里需要注意,boxplot是用于显示数据分散情况的图,其中的minimum和maximum很可能不表示数据集中的最小、最大点,而是由Q1、Q3、IQR决定, 而不分布于[minimum, maximum]的点视为outlier.
2. 接下来介绍三个四分位数Q1、Q2和Q3的具体取值情况,这里部分参考:Wikipedia: Quartile 维基百科。
Q2,即median的取值比较简单,设n表示数据集中点的数目,a为该数据集的升序数组.
这里分为两种情况:
- n = 2 * i + 1, 即数据点个数为奇数 (odd number), median (Q2) = a[i]
- n = 2 * i, 即数据点个数为偶数 (even number), median (Q2) = a[i-1] * 0.5 + a[i] * 0.5
Q1和Q3的取值,根据Wikipedia: Quartile上的解释,还没有通用的取值。
上面介绍了3种主要的取值方法,需要先将点的数量n分为4种情况:
- n = 4 * i, 即数据点个数为偶数,将其平分后,每一份的个数仍是偶数;
- n = 4 * i + 2, 即数据点个数为偶数, 将其平分后,每一份的个数为奇数;
- n = 4 * i + 1, 即数据点个数为奇数,先将其去除中值Q2, 再平分后,每一份的个数为偶数;
- n = 4 * i +3, 即数据点个数为奇数,先将其去除中值Q2, 再平分后,每一份的个数为奇数。
3种方法对于Q1和Q3的具体取值为:
当n为偶数时,3种方法对于Q1和Q3的取值均相同,即先将a等分为下半 (lower half) 和上半 (upper half)(不去除用于计算中值的两个数),等分之后的数组再分别计算中值,Q1为下半的中值,Q3为上半的中值。
若 n = 4 * i, Q1 = a[i-1] * 0.5 + a[i] * 0.5; Q3 = a[3*i-1] * 0.5 + a[3*i] * 0.5
若 n = 4 * i + 2, Q1 = a[i]; Q3 = a[3*i+1]
3种方法对于Q1和Q3的取值不同体现在当n为奇数时:
Method 1:对其等分为下半和上半时,两个数组均不包含中间的那个中值,Q1为下半的中值,Q3为上半的中值:
若n = 4 * i + 1, Q1 = a[i-1] * 0.5 + a[i] * 0.5; Q3 = a[3*i] * 0.5 + a[3*i+1] * 0.5
若n = 4 * i + 3, Q1 = a[i]; Q3 = a[3*i+2]
Method 2: 对其等分为下半和上半时,两个数组均包含中间的那个中值,Q1为下半的中值,Q3为上半的中值:
若n = 4 * i + 1, Q1 = a[i]; Q3 = a[3*i]
若n = 4 * i + 3, Q1 = a[i] * 0.5 + a[i+1] * 0.5; Q3 = a[3*i+1] * 0.5 + a[3*i+2] * 0.5
Method 3: 对其等分为下半和上半时,两种情况下,一种两个数组均包含中间的那个均值,另一种两个数组均不包含中间的那个中值,使两个半数组中数值个数为偶数,Q1、Q3分别为下半和上半中间值的权值,不是中值。
若n = 4 * i + 1, 两个数组不包含中间那个中值,此时method 3和method 1相似,不过权值分别为0.25和0.75,不是0.5和0.5
Q1 = a[i-1] * 0.25 + a[i] * 0.75; Q3 = a[3*i] * 0.75 + a[3*i+1] * 0.25
若n = 4 * i +3, 两个数组包含中间的那个中值,此时method 3和method 2相似,不过权值分别为0.25和0.75, 不是0.5和0.5
Q1 = a[i] * 0.75 + a[i+1] * 0.25; Q3 = a[3*i+1] * 0.25 + a[3*i+2] * 0.75
示例:
示例1: n = 8 (2*4), a = [6, 7, 15, 36, 39, 40, 41, 42]
Method 1 | Method 2 | Method 3 | |
Q1 | 11 | 11 | 11 |
Q2 | 37.5 | 37.5 | 37.5 |
Q3 | 40.5 | 40.5 | 40.5 |
示例2: n = 10 (2*4+2), a = [6, 7, 15, 36, 39, 40, 41, 42, 43, 47]
Method 1 | Method 2 | Method 3 | |
Q1 | 15 | 15 | 15 |
Q2 | 39.5 | 39.5 | 39.5 |
Q3 | 42 | 42 | 42 |
示例3: n = 9 (2*4+1), a = [6, 7, 15, 36, 39, 40, 41, 42, 43]
Method 1 | Method 2 | Method 3 | |
Q1 | 11 | 15 | 13 |
Q2 | 39 | 39 | 39 |
Q3 | 41.5 | 41 | 41.25 |
示例4: n = 11 (2*4+3), a = [6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49]
Method 1 | Method 2 | Method 3 | |
Q1 | 15 | 25.5 | 9 |
Q2 | 40 | 40 | 40 |
Q3 | 43 | 42.5 | 42.75 |
3. Python 中matplotlib.pyplot中包含的boxplot()函数可直接用于画boxplot箱形图。
定义,及参数的官方文档参考:matplotlib.pyplot.boxplot
不过,如第二节介绍Q1、Q2和Q3取值时说明,目前对于Q1和Q3,没有通用的取值标准,这里我用实际的示例进行实验,发现其对于Q1和Q3的取值,和上述3种方法均不同。
假设定义如上,n表示数据点的数目,a表示升序数组:
若n = 4 * i, Q1 = a[i-1] * 0.25 + a[i] * 0.75; Q3 = a[3*i-1] * 0.75 + a[3*i] * 0.25
此时,Q1和Q3和3种Method的取的元素相同,但权值不是0.5和0.5。
示例:
import numpy as np
import matplotlib.pyplot as plt#A2 = [6, 7, 15, 36, 39, 40, 41, 42]
A2 = [1, 2, 3, 4, 5, 6, 7, 8]
#n = 8A2_sort = sorted(A2)plt.boxplot(A2, whis = 1.5000)median = np.median(A2)plt.plot([1, 2], [median, median], lw = 0.40)plt.plot([0, 1], [A2_sort[1] * 0.25 + A2_sort[2] * 0.75, A2_sort[1] * 0.25 + A2_sort[2] * 0.75], lw = 0.80, linestyle= ':')plt.plot([0, 1], [A2_sort[5] * 0.75 + A2_sort[6] * 0.25, A2_sort[5] * 0.75 + A2_sort[6] * 0.25], lw = 0.80, linestyle= ':')plt.plot([1, 2], [A2_sort[1] * 0.50 + A2_sort[2] * 0.50, A2_sort[1] * 0.50 + A2_sort[2] * 0.50], lw = 0.75, linestyle= '-')plt.plot([1, 2], [A2_sort[5] * 0.50 + A2_sort[6] * 0.50, A2_sort[5] * 0.50 + A2_sort[6] * 0.50], lw = 0.75, linestyle= '-')#plt.grid(True, linestyle = '--')#plt.savefig('anita.png', dpi = 600, bbox_inches = 'tight')plt.show()
运行结果:
明显,左边由自己实验验证的权值,即虚线求出的Q1和Q3和真正由boxplot()画出的Q1和Q3是吻合的 ,和上述3种方法的在n为偶数的相同情况,即右边实线画出的Q1和Q3和boxplot()画出的不同。
若 n = 4 * i + 2 , Q1 = a[i] * 0.75 + a[i+1] * 0.25; Q3 = a[3*i] * 0.25 + a[3*i+1] * 0.75
示例:
import numpy as np
import matplotlib.pyplot as pltA2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#n = 10A2_sort = sorted(A2)plt.boxplot(A2, whis = 1.5000)median = np.median(A2)plt.plot([1, 2], [median, median], lw = 0.40)plt.plot([0, 1], [A2_sort[2] * 0.75 + A2_sort[3] * 0.25, A2_sort[2] * 0.75 + A2_sort[3] * 0.25], lw = 0.80, linestyle= ':')plt.plot([0, 1], [A2_sort[6] * 0.25 + A2_sort[7] * 0.75, A2_sort[6] * 0.25 + A2_sort[7] * 0.75], lw = 0.80, linestyle= ':')plt.plot([1, 2], [A2_sort[2], A2_sort[2]], lw = 0.75, linestyle= '-')plt.plot([1, 2], [A2_sort[7], A2_sort[7]], lw = 0.75, linestyle= '-')#plt.grid(True, linestyle = '-.')#plt.savefig('Bob.png', dpi = 600, bbox_inches = 'tight')plt.show()
运行结果:
左边由虚线画出的线,即自己实验验证的权值,和boxplot()画出的Q1和Q3吻合;而右边,上述3种方法画出的实线,和实际结果有偏差。
若 n = 4 * i + 1, Q1 = a[i]; Q3 = a[3*i]
此时的Q1和Q3取值和Method 2相同。
示例:
import numpy as np
import matplotlib.pyplot as pltA2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
#n = 9A2_sort = sorted(A2)plt.boxplot(A2, whis = 1.5000)median = np.median(A2)plt.plot([1, 2], [median, median], lw = 0.40)plt.plot([0, 1], [A2_sort[2], A2_sort[2]], lw = 0.80, linestyle = ':')plt.plot([0, 1], [A2_sort[6], A2_sort[6]], lw = 0.80, linestyle = ':')plt.plot([1, 2], [A2_sort[1] * 0.50 + A2_sort[2] * 0.50, A2_sort[1] * 0.50 + A2_sort[2] * 0.50], lw = 0.75, linestyle= '-', color='r') #Method 1plt.plot([1, 2], [A2_sort[6] * 0.50 + A2_sort[7] * 0.50, A2_sort[6] * 0.50 + A2_sort[7] * 0.50], lw = 0.75, linestyle= '-', color = 'r')plt.plot([1, 2], [A2_sort[2], A2_sort[2]], lw = 0.75, linestyle= '-', color = 'k') #Method 2plt.plot([1, 2], [A2_sort[6], A2_sort[6]], lw = 0.75, linestyle= '-', color = 'k')plt.plot([1, 2], [A2_sort[1] * 0.25 + A2_sort[2] * 0.75, A2_sort[1] * 0.25 + A2_sort[2] * 0.75], lw = 0.75, linestyle= '-', color = 'b') #Method 3plt.plot([1, 2], [A2_sort[6] * 0.75 + A2_sort[7] * 0.25, A2_sort[6] * 0.75 + A2_sort[7] * 0.25], lw = 0.75, linestyle= '-', color = 'b')#plt.grid(True, linestyle = '--')#plt.savefig('claire.png', dpi = 600, bbox_inches = 'tight')plt.show()
运行结果:
右边画出的实线,红、黑蓝分别是Method 1、Method 2、Method 3画出的Q1和Q3的值;左边虚线是自己实验验证的结果, 由对比可知,黑色的实线以及虚线,和boxplot()画出的Q1和Q3吻合,此时Q1和Q3的取值是由Method 2决定的。
若 n = 4 * i +3, Q1 = a[i] * 0.5 + a[i+1] * 0.5; Q3 = a[3*i+1] * 0.5 + a[3*i+2] * 0.5
此时的Q1和Q3取值和Method 2相同。
示例:
import numpy as np
import matplotlib.pyplot as pltA2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
#n = 11A2_sort = sorted(A2)plt.boxplot(A2, whis = 1.5000)median = np.median(A2)plt.plot([1, 2], [median, median], lw = 0.40)plt.plot([0, 1], [A2_sort[2] * 0.50 + A2_sort[3] * 0.50, A2_sort[2] * 0.50 + A2_sort[3] * 0.50], lw = 0.80, linestyle= ':')plt.plot([0, 1], [A2_sort[7] * 0.50 + A2_sort[8] * 0.50, A2_sort[7] * 0.50 + A2_sort[8] * 0.50], lw = 0.80, linestyle= ':')plt.plot([1, 2], [A2_sort[2], A2_sort[2]], lw = 0.75, linestyle= '-', color = 'r') #Method 1plt.plot([1, 2], [A2_sort[8], A2_sort[8]], lw = 0.75, linestyle= '-', color = 'r')plt.plot([1, 2], [A2_sort[2] * 0.50 + A2_sort[3] * 0.50, A2_sort[2] * 0.50 + A2_sort[3] * 0.50], lw = 0.75, linestyle= '-', color='k') #Method 1plt.plot([1, 2], [A2_sort[7] * 0.50 + A2_sort[8] * 0.50, A2_sort[7] * 0.50 + A2_sort[8] * 0.50], lw = 0.75, linestyle= '-', color = 'k')plt.plot([1, 2], [A2_sort[2] * 0.75 + A2_sort[3] * 0.25, A2_sort[2] * 0.75 + A2_sort[3] * 0.25], lw = 0.75, linestyle= '-', color = 'b') #Method 3plt.plot([1, 2], [A2_sort[7] * 0.25 + A2_sort[8] * 0.75, A2_sort[7] * 0.25 + A2_sort[8] * 0.75], lw = 0.75, linestyle= '-', color = 'b')#plt.grid(True, linestyle = '--')#plt.savefig('david.png', dpi = 600, bbox_inches = 'tight')plt.show()
运行结果:
右边画出的实线,红、黑蓝分别是Method 1、Method 2、Method 3画出的Q1和Q3的值;左边虚线是自己实验验证的结果, 由对比可知,黑色的实线以及虚线,和boxplot()画出的Q1和Q3吻合,此时Q1和Q3的取值是由Method 2决定的。
4. 对matplotlib.pyplot中boxplot()总结:
n的数量 | Q1 | Q3 | 和3种Method关系 |
4 * i |
a[i-1] * 0.25 + a[i] * 0.75 |
a[3*i-1] * 0.75 + a[3*i] * 0.25 |
无,权值改变 |
4 * i + 2 |
a[i] * 0.75 + a[i+1] * 0.25 |
a[3*i] * 0.25 + a[3*i+1] * 0.75 |
无,权值改变 |
4* i +1 | a[i] | a[3*i] | Method 2 |
4 * i +3 |
a[i] * 0.5 + a[i+1] * 0.5 |
a[3*i+1] * 0.5 + a[3*i+2] * 0.5 |
Method 2 |
5. 示例:
这里用的示例是基于官方文档给出的Boxplot Demo
n = 100, 50个数为(0, 100)的随机分布,30个数为(0,50)的随机分布,10个数为(0, 200)的随机分布,10个数为(-100, 0)的随机分布,画出其箱形图。
# n较大的示例import numpy as np
import matplotlib.pyplot as plt
import timenp.random.seed(int(time.time()))spread = np.random.rand(50) * 100
center = np.random.rand(30) * 50
filter_high = np.random.rand(10) * 100 + 100
filter_low = np.random.rand(10) * 100 - 100data = np.concatenate((spread, center, filter_high, filter_low))fig1, ax1 = plt.subplots()
ax1.set_title('Box Plot Demo')plt.ylim(-101, 201)ax1.boxplot(data, showfliers = True, whis = 1.50000)####Verifing the data data_sort = sorted(data)Q1 = data_sort[24] * 0.25 + data_sort[25] * 0.75
Q3 = data_sort[74] * 0.75 + data_sort[75] * 0.25IQR = Q3 - Q1Minimum = Q1 - 1.50000 * IQR
Maximum = Q3 + 1.5000 * IQRmedian = np.median(data)outlier = np.array([data_sort[0], data_sort[-1]])for i in range(len(data)): # 求出minimum, 即大于等于Q1-1.5*IQR最小的数值;if(data_sort[i] >= Minimum ):minimum = data_sort[i]break
for i in range(len(data)): # 求出maximum, 即小于等于Q3+1.5*IQR最大的数值。if(data_sort[::-1][i] <= Maximum):maximum_num = imaximum = data_sort[::-1][i]breakplt.plot([0, 1], [median, median], lw = 0.50)plt.plot([0, 1], [Q1, Q1], lw = 0.80, linestyle = ':')
plt.plot([0, 1], [Q3, Q3], lw = 0.80, linestyle = ':')Q1_M = data_sort[24] * 0.50 + data_sort[25] * 0.50 # value adopted in 3 methods
Q3_M = data_sort[74] * 0.50 + data_sort[75] * 0.50
plt.plot([1, 2], [Q1_M, Q1_M], lw = 0.75, linestyle = '-')
plt.plot([1, 2], [Q3_M, Q3_M], lw = 0.75, linestyle = '-')plt.plot([0, 2], [minimum, minimum], lw = 0.50)
plt.plot([0, 2], [maximum, maximum], lw = 0.50)#plt.grid(True, linestyle = '-.')
#plt.savefig("plot_100.png", dpi = 600, bbox_inches = 'tight')plt.show()
一次的运行结果:
需要注意,由于这样的随机取值下,权值是(0.5, 0.5)(右实线)或(0.25, 0.75)(左虚线)相差不大, 但如果采用错误的权值,有可能造成求minimum和maximum错误。
Box plot (箱形图) 中 quartile (四分位数)原理,及python_matplotlib中Q1和Q3定义的不同相关推荐
- 中职 计算机原理 计算题,中职《计算机原理》测验2.doc
中职<计算机原理>测验2 计算机原理测验二 一.单项选择题 1.X的8位补码则X的16位补码是( ) A.0000000010110100B.1000000010110100C.11111 ...
- matlab箱形图_使用javascript可视化世界幸福来构建箱形图
matlab箱形图 Data visualization is an important and sometimes undervalued tool in a data scientist's to ...
- 箱形图box plot 和 小提琴图violin plot
一.箱形图box plot 1)箱型图概念 箱形图(Box-plot)又称为盒须图.盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图.因形状如箱子而得名. 箱形图于1977年由美国著名统计学 ...
- Python使用matplotlib可视化箱图、seaborn中的boxplot函数可视化分组箱图、在箱图中添加抖动数据点(Dot + Box Plot)
Python使用matplotlib可视化箱图.seaborn中的boxplot函数可视化分组箱图.在箱图中添加抖动数据点(Dot + Box Plot) 目录
- R语言ggplot2可视化:可视化箱图、在箱图中添加抖动数据点(Dot + Box Plot)、自定义抖动数据点的大小、颜色、数据点分布在箱图中间、添加主标题、副标题、题注信息
R语言ggplot2可视化:可视化箱图.在箱图中添加抖动数据点(Dot + Box Plot).自定义抖动数据点的大小.颜色.数据点分布在箱图中间.添加主标题.副标题.题注信息 目录
- seaborn箱图(box plot)可视化、并且在箱图中使用三角形标注均值的位置(showmeans=True)
seaborn箱图(box plot)可视化.并且在箱图中使用三角形标注均值的位置(showmeans=True) 目录
- seaborn箱图(box plot)可视化、并且使用matplotlib的meanprops函数在箱图中自定义均值标签、标签形状、标签大小、标签填充色彩、标签边缘颜色
seaborn箱图(box plot)可视化.并且使用matplotlib的meanprops函数在箱图中自定义均值标签.标签形状.标签大小.标签填充色彩.标签边缘颜色 目录
- excel箱形图中位数_在Excel中创建简单的箱形图
excel箱形图中位数 A box plot (box and whisker chart) lets you show how numbers are distributed in a set of ...
- ggplot2箱式图两两比较_ggplot2 - 箱线图(Box - plot)
简介 箱线图,顾明思义,是形状像箱子并展示一组或多组数据分布的统计图,被认为是一个优于柱形图的数据可视化方案,文章中指出了很多箱线图的优点. 在ggplot2 中做箱线图的图形变换是geom_boxp ...
- R语言可视化散点图(scatter plot)图、为图中的部分数据点添加标签、ggrepel包来帮忙
R语言可视化散点图(scatter plot)图.为图中的部分数据点添加标签.ggrepel包来帮忙 目录
最新文章
- ie6/IE8/IE9/谷歌以及火狐等浏览器下li 高度一致解决办法
- java 往文件写值,java文件读写
- Maven项目错误解决小结
- 29 SD配置-主数据-信用管理-分配订单类型的信贷控制
- LA 6047 Perfect Matching 字符串哈希
- 深度学习课程笔记(七):模仿学习(imitation learning)
- 把文档所有的字体都缩小一号_美观且专业的macOS字体管理工具
- 80X86寄存器详解
- 国内装备制造业为什么需要项目管理
- 独孤求败,未必就是王者:CloudStack和Eucalyptus已去,OpenStack赢了吗?
- educoder——面向对象程序设计java——实验实训——实验二 - 面向对象
- Orthogonal greedy algorithm降维
- Pale Blue Dot/暗淡蓝点------Carl Sagan/卡尔萨根
- Worthington核心酶——木瓜蛋白酶的特征及相关应用
- PS实用小技巧--修改图片上的文字
- 医咖会免费STATA教程学习笔记——单因素方差分析
- 怎样才能在网上卖东西,手把手教你闲鱼卖货!
- uni-app的发展和应用
- 安卓开发 java.lang.IllegalStateException 	isPlaying() 解决方案
- Paddle-NEAT——飞桨进化神经网络组件
热门文章
- 阿里资深架构师的学习之路
- Java内存模型中的happen-before是什么?
- POI excel单元格中内容换行
- PhotonServer简介(Yanlz+Unity+Photon+PUN+BOLT+UNet+KBEngine+立钻哥哥+CCU+MMO+WWW+==)
- 用序列到序列和注意模型实现的翻译:Translation with a Sequence to Sequence Network and Attention
- 两台路由器直连服务器需要怎么配置,设置串联两台无线路由器的方法步骤
- python使用神器_python 神器
- 蒋涛对话王成录:开发者的黄金十年
- 解除pdf文件打印限制
- Windows10 快捷键