垃圾进,垃圾出
MMM 模型的质量上限由数据质量决定。再好的引擎、再精妙的参数,如果输入数据有问题,输出一定不可信。SparkX 的 Instant Mode 在上传数据时会自动执行 9 步数据质量检查,但理解这些检查背后的逻辑,能帮你更快定位问题。
10 项必查清单
1. 时间范围足够
MMM 至少需要 52 周(1 年)的周度数据,推荐 104 周(2 年)。低于 52 周时,模型无法区分季节性效应和渠道效应。SparkX 的最低行数阈值是 52 行(周度)或 365 行(日度)。
2. 时间粒度一致
数据必须是均匀间隔的时间序列——每周一行或每天一行。不能混用周度和日度。如果某些渠道只有月度数据,需要分配到周/日(按天数均匀分配或按已知投放节奏分配)。
3. 无时间缺口
时间序列不能有缺失的日期/周。检查方法:计算相邻两行的日期差,如果差不等于 7 天(周度)或 1 天(日度),说明有缺口。缺口期间需要插值或标记为 0 花费。
4. 因变量非零非空
收入/销量列不能有缺失值或全 0 行。如果某周确实没有销售数据,需要用前后周的平均值插值,或从分析中排除该周。全 0 的因变量会导致模型无法估计截距。
5. 渠道花费非负
所有渠道花费列必须 ≥ 0。负花费没有业务含义。如果出现负值,通常是数据导入错误(如退款被记为负投放),需要修正为 0 或正值。
6. 渠道花费有变异性
每个渠道的花费不能是常数(比如每周都是 $10000)。如果花费不变,模型无法估计该渠道的效应——因为没有"高低对比"。检查方法:计算每列的标准差,标准差为 0 的渠道需要从模型中排除或合并。
7. 渠道间不过度共线
检查渠道间的相关系数矩阵。如果两个渠道相关系数 > 0.95,模型无法区分它们的贡献。详见 多重共线性一文。解决方法:合并渠道或调整投放策略。
8. 异常值检测
检查因变量和自变量中的异常值——比如某周收入突然是平时的 10 倍(可能是双十一大促),或某渠道花费突然为 0(可能是停投)。异常值需要用 indicator variable 标记,让模型知道"这周有特殊事件"。
9. 控制变量齐全
除了渠道花费,模型还需要控制变量来解释非营销因素导致的收入变化:
- 季节性:月份 indicator 或 Prophet 分解的趋势/季节分量
- 节假日:春节、双十一、Black Friday 等 indicator variable
- 价格变动:产品价格指数或折扣力度
- 分销变化:门店数量、上架 SKU 数等
- 宏观因素:CPI、疫情 indicator 等(如适用)
10. 数据类型正确
确保每列的数据类型正确:日期列是 datetime(不是 string),花费列是 numeric(不是 string),因变量是 numeric。SparkX 的自动字段映射会识别列类型,但手动检查能避免映射错误。
常见数据问题
- 含税含运的收入:确保因变量是"净收入"而非"含税含运的总收入",否则渠道 ROI 会被系统性低估
- 渠道分类过细:把 Google Search 和 Google Display 分成两列是可以的,但把 Google Search 按关键词分成 20 列就会导致数据稀疏和共线性。建议 5-15 个渠道列
- 时区不一致:花费数据和收入数据的时区要一致。如果花费是 UTC 但收入是北京时间,周度对齐会出错
- 费用含服务费:有些渠道的花费包含平台服务费,有些不含。需要统一口径
自动化校验
SparkX Instant Mode 上传数据后自动执行以下校验:
# SparkX 自动数据检查(9 步 Pipeline 第 1 步)
1. 列类型识别:自动区分日期、因变量、花费列、控制变量
2. 时间范围检查:>= 52 行,无缺口
3. 缺失值检测:标记缺失行和缺失单元格
4. 异常值检测:IQR 方法标记离群点
5. 花费非负检查:标记负值行
6. 变异性检查:标记标准差为 0 的渠道
7. 共线性诊断:计算 VIF,标记 > 10 的渠道对
8. 相关性矩阵:渠道间和渠道-因变量相关系数
9. 数据摘要:行数、列数、时间范围、花费总计
检查通过后才会进入 EDA 和建模阶段。如果有严重问题(如行数不足或因变量全空),会直接报错并给出修复建议。
总结
数据质量是 MMM 的基石。一份干净、完整、有变异性的数据,比一个复杂的模型更重要。在跑模型之前,花 30 分钟过一遍这份清单,能避免后面数天的排查和返工。
想了解数据准备的最佳实践?看 MMM 数据准备指南。想了解 SparkX 的完整 9 步 Pipeline?看 产品文档。
SparkX Instant Mode 上传 CSV 后自动执行 9 步数据检查,2 分钟告诉你数据有没有问题。试试上传你的数据。