Box plot (箱形图) 中 quartile (四分位数)原理,及python_matplotlib中Q1和Q3定义的不同

本文详细介绍了Boxplot(箱形图)的组成,特别是四分位数Q1、Q2、Q3的定义,并探讨了在Python的matplotlib库中boxplot函数对四分位数的处理方式。内容包括不同数据点数量下的Q1和Q3计算方法,以及matplotlib与常见方法的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 +

### 使用Python计算统计数据并绘制箱线图 为了完成这些任务,可以使用`pandas`库中的功能以及`matplotlib`或`seaborn`来进行可视化。以下是详细的说明: #### 导入必要的库 ```python import pandas as pd import matplotlib.pyplot as plt from scipy import stats ``` #### 创建数据集 ```python data = [5, 9, 13, 15, 16, 17, 19, 21, 22, 22, 25, 26, 26, 29, 30, 32, 39, 52] df = pd.Series(data) ``` #### 计算基本统计量 - **均值**:可以通过调用`.mean()`方法获得整个序列的平均值。 - **中位数**:通过`.median()`获取位于排序数组中央位置的数值[^2]。 - **众数**:利用`scipy.stats.mode()`找到出现频率最高的数值。 ```python mean_value = df.mean() median_value = df.median() mode_result = stats.mode(df) print(f"Mean (Average): {mean_value}") print(f"Median: {median_value}") if mode_result.count[0] > 0: print(f"Mode(s): {mode_result.mode[0]} with frequency of {mode_result.count[0]}") else: print("No clear mode found.") ``` #### 估算四分位数 - 可以借助于`.quantile([q])`函数来求取不同比例下的分位数,其中参数`q`表示所需的百分比位置;例如,要得到Q1(第一四分位),则设置`q=0.25`;对于Q3,则设为`q=0.75`[^1]。 ```python quartiles = df.quantile([0.25, 0.75]) print(f"First Quartile Q1: {quartiles[0.25]}") print(f"Third Quartile Q3: {quartiles[0.75]}") ``` #### 绘制箱形图(Box Plot) 箱形图是一种用于显示一组数据分散情况资料的统计图,能够直观展示最小值、最大值、上下四分位数及异常点等信息。这里采用`matplotlib`库中的`boxplot()`函数实现绘图操作。 ```python plt.figure(figsize=(8, 6)) plt.boxplot(x=data, vert=False) # 设置水平方向上的箱型图 plt.title('Box plot') plt.xlabel('Value') plt.show() ``` 上述代码片段展示了如何有效地运用Python及其相关库执行数据分析工作流的一部分——从基础描述性统计到图形化表达的关键步骤。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值