06 Python 数据分析入门:集中趋势与离散程度

Python 数据分析入门:一文搞懂集中趋势与离散程度(附 Pandas 实战)

适合人群:Python 初学者 / 数据分析入门 / 统计学基础学习者 / 教学案例分享

在做数据分析时,我们经常会遇到这样的问题:

  • 一组数据的“平均水平”到底是多少?
  • 为什么两组数据均值差不多,但实际情况完全不同?
  • 如何判断数据是否稳定,波动大不大?
  • 数据里有没有异常值?

这些问题,本质上都离不开两个统计学基础概念:

  • 集中趋势
  • 离散程度

本文用一个非常简单的案例——班级成绩分析,带你从 0 到 1 学会这些统计指标,并用 Pandas 完成实战分析。


一、先看一个问题:平均分差不多,班级情况就一样吗?

假设现在有两个班级的数学成绩:

A班成绩 =[85,82,88,84,86,83,87,85,84,86] B班成绩 =[100,60,90,70,95,65,85,85,85,85]

很多人拿到数据后,第一反应就是先看平均分。

但问题是:

  • 平均分差不多,就说明两个班水平一样吗?
  • 哪个班更稳定?
  • 哪个班成绩差距更大?

答案显然不是。

A班成绩比较集中,整体比较稳定;B班虽然也有高分,但高低差距很大。

这说明:

分析数据时,不能只看平均值,还要看数据的分散程度。

二、什么是集中趋势?

集中趋势,就是描述一组数据“中心位置”的指标。

你可以简单理解为:

这组数据大多数值,整体上靠近哪里?

常见的集中趋势指标有:

  • 均值(Mean)
  • 中位数(Median)
  • 众数(Mode)
  • 中列数(Midrange)

1)均值(Mean)

均值就是我们平时说的“平均数”。

计算公式
均值 = 所有数据之和 / 数据个数 
Pandas 写法
df['A班'].mean()
特点
  • 优点:最常用,最直观
  • 缺点:对异常值敏感

也就是说,如果一组数据里存在特别大或特别小的值,均值很容易被拉偏。


2)中位数(Median)

中位数就是把数据排序后,位于中间位置的值。

Pandas 写法
df['A班'].median()
特点
  • 不容易被极端值拉偏
  • 在有异常值时,通常比均值更可靠

如果你分析的数据可能存在异常值,比如成绩异常、消费异常、销售爆发等,中位数往往比均值更能反映真实水平。


3)众数(Mode)

众数就是一组数据中出现次数最多的值。

Pandas 写法
df['A班'].mode()
特点
  • 适合看“最常见的水平”
  • 可能有多个众数
  • 如果每个值都只出现一次,就可能没有众数

比如一组成绩里,85 分出现次数最多,那么 85 就是众数。


4)中列数(Midrange)

中列数是最大值和最小值的平均值。

计算公式
中列数 =(最大值 + 最小值)/2
特点
  • 计算简单
  • 但受极端值影响较大
  • 一般了解即可,实际分析中不如均值和中位数常用

三、什么是离散程度?

如果说集中趋势解决的是:

“这组数据大概在什么水平?”

那么离散程度解决的就是:

“这组数据差距大不大?稳定不稳定?”

常见指标有:

  • 极差(Range)
  • 四分位数(Quartiles)
  • 四分位数极差(IQR)
  • 方差(Variance)
  • 标准差(Standard Deviation)

1)极差(Range)

极差是最大值减去最小值。

计算公式
极差 =max-min
Pandas 写法
df['A班'].max()- df['A班'].min()
特点
  • 计算最简单
  • 但只看最值,容易受极端值影响

如果一组数据里有异常值,极差可能会被放大。


2)四分位数(Quartiles)

四分位数是把数据从小到大排序后,分成四份得到的几个关键位置:

  • Q1:25%位置
  • Q2:50%位置,也就是中位数
  • Q3:75%位置
Pandas 写法
df['A班'].quantile([0.25,0.5,0.75])

四分位数非常适合用来观察数据分布情况。


3)四分位数极差(IQR)

IQR 的公式是:

IQR = Q3 - Q1 

它表示中间 50% 数据的离散程度。

特点
  • 比极差更稳定
  • 常用于异常值判断
  • 对极端值不那么敏感

所以在实际分析中,IQR 是一个非常实用的指标。


4)方差(Variance)与标准差(Standard Deviation)

这两个指标是分析“波动大小”的经典工具。

