用几个数说清一列
3 道练习题·预计 45 分钟·做对一题解锁下一段
前言
上一章学会了从表里挑出想要的数据。可是挑出来以后,还得把它说清楚才行。比如记账本里一千多笔花销,一笔一笔地看,看到眼花,也说不出个所以然。要是有人问你「你平时一笔花多少钱」,总不能把整本账递过去吧?
这时候,就得用几个数,把一整列说清楚:一般是多少?最多的是哪种?大的有多大?波动又有多大?这几个数,在统计学里叫描述统计。
其实第 2 章用 describe() ,已经一下子算出了好几个,还发现了一件怪事:平均每笔 51 元,可一半的花销都不超过 21 元。当时说这一点第 4 章还会细讲,指的就是这一章。所以这一章,就把这几个数一个一个拆开,弄清楚它们各自在说什么,什么时候该信哪一个。
学这一章之前,需要先学完 数据分析课第 3 章 。
目录
这一章会学到:
- 一、平均数和中位数——「一般是多少」该信哪个
- 二、数一数——
value_counts(),以及占多大比例 - 三、分位数——大的有多大,
quantile()和nlargest() - 四、标准差——波动有多大
- 五、常见坑
- 六、自己查一次文档——用
value_counts()把金额分成几段 - 七、小结与回看
学完这一章,别人问起「你平时一笔花多少钱」,你能用几个数答得又准又清楚。
一、平均数和中位数
先来解开第 2 章留下的那个疑问:平均数和中位数,为什么会差那么多?别急着看记账本,先用四个数做个小实验。这里要用到 pd.Series() ,它能直接把一个列表变成一列:
import pandas as pd
s = pd.Series([10, 20, 30, 1000])
print(s.mean())
print(s.median())输出的结果:
265.0
25.0两个数差了一大截。它们各是怎么算出来的呢?
mean()算的是平均数:把所有数加起来,再除以个数。(10 + 20 + 30 + 1000) ÷ 4 = 265。median()算的是中位数:先从小到大排好,再取正中间的那个数。个数是双数的时候,就取中间两个的平均,(20 + 30) ÷ 2 = 25。
各位童鞋发现没有?四个数里有三个都不超过 30,平均数却是 265,没有一个数接近它。为什么会这样?就是因为那一个 1000,把平均数拉了上去。中位数就不一样了,它只看排在中间的是谁。最大的那个数是 1000 也好,100 万也好,中位数都不受影响。
小实验看明白了,再回到记账本。这回分两次算:先算全部的花销,再把房租去掉,算一遍。
import pandas as pd
ledger = pd.read_csv('ledger_2026.csv')
print(round(ledger['cost'].mean(), 2))
print(ledger['cost'].median())
no_rent = ledger[ledger['item'] != '房租']
print(round(no_rent['cost'].mean(), 2))
print(no_rent['cost'].median())输出的结果:
51.1
21.0
29.21
21.0对比一下:去掉一年的 12 笔房租以后,平均数从 51 元一下子掉到了 29 元;中位数却纹丝不动,还是 21 元。
所以,「平时一笔花多少」这个问题,中位数答得更准:21 元左右。那平均数是不是就没用了呢?也不是。平均数乘上笔数,就是总额,所以算总账离不开它。而且,两个数差得越远,说明数据里「特别大」或「特别小」的值越多,这本身就是一条值得注意的信息。
把两者放在一起,比一比:
平均数 mean() | 中位数 median() | |
|---|---|---|
| 怎么算 | 加起来除以个数 | 排好序取中间 |
| 受特别大、特别小的值影响吗 | 受,影响很大 | 几乎不受 |
| 适合回答 | 一共多少、平均分到每一个是多少 | 一般情况是多少 |
先做一道练习:晚饭一般花多少?用平均数和中位数各算一遍。
读进记账本,挑出名称(item)是「晚饭」的那些金额,分两行打印:平均数(用 round() 保留两位小数)和中位数。
运行后的输出应该是:
39.58
40.0推荐一个,全网最全最友好的中文 AI 编程指南: coding.stormzhang.ai