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