Pandas 写法
df['A班'].var()# 方差 df['A班'].std()# 标准差
怎么理解?

你可以简单理解为:

  • 标准差越小:数据越集中,越稳定
  • 标准差越大:数据越分散,差异越明显

在实际工作中,标准差通常比方差更常用,因为它更容易解释。


四、Pandas 实战:完整代码直接运行

下面直接上完整代码,复制即可运行。

import pandas as pd import matplotlib.pyplot as plt # 1. 构造数据 a_scores =[85,82,88,84,86,83,87,85,84,86] b_scores =[100,60,90,70,95,65,85,85,85,85] df = pd.DataFrame({'A班': a_scores,'B班': b_scores })# 2. 查看原始数据print("=== 原始数据 ===")print(df)# 3. 一键统计描述print("\n=== describe() 统计结果 ===")print(df.describe())# 4. 集中趋势print("\n=== 集中趋势 ===")print("A班均值:", df['A班'].mean())print("B班均值:", df['B班'].mean())print("A班中位数:", df['A班'].median())print("B班中位数:", df['B班'].median())print("A班众数:", df['A班'].mode().tolist())print("B班众数:", df['B班'].mode().tolist())print("A班中列数:",(df['A班'].max()+ df['A班'].min())/2)print("B班中列数:",(df['B班'].max()+ df['B班'].min())/2)# 5. 离散程度print("\n=== 离散程度 ===")print("A班极差:", df['A班'].max()- df['A班'].min())print("B班极差:", df['B班'].max()- df['B班'].min())print("A班方差:", df['A班'].var())print("B班方差:", df['B班'].var())print("A班标准差:", df['A班'].std())print("B班标准差:", df['B班'].std())# 6. 四分位数和IQR a_q1 = df['A班'].quantile(0.25) a_q2 = df['A班'].quantile(0.5) a_q3 = df['A班'].quantile(0.75) a_iqr = a_q3 - a_q1 b_q1 = df['B班'].quantile(0.25) b_q2 = df['B班'].quantile(0.5) b_q3 = df['B班'].quantile(0.75) b_iqr = b_q3 - b_q1 print("\n=== 四分位数与 IQR ===")print(f"A班: Q1={a_q1}, Q2={a_q2}, Q3={a_q3}, IQR={a_iqr}")print(f"B班: Q1={b_q1}, Q2={b_q2}, Q3={b_q3}, IQR={b_iqr}")# 7. 盒图可视化 df.boxplot() plt.title("A班与B班成绩盒图") plt.ylabel("分数") plt.show()

输出

=== 原始数据 === A班 B班 0 85 100 1 82 60 2 88 90 3 84 70 4 86 95 5 83 65 6 87 85 7 85 85 8 84 85 9 86 85 === describe() 统计结果 === A班 B班 count 10.000000 10.000000 mean 85.000000 82.000000 std 1.825742 12.952906 min 82.000000 60.000000 25% 84.000000 73.750000 50% 85.000000 85.000000 75% 86.000000 88.750000 max 88.000000 100.000000 === 集中趋势 === A班均值: 85.0 B班均值: 82.0 A班中位数: 85.0 B班中位数: 85.0 A班众数: [84, 85, 86] B班众数: [85] A班中列数: 85.0 B班中列数: 80.0 === 离散程度 === A班极差: 6 B班极差: 40 A班方差: 3.3333333333333335 B班方差: 167.77777777777777 A班标准差: 1.8257418583505538 B班标准差: 12.952906151816965 === 四分位数与 IQR === A班: Q1=84.0, Q2=85.0, Q3=86.0, IQR=2.0 B班: Q1=73.75, Q2=85.0, Q3=88.75, IQR=15.0 
在这里插入图片描述

五、重点来了:describe() 到底看什么?

很多初学者第一次用 describe(),会觉得输出一堆数字,不知道重点看哪里。

其实重点就盯住这几个字段:

  • mean:均值
  • 50%:中位数
  • std:标准差
  • min / max:最小值和最大值
  • 25% / 75%:Q1 和 Q3

一个简单经验

如果你刚开始学数据分析,看到 describe(),优先看这三类信息:

1. 看中心
  • mean
  • 50%
2. 看波动
  • std
  • max - min
3. 看分布
  • 25%
  • 75%

这几个值,已经足够完成一轮基础分析。


六、结合案例解释结果

