Python statistics.mode() 方法(长文解析)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

什么是众数?

众数(Mode)是统计学中描述数据集中趋势的核心指标之一,它指的是一组数据中出现次数最多的数值或类别。例如,在班级学生的数学成绩中,如果70分出现的次数最多,那么70分就是该组数据的众数。众数特别适用于分类数据或离散型数值数据,能够直观反映数据中“最常见”的特征。

在Python中,statistics模块的mode()方法提供了快速计算众数的便捷工具。它适用于编程初学者入门统计学,也能帮助中级开发者在数据分析项目中高效处理数据分布问题。


如何使用 statistics.mode() 方法?

基础语法与示例

statistics.mode() 方法接受一个可迭代对象(如列表、元组)作为输入,返回其中出现次数最多的元素。若存在多个众数,则抛出StatisticsError异常。

示例代码:

import statistics  

scores = [85, 90, 85, 88, 85, 92, 85]  
print("众数为:", statistics.mode(scores))  # 输出:85  

colors = ["red", "blue", "red", "green", "red"]  
print("最常见的颜色是:", statistics.mode(colors))  # 输出:"red"  

解释:

  • 在第一个示例中,85分出现了4次,是成绩中的“最常客”。
  • 第二个示例展示了mode()对字符串数据的支持,适用于分类变量(如颜色、性别等)。

多众数情况的处理

如果数据集中存在多个众数(即两个或更多元素出现次数相同且均为最大值),statistics.mode()会抛出异常。此时,可改用statistics.multimode()方法(Python 3.8+版本支持),它返回包含所有众数的列表。

示例代码:

import statistics  

data = [1, 2, 2, 3, 3, 4]  
try:  
    print("众数:", statistics.mode(data))  
except statistics.StatisticsError as e:  
    print("错误:", e)  

print("所有众数:", statistics.multimode(data))  # 输出:[2, 3]  

比喻说明:
想象一场选举中两名候选人得票相同,此时无法选出单一胜者。类似地,当数据存在多个众数时,mode()会“拒绝裁决”,而multimode()则会列出所有“并列冠军”。


实际案例:众数在数据分析中的应用

案例1:销售数据中的热门产品

假设某电商平台记录了某商品一周的销量:

sales = [120, 150, 120, 130, 120, 150, 150]  
print("最畅销销量:", statistics.mode(sales))  # 输出:150  

通过众数,商家可以快速定位到“最受欢迎”的销售量,辅助制定库存策略。

案例2:学生考试成绩分析

在学生成绩分析中,众数能帮助教师了解最常见的分数段:

exam_scores = [65, 70, 70, 75, 75, 75, 80, 80]  
print("常见分数:", statistics.mode(exam_scores))  # 输出:75  

此结果表明,75分是学生中最普遍的得分,可能提示教学内容或考试难度需要调整。


进阶技巧:结合其他统计方法

1. 与均值、中位数的对比

众数常与均值(mean())和中位数(median())联合使用,以全面分析数据分布:

import statistics  

data = [1, 2, 2, 3, 4, 4, 4, 5]  
print("均值:", statistics.mean(data))       # 约3.0  
print("中位数:", statistics.median(data))   # 3.5  
print("众数:", statistics.mode(data))       # 4  
  • 均值受极端值影响大,中位数体现中间位置,而众数反映“集中趋势”。

2. 处理复杂数据结构

对于嵌套列表或二维数据,可通过循环或列表推导式逐层计算众数:

matrix = [  
    [10, 20, 30],  
    [10, 25, 30],  
    [10, 20, 35]  
]  

columns = list(zip(*matrix))  # 转置为列  
for col in columns:  
    print("列众数:", statistics.mode(col))  

注意事项与最佳实践

1. 数据类型限制

statistics.mode()要求输入元素是可哈希的(如整数、字符串),且必须存在至少一个重复元素。若数据完全唯一或为空列表,会抛出异常:

try:  
    statistics.mode([1, 2, 3])  # 无重复元素  
except statistics.StatisticsError as e:  
    print("错误:", e)  # 输出:"no mode for this sequence"  

2. 异常处理建议

在实际项目中,建议用try-except块包裹mode()调用,以应对数据异常:

def safe_mode(data):  
    try:  
        return statistics.mode(data)  
    except statistics.StatisticsError:  
        return None  # 或返回默认值  

3. 性能优化

对于大规模数据,statistics.mode()的时间复杂度为O(n),效率较高。但若需同时计算其他统计指标(如频率分布),可优先用字典或collections.Counter

from collections import Counter  

data = [1, 2, 2, 3, 3, 3]  
count = Counter(data)  
print("众数:", count.most_common(1)[0][0])  # 输出:3  

与其他统计库的对比

与 numpy.mode 的区别

numpy库的numpy.mode()方法与statistics.mode()功能类似,但存在以下差异:
| 特性 | statistics.mode() | numpy.mode() |
|------------------|------------------------------|------------------------------|
| 输入类型 | Python原生列表/元组 | Numpy数组 |
| 多众数处理 | 抛出异常 | 返回最小众数 |
| 性能 | 适合小数据集 | 适合大数据集(数组操作优化) |

选择建议

  • 若数据已转为Numpy数组且需高性能,推荐numpy.mode()
  • 若需与Python原生数据结构交互或希望清晰报错,选择statistics.mode()

结论

Python statistics.mode()方法是数据分析中不可或缺的工具,它以简洁的语法和直观的输出,帮助开发者快速定位数据中的“核心特征”。通过结合案例与进阶技巧,读者可以掌握众数计算在实际场景中的应用,例如优化库存策略或分析用户行为。

对于编程初学者,建议从基础语法入手,逐步尝试处理多众数和复杂数据结构;中级开发者则可探索与pandasnumpy等库的协同使用,提升数据分析的深度和效率。掌握众数计算,不仅能够增强统计分析能力,更能为构建数据驱动的决策系统奠定坚实基础。


通过本文的学习,相信读者已对Python statistics.mode()方法有了全面理解。在接下来的项目中,不妨尝试将其融入数据预处理或可视化流程,亲身体验统计学与编程结合的魅力!

最新发布