📊 第10章 京东电商销售数据分析与预测
📄 一句话概括

换数据源,流程不变:取数、洗数、统计、建模、出结论,还是这五步。 这张表一天一行、四个字段,全年 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 秒实验

  1. 把 6 月的季节系数从 1.25 改成 1.00,重跑,看 6 月还是不是第一。
  2. 把周末的 1.08 改成 1.00,再看按星期的统计还有没有差距。
  3. 想一想:如果种子不写死,后面每一节的数字还能互相对上吗?

常见误区

  1. 以为换数据源就要换方法:流程五步不变,变的只是第一步读的是库还是表。
  2. 装 pandas 不装 openpyxl:read_excel 报缺 engine,很多人以为是文件路径错。
  3. 拿到表就开算:先看行数、字段、单位,这三样错一个,后面全错。
  4. 把造出来的数据当真实规律:机制可信,数字不可外推,报告里必须写明数据来源。
自测三问(点开对答案) 1. 换数据源之后,哪一步没变? —— 五步全没变:取数、洗数、统计、建模、出结论。变的只是第一步取数的对象。 2. 为什么必须单独装 openpyxl? —— pandas 自己不解析 xlsx,靠 openpyxl 这个引擎。不装,read_excel 直接报 ImportError。 3. 数据是造的,结论还能信吗? —— 方法和代码能信,具体数字不能外推。造数时写进去的机制决定了结论的形状。

流程清楚了,下一篇动手:把这份 Excel 读回来,先看类型,再查缺、重、怪。

相关笔记