Python statistics.quantiles() 方法(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言:统计学在编程中的重要性

在数据分析和编程领域,统计学方法是处理数据的核心工具之一。无论是计算平均值、方差,还是分析数据分布特征,统计方法都能帮助开发者快速提取数据中的关键信息。Python 的 statistics 模块提供了丰富的统计函数,其中 statistics.quantiles() 方法是用于计算分位数的便捷工具。

分位数在数据科学中扮演着重要角色,例如四分位数可以划分数据集的分布范围,帮助识别异常值或数据集中值的集中趋势。对于编程初学者和中级开发者而言,掌握 quantiles() 方法不仅能提升数据处理效率,还能为更复杂的统计分析打下基础。

本文将通过循序渐进的方式,从基础概念到实际案例,深入讲解 statistics.quantiles() 方法的使用场景、参数配置以及注意事项。


基础概念:什么是分位数?

分位数(Quantiles)是将一组数据按顺序划分为等概率的连续区间所对应的数值点。常见的分位数包括:

  • 四分位数(Quartiles):将数据分为4个等份,对应3个分位点(Q1, Q2, Q3)。
  • 五分位数(Quintiles):分为5个等份,对应4个分位点。
  • 百分位数(Percentiles):分为100个等份,对应99个分位点。

例如,假设有一个学生的数学成绩分布,计算四分位数可以帮助我们快速判断:

  • Q1(25%分位数):25%的学生得分低于或等于该值。
  • Q2(50%分位数,即中位数):50%的学生得分低于或等于该值。
  • Q3(75%分位数):75%的学生得分低于或等于该值。

方法详解:statistics.quantiles() 的基础用法

函数语法与参数

statistics.quantiles() 方法的语法如下:

statistics.quantiles(data, n=4, method='exclusive')  

参数说明

  1. data:要计算分位数的可迭代数据集(如列表、元组等)。
  2. n:将数据划分为多少个等份(默认为4,即计算四分位数)。
  3. method:分位数的计算方法,支持 'exclusive''inclusive'(默认为 'exclusive')。

示例:计算四分位数

import statistics  

scores = [58, 62, 65, 68, 70, 72, 75, 80, 85, 90]  

quartiles = statistics.quantiles(scores)  

print("四分位数:", quartiles)  

结果解释

  • 四分位数返回两个值,对应 Q1(68.0)和 Q3(72.0)。
  • 中位数(Q2)未被包含在返回结果中,但可以通过 statistics.median() 单独计算。

参数深度解析:nmethod 的选择

参数 n:划分数据的等份数

n 参数决定了数据被划分为多少个等份,返回的分位点数量为 n-1。例如:

  • n=5,返回 4个分位数(五分位数)。
  • n=100,返回 99个分位数(百分位数)。
quintiles = statistics.quantiles(scores, n=5)  
print("五分位数:", quintiles)  

参数 method:分位数的计算方式

method 参数决定了分位数的计算逻辑,具体分为两种模式:

模式 1:method='exclusive'(默认)

  • 数据排序后,两端的极值(最小值和最大值)不包含在计算范围内。
  • 适用场景:当数据被视为来自连续分布时,避免因数据边界值导致结果偏差。

模式 2:method='inclusive'

  • 数据排序后,两端的极值被包含在计算范围内。
  • 适用场景:当数据是有限且完整的集合时,确保所有值参与计算。

对比示例

data = [1, 2, 3, 4, 5]  

print("exclusive:", statistics.quantiles(data))  # 输出:[2.0, 4.0]  

print("inclusive:", statistics.quantiles(data, method='inclusive'))  

差异分析

  • exclusive 模式将数据视为 2, 3, 4(排除两端),因此 Q1=2.0,Q3=4.0。
  • inclusive 模式包含所有数据点,因此 Q1 和 Q3 是中间值的平均。

实战案例:分析学生成绩分布

案例背景

假设某班级有以下数学成绩数据:

math_scores = [55, 60, 65, 70, 75, 80, 85, 90, 95, 100]  

步骤 1:计算四分位数

quartiles = statistics.quantiles(math_scores)  
print("四分位数:", quartiles)  # 输出:[70.0, 85.0]  

分析

  • Q1(25%分位数):70.0 表示25%的学生得分≤70分。
  • Q3(75%分位数):85.0 表示75%的学生得分≤85分。

步骤 2:计算百分位数

percentiles = statistics.quantiles(math_scores, n=100)  
print("第90百分位数:", percentiles[89])  # 输出:95.0  

分析

  • 第90百分位数为95.0,意味着90%的学生得分≤95分。

对比其他方法:为何选择 quantiles()

numpy.quantile() 的对比

numpy 库的 quantile() 函数也用于计算分位数,但两者在以下方面存在差异:

特性statistics.quantiles()numpy.quantile()
依赖库Python 标准库需要安装 numpy
数据类型支持列表、元组等简单数据结构支持多维数组和复杂数据结构
分位数返回方式直接返回 n-1 个分位数需手动指定分位数位置(如 0.25)
计算速度较慢(适合小规模数据集)快速(适合大规模数据集)

使用场景建议

  • 若需简单、轻量级的分位数计算,优先使用 statistics.quantiles()
  • 处理大规模或复杂数据时,可结合 numpy 的高性能方法。

注意事项与常见问题

问题 1:数据未排序的后果

quantiles() 方法会自动对数据排序,但需注意:

unsorted_data = [5, 3, 8, 1, 9]  
print(statistics.quantiles(unsorted_data))  # 输出:[3.0, 8.0]  

结论:输入数据无需预先排序,但若数据本身已排序,结果更易被验证。

问题 2:数据长度不足的处理

当数据长度不足以划分 n 份时,quantiles() 会返回 统计错误(StatisticsError)。例如:

short_data = [1, 2]  
try:  
    print(statistics.quantiles(short_data, n=3))  # 需至少3个数据点  
except Exception as e:  
    print(e)  

解决方法:确保数据长度足够,或调整 n 的值。

问题 3:method 参数的选择

  • 若数据包含明确的边界值(如传感器测量值),推荐 method='inclusive'
  • 若数据是样本的一部分,可能代表更大群体,选择 method='exclusive' 更合理。

进阶技巧:结合其他统计方法

技巧 1:计算四分位距(IQR)

四分位距(IQR)是 Q3 - Q1,用于衡量数据离散程度:

q1, q3 = statistics.quantiles(math_scores)  
iqr = q3 - q1  
print("IQR:", iqr)  # 输出:IQR: 15.0  

技巧 2:检测异常值

通过 IQR 可识别异常值:

lower_bound = q1 - 1.5 * iqr  
upper_bound = q3 + 1.5 * iqr  
outliers = [x for x in math_scores if x < lower_bound or x > upper_bound]  
print("异常值:", outliers)  # 输出:异常值: [55]  

结论与展望

通过本文的学习,开发者可以掌握 statistics.quantiles() 方法的核心功能与应用场景。该方法简化了分位数的计算流程,尤其适合需要快速分析小规模数据集的场景。

在实际开发中,分位数不仅是数据可视化(如箱线图)的基础,还能帮助优化算法性能(如排序算法的中间值选择)。随着数据量的增长,开发者可以进一步结合 numpypandas 库,探索更复杂的统计分析方法。

掌握 Python statistics.quantiles() 方法,不仅是对统计学工具的补充,更是提升数据处理能力的重要一步。希望本文能为你的编程旅程提供清晰的指引!

最新发布