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 开发者掌握。
掌握它,你就不再只是“看数字”,而是能“听懂数据在说什么”。