Python 数据分析入门:集中趋势与离散程度
一、先看一个问题:平均分差不多,班级情况就一样吗?
假设现在有两个班级的数学成绩:
A班成绩 = [85, 82, 88, 84, 86, 83, 87, , , ]
B班成绩 = [, , , , , , , , , ]
Python 数据分析中,集中趋势与离散程度是理解数据分布的基础。文章通过班级成绩案例,演示了均值、中位数、众数等集中趋势指标,以及极差、方差、标准差、四分位数等离散程度指标的计算方法。结合 Pandas 库的 describe() 函数及代码实战,帮助初学者掌握如何识别异常值、评估数据稳定性,并总结常见分析误区与记忆口诀,为后续数据清洗与建模打下基础。
假设现在有两个班级的数学成绩:
A班成绩 = [85, 82, 88, 84, 86, 83, 87, , , ]
B班成绩 = [, , , , , , , , , ]
很多人拿到数据后,第一反应就是先看平均分。
但问题是:
答案显然不是。
A 班成绩比较集中,整体比较稳定;B 班虽然也有高分,但高低差距很大。
这说明:
分析数据时,不能只看平均值,还要看数据的分散程度。
集中趋势,就是描述一组数据'中心位置'的指标。
你可以简单理解为:
这组数据大多数值,整体上靠近哪里?
常见的集中趋势指标有:
均值就是我们平时说的'平均数'。
均值 = 所有数据之和 / 数据个数
df['A 班'].mean()
也就是说,如果一组数据里存在特别大或特别小的值,均值很容易被拉偏。
中位数就是把数据排序后,位于中间位置的值。
df['A 班'].median()
如果你分析的数据可能存在异常值,比如成绩异常、消费异常、销售爆发等,中位数往往比均值更能反映真实水平。
众数就是一组数据中出现次数最多的值。
df['A 班'].mode()
比如一组成绩里,85 分出现次数最多,那么 85 就是众数。
中列数是最大值和最小值的平均值。
中列数 = (最大值 + 最小值) / 2
如果说集中趋势解决的是:
'这组数据大概在什么水平?'
那么离散程度解决的就是:
'这组数据差距大不大?稳定不稳定?'
常见指标有:
极差是最大值减去最小值。
极差 = max - min
df['A 班'].max() - df['A 班'].min()
如果一组数据里有异常值,极差可能会被放大。
四分位数是把数据从小到大排序后,分成四份得到的几个关键位置:
Q1:25% 位置Q2:50% 位置,也就是中位数Q3:75% 位置df['A 班'].quantile([0.25, 0.5, 0.75])
四分位数非常适合用来观察数据分布情况。
IQR 的公式是:
IQR = Q3 - Q1
它表示中间 50% 数据的离散程度。
所以在实际分析中,IQR 是一个非常实用的指标。
这两个指标是分析'波动大小'的经典工具。
df['A 班'].var() # 方差
df['A 班'].std() # 标准差
你可以简单理解为:
在实际工作中,标准差通常比方差更常用,因为它更容易解释。
下面直接上完整代码,复制即可运行。
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(),会觉得输出一堆数字,不知道重点看哪里。
其实重点就盯住这几个字段:
mean:均值50%:中位数std:标准差min / max:最小值和最大值25% / 75%:Q1 和 Q3如果你刚开始学数据分析,看到 describe(),优先看这三类信息:
mean50%stdmax - min25%75%这几个值,已经足够完成一轮基础分析。
运行完代码后,你通常会发现:
这说明:
这也是为什么在实际分析中,不能只看平均分。
在真实数据中,经常会遇到一些'看起来不太正常'的值,比如:
这些值可能是:
因此,分析数据时一定要关注异常值,因为它会直接影响均值、极差、标准差等指标。
对于异常值,常见的一种判断方式是利用四分位数极差 IQR:
下界 = Q1 - 1.5 * IQR
上界 = Q3 + 1.5 * IQR
超出这个范围的数据,通常可以视为异常值。
这是初学者最常见的问题。
均值只能说明平均水平,不能说明稳定性。
不一定。
有时候数据虽然中位数和均值接近,但极差、IQR、标准差可能已经说明波动很大。
mode() 返回的是一个序列,不一定只有一个值。
比如:
print(df['A 班'].mode())
可能返回多个众数,这是正常现象。
记住一句话:
实际分析中,标准差更常用。
别看它只是'统计描述',其实它是后面很多内容的基础。
比如:
也就是说:
如果你连均值、中位数、标准差都看不懂,后面做更复杂的数据分析会非常吃力。
这部分我建议直接记成下面这 4 句话:
已知一组成绩数据:
scores = [72, 75, 78, 80, 85, 85, 86, 90, 92, 95]
请完成:
加入一个异常值:
scores = [72, 75, 78, 80, 85, 85, 86, 90, 92, 150]
请思考:
请把'成绩数据'换成你熟悉的业务数据,例如:
要求:
Pandas 完成统计描述describe()这篇文章我们解决了一个非常基础但非常重要的问题:
一组数据到底该怎么快速读懂?
答案就是两步:
本文重点讲了这些常用指标:
这些内容是数据分析中的基础能力,也是后续数据清洗、异常值识别和可视化分析的起点。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online