Python入门:Python3 statistics模块全面学习教程

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 等)

进阶替代方案(按推荐顺序):

  1. pandas(最常用替代)→ 几乎覆盖所有场景 + 更强大
  2. numpy(数值计算更快)
  3. scipy.stats(统计检验、分布拟合)
  4. statsmodels(统计建模、回归分析)

一句话总结

初学 / 面试 / 小数据集 / 教学 → 用 statistics
真实数据分析 / 生产环境 → 直接上 pandas + numpy + scipy

五、快速自测清单(做完说明你基本掌握)

  1. mean([1,2,3,4])fmean([1,2,3,4]) 结果一样吗?
  2. median([1,2,3,4,5])median([1,2,3,4]) 分别返回什么?
  3. mode()multimode() 的区别?
  4. 如何求样本标准差而不是总体标准差?
  5. quantiles(data, n=4) 返回几个值?
  6. correlation() 返回什么范围的值?
  7. 如何处理列表中带有 nan 的均值计算?

把上面几个函数都敲一遍,基本就过关了。

有哪部分还想深入(比如结合 pandas 对比、面试题解析、处理真实数据集案例)?
直接告诉我,我继续给你展开代码和讲解。

文章已创建 4026

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部