运行完代码后,你通常会发现:

  • A班成绩集中在 80 多分附近
  • B班虽然也有多个 85,但整体差距更大
  • B班的极差和标准差通常会更大

这说明:

A班

  • 整体稳定
  • 学生成绩差异不大
  • 班级表现比较均衡

B班

  • 两极分化更明显
  • 有高分,也有低分
  • 平均值不能完全说明问题

这也是为什么在实际分析中,不能只看平均分


七、异常值为什么重要?

在真实数据中,经常会遇到一些“看起来不太正常”的值,比如:

  • 成绩里突然出现一个特别高或特别低的数
  • 销售数据里某一天异常爆发
  • 用户消费数据里出现极端金额

这些值可能是:

  • 真实异常
  • 录入错误
  • 特殊情况

因此,分析数据时一定要关注异常值,因为它会直接影响均值、极差、标准差等指标。

对于异常值,常见的一种判断方式是利用四分位数极差 IQR:

下界 = Q1 -1.5* IQR 上界 = Q3 +1.5* IQR 

超出这个范围的数据,通常可以视为异常值。


八、学习这部分内容,最容易踩的坑

坑1:只看均值,不看标准差

这是初学者最常见的问题。

均值只能说明平均水平,不能说明稳定性。


坑2:看到中位数和均值差不多,就觉得数据没问题

不一定。

有时候数据虽然中位数和均值接近,但极差、IQR、标准差可能已经说明波动很大。


坑3:不会解读 mode()

mode() 返回的是一个序列,不一定只有一个值。

比如:

print(df['A班'].mode())

可能返回多个众数,这是正常现象。


坑4:把方差和标准差混为一谈

记住一句话:

  • 方差是“平方后的离散程度”
  • 标准差是方差开根号后得到的,更容易解释

实际分析中,标准差更常用


九、这部分知识在数据分析里有什么用?

别看它只是“统计描述”,其实它是后面很多内容的基础。

比如:

  • 数据清洗
  • 异常值检测
  • 数据可视化
  • 聚类分析
  • 建模前的数据理解

也就是说:

如果你连均值、中位数、标准差都看不懂,后面做更复杂的数据分析会非常吃力。

十、给初学者的一个记忆口诀

这部分我建议直接记成下面这 4 句话:

记忆版总结

  1. 均值看平均,但怕异常值。
  2. 中位数更稳,适合有极端值的数据。
  3. 标准差越大,波动越大。
  4. 分析数据时,中心和离散要一起看。

十一、课后练习(适合课堂 / 自学)

练习 1:基础题

已知一组成绩数据:

scores =[72,75,78,80,85,85,86,90,92,95]

请完成:

  1. 计算均值、中位数、众数
  2. 计算极差、方差、标准差
  3. 计算 Q1、Q2、Q3 和 IQR
  4. 用一句话描述这组数据的特点

练习 2:提高题

加入一个异常值:

scores =[72,75,78,80,85,85,86,90,92,150]

请思考:

  1. 均值变化大吗?
  2. 中位数变化大吗?
  3. 哪个指标更适合描述这组数据?
  4. 能否认为 150 是异常值?

练习 3:迁移题

请把“成绩数据”换成你熟悉的业务数据,例如:

  • 某店铺近 10 天销售额
  • 某班学生 10 次上机时长
  • 某宿舍 10 天用电量

要求:

  • 使用 Pandas 完成统计描述
  • 输出 describe()
  • 分析集中趋势和离散程度
  • 尝试绘制盒图

十二、总结

这篇文章我们解决了一个非常基础但非常重要的问题:

一组数据到底该怎么快速读懂?

答案就是两步:

  • 看集中趋势:判断整体水平
  • 看离散程度:判断波动大小

本文重点讲了这些常用指标:

  • 均值
  • 中位数
  • 众数
  • 中列数
  • 极差
  • 四分位数
  • IQR
  • 方差
  • 标准差

这些内容是数据分析中的基础能力,也是后续数据清洗、异常值识别和可视化分析的起点。


十三、写在最后

如果这篇文章对你有帮助,欢迎点赞、收藏、评论支持一下。
如果你也在学习 Python 数据分析,建议把 describe()mean()median()mode()std() 这几个方法先练熟,它们真的非常高频。

你在学习数据分析时,最开始卡在哪个统计指标上?
欢迎在评论区交流。


Read more

Node.js 下载安装与环境配置全流程(保姆级详解)| 图文详解,快速上手

Node.js 下载安装与环境配置全流程(保姆级详解)| 图文详解,快速上手

