statistics是 Python 3.4 版本开始加入的内置标准库,专门用来做基础的统计计算,不需要额外安装,导入就能用。它封装了我们日常最常用的统计量(均值、中位数、众数、方差、标准差等),不用自己写循环、写公式计算,一行代码就能得到准确结果,非常适合新手处理简单的数据分析场景。
本文会按「集中趋势 → 离散程度」的逻辑逐个讲解每个函数,每个函数都配可运行示例 + 逐行解释 + 新手避坑指南,零基础也能完全吃透。
一、模块基础说明
1. 模块定位
- 内置模块:Python 安装完就有,不需要
pip install - 适用场景:简单的基础统计计算,处理小规模数值数据
- 优势:代码简洁、结果准确、不用自己实现统计公式
2. 导入方式
# 方式1:导入整个模块(推荐新手用,不容易混淆函数来源) import statistics # 方式2:单独导入需要的函数 from statistics import mean, stdev, median3. 前置约定
所有统计函数的输入,基本都是「数值型可迭代对象」,比如整数 / 浮点数组成的列表、元组。 ⚠️ 新手坑:不能传入空列表、不能传入字符串 / 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代码解释
- 先定义成绩列表
scores,一共 8 个数值 statistics.mean(scores)自动计算:(85+92+78+90+88+76+95+82) ÷ 8 = 686 ÷ 8 = 85.75- 结果是浮点数类型,哪怕刚好整除也会返回 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)) # 883. 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.942. 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 个数据,空列表会触发
StatisticsError。非数值类型报错列表里不能有字符串、None、布尔值以外的非数值类型,否则报类型错误。
众数多个时报错并列最多的众数有多个时,
mode()会报错,改用multimode()获取所有众数列表。总体和样本搞混
- 数据是全部研究对象 → 用
pvariance/pstdev - 数据是抽样样本 → 用
variance/stdev日常小数据、只是描述当前这组数据,用总体的即可。
- 数据是全部研究对象 → 用
低版本 Python 不支持新函数
geometric_mean、harmonic_mean、multimode、quantiles都是 Python 3.8+ 才有的,低版本会报错。复杂统计场景不适用
statistics只适合基础统计,复杂的数据分析、矩阵运算、回归分析等,建议用numpy、pandas第三方库。