news 2026/8/27 18:47:10

Python进阶教程:17_statistics 模块 —— 新手完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python进阶教程:17_statistics 模块 —— 新手完全指南

statistics是 Python 3.4 版本开始加入的内置标准库,专门用来做基础的统计计算,不需要额外安装,导入就能用。它封装了我们日常最常用的统计量(均值、中位数、众数、方差、标准差等),不用自己写循环、写公式计算,一行代码就能得到准确结果,非常适合新手处理简单的数据分析场景。

本文会按「集中趋势 → 离散程度」的逻辑逐个讲解每个函数,每个函数都配可运行示例 + 逐行解释 + 新手避坑指南,零基础也能完全吃透。


一、模块基础说明

1. 模块定位

  • 内置模块:Python 安装完就有,不需要pip install
  • 适用场景:简单的基础统计计算,处理小规模数值数据
  • 优势:代码简洁、结果准确、不用自己实现统计公式

2. 导入方式

# 方式1:导入整个模块(推荐新手用,不容易混淆函数来源) import statistics # 方式2:单独导入需要的函数 from statistics import mean, stdev, median

3. 前置约定

所有统计函数的输入,基本都是「数值型可迭代对象」,比如整数 / 浮点数组成的列表、元组。 ⚠️ 新手坑:不能传入空列表、不能传入字符串 / None 等非数值类型,否则会直接报错。


二、第一类:集中趋势指标(描述数据的中心水平)

集中趋势就是找一组数据的「代表值 / 中心值」,比如我们常说的平均分、中间分、出现最多的分数,都属于这类指标。

1. mean ():算术平均数

功能

计算一组数据的算术平均值,也就是我们最常用的「总和 ÷ 个数」,是最基础、最常用的平均指标。

语法
statistics.mean(数值序列)
示例:计算班级考试平均分
import statistics # 班级8名同学的数学成绩 scores = [85, 92, 78, 90, 88, 76, 95, 82] # 计算算术平均分 avg = statistics.mean(scores) print(f"班级数学平均分:{avg}")

运行结果:

plaintext

班级数学平均分:85.75
代码解释
  1. 先定义成绩列表scores,一共 8 个数值
  2. statistics.mean(scores)自动计算:(85+92+78+90+88+76+95+82) ÷ 8 = 686 ÷ 8 = 85.75
  3. 结果是浮点数类型,哪怕刚好整除也会返回 float
注意事项
  • 序列不能为空,否则报错StatisticsError: mean requires at least one data point
  • 只能放数值(int/float),放字符串会报类型错误
  • 容易受极端值影响:比如加一个 0 分,平均分被大幅拉低

2. median ():中位数

功能

把数据从小到大排序后,位于正中间位置的数值。如果数据个数是偶数,取中间两个数的平均值。 中位数的优势是不受极端值影响,适合数据里有异常大 / 异常小值的场景。

语法
statistics.median(数值序列)
示例 1:奇数个数据
import statistics # 9个同学的成绩(奇数个) scores = [76, 78, 82, 85, 88, 90, 92, 95, 100] mid = statistics.median(scores) print(f"成绩中位数:{mid}")

运行结果:

成绩中位数:88

解释:9 个数排序后,第 5 个位置的数就是中位数,也就是 88。

示例 2:偶数个数据
import statistics # 8个同学的成绩(偶数个) scores = [76, 78, 82, 85, 88, 90, 92, 95] mid = statistics.median(scores) print(f"成绩中位数:{mid}")

运行结果:

成绩中位数:86.5

解释:8 个数排序后,中间是第 4 个和第 5 个,取两者的平均值:(85+88) ÷ 2 = 86.5

拓展:低中位数、高中位数

还有两个衍生函数,适合需要取整数的场景:

  • median_low():偶数个时取中间偏小的那个数
  • median_high():偶数个时取中间偏大的那个数
scores = [76, 78, 82, 85, 88, 90, 92, 95] print(statistics.median_low(scores)) # 85 print(statistics.median_high(scores)) # 88

3. mode ():众数

功能

一组数据中出现次数最多的数值,用来反映最普遍的情况。

语法
statistics.mode(数值序列)
示例:统计出现次数最多的分数
import statistics scores = [85, 92, 85, 90, 88, 92, 92, 82] most = statistics.mode(scores) print(f"出现次数最多的分数:{most}")

运行结果:

出现次数最多的分数:92

解释:92 出现了 3 次,是出现次数最多的,所以众数是 92。

⚠️ 新手头号大坑:多个众数会报错

如果有两个及以上的数值出现次数并列最多,mode()会直接报错StatisticsError。 解决方法:用multimode()函数,返回所有众数组成的列表(Python 3.8+ 支持)。

