zohairbaloch-64/walmart-sales-forecasting-case-study

GitHub: zohairbaloch-64/walmart-sales-forecasting-case-study

一个端到端的零售销售预测案例研究,结合特征工程、XGBoost建模与SHAP可解释性分析,从历史数据中挖掘销售驱动因素并输出可操作的商业决策。

Stars: 0 | Forks: 0

# 🛒 Walmart 每周销售额预测 ### 一个专业的端到端零售分析与机器学习案例研究

## 📌 项目摘要 本项目分析了 **45 家 Walmart 门店的 6,435 条每周销售记录(2010 年 2 月 – 2012 年 10 月)**,旨在找出零售收入的真正驱动因素,并构建能够以生产级精度预测每周销售额的机器学习模型。 最终的 XGBoost 模型实现了 **R² = 0.988 和 MAPE = 3.99%** —— 实际销售额每 1 美元的误差不到 4 美分 —— 同时 SHAP 可解释性分析将模型行为转化为可操作的商业决策,据估算,在该 45 家门店的数据集中,这每年能带来约 **1.07 亿美元的库存效率提升**。 ## 🎯 商业目标 | 问题 | 发现的答案 | |---|---| | 哪些因素对每周销售额的影响最大? | 滞后销售额和滚动平均值占主导地位;经济变量几乎无影响 | | 节假日如何影响购买行为? | 感恩节 +41.3%;圣诞/新年(12月31日,已标记)实际上 **-7.7%** | | 经济指标(CPI、燃料价格、失业率)会驱动销售吗? | 线性信号几乎为零;失业率显示出非线性的消费降级效应 | | 特征工程能改善预测吗? | 是的 —— Linear Regression 的 MAE 降低了 **87.9%**;XGBoost 降低了 50.6% | | 机器学习能提供可操作的商业洞察吗? | 能 —— 仅从 MAPE 的提升中就量化出了每年 1.07 亿美元的预测价值 | ## 📊 数据集 | 属性 | 值 | |---|---| | 来源 | Walmart Store Sales Forecasting | | 记录 | 6,435 条每周观测数据 | | 门店 | 45 | | 日期范围 | 2010 年 2 月 – 2012 年 10 月 | | 缺失值 | **零** —— 生产级纯净数据集 | ### 特征 | 特征 | 类型 | 描述 | |---|---|---| | `Store` | Integer | 唯一的门店标识符 (1–45) | | `Date` | DateTime | 每周的开始日期 | | `Weekly_Sales` | Float | 每周总收入 (目标变量) | | `Holiday_Flag` | Binary | 1 = 该周包含 Super Bowl、Labor Day、Thanksgiving 或 Christmas | | `Temperature` | Float | 地区平均气温 (°F) | | `Fuel_Price` | Float | 地区燃油价格 ($/加仑) | | `CPI` | Float | 消费者物价指数 | | `Unemployment` | Float | 地区失业率 (%) | ## 🔍 关键发现 ### 发现 1 — 节假日列存在严重的误导性 `Holiday_Flag` 列将 **12月31日** 标记为圣诞节当周。但实际上: - **平安夜(12月23–24日)平均周销售额为 179 万美元 —— 比所有官方标记的节假日高出 60%** - 12月31日(被标记为“圣诞节”的那一周)低于正常水平,为 **-7.7%** - **数据集中收入排名前 10 的最高周,其 Holiday_Flag 全部标记为 0** 任何使用 `Holiday_Flag` 作为圣诞节信号的模型都在从错误的周中学习。这是本项目最具影响力的数据工程发现。 ### 发现 2 — 一个二元标志掩盖了四种不同的情况 | 节假日 | 平均每周销售额 | 对比正常水平 | |---|---|---| | Thanksgiving | $1.41M | **+41.3%** ✅ | | Super Bowl | $1.07M | +3.6% | | Labor Day | $1.03M | +0.1% | | Christmas/新年 (12月31日) | $0.95M | **-7.7%** ❌ | 单一的 `Holiday_Flag` 将这四者平均在一起,得出了具有误导性的 +7.8% 信号。将其拆解为单独的虚拟变量是为了保证正确性,而非仅仅是偏好。 ### 发现 3 — 经济变量的线性信号几乎为零 | 变量 | Pearson r | 是否显著? | |---|---|---| | Fuel_Price | 0.009 | ❌ 否 | | CPI | -0.073 | ✅ 是,但影响微乎其微 | | Unemployment | -0.106 | ✅ 是,呈非线性 | | Temperature | -0.064 | ✅ 是,但影响微乎其微 | 失业率呈现 **U型非线性效应** —— 当失业率 >10.4% 时,由于消费者从高端零售商处消费降级,Walmart 的销售额会部分恢复。 ### 发现 4 — 门店的异质性导致全局模型在结构上存在弱点 - **8.1倍的收入差距**:Store 20(210万美元/周)对比 Store 33(26万美元/周) - 门店间存在 **5.5倍的波动性差距** - 高收入 ≠ 高波动性 —— Store 31 每周收入 140 万美元,且变异系数 (CV) = 0.09(非常稳定) 缺乏门店级特征的全局模型会将 45 条根本不同的需求曲线平均化。 ## ⚙️ 特征工程 原始特征被转化为一系列高信号工程特征: | 特征类别 | 创建的特征 | 目的 | |---|---|---| | **滞后特征** | `Lag_1`, `Lag_2`, `Lag_4` | 捕捉近期的销售动能 | | **滚动平均值** | `Rolling_Mean_3`, `Rolling_Mean_5` | 平滑短期趋势 | | **日历特征** | `Week_Num`, `Month`, `Quarter` | 编码季节性 | | **节假日虚拟变量** | `Is_Thanksgiving`, `Is_SuperBowl`, `Pre_Christmas` | 替换具有误导性的二元标志 | | **门店特征** | `Store_Mean`, `Store_Tier` | 捕捉门店级别的表现水平 | | **季节性标志** | `Is_December`, `Is_Jan_Dip` | 标记结构性的高/低谷期 | ## 🤖 模型结果 所有模型均在基于时间的训练/测试集划分上进行训练(没有随机打乱 —— 这是进行有效时间序列评估所必需的)。 ### 原始特征对比工程特征 | 模型 | 特征 | MAE | RMSE | R² | MAPE | |---|---|---|---|---|---| | Linear Regression | 原始 | $417,105 | $495,738 | 0.1419 | 58.95% | | XGBoost | 原始 | $80,943 | $123,365 | 0.9469 | 8.06% | | Linear Regression | **工程** | $50,420 | $70,221 | 0.9828 | 5.22% | | Random Forest | **工程** | $45,325 | $65,299 | 0.9851 | 4.36% | | **XGBoost** | **工程** | **$40,026** | **$58,649** | **0.9880** | **3.99%** | ## 🔬 SHAP 可解释性 SHAP (SHapley Additive Explanations) 被用于解释个体预测,并量化每个特征在美元级别的影响。 ### 按平均 |SHAP| 值排列的顶级特征 | 排名 | 特征 | 平均美元影响 | 方向 | |---|---|---|---| | 1 | `Rolling_Mean_5` | ~$208,000 | 高滚动平均值 → 预测值大幅跳跃 | | 2 | `Lag_1` | ~$165,000 | 上周的销售额 = 最强的单一驱动因素 | | 3 | `Store_Mean` | ~$95,000 | 门店基线主导了结构性预测 | | 4 | `Store_Tier` | ~$36,000 | 高级别门店系统性地推高预测值 | | 5 | `Pre_Christmas` | 方向性极强 | 12月14–25日标志大幅推高预测值 | | 6–10 | 经济变量 | 各自 <$5,000 | 模型正确地学会了几乎忽略它们 | SHAP 证实了 **模型学习到了领域分析所预测的内容**:动能、门店标识和圣诞节前的时机是真正的驱动因素。经济变量只是噪声。 ## 🚨 误差分析 | 指标 | 值 | |---|---| | 平均残差 | 接近于零 —— **模型是无偏的** | | 绝对误差中位数 | ~$29,000 | | 90 分位绝对误差 | ~$95,000 | | 95 分位绝对误差 | ~$121,000 | **模型在哪些地方表现不佳**:高收入、高波动性的门店(Store 20、Store 14)导致了最大的误差。它们突发的需求激增在结构上很难仅从近期历史记录中进行预测。对于这些门店,建议使用针对特定门店的模型或更宽裕的安全库存缓冲。 存在轻微的 **异方差性** —— 预测误差随着实际销售额的增加而扩大 —— 但在所有收入范围内,MAPE 始终保持在受控状态。 ## 💡 商业建议 **1. 根据模型预测重建库存日历,而不是依赖 Holiday_Flag 列。** 该标志表示在 12月31日备货。而模型表示应在 12月14–25日备货。这是截然相反的建议。模型是正确的。 **2. 将基于活动的计划完全集中在 Thanksgiving 上。** 它是唯一能产生可衡量消费者行为变化的已标记节假日 (+41.3%)。Super Bowl (+3.6%) 和 Labor Day (+0.1%) 在总体水平上对运营没有实质性影响。 **3. 采用基于门店级别的预测策略。** 高级别门店(Store 20、Store 4、Store 14)在进入 11–12 月时需要成比例增加的安全库存。单一的全局预测会将 Store 20 和 Store 33 同等对待 —— 但实际上并非如此。 **4. 监控失业率的消费降级信号。** 当失业率 >10.4% 时,由于消费者从更昂贵的零售商处转移过来,Walmart 的销售额会部分恢复。这是一个值得每季度跟踪的宏观经济投资组合级别的信号。 **5. 优先考虑特征工程,而不是模型调优。** 经过特征工程的 Linear Regression 模型 (MAPE 5.22%) 已经优于原始的 XGBoost (MAPE 8.06%)。额外的超参数调优带来的价值会递减;而额外的特征工程则不然。 ## 💰 特征工程的财务影响 在 45 家门店中,从原始特征的 XGBoost (MAPE 8.06%) 切换为工程特征的 XGBoost (MAPE 3.99%): | 提升 | 每店 / 每周 | 45店 / 每周 | 年度 | |---|---|---|---| | 减少 4.07 个百分点的 MAPE | ~$46,000 | ~$2.1M | **~$107M/年** | 此估算仅反映 **预测精度本身的价值** —— 尚未包含任何供应链、人员配置或促销效率提升带来的收益。 ## 📚 Notebook 结构 | # | 章节 | 关键产出 | |---|---|---| | 1 | 设置与数据理解 | 零缺失值 · 确认 8.1 倍门店差距 · 识别出 12月24日的峰值 | | 2 | 惊人发现 | 4 个重塑整个建模策略的反直觉发现 | | 3 | 探索性数据分析 | 季节性模式 · 相关性热力图 · 统计检验 | | 4 | 特征工程 | 15+ 个替代原始变量的工程特征 | | 5 | 模型训练 | LR → Random Forest → XGBoost (基于时间的划分) | | 6 | 原始特征对比工程特征 | LR 的 MAE 降低了 87.9% · XGBoost 降低了 50.6% | | 7 | 模型评估与比较 | 所有模型的完整 MAE / RMSE / R² / MAPE 对照表 | | 8 | 误差分析 | 残差分布 · 门店级误差排名 · 异方差性检验 | | 9 | SHAP 可解释性 | 以美元表示的特征重要性 · 蜂群方向性图 | | 10 | 异常检测 | 前 15 大销售激增 · 75% 未被标记 · 前 10 均处于 12 月 | | 11 | 商业解读 | 库存日历 · 财务影响表 · 运营建议 | | 12 | 经验教训 | 6 个技术要点 + 5 个商业 | ## 🧰 技术栈 | 类别 | 工具 | |---|---| | 数据操作 | Python · Pandas · NumPy | | 可视化 | Matplotlib · Seaborn | | 机器学习 | Scikit-Learn · XGBoost | | 可解释性 | SHAP | | 统计 | SciPy | ## 📁 仓库结构 ``` walmart-sales-forecasting/ │ ├── What_Really_Drives_Walmart_Sales.ipynb # Main notebook (all 12 sections) ├── Walmart_Sales.csv # Raw dataset └── README.md # This file ``` ## 🚀 快速开始 ``` # 1. Clone repository git clone https://github.com/your-username/walmart-sales-forecasting.git cd walmart-sales-forecasting # 2. Install dependencies pip install pandas numpy matplotlib seaborn scikit-learn xgboost shap scipy # 3. Launch notebook jupyter notebook What_Really_Drives_Walmart_Sales.ipynb ``` ## 👤 作者 **Zohair Baloch** 有志成为数据分析师,致力于通过分析、可视化和机器学习将原始数据转化为可操作的商业洞察。 ## ⭐ 如果您觉得这个项目有用 如果这个项目对您有帮助,请考虑在 GitHub 上给它点个 ⭐ —— 这有助于其他人发现这项工作。 *数据集:Walmart Store Sales Forecasting · 6,435 条记录 · 45 家门店 · 2010 年 2 月 – 2012 年 10 月*
标签:Apex, Python, XGBoost, 无后门, 时间序列预测, 机器学习, 逆向工具, 零售分析