换数据源,流程不变:取数、洗数、统计、建模、出结论,还是这五步。 这张表一天一行、四个字段,全年 365 行,销售额合计 14766.53 万元。 数据是仿造的,造的时候写进了月季节、周末效应、广告拉动——后面的规律有一半是设计出来的。
第 9 章的数据在 MySQL 里,这一章的数据在 Excel 里。换的是数据源,不是方法。 六篇走完一个完整项目:概述、处理、统计、分析、相关、预测。比第 9 章多了最后那一步——往外推。
一、老板要的四句话
一家电商攒了一年的日销售流水。老板不看明细,只要四句话: 哪个月卖得多、旺季旺到什么程度、投的广告费到底起没起作用、明天大概能卖多少。 前三句这一章都能答,第四句要往外推一步——预测。
前五章都在描述已经发生的事,这一章第一次往未来伸手。手伸得准不准,得用一套指标量出来。 说白了:前面是回看,这一章开始向前看。回看错了能回头改,向前看错了要赔钱。
二、一张表,四个字段
| 字段 | 含义 | 单位 |
|---|---|---|
| 日期 | 下单日期 | 2025-01-01 起 |
| 销售额 | 当天成交金额 | 万元 |
| 广告费 | 当天投放花费 | 万元 |
| 订单量 | 当天成交单数 | 单 |
365 行,一天一行,一个空值都没有。合计 14766.53 万元,月均 1230.54 万元。 一天一行是这张表最要紧的性质。有了日粒度,按月、按季、按周、按星期, 全都变成「从日期拆出来」的事。 如果原始数据是订单明细(一单一行),第一步得先按天汇总——那是第 3 章 groupby 的活。
字段的单位也必须先确认。同样是「销售额」,写万元和写元,后面每个数差一万倍。
三、三种方法,一层压一层
| 方法 | 用来回答 | 这次用在哪 |
|---|---|---|
| 分组统计 | 哪个月高、哪个季度低 | 按月、按季、按周汇总 |
| 对比分析 | 这个月比上个月怎么样 | 环比、极值、贡献度 |
| 相关与回归 | 广告和销售是什么关系 | 算 r、建预测模型 |
分组统计看清形状,对比分析比出高低,相关与回归找关系。 顺序不能跳。关系没看清就上模型,等于闭着眼开枪。 这句话不是修辞。10.6 那个模型的 R 方只有 0.5005,原因就是季节和周末还没进模型,关系根本没看清。
四、项目准备:多装一个 openpyxl
课本要三样:pandas 读 Excel、matplotlib 画图、scikit-learn 建模。
pip install pandas openpyxl matplotlib scikit-learn
pandas 读 xlsx 靠的不是自己,是 openpyxl。装 pandas 时它不会跟着来,得单独装。
少了它,read_excel 会甩一句 ImportError,说缺一个 engine。看见这句不用怀疑路径,就是没装。
本机这套是 openpyxl 3.1.5、pandas 3.1.0、numpy 2.5.2、scikit-learn 1.9.1,读、算、建模都够。
五、数据是造的,这一点要说在前面
教材配套的原始 Excel 拿不到,所以按同样的量级造了一份:一天一行,四个字段,金额按万元。 造的时候写进了三件事:按月给的季节系数(6 月 1.25、11 月 1.45、2 月 0.85)、周末加 8%、 广告费按 2.2 倍拉动销售,再各叠一层噪声。 所以后面算出来「6 月和 11 月是两个尖峰」「周末比工作日高」,这些是设计进去的,不是从现实里发现的。
这句话决定了怎么读后面的结论:机制可信,具体数字不可外推。同样一套代码换成真数据, 形状可能完全不同。 造数不是作弊。学方法的时候,知道自己手里这份数据是怎么来的,比拿到一份来源不明的真数据更安全。
六、动手 Demo:项目概述与分析方法
先把这一份日销售数据造出来,落成 京东销售数据.xlsx,后面每一篇都从它读。
造法和全章一致:月季节、周末效应、广告拉动三件事写进去,再叠一层噪声。
import numpy as np
import pandas as pd
MONTH_K = [1.15, 0.85, 0.95, 0.92, 1.00, 1.25, 0.95, 0.98, 1.00, 1.05, 1.45, 1.10]
rng = np.random.default_rng(2026)
rows = []
for d in pd.date_range("2025-01-01", "2025-12-31", freq="D"):
ad = float(np.round(rng.uniform(8, 25), 2))
sales = 2.2 * ad * MONTH_K[d.month - 1] * (1.08 if d.day_of_week >= 5 else 1.0)
sales = sales * rng.normal(1.0, 0.07)
orders = int(round(sales * 10000 / 68.0 * rng.normal(1.0, 0.06)))
rows.append((d.strftime("%Y-%m-%d"), round(sales, 2), ad, orders))
df = pd.DataFrame(rows, columns=["日期", "销售额", "广告费", "订单量"])
df.to_excel("京东销售数据.xlsx", index=False, sheet_name="销售明细")
print("形状 %s" % (df.shape,))
print("全年合计 %.2f 万元" % df["销售额"].sum())
实跑输出:
--------------------------------------------------------------------
项目概述与分析方法
--------------------------------------------------------------------
① 项目和上一个的差别
--------------------------------------------------------------------
第 9 章的数据在 MySQL 里,这一章的数据在 Excel 里。
换数据源,流程不变:取数、洗数、统计、建模、出结论,还是这五步。
多出来的一步是「预测」——前面只在描述发生过的事,这一章要往外推一步。
② 数据长什么样
--------------------------------------------------------------------
一张表,四个字段,365 行,一天一行。
| 字段 | 含义 | 单位 |
|---|---|---|
| 日期 | 下单日期 | 2025-01-01 起 |
| 销售额 | 当天成交金额 | 万元 |
| 广告费 | 当天投放花费 | 万元 |
| 订单量 | 当天成交单数 | 单 |
一年 365 行,销售额合计 14766.53 万元。
数据是造的,但造的时候写进了三件事:月季节、周末效应、广告拉动。
③ 三种分析方法
--------------------------------------------------------------------
| 方法 | 用来回答 | 这次用在哪 |
|---|---|---|
| 分组统计 | 哪个月高、哪个季度低 | 按月、按周、按季汇总 |
| 对比分析 | 这个月比上个月怎么样 | 环比、极值、峰谷 |
| 相关与回归 | 广告和销售是什么关系 | 算 r、建预测模型 |
三种方法一层压一层:先看清长什么样,再比出高低,最后找出关系。
顺序不能跳。关系没看清就上模型,等于闭着眼开枪。
④ 项目准备
--------------------------------------------------------------------
要三样:pandas 读 Excel、matplotlib 画图、sklearn 建模。
[本沙箱已装齐]
| pip install pandas openpyxl matplotlib scikit-learn
openpyxl 是读 xlsx 的引擎,不装会报错
pandas 读 xlsx 靠的不是自己,是 openpyxl。装 pandas 不带它,得单独装。
本机 openpyxl 3.1.5、pandas 3.1.0、numpy 2.5.2。
⑤ 先把数据落成 Excel
--------------------------------------------------------------------
演示用的数据先写成 xlsx,后面每一节都从这个文件读。
路径是 京东销售数据.xlsx,一个工作表,名字叫「销售明细」。
真实项目里这一步是「拿到别人给的 Excel」。这次自己造一份,好让全章的数对得上。
! 文件已经写好了,365 行 4 列。
rng.normal(1.0, 0.07) 是乘在销售额上的噪声:均值 1、标准差 0.07,也就是上下浮动百分之七。
default_rng(2026) 里的种子就是「同一份数据」的保证。种子一样,跑一百遍都是这 365 行。
to_excel 的 index=False 不能漏,漏了会多出一列行号,下次读进来还得删。
30 秒实验
- 把 6 月的季节系数从 1.25 改成 1.00,重跑,看 6 月还是不是第一。
- 把周末的 1.08 改成 1.00,再看按星期的统计还有没有差距。
- 想一想:如果种子不写死,后面每一节的数字还能互相对上吗?
常见误区
- 以为换数据源就要换方法:流程五步不变,变的只是第一步读的是库还是表。
- 装 pandas 不装 openpyxl:read_excel 报缺 engine,很多人以为是文件路径错。
- 拿到表就开算:先看行数、字段、单位,这三样错一个,后面全错。
- 把造出来的数据当真实规律:机制可信,数字不可外推,报告里必须写明数据来源。
自测三问(点开对答案)
1. 换数据源之后,哪一步没变? —— 五步全没变:取数、洗数、统计、建模、出结论。变的只是第一步取数的对象。 2. 为什么必须单独装 openpyxl? —— pandas 自己不解析 xlsx,靠 openpyxl 这个引擎。不装,read_excel 直接报 ImportError。 3. 数据是造的,结论还能信吗? —— 方法和代码能信,具体数字不能外推。造数时写进去的机制决定了结论的形状。流程清楚了,下一篇动手:把这份 Excel 读回来,先看类型,再查缺、重、怪。
- ☐ (本篇完,下一篇 10.2 数据处理)