前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它采用事件驱动、非阻塞式 I/O 模型,使得其在处理高并发任务时具有极高的效率。得益于这样的设计,Node.js 在 Web 开发、实时应用、微服务架构等场景中被广泛使用。 除了高性能,Node.js 还配备了功能强大的包管理器 npm(Node Package Manager)。npm 提供了丰富的开源库和工具,开发者可以轻松地安装、管理和共享代码,使开发过程更加高效。 一、下载安装 Node.js 1.下载安装包: * 访问 Node.js 官方下载页面。 通常页面会显示两个版本: 1. 长期维护版本(推荐)

By Ne0inhk
深度解析个人AI助手OpenClaw:从消息处理到定时任务的全流程架构

深度解析个人AI助手OpenClaw:从消息处理到定时任务的全流程架构

在人工智能快速普及的当下,个人AI助手已经逐渐渗透到我们的工作和生活中,它们能够跨平台接收消息、智能处理需求、执行指定任务,成为提升效率的重要工具。OpenClaw作为一款功能强大的个人AI助手,凭借其灵活的渠道适配、完善的路由机制、强大的Agent能力以及可靠的定时任务系统,在众多AI助手中脱颖而出。很多开发者在使用OpenClaw时,都会好奇其背后的运行逻辑:当我们在WhatsApp、Discord等平台发送消息时,OpenClaw是如何捕捉到这些消息的,又是如何一步步处理并给出回复的;Web UI端的消息传递和外部渠道有何不同;Pi Agent如何调用大语言模型(LLM)和执行本地命令;定时任务从创建到结束的完整生命周期又包含哪些环节。今天,我们就结合OpenClaw的源代码,对这些核心功能模块进行全面且深入的解析,带你走进这款个人AI助手的底层架构,读懂每一个流程背后的技术实现。 OpenClaw的整体架构遵循“模块化设计、统一化管理”的理念,无论是消息处理、Agent执行还是定时任务,都有清晰的模块划分和明确的流程逻辑,这不仅保证了系统的稳定性和可扩展性,也让开发者能够快速

By Ne0inhk
什么是约定优于配置?自动配置的原理是什么?一文搞懂SpringBoot底层启动流程

什么是约定优于配置?自动配置的原理是什么?一文搞懂SpringBoot底层启动流程

👨‍💻程序员三明治:个人主页 🔥 个人专栏: 《设计模式精解》《重学数据结构》 🤞先做到 再看见! 目录 * 什么是自动配置类? * 自动配置原理 * 有没有自动配置的区别在哪? * Spring整合Mybatis * 在pom.xml文件中添加jar包的依赖 * 配置MyBatis文件 * 新建一个实体类的包和User实体类 * 编写实体类 * 新建Mapper接口包和UserMapper接口 * resouces下新建jdbc资源文件 jdbc-config.properties * resources下新建mybatis配置文件 mybatis.xml * resources下新建logj4j的日志配置文件log4j.properties * 新建User的映射mapper文件 * 在UserMapper接口中编写映射文件对应的方法 * 配置Spring文件 * resources下新

By Ne0inhk
Flutter 组件 graphql 的适配 鸿蒙Harmony 实战 - 驾驭标准化分布式图形协议、实现鸿蒙端实时订阅与高性能交互网关方案

Flutter 组件 graphql 的适配 鸿蒙Harmony 实战 - 驾驭标准化分布式图形协议、实现鸿蒙端实时订阅与高性能交互网关方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 graphql 的适配 鸿蒙Harmony 实战 - 驾驭标准化分布式图形协议、实现鸿蒙端实时订阅与高性能交互网关方案 前言 在鸿蒙(OpenHarmony)生态的万物互联、极繁交互中台、以及对数据获取灵活性有极致要求的现代应用研发中,“高效的数据检索协议”是应用响应速度的灵魂。面对复杂的社交网络关系查询、实时的行情推送、或是海量状态信息的聚合。如果仅仅依靠传统的 RESTful 接口,那么不仅会导致因为 Over-fetching(获取多余数据)导致的带宽浪费,更会因为频繁的 API 版本演进引入严重的跨端兼容性碎片化问题。 我们需要一种“按需检索、逻辑解耦”的交互艺术。 graphql 是一套专为 Flutter 设计的标准 GraphQL 客户端套件。它通过构建规范的规范化缓存(Normalized Cache)与极其灵活的连接链路(Links)

By Ne0inhk