示例:多个众数的处理
import statistics scores = [85, 92, 85, 92, 88, 76] # 85和92都出现了2次,并列最多 # 错误写法:mode会报错 # print(statistics.mode(scores)) # 正确写法:multimode返回所有众数 all_modes = statistics.multimode(scores) print(f"所有众数:{all_modes}")

运行结果:

所有众数:[85, 92]

4. geometric_mean ():几何平均数

功能

几何平均数多用于计算平均增长率、平均比例,比如连续多年的收益率、人口增长率,比算术平均更适合描述增长类数据。 公式:n 个数值相乘后开 n 次方。

注意:Python 3.8+ 才支持这个函数;所有数据必须是正数。

示例:计算平均年收益率
import statistics # 某基金连续3年的收益率:第一年涨10%、第二年涨20%、第三年涨15% # 转化为增长倍数:1.1、1.2、1.15 growth_rates = [1.1, 1.2, 1.15] avg_growth = statistics.geometric_mean(growth_rates) print(f"年均增长倍数:{avg_growth:.4f}") print(f"年均收益率:{(avg_growth - 1)*100:.2f}%")

运行结果:

年均增长倍数:1.1487 年均收益率:14.87%

解释:三年的复利平均下来,相当于每年稳定涨 14.87%。


5. harmonic_mean ():调和平均数

功能

调和平均数多用于计算平均速度、平均单价等场景,比如路程相同的情况下,计算平均速度。

示例:计算往返平均速度
import statistics # 去程速度60km/h,返程速度40km/h,路程相同,求平均速度 speeds = [60, 40] avg_speed = statistics.harmonic_mean(speeds) print(f"往返平均速度:{avg_speed:.2f} km/h")

运行结果:

往返平均速度:48.00 km/h

解释:调和平均计算的是「相同距离下的平均速度」,结果 48 是正确的,不是简单的 (60+40)/2=50。


三、第二类:离散程度指标(描述数据的波动大小)

离散程度用来衡量一组数据「散不散、波动大不大」。比如两个班平均分都是 85,一个班分数都集中在 80-90,另一个班有考 60 也有考 100 的,后者波动更大,离散程度更高。

前置必懂:总体 vs 样本

这是新手最容易混淆的点,先通俗讲清楚:

  • 总体:你手里的数据就是全部研究对象(比如全班所有人的成绩),计算波动用「总体方差 / 总体标准差」,函数名带p前缀(p = population)
  • 样本:你手里的数据只是从整体里抽出来的一部分(比如从全年级抽 10 个学生的成绩,用来估计全年级的波动),用「样本方差 / 样本标准差」,分母是 n-1,结果比总体的稍大,更严谨。

四个函数对应关系:

类型方差函数标准差函数
总体pvariance()pstdev()
样本variance()stdev()

方差和标准差的关系:标准差 = √方差 标准差的单位和原数据一致,比方差更直观,日常描述波动更常用标准差。


1. pvariance ():总体方差

功能

计算总体方差,描述整组数据偏离均值的程度,数值越大,数据越分散。

语法
statistics.pvariance(数值序列, 均值可选)
示例:计算全班成绩的总体方差
import statistics # 全班8名同学的成绩(这就是全部总体) scores = [85, 92, 78, 90, 88, 76, 95, 82] # 计算总体方差 p_var = statistics.pvariance(scores) print(f"成绩总体方差:{p_var:.2f}")

运行结果:

成绩总体方差:35.94

2. pstdev ():总体标准差

功能

总体方差开平方就是总体标准差,单位和原数据一样(这里是「分」),比方差更直观好理解。

示例
import statistics scores = [85, 92, 78, 90, 88, 76, 95, 82] p_std = statistics.pstdev(scores) print(f"成绩总体标准差:{p_std:.2f} 分")

运行结果:

成绩总体标准差:5.99 分

解释:可以简单理解为,班级里大部分同学的分数,都在平均分上下浮动约 6 分左右。


3. variance ():样本方差

功能

计算样本方差,用于抽样数据估计总体波动,分母是 n-1(n 是数据个数)。

示例:抽样估计年级成绩波动
import statistics # 从全年级抽了8个同学的成绩(样本数据) sample_scores = [85, 92, 78, 90, 88, 76, 95, 82] # 样本方差 sample_var = statistics.variance(sample_scores) print(f"样本方差:{sample_var:.2f}")

运行结果:

样本方差:41.07

可以看到,同样的数据,样本方差(41.07)比总体方差(35.94)大,这是正常的,因为样本估计总体需要留有余量。


4. stdev ():样本标准差

功能

样本方差开平方,是最常用的波动描述指标。

示例
import statistics sample_scores = [85, 92, 78, 90, 88, 76, 95, 82] sample_std = statistics.stdev(sample_scores) print(f"样本标准差:{sample_std:.2f} 分")

