数据分析的第一步不是打开数据,是把「这个月卖得怎么样」换成一句能用数字回答的话。 同一张 12 个数的表,问「谁贡献最多」「谁在涨」,会得出两个都正确、但完全不同的话。 这一篇只练一个动作:把总量拆开看,再换一种比法看。
这是全书第一篇,没有前置章节。 它先不碰代码,只把「什么叫分析」讲清楚——后面每一章都是在这个动作上加工具。 例子是一家四个门店的三个月销量,12 个数,用 Python 现算,文里每个数都能自己复核。
一、一句能回答的话长什么样
店长问:这个月卖得怎么样?这句话在日常对话里够用,拿来做分析不行。 它没说跟谁比——跟上个月比、跟去年同期比、跟隔壁店比,三个答案可以完全相反。 它也没说比哪一项——营业额、件数、毛利,是三个不同的数,走向经常不同。
能回答的问法得长这样:四个门店这三个月各卖了多少,谁在涨,涨的够不够补上跌的。 这句话里每一段都能对着数据核,所以它是能回答的。
二、第一步:把总量拆开
原始数据只有一张表:四家店、三个月、12 个销量数字。 三个月的总额是 3,823,108 元。这个数说了一件事,也只说了一件事——总量这么多。 把它按门店拆成四份,结论立刻多了一条:
| 门店 | 三个月合计(元) | 占比 |
|---|---|---|
| 万达店 | 1,069,115 | 28.0% |
| 步行街店 | 976,571 | 25.5% |
| 中山路店 | 971,193 | 25.4% |
| 解放路店 | 806,229 | 21.1% |
贡献最多的是万达店,占 28.0%;最少的是解放路店,占 21.1%。 这一步没有任何模型,只有加法和除法。所谓分析,很多时候就是把总量拆开。
三、第二步:换一种比法
再看变化。同样是这 12 个数,只比 7 月和 9 月:
| 门店 | 7 月 | 9 月 | 两个月变化 |
|---|---|---|---|
| 中山路店 | 317,873 | 330,208 | +3.9% |
| 步行街店 | 318,366 | 321,291 | +0.9% |
| 万达店 | 361,395 | 347,790 | -3.8% |
| 解放路店 | 281,804 | 264,562 | -6.1% |
四家里两家在涨、两家在跌。可合计从 7 月的 1,279,438 元到 9 月的 1,263,851 元,只跌了 1.2%。 为什么跌得这么轻?因为跌的是体量大的那两家,涨的是体量小的那两家,两下抵掉一大半。 总量涨跌不等于每家涨跌。这句话看着像废话,可它是最常被忘掉的一句。
四、为什么这件事值得单独讲
上面两个动作——拆开、换比法——都不需要任何技术。会除法和排序就能做。 但跳过这两步直接上模型的人非常多:拿 12 个数扔进回归,得一个斜率,然后说「趋势向上」。 可这 12 个数里有两家在跌,模型把这件事抹平了。模型不会告诉你它抹掉了什么。
所以顺序是:先拆、先比,把结构看清楚,再决定要不要建模。
五、这份数据回答不了什么
它能回答:谁多谁少、谁涨谁跌、涨跌加起来是正是负。 它回答不了三件事:为什么涨、明年会怎样、预算该给哪家。 「为什么涨」要成本、客流、竞品、促销记录;「明年怎样」要历史长度和外部变量;
「预算给哪家」要一个目标函数——是要总额最大,还是要利润率最高,答案不一样。 分清手上这份数据能回答什么,比会写多少行代码重要得多。
六、动手 Demo:同一堆数,问法不同,答案不同
四家店、三个月、12 个销量数字,用线性同余发生器造,量级按一家社区店来。 先算总额,再按门店拆,最后只比 7 月和 9 月——三个动作都不出加法和除法。
S = [20261102]
def rnd():
S[0] = (S[0] * 1103515245 + 12345) % 2147483648
return S[0] / 2147483648.0
STORES = ["中山路店", "解放路店", "万达店", "步行街店"]
MONTHS = ["7 月", "8 月", "9 月"]
SALES = {}
for s in STORES:
base = 260000 + int(rnd() * 120000)
for i, m in enumerate(MONTHS):
SALES[(s, m)] = base + int((rnd() - 0.35) * 60000) + i * 9000
tot = sum(SALES.values())
print("三个月合计 %d 元" % tot)
for s in STORES:
t = sum(v for (a, m), v in SALES.items() if a == s)
print("%s %d 元 %.1f%%" % (s, t, t * 100.0 / tot))
m0 = sum(v for (a, m), v in SALES.items() if m == "7 月")
m1 = sum(v for (a, m), v in SALES.items() if m == "9 月")
print("7 月 %d 元,9 月 %d 元,变化 %+.1f%%" % (m0, m1, (m1 - m0) * 100.0 / m0))
实跑输出:
--------------------------------------------------------------------
同一堆数,问法不同,答案不同
--------------------------------------------------------------------
① 「这个月卖得怎么样」不是一个能回答的问题
--------------------------------------------------------------------
原始数据只有一张表:4 家店、3 个月、12 个销量数字,加起来 3,823,108 元。
「卖得怎么样」没法回答,因为它没说跟谁比、比哪一项。
换成三个能回答的问法:谁贡献最多、谁在涨、涨得够不够补上另一家的跌。
! 数据分析的第一步不是打开数据,是把问题问成一个能用数字回答的句子。
② 谁贡献最多:拆开看才知道
--------------------------------------------------------------------
| 门店 | 三个月合计(元) | 占比 |
|---|---:|---:|
| 中山路店 | 971,193 | 25.4% |
| 解放路店 | 806,229 | 21.1% |
| 万达店 | 1,069,115 | 28.0% |
| 步行街店 | 976,571 | 25.5% |
| 合计 | 3,823,108 | 100.0% |
贡献最多的是万达店,占比 28.0%。只是把总和拆成四份,结论就出来了。
! 这一步没有任何模型,只是除法和排序。所谓分析,很多时候就是把总量拆开。
③ 谁在涨:同一个数,换个比法结论就变
--------------------------------------------------------------------
| 门店 | 7 月 | 9 月 | 两个月变化 |
|---|---:|---:|---|
| 中山路店 | 317,873 | 330,208 | +3.9% |
| 解放路店 | 281,804 | 264,562 | -6.1% |
| 万达店 | 361,395 | 347,790 | -3.8% |
| 步行街店 | 318,366 | 321,291 | +0.9% |
三个月里在涨的有 2 家:中山路店、步行街店。
合计从 7 月的 1,279,438 元变到 9 月的 1,263,851 元,变化 -1.2%。
总数在跌,而且跌的正是体量大的那两家,所以总跌幅比单看家数更明显。
! 总量涨跌不等于每家涨跌。这种「总数掩盖结构」的错觉,是第一章反复要讲的一件事。
④ 数据能回答什么,不能回答什么
--------------------------------------------------------------------
这份表能回答:谁多谁少、谁涨谁跌、涨跌加起来是正是负。
它回答不了:为什么涨、明年会怎样、把预算给哪家最划算。
后三个问题要别的数据(成本、客流、竞品),这张表里一个都没有。
! 分清「手上这份数据能回答什么」,比会写多少行代码重要得多。
这段代码只做了三件事:求和、按门店分组求和、按月分组求和。三个都是同一个动作的变体。
注意最后那个 %+.1f%%:+ 让正数带加号,%% 打出百分号本身。
不写 %%,格式化字符串会把 % 当成占位符报错。
30 秒实验
- 把「按门店拆」换成「按月拆」,四家店合计变成三个数,这两组数的和应该相等。手动加一遍验证。
- 如果只看总额,你会说「生意还行」;只看门店,你会说「有一家在跌」。两句都对,怎么选?
- 想一想:这 12 个数里,如果解放路店的跌幅从 -6.1% 变成 -20%,总额的变化是多少?
常见误区
- 拿总额当结论:总额只说明规模,不说明结构,也不说明趋势。
- 只比首尾两个月:中间那个月被跳过了,涨跌的顺序可能有反复。
- 把占比当原因:万达店占比最高,不代表把货都给万达店就能涨。
- 用一份数据回答三个问题:销量表回答不了「为什么」,那要另一份数据。
自测三问(点开对答案)
1. 为什么「这个月卖得怎么样」不算一个能回答的问题? —— 因为它没指定比较对象和比较指标。换一个比较对象或换一个指标,答案就可能反过来。 2. 总额只跌了 1.2%,为什么不能说「生意基本没变」? —— 因为四家里两家在涨、两家在跌,总额是抵出来的结果。结构已经变了,只是被总量盖住。 3. 拆开和换比法这两个动作,哪一步更依赖数据,哪一步更依赖你想问什么? —— 拆开只依赖数据的结构(有哪些门店),换比法更依赖你想回答什么(比月度还是比同比)。看清结构之后,下一个问题是:一个决定到底值多少钱。 下一篇用一个促销算给你看,同一件事换个口径,结论会反过来。
- ☐ (本篇完,下一篇 1.2 为什么值得花力气学)