ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

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

Python进阶教程:17_statistics 模块 —— 新手完全指南 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)自动计算(8592789088769582) ÷ 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 个取两者的平均值(8588) ÷ 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 是正确的不是简单的 (6040)/250。三、第二类离散程度指标描述数据的波动大小离散程度用来衡量一组数据「散不散、波动大不大」。比如两个班平均分都是 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-1n 是数据个数。示例抽样估计年级成绩波动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] # n4 表示分成4等份得到3个四分位点 q statistics.quantiles(scores, n4) print(f第一四分位数Q1{q[0]}) # 25%位置 print(f第二四分位数Q2{q[1]}) # 50%位置就是中位数 print(f第三四分位数Q3{q[2]}) # 75%位置运行结果第一四分位数Q180.0 第二四分位数Q288.0 第三四分位数Q393.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第三方库。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表