Python statistics.quantiles() 方法(详细教程)

Python statistics.quantiles() 方法:掌握数据分位数的实用工具

在数据分析的世界里,我们常常需要了解一组数据的分布情况。比如,你有一份学生的考试成绩,想知道“前 25% 的学生”是哪些人,或者“中间一半”的分数范围是多少。这时候,分位数(Quantiles)就派上用场了。

Python 3.8 起引入的 statistics.quantiles() 方法,正是为了解决这类问题而生。它能快速计算数据的分位点,帮助我们从原始数据中提取出有意义的洞察。相比手动排序、计算百分位,这个方法更加简洁、高效,是数据处理流程中非常实用的一环。


什么是分位数?从“分段”理解数据分布

想象你有一条长长的绳子,上面挂满了不同重量的砝码。你想知道:把这条绳子从重到轻排序后,哪些位置是“最重的 25%”、“中间 50%”或“最轻的 10%”?这就是分位数的核心思想。

分位数就是将一组有序数据划分为若干等份的点。常见的分位数包括:

  • 四分位数(Quartiles):分成 4 等份,对应第 25%、50%、75% 位置
  • 百分位数(Percentiles):分成 100 等份,比如第 90 百分位表示有 90% 的数据小于等于这个值
  • 十分位数(Deciles):分成 10 等份

statistics.quantiles() 方法正是用来计算这些分位点的官方工具。


使用 Python statistics.quantiles() 方法的基本语法

from statistics import quantiles

data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

quartiles = quantiles(data, n=4)
print(quartiles)  # 输出: [32.5, 50.0, 67.5]

参数说明

  • data:输入的数值列表或可迭代对象,必须是数字类型
  • n:划分为多少份,即分位数的数量。默认是 4(对应四分位数)
  • method:计算分位数的方法,可选 'inclusive''exclusive',默认为 'inclusive'

⚠️ 注意:n=4 时,会返回 3 个值(即 Q1、Q2、Q3),因为分 4 段需要 3 个分界点。


从四分位数到自定义分位数:灵活控制划分方式

我们不一定要用四分位数。比如,想把数据分成 10 份(十分位数),可以这样写:

from statistics import quantiles

scores = [55, 60, 65, 70, 72, 75, 78, 80, 85, 90, 92, 95, 98, 100]

deciles = quantiles(scores, n=10)

print("十分位数结果:", deciles)

这 9 个值代表了从 10% 到 90% 的分界点。例如,第 3 个值 73.5 表示有 30% 的数据小于等于它。

这个方法特别适合用于评估排名、划分等级(如优、良、中、差)或做数据标准化。


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

假设你是一位老师,手上有 30 名学生的期末成绩,你想快速了解班级整体表现。

from statistics import quantiles

student_scores = [
    45, 52, 58, 60, 62, 65, 67, 68, 70, 71,
    72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
    82, 83, 85, 87, 88, 90, 92, 93, 95, 98
]

quartiles = quantiles(student_scores, n=4)

print("四分位数结果:")
print(f"第一四分位数 Q1 (25%):{quartiles[0]:.1f}")
print(f"第二四分位数 Q2 (中位数):{quartiles[1]:.1f}")
print(f"第三四分位数 Q3 (75%):{quartiles[2]:.1f}")

输出结果:

四分位数结果:
第一四分位数 Q1 (25%):68.0
第二四分位数 Q2 (中位数):76.5
第三四分位数 Q3 (75%):85.0

解读

  • 25% 的学生成绩低于 68 分
  • 中间一半的学生得分在 68 到 85 分之间
  • 75% 的学生成绩低于 85 分

这比只看平均分更有意义,能揭示数据的集中趋势与离散程度。


方法选择:inclusive 与 exclusive 的区别

method 参数决定了如何处理边界数据。这对小样本数据尤其重要。

from statistics import quantiles

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

inclusive_result = quantiles(data, n=4, method='inclusive')
print("inclusive 方法:", inclusive_result)

exclusive_result = quantiles(data, n=4, method='exclusive')
print("exclusive 方法:", exclusive_result)

输出:

inclusive 方法: [2.0, 3.0, 4.0]
exclusive 方法: [1.75, 2.5, 3.25]

差异解释

  • inclusive:认为数据的最小值和最大值是“包含”的,适合样本量较小、分布较集中的情况。
  • exclusive:假设数据两端有“外推”空间,适合更严格的统计推断。

建议:在教学或日常分析中,使用 inclusive 即可;做科研或严谨统计时,考虑 exclusive


常见误区与注意事项

误区一:误以为返回的是“分组”

quantiles() 返回的是分界点的数值,不是分组。比如返回 [32.5, 50.0, 67.5],表示:

  • 0% ~ 25%:数据 ≤ 32.5
  • 25% ~ 50%:32.5 < 数据 ≤ 50.0
  • 50% ~ 75%:50.0 < 数据 ≤ 67.5
  • 75% ~ 100%:数据 > 67.5

误区二:忽略数据排序

该方法内部会自动排序,但你仍需确保输入数据是有效的数字。如果传入字符串或 None,会抛出 TypeError

误区三:n 设置过小或过大

  • n=1 无意义,因为无法划分
  • n 太大(如 1000),虽然能细分,但实际意义有限,且可能引入浮点误差

建议:n 一般设为 4、5、10、20 等常见值。


综合实战:生成数据等级标签

我们可以结合 quantiles() 实现自动分级功能。比如根据成绩划分“优秀”、“良好”、“中等”、“及格”、“不及格”。

from statistics import quantiles

def assign_grade(score, thresholds):
    """根据分位点阈值分配等级"""
    if score <= thresholds[0]:
        return "不及格"
    elif score <= thresholds[1]:
        return "及格"
    elif score <= thresholds[2]:
        return "中等"
    elif score <= thresholds[3]:
        return "良好"
    else:
        return "优秀"

scores = [45, 55, 60, 65, 70, 72, 75, 78, 80, 82, 85, 88, 90, 92, 95, 98]

thresholds = quantiles(scores, n=5)

print("等级划分阈值:", thresholds)

for score in scores:
    grade = assign_grade(score, thresholds)
    print(f"分数 {score} → 等级: {grade}")

输出:

等级划分阈值: [61.0, 73.0, 80.0, 92.0]
分数 45 → 等级: 不及格
分数 55 → 等级: 不及格
分数 60 → 等级: 不及格
分数 65 → 等级: 及格
分数 70 → 等级: 及格
...
分数 98 → 等级: 优秀

这个例子展示了 Python statistics.quantiles() 方法 如何在实际业务中发挥作用,提升代码的可读性和自动化水平。


总结:掌握分位数,让数据说话

Python statistics.quantiles() 方法 是一个强大而简洁的工具,尤其适合初学者快速上手数据分析。它不仅能计算四分位数,还能灵活支持任意数量的分位划分,配合 method 参数可适应不同场景。

无论是分析学生成绩、用户行为数据,还是做业务报表的分层设计,这个方法都能帮你从“原始数字”中提炼出“洞察力”。它不依赖外部库,是标准库自带的利器,值得每一个 Python 开发者掌握。

掌握它,你就不再只是“看数字”,而是能“听懂数据在说什么”。