运行结果:

样本标准差:6.41 分

四、拓展:quantiles () 分位数(Python 3.8+)

功能

把数据按大小排序后,分成 n 等份,得到分割点的数值,最常用的是四分位数(分成 4 份),可以快速了解数据的分布区间。

示例:计算成绩的四分位数

import statistics scores = [76, 78, 82, 85, 88, 90, 92, 95, 100] # n=4 表示分成4等份,得到3个四分位点 q = statistics.quantiles(scores, n=4) print(f"第一四分位数Q1:{q[0]}") # 25%位置 print(f"第二四分位数Q2:{q[1]}") # 50%位置,就是中位数 print(f"第三四分位数Q3:{q[2]}") # 75%位置

运行结果:

第一四分位数Q1:80.0 第二四分位数Q2:88.0 第三四分位数Q3:93.5

解释:25% 的同学分数低于 80 分,75% 的同学低于 93.5 分。


五、综合实战案例:班级成绩完整统计

下面是一个完整的小例子,用statistics模块一次性算出所有常用统计量,非常适合日常简单分析。

import statistics # 某班10名同学的期末数学成绩 scores = [72, 85, 91, 68, 95, 85, 79, 88, 91, 91] print("===== 班级成绩统计 =====") print(f"平均分:{statistics.mean(scores):.2f} 分") print(f"中位数:{statistics.median(scores)} 分") print(f"众数:{statistics.mode(scores)} 分") print(f"最高分:{max(scores)} 分") print(f"最低分:{min(scores)} 分") print(f"总体标准差:{statistics.pstdev(scores):.2f} 分") print(f"总体方差:{statistics.pvariance(scores):.2f}")

运行结果:

===== 班级成绩统计 ===== 平均分:84.50 分 中位数:86.5 分 众数:91 分 最高分:95 分 最低分:68 分 总体标准差:8.52 分 总体方差:72.65

六、新手高频易错点总结

  1. 传入空列表报错所有统计函数都要求序列至少有 1 个数据,空列表会触发StatisticsError

  2. 非数值类型报错列表里不能有字符串、None、布尔值以外的非数值类型,否则报类型错误。

  3. 众数多个时报错并列最多的众数有多个时,mode()会报错,改用multimode()获取所有众数列表。

  4. 总体和样本搞混

    • 数据是全部研究对象 → 用pvariance/pstdev
    • 数据是抽样样本 → 用variance/stdev日常小数据、只是描述当前这组数据,用总体的即可。
  5. 低版本 Python 不支持新函数geometric_meanharmonic_meanmultimodequantiles都是 Python 3.8+ 才有的,低版本会报错。

  6. 复杂统计场景不适用statistics只适合基础统计,复杂的数据分析、矩阵运算、回归分析等,建议用numpypandas第三方库。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 18:36:50

面对饱和的Android市场,音视频开发是否成为新的热门领域?

前言 当前互联网行业迅猛发展,各类热门开发专业在初期都备受追捧。然而,随着技术的普及和市场人才饱和,招聘要求逐渐提高,竞争也愈发激烈。Android开发同样面临这样的挑战。 Android程序员困境 许多人在从事Android开发时&#xf…

作者头像 李华
网站建设 2026/8/27 18:32:56

Android判断定位功能是否可用的方法

定位功能是否可用由定位服务和定位权限共同决定: 判断定位服务: 代码语言:javascript /*** 手机是否开启位置服务,如果没有开启那么所有app将不能使用定位功能*/public static boolean isLocServiceEnable(Context context) {Loca…

作者头像 李华
网站建设 2026/8/27 18:31:37

《妃梦千年》第20章-贵妃之位

第20章 贵妃之位 淑妃死后,长安落了场大雪。 边报却一天比一天急。北境左贤王围青石口,姜横死守。就在满朝上下都揪着心的时候,北境来了捷报。 姜横用疑兵之计,夜里举火三处,佯装援军,又趁雪夜劫了北境粮道…

作者头像 李华
网站建设 2026/8/27 18:27:41

从顺序执行到条件执行:解析 if 语句

目录 1.引言 2.if语句(if statement) 3.缩进(indent)与取消缩进(dedent) 4.比较运算符 5.if-else结构 1.引言 在之前的几篇博客当中,我们讨论了很多,但都是关于顺序执行的&…

作者头像 李华
网站建设 2026/8/27 18:24:10

智能审查别跳过前端的确定性检查

智能审查别跳过前端的确定性检查 1. 告警群里的反打卡:AI 审查助手把正常组件全踢回去了 接入 LLM 代码审查后,常见问题是:正常的 useMemo 被误报为风险,模型给出的修复无法通过编译,或在同步逻辑中建议加入无意义的异…

作者头像 李华