Python 数据分析入门:一文搞懂集中趋势与离散程度(附 Pandas 实战)
适合人群:Python 初学者 / 数据分析入门 / 统计学基础学习者 / 教学案例分享
在做数据分析时,我们经常会遇到这样的问题:
- 一组数据的"平均水平"到底是多少?
- 为什么两组数据均值差不多,但实际情况完全不同?
- 如何判断数据是否稳定,波动大不大?
- 数据里有没有异常值?
这些问题,本质上都离不开两个统计学基础概念:
- 集中趋势
- 离散程度
本文用一个非常简单的案例------班级成绩分析 ,带你从 0 到 1 学会这些统计指标,并用 Pandas 完成实战分析。
一、先看一个问题:平均分差不多,班级情况就一样吗?
假设现在有两个班级的数学成绩:
python
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)
均值就是我们平时说的"平均数"。
计算公式
python
均值 = 所有数据之和 / 数据个数
Pandas 写法
python
df['A班'].mean()
特点
- 优点:最常用,最直观
- 缺点:对异常值敏感
也就是说,如果一组数据里存在特别大或特别小的值,均值很容易被拉偏。
2)中位数(Median)
中位数就是把数据排序后,位于中间位置的值。
Pandas 写法
python
df['A班'].median()
特点
- 不容易被极端值拉偏
- 在有异常值时,通常比均值更可靠
如果你分析的数据可能存在异常值,比如成绩异常、消费异常、销售爆发等,中位数往往比均值更能反映真实水平。
3)众数(Mode)
众数就是一组数据中出现次数最多的值。
Pandas 写法
python
df['A班'].mode()
特点
- 适合看"最常见的水平"
- 可能有多个众数
- 如果每个值都只出现一次,就可能没有众数
比如一组成绩里,85 分出现次数最多,那么 85 就是众数。
4)中列数(Midrange)
中列数是最大值和最小值的平均值。
计算公式
python
中列数 = (最大值 + 最小值) / 2
特点
- 计算简单
- 但受极端值影响较大
- 一般了解即可,实际分析中不如均值和中位数常用
三、什么是离散程度?
如果说集中趋势解决的是:
"这组数据大概在什么水平?"
那么离散程度解决的就是:
"这组数据差距大不大?稳定不稳定?"
常见指标有:
- 极差(Range)
- 四分位数(Quartiles)
- 四分位数极差(IQR)
- 方差(Variance)
- 标准差(Standard Deviation)
1)极差(Range)
极差是最大值减去最小值。
计算公式
python
极差 = max - min
Pandas 写法
python
df['A班'].max() - df['A班'].min()
特点
- 计算最简单
- 但只看最值,容易受极端值影响
如果一组数据里有异常值,极差可能会被放大。
2)四分位数(Quartiles)
四分位数是把数据从小到大排序后,分成四份得到的几个关键位置:
Q1:25%位置Q2:50%位置,也就是中位数Q3:75%位置
Pandas 写法
python
df['A班'].quantile([0.25, 0.5, 0.75])
四分位数非常适合用来观察数据分布情况。
3)四分位数极差(IQR)
IQR 的公式是:
python
IQR = Q3 - Q1
它表示中间 50% 数据的离散程度。
特点
- 比极差更稳定
- 常用于异常值判断
- 对极端值不那么敏感
所以在实际分析中,IQR 是一个非常实用的指标。
4)方差(Variance)与标准差(Standard Deviation)
这两个指标是分析"波动大小"的经典工具。
Pandas 写法
python
df['A班'].var() # 方差
df['A班'].std() # 标准差
怎么理解?
你可以简单理解为:
- 标准差越小:数据越集中,越稳定
- 标准差越大:数据越分散,差异越明显
在实际工作中,标准差通常比方差更常用,因为它更容易解释。
四、Pandas 实战:完整代码直接运行
下面直接上完整代码,复制即可运行。
python
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()
五、重点来了:describe() 到底看什么?
很多初学者第一次用 describe(),会觉得输出一堆数字,不知道重点看哪里。
其实重点就盯住这几个字段:
mean:均值50%:中位数std:标准差min / max:最小值和最大值25% / 75%:Q1 和 Q3
一个简单经验
如果你刚开始学数据分析,看到 describe(),优先看这三类信息:
1. 看中心
mean50%
2. 看波动
stdmax - min
3. 看分布
25%75%
这几个值,已经足够完成一轮基础分析。
六、结合案例解释结果
运行完代码后,你通常会发现:
- A班成绩集中在 80 多分附近
- B班虽然也有多个 85,但整体差距更大
- B班的极差和标准差通常会更大
这说明:
A班
- 整体稳定
- 学生成绩差异不大
- 班级表现比较均衡
B班
- 两极分化更明显
- 有高分,也有低分
- 平均值不能完全说明问题
这也是为什么在实际分析中,不能只看平均分。
七、异常值为什么重要?
在真实数据中,经常会遇到一些"看起来不太正常"的值,比如:
- 成绩里突然出现一个特别高或特别低的数
- 销售数据里某一天异常爆发
- 用户消费数据里出现极端金额
这些值可能是:
- 真实异常
- 录入错误
- 特殊情况
因此,分析数据时一定要关注异常值,因为它会直接影响均值、极差、标准差等指标。
对于异常值,常见的一种判断方式是利用四分位数极差 IQR:
python
下界 = Q1 - 1.5 * IQR
上界 = Q3 + 1.5 * IQR
超出这个范围的数据,通常可以视为异常值。
八、学习这部分内容,最容易踩的坑
坑1:只看均值,不看标准差
这是初学者最常见的问题。
均值只能说明平均水平,不能说明稳定性。
坑2:看到中位数和均值差不多,就觉得数据没问题
不一定。
有时候数据虽然中位数和均值接近,但极差、IQR、标准差可能已经说明波动很大。
坑3:不会解读 mode()
mode() 返回的是一个序列,不一定只有一个值。
比如:
python
print(df['A班'].mode())
可能返回多个众数,这是正常现象。
坑4:把方差和标准差混为一谈
记住一句话:
- 方差是"平方后的离散程度"
- 标准差是方差开根号后得到的,更容易解释
实际分析中,标准差更常用。
九、这部分知识在数据分析里有什么用?
别看它只是"统计描述",其实它是后面很多内容的基础。
比如:
- 数据清洗
- 异常值检测
- 数据可视化
- 聚类分析
- 建模前的数据理解
也就是说:
如果你连均值、中位数、标准差都看不懂,后面做更复杂的数据分析会非常吃力。
十、给初学者的一个记忆口诀
这部分我建议直接记成下面这 4 句话:
记忆版总结
- 均值看平均,但怕异常值。
- 中位数更稳,适合有极端值的数据。
- 标准差越大,波动越大。
- 分析数据时,中心和离散要一起看。
十一、课后练习(适合课堂 / 自学)
练习 1:基础题
已知一组成绩数据:
python
scores = [72, 75, 78, 80, 85, 85, 86, 90, 92, 95]
请完成:
- 计算均值、中位数、众数
- 计算极差、方差、标准差
- 计算 Q1、Q2、Q3 和 IQR
- 用一句话描述这组数据的特点
练习 2:提高题
加入一个异常值:
python
scores = [72, 75, 78, 80, 85, 85, 86, 90, 92, 150]
请思考:
- 均值变化大吗?
- 中位数变化大吗?
- 哪个指标更适合描述这组数据?
- 能否认为 150 是异常值?
练习 3:迁移题
请把"成绩数据"换成你熟悉的业务数据,例如:
- 某店铺近 10 天销售额
- 某班学生 10 次上机时长
- 某宿舍 10 天用电量
要求:
- 使用
Pandas完成统计描述 - 输出
describe() - 分析集中趋势和离散程度
- 尝试绘制盒图
十二、总结
这篇文章我们解决了一个非常基础但非常重要的问题:
一组数据到底该怎么快速读懂?
答案就是两步:
- 看集中趋势:判断整体水平
- 看离散程度:判断波动大小
本文重点讲了这些常用指标:
- 均值
- 中位数
- 众数
- 中列数
- 极差
- 四分位数
- IQR
- 方差
- 标准差
这些内容是数据分析中的基础能力,也是后续数据清洗、异常值识别和可视化分析的起点。
十三、写在最后
如果这篇文章对你有帮助,欢迎点赞、收藏、评论支持一下。
如果你也在学习 Python 数据分析,建议把 describe()、mean()、median()、mode()、std() 这几个方法先练熟,它们真的非常高频。
你在学习数据分析时,最开始卡在哪个统计指标上?
欢迎在评论区交流。