Python3 statistics 模块全面学习教程
(适合 Python 入门到中阶,2025–2026 最新实用指南)
statistics 是 Python 标准库中专门用于描述性统计的模块,从 Python 3.4 开始引入,3.10+ 版本又增加了不少实用功能。
它最大的特点是:简单、纯 Python 实现、无需安装第三方包,非常适合初学者快速上手统计计算,同时也足够用于教学、数据分析原型、考试刷题等场景。
一、statistics 模块核心功能一览表(2025 视角)
| 类别 | 主要函数 | Python 版本引入 | 是否支持 NaN 处理 | 主要用途 / 典型场景 |
|---|---|---|---|---|
| 平均值类 | mean() / fmean() / median() / mode() | 3.4 / 3.8 / 3.4 | 部分支持 | 算术平均、中位数、众数 |
| 离散程度 | pvariance() / pstdev() / variance() / stdev() | 3.4 | 部分支持 | 总体/样本方差、标准差 |
| 相关性 | covariance() / correlation() | 3.10 | 是 | 协方差、皮尔逊相关系数 |
| 其他位置统计量 | quantiles() / median_low() / median_high() | 3.4 | — | 分位数、中位数两种取值方式 |
| 加权统计 | —(无内置,需自己实现或用 numpy) | — | — | 加权平均(常见面试题) |
| 数据分组统计 | —(需配合 itertools.groupby 或 pandas) | — | — | 分组求均值、中位数等 |
最常用函数速记口诀(前五个最重要):
mean → 中位 → 众数 → 方差 → 标准差
fmean(快浮点均值)→ median_low/high(有序数据边界处理)→ quantiles(分位数)
二、核心函数逐一详解 + 代码示例
1. 基本统计量(最常用)
from statistics import mean, median, mode, multimode, pvariance, pstdev
data = [1, 2, 2, 3, 3, 3, 4, 7, 8, 9, 10]
print(mean(data)) # 4.727272...
print(median(data)) # 3(中间值)
print(mode(data)) # 3(出现最多次的唯一值)
print(multimode(data)) # [3](3.8+,返回列表,支持多众数)
# 总体方差 / 总体标准差(n 分母)
print(pvariance(data)) # 8.834710743801654
print(pstdev(data)) # ≈2.972
# 样本方差 / 样本标准差(n-1 分母) ← 更常用
from statistics import variance, stdev
print(variance(data)) # 9.718181...
print(stdev(data)) # ≈3.117
2. 浮点精度更高的均值(3.8+ 强烈推荐)
from statistics import fmean, fsum
data_float = [0.1] * 10
print(mean(data_float)) # 0.09999999999999999(经典浮点误差)
print(fmean(data_float)) # 0.1(使用更精确的算法)
3. 分位数(quantiles)——非常实用
from statistics import quantiles
scores = list(range(101)) # 0~100 分
# 四分位数(默认 method='inclusive')
print(quantiles(scores, n=4)) # [25.0, 50.0, 75.0]
# 十分位数
print(quantiles(scores, n=10)) # [10.0, 20.0, ..., 90.0]
# 更细粒度控制(3.10+ 支持更多 method)
print(quantiles(scores, n=4, method='inclusive'))
print(quantiles(scores, n=4, method='exclusive'))
4. 协方差与相关系数(3.10+ 新增,面试高频)
from statistics import covariance, correlation
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10] # 完美正相关
print(covariance(x, y)) # 5.0
print(correlation(x, y)) # 1.0(皮尔逊相关系数)
z = [5, 4, 3, 2, 1] # 完美负相关
print(correlation(x, z)) # -1.0
5. 处理缺失值 / NaN(3.11+ 增强)
from statistics import mean
from math import nan
data_with_nan = [1, 2, 3, nan, 5]
print(mean(data_with_nan)) # nan(默认传播 NaN)
# 手动过滤(最常用做法)
clean_data = [x for x in data_with_nan if not isinstance(x, float) or not isnan(x)]
print(mean(clean_data)) # 2.75
三、常见使用场景 & 代码模板(直接复制改)
场景1:快速统计一组考试成绩
from statistics import mean, median, stdev, quantiles
scores = [78, 85, 92, 65, 88, 91, 73, 84, 95, 67]
print(f"平均分: {mean(scores):.1f}")
print(f"中位数: {median(scores)}")
print(f"标准差: {stdev(scores):.2f}")
print(f"四分位数: {quantiles(scores, n=4)}")
场景2:分组统计(配合 itertools.groupby)
from statistics import mean
from itertools import groupby
from operator import itemgetter
data = [
("小明", "数学", 92),
("小明", "英语", 88),
("小红", "数学", 95),
("小红", "英语", 90),
]
# 按姓名分组求平均分
grouped = groupby(sorted(data, key=itemgetter(0)), key=itemgetter(0))
for name, group in grouped:
scores = [score for _, _, score in group]
print(f"{name} 平均分:{mean(scores):.1f}")
场景3:简单异常值检测(IQR 法)
def detect_outliers_iqr(data):
q1, q2, q3 = quantiles(data, n=4)
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
return [x for x in data if x < lower or x > upper]
scores = [60, 65, 70, 75, 80, 85, 90, 95, 100, 200] # 200 是异常值
print("异常值:", detect_outliers_iqr(scores)) # [200]
四、statistics 模块的局限性 & 进阶建议
局限性(必须知道):
- 不支持加权统计(weighted mean)
- 不支持缺失值自动忽略(需手动处理)
- 不支持多维数据 / 矩阵运算
- 没有高级统计检验(t-test、ANOVA 等)
进阶替代方案(按推荐顺序):
- pandas(最常用替代)→ 几乎覆盖所有场景 + 更强大
- numpy(数值计算更快)
- scipy.stats(统计检验、分布拟合)
- statsmodels(统计建模、回归分析)
一句话总结:
初学 / 面试 / 小数据集 / 教学 → 用
statistics
真实数据分析 / 生产环境 → 直接上pandas+numpy+scipy
五、快速自测清单(做完说明你基本掌握)
mean([1,2,3,4])和fmean([1,2,3,4])结果一样吗?median([1,2,3,4,5])和median([1,2,3,4])分别返回什么?mode()和multimode()的区别?- 如何求样本标准差而不是总体标准差?
quantiles(data, n=4)返回几个值?correlation()返回什么范围的值?- 如何处理列表中带有
nan的均值计算?
把上面几个函数都敲一遍,基本就过关了。
有哪部分还想深入(比如结合 pandas 对比、面试题解析、处理真实数据集案例)?
直接告诉我,我继续给你展开代码和讲解。