前阵子有位做门店运营的朋友来找我,手里攒了一堆按月统计的销售明细,想预测接下来半年的走势,又不太想为这事专门去学 Python,问 SPSS 到底能不能做。我回了一句:能做,而且 SPSS 的时间序列分析模块比你想象的稳得多。
很多人对 SPSS 的印象还停留在卡方检验、方差分析、信度效度这一类操作上,最多再加个线性回归。但 SPSS 的【预测】模块里,指数平滑、ARIMA、季节性分解、自相关分析这些东西都是正经工具,甚至还有一个自动选择模型的专家建模器。对于社科研究者、企业分析师和写论文的学生来说,这算得上桌面级统计软件里最友好的时间序列工具箱之一。
这篇文章不打算写成软件说明书,而是按一个真正项目的流程来讲:数据怎么摆、日期怎么定义、专家建模器怎么快速上手、手动 ARIMA 怎么调参,再用一个门店月销售额的案例把整个流程串起来,最后把 SPSS 输出表里容易读错的指标和常见坑位一并说清楚。
1. 先搞清楚:SPSS 里做时间序列,和回归分析有什么不一样
1.1 时间依赖才是核心:为什么不能拿普通回归直接套
不少第一次接触时间序列分析的朋友,上来就习惯性把数据扔进线性回归,这是最容易踩的坑。普通回归模型有一个基本假设:样本之间相互独立。但时间序列数据天生就违反这个假设,因为相邻时间点的观测值几乎都是相关的。比如一个门店 1 月销售额冲到高点,2 月大概率不会突然断崖式下跌;这个月的用户量高,下个月也有惯性。这种“时间依赖”如果被忽略,回归模型的显著性会被严重夸大,预测误差也会被低估。
SPSS 的时间序列分析,本质上就是在做一件事:把时间依赖拆解成趋势、季节性、周期和随机波动四个部分,然后分别建模。它不再把每个月份当成完全独立的个案,而是当成一个连续的、有先后关系的过程来处理。理解了这一点,再看后面的操作就不会觉得只是在点菜单。
1.2 SPSS 时间序列模块到底能做哪些分析
在动手之前,先盘一下手工上能用到哪些功能。以 SPSS Statistics 26 及以上版本为例,【分析 > 预测】菜单下面主要提供了这几类东西:
- 专家建模器:自动比较指数平滑和 ARIMA 的一批候选模型,自动判断是否差分、是否含季节项,适合快速出结果。
- 传统建模方法:指数平滑里的简单法、Holt 线性趋势法、Holt-Winters 加法/乘法模型;ARIMA 也就是 Box-Jenkins 方法;季节性分解;谱分析。
- 辅助诊断工具:自相关图、偏自相关图、交叉相关图,用于判断序列的平稳性和模型阶数。
- 应用模型:把训练好的模型保存成 XML 文件,之后可以对新数据直接打分预测。
这些功能并不比某些编程工具弱,只是很多人不知道。尤其专家建模器,它能在后台跑出几十个候选模型,最后按信息准则挑一个,这个逻辑放在 R 或 Python 里得写不少代码。
1.3 数据表格应该长什么样
SPSS 的数据视图还是老规矩,一行一个观测,但时间序列分析有一个特殊要求:必须有一个“代表时间顺序”的变量,并且时间间隔要等距。比如每个季度一条、每个月一条、每周一条。如果你的数据里有的月份有记录、有的月份没有,那就不是等间隔,后面做滞后项和差分都会出问题。
举例来说,要做月度销售额预测,数据表中最少要有两列:一列是年月,比如 2018 年 1 月;一列是指标值,比如销售额。日期列可以是字符串“2018/01”,也可以是数值 201801,但 SPSS 不会因为你填了这个就自动知道它是月度数据。真正告诉 SPSS“这是一组按月排列的时间序列”的操作,是菜单栏里的【数据 > 定义日期和时间】。这一步没做,后面一大堆分析菜单都用不了,或者分析结果完全不对。
2. 数据准备:日期定义和缺失值处理,这一步能挡掉绝大多数报错
2.1 先把时间刻度告诉 SPSS:定义日期和时间
具体操作如下,建议第一次做的时候一步一步跟。
第一步,打开数据文件,确认日期列和指标列都在。 第二步,点击菜单【数据 > 定义日期和时间】。系统会弹出一个对话框,左边是“个案数”,右边是时间间隔选项。 第三步,根据数据粒度选择间隔。月度数据选“年、月”,季度数据选“年、季度”,日数据选“日”。如果数据带月份又有周的概念,也可以选“年、月、周”这种组合,但一般用不到。 第四步,在“第一个个案”区域填写起始时间。比如数据从 2018 年 1 月开始,就填入年份 2018、月份 1。 第五步,点击确定。
完成后,数据视图末尾会自动生成几个新变量,通常包括 YEAR_、MONTH_、DATE_ 等。DATE_ 是 SPSS 内部真正认识的日期变量,后面画图、建模型时选它做时间轴就对了。
这里有一个容易被忽略的点:定义日期之后,SPSS 会把这个文件标记为“时间序列数据”,并且记住你的时间周期。月度数据对应的季节周期长度是 12,季度数据是 4。如果这一步选错了,等于整个模型的前提就错了。
2.2 时间序列里缺失值不能随便删
普通问卷数据遇到缺失值,最省事的办法是整行删除。但时间序列数据绝对不建议这么干。原因很简单:你删掉哪一个月,SPSS 根本不知道那个月存在过,它会把下一个月当成上个月的紧邻期,所有滞后关系就错位了。
举个例子,1 月、2 月、4 月有数据,3 月缺失。如果你不处理,滞后 1 期时,SPSS 计算的是 1 月对 2 月、2 月对 4 月,这样 4 月被当成 3 月的下一个月,本来应该有的 2 月到 3 月的间隔消失了,自相关结构完全被打乱。
处理缺失值一般有两个思路。如果缺失的量不大,先用【转换 > 替换缺失值】补上。SPSS 提供了几种填充方法:序列均值、相邻点均值、相邻点中位数、线性插值、线性趋势等。对于月度销售数据,我一般用线性插值,因为它能保持一定的连续性。如果缺失值集中在尾部,也就是最近几个月没有数据,那要更小心,因为模型会把这种情况理解成“趋势中断”,预测结果容易明显偏低。
2.3 画序列图是建模前必做的体检
不管你是用专家建模器还是手动建 ARIMA,建模之前都应该先画一张序列图。操作路径:【图形 > 时间序列 > 序列图】。把销售额变量选入“变量”,把 DATE_ 放入“时间轴标签”。
序列图主要看三件事:
- 有没有明显的长期上升或下降趋势。如果有,说明序列非平稳,后面可能要差分。
- 有没有规律性的周期波动。月度数据通常能看到每年的旺季和淡季,比如 12 月冲高、2 月回落的循环。
- 有没有异常点,以及波动幅度是否随水平升高而变大。如果方差不稳定,可以考虑对数据取对数之后再建模。
这一步花不了两分钟,但对后续模型选择非常有帮助。很多人跳过序列图直接跑专家建模器,结果模型出来的趋势和季节项跟业务实际对不上,回头再排查,才发现数据里有异常值或者周期定义错了。
3. 快速上手:用专家建模器跑出一个预测模型
3.1 菜单路径和关键选项
如果你的需求是做预测,最省力的路径是用专家建模器。操作步骤:
- 点击【分析 > 预测 > 创建模型】。
- 把“销售额”选入“因变量”列表。
- 方法下拉框保持默认的“专家建模器”。
- 点击“统计”按钮,勾选需要的拟合指标,建议勾上稳定 R 方、R 方、RMSE、MAPE、正态化 BIC、Ljung-Box Q 检验。
- 点击“图”按钮,勾选“序列图”,方便看拟合值和实际值的对比。
- 点击“保存”按钮,勾选“预测值”、“置信区间下界”、“置信区间上界”,这样预测结果会直接写回数据表。
- 点击“选项”按钮,设定预测周期。可以在“最后一个个案之后指定预测周期”里填 12,意思是往后预测 12 个月;也可以选择指定日期。
- 点击确定,跑模型。
整个过程不需要写一行代码,跑完以后,输出窗口会出现模型描述表、模型拟合统计量表、模型参数表,以及拟合图。数据视图末尾会多出几列,比如 Model_1 的预测值、置信区间上下界。
3.2 专家建模器到底在做什么
很多人在这一步会问:它到底是怎么选模型的?其实原理不复杂。SPSS 会在后台同时准备一批候选模型,包括指数平滑家族的简单法、Holt 线性趋势、阻尼趋势、Holt-Winters 加法/乘法模型,以及 ARIMA 模型的若干种 p、d、q 组合。它会对这些模型逐个估计,然后按照信息准则和拟合误差做比较,最终选出一个相对最优的模型。
这里有个细节值得强调:专家建模器不仅能判断要不要差分,还能判断要不要季节项。如果数据有明显季节性,它给出的模型会带季节差分或季节 ARIMA 项;如果数据就是个随机波动,它可能会选简单指数平滑。换句话说,普通用户不需要先手动做平稳性检验,这一步被自动化了。但自动化不等于万能,后面我会专门讲它的局限。
3.3 模型跑出来了,先别急着看预测值
输出结果里最值得先看的是“模型描述”表。这张表里的“模型类型”一列会告诉你 SPSS 最后选了哪种模型。比如写的是 ARIMA(0,1,1)(0,1,1),意思是模型包含一阶差分、一个非季节 MA(1) 项、一阶季节差分和一个季节 MA(1) 项。这说明数据里有趋势,也有以 12 为周期的季节性。如果写的是“指数平滑-简单”,则意味着序列基本平稳,没有明显趋势和季节,模型只会把未来预测成一个围绕均值的水平线。
这一步是在给你交底:软件到底替你做了哪些决定。很多人拿到预测结果就直接截图,结果被导师或领导问“你的模型是什么”,答不上来,就是没看这张表。
3.4 预测值是怎么写回数据表的
运行完后,回到数据视图,拉到表格最下面,你会发现多了 12 行。这些行的日期变量 DATE_ 被自动扩展到了未来 12 个月,YEAR_、MONTH_ 也跟着填好,同时 Model_1 的预测值和置信区间上下界都出现在对应的新行里。这就是前面“保存”选项的作用。
如果想把历史实际值和未来预测值画在一张图里,可以再用【图形 > 时间序列 > 序列图】,把销售额和预测列都选进去。这样看起来更直观,汇报时也更好用。
4. 手动路子:用 ACF/PACF 图自己识别 ARIMA 模型
4.1 为什么要会手动建模型
可能你会问:专家建模器已经能自动选模型了,我为什么还要手动建?因为自动选模型有它照顾不到的地方。一是输出报告里往往需要你写清楚“模型是怎么识别出来的”,这时候你不能说“专家建模器选的”,得展示你看了自相关图、偏自相关图,经过判断后才确定了 p、d、q。二是遇到数据量太少、异常值多、业务上有特殊干预事件时,自动算法选出来的模型可能不符合实际,手动建模能给你更多控制权。
4.2 自相关图和偏自相关图怎么看
先做自相关分析。路径:【分析 > 预测 > 自相关】。把销售额选入变量,勾选“自相关”和“偏自相关”,其它选项保持默认。SPSS 会输出两张图:ACF 图和 PACF 图,并画出 95% 置信带。
看图的核心规则可以整理成下面这张表:
| ACF 表现 | PACF 表现 | 倾向选用的模型 |
|---|---|---|
| 截尾 | 拖尾 | MA(q) |
| 拖尾 | 截尾 | AR(p) |
| 拖尾 | 拖尾 | ARMA(p, q) |
| 衰减极慢、长期为正 | 第一阶或前几阶很大 | 序列非平稳,先差分 |
所谓“截尾”,是指自相关系数在某一个滞后阶之后快速落入置信带内,不再显著;所谓“拖尾”,是指自相关系数随着滞后阶数增加缓慢衰减,虽然有波动,但长期处在显著状态。如果你的 ACF 图呈现出衰减极慢的正相关,尤其是连续十几期都超过置信带,那基本可以认定原始序列不平稳。这时候不要硬套 ARMA 模型,先做差分。
4.3 在 SPSS 里手动设置 ARIMA(p,d,q)
手动建立 ARIMA 模型还是在【分析 > 预测 > 创建模型】这个窗口,只不过方法下拉框从“专家建模器”改成“ARIMA”。选完之后下方会出现非季节性部分 p、d、q 和季节性部分 P、D、Q 以及周期长度。
具体怎么定阶?我常用的顺序是这样:
第一步,先看原始序列图,确定 d。有明显趋势的取 d=1;方向不确定或者趋势很弱,可以先做一次差分再看图。 第二步,差分后再看 ACF 和 PACF。差分操作可以用【转换 > 创建时间序列】,方法选“差值”,或者直接在 SPSS 语法窗口写:
COMPUTE sales_diff = sales - LAG(sales). EXECUTE.第三步,观察差分后 ACF 和 PACF 的截尾/拖尾情况,对照上面那张表确定 p 和 q。比如差分后 ACF 第 1 阶很大、第 2 阶骤然不显著,而 PACF 缓慢衰减,那很可能适合 MA(1),也就是 ARIMA(0,1,1)。 第四步,如果数据有明显季节性,再考虑季节差分和季节项。月度数据周期填 12,季度数据填 4。
手动建模有一个比较麻烦的地方:你可能会在几个候选模型之间纠结。这时候可以建几个模型,然后对比“正态化 BIC”和“平稳 R 方”,选一个拟合更好、残差更干净的。
4.4 手动模型也需要诊断
模型跑完以后,不要以为参数显著就结束了。SPSS 会输出残差的自相关函数和偏自相关函数,还会给出 Ljung-Box Q 检验结果。这一步核心是看残差是不是“白噪声”,也就是残差序列里不应该再含有可提取的自相关。
判断标准很简单:Ljung-Box Q 检验的显著性 P 值大于 0.05,说明残差已经是白噪声,模型可以接受;如果 P 值很小,说明残差里还有模式没被抽干净,要么 p、q 没定对,要么季节性没处理好。SPSS 的专家建模器内部也会自动执行这一步,但手动建模时必须自己盯。
整个手动建 ARIMA 的流程可以总结成一个闭环:识别阶数 → 估计参数 → 残差诊断 → 不满意再回到第一步。这个过程看起来多,但熟练之后很快,而且你对数据的理解会远超直接点一个“专家建模器”按钮。
5. 案例拆解:门店月销售额的时间序列建模与预测全流程
5.1 数据和背景
为了把前面讲的步骤串起来,我模拟一个门店的月度销售额案例。假设数据从 2018 年 1 月到 2023 年 12 月,共 72 个月,单位是万元。数据的基本特征:整体有缓慢上升趋势,每年 11 月、12 月因为促销冲高,2 月因为春节回落。目标是预测 2024 年全年 12 个月的销售额。
这个数据形态非常典型:既有趋势,又有周期,还带一点噪声。适合演示指数平滑或 ARIMA 的季节建模。
5.2 完整操作链路
第一步,整理数据。把原始数据导入 SPSS,确保每个月的销售额一行。日期列有年份和月份。
第二步,定义日期。点击【数据 > 定义日期和时间】,选择“年、月”,起始个案设为 2018 年 1 月。完成后生成 YEAR_、MONTH_、DATE_ 三个变量。
第三步,画序列图。用【图形 > 时间序列 > 序列图】查看销售额走势。这时应该能看到明显的上升趋势和以年为周期的波动。
| 日期 | 销售额(万元) |
|---|---|
| 2018-01 | 102 |
| 2018-02 | 84 |
| 2018-03 | 95 |
| 2018-04 | 98 |
| ... | ... |
| 2023-12 | 178 |
第四步,跑专家建模器。在【分析 > 预测 > 创建模型】里,销售额选入因变量,方法选“专家建模器”,统计量勾选稳定 R 方、R 方、RMSE、MAPE、正态化 BIC、Ljung-Box Q,图勾选序列图,保存勾选预测值和置信区间,选项里预测期数填 12。
第五步,手动建模做对比。如果专家建模器给了 ARIMA(0,1,1)(0,1,1),我通常会手动指定同样的模型再跑一遍,看两个模型的拟合指标是否接近,顺便确认参数表里的系数是否合理。
5.3 模型输出结果示例
假设最终跑出来的模型类型是 ARIMA(0,1,1)(0,1,1),模型拟合统计量如下表。注意这组数字是我为了说明问题构造的示例,不是某个真实门店的数据。
| 统计量 | 示例值 |
|---|---|
| 稳定 R 方 | 0.74 |
| R 方 | 0.90 |
| RMSE | 6.2 |
| MAPE | 4.8% |
| 正态化 BIC | 5.12 |
| Ljung-Box Q(18) | 15.2 |
| 显著性 | 0.65 |
这个结果里,稳定 R 方 0.74 说明差分后的模型能解释大部分非平稳波动;MAPE 4.8% 对销售预测来说精度不错;Ljung-Box Q 检验的显著性 0.65,远大于 0.05,说明残差没有明显的自相关,模型诊断通过。
导出预测结果后,可以得到未来 12 个月的预测值和 95% 置信区间,格式类似:
| 日期 | 预测值 | 下界 | 上界 |
|---|---|---|---|
| 2024-01 | 132.5 | 120.1 | 144.9 |
| 2024-02 | 121.3 | 107.4 | 135.2 |
| 2024-03 | 129.8 | 114.8 | 144.8 |
| ... | ... | ... | ... |
到这里,一个完整的 SPSS 时间序列预测项目就算跑通了。从原始数据到拿到预测值,熟练以后整个过程不超过十分钟。
5.4 预测图怎么导出
结果窗口里的预测图,可以直接右键导出为图片,也可以先复制到粘贴板再贴到报告里。如果想自己重新排版,用【图形 > 时间序列 > 序列图】,把历史销售额和预测值同时放进去,再补上置信区间,生成更符合自己需要的图。有一点要注意:SPSS 自动生成的预测图通常会把历史期和预测期放在同一个横轴上,如果你只需要未来部分,可以在图表编辑窗口里调整坐标轴范围。
6. 结果解读:SPSS 输出表里真正值得盯的指标
6.1 模型描述表:确认软件替你选了啥
第一次跑出结果时,先看“模型描述”表,确认模型类型。比如看到 ARIMA(0,1,1)(0,1,1),要能翻译成业务语言:模型对数据做了一阶差分,抵消了长期趋势;再做一阶季节差分,消除了 12 个月的周期循环;最后用移动平均项处理随机波动。如果这步看不懂,后面所有参数表都很难读明白。
6.2 拟合优度和误差指标怎么权衡
SPSS 输出里会同时给出 R 方、稳定 R 方、RMSE、MAPE、MAE、正态化 BIC、Ljung-Box Q 等一堆统计量。真正值得关注的排序,我个人是这样:
- 稳定 R 方:优先看。它是基于差分后的序列计算的,去掉了趋势和季节成分的影响,更能反映模型对非平稳信息的捕捉能力。
- RMSE 和 MAPE:看误差大小。MAPE 是百分比误差,跨数据集相对容易理解。如果 MAPE 超过 15%,预测精度一般;如果低于 5%,通常说明模型拟合得不错。
- 正态化 BIC:用于不同模型之间的比较,越小越好。它没有绝对的“好”或“坏”临界值,别单独拿出来说。
- R 方:在时间序列里最容易误导人。因为原始序列本身有强烈趋势时,R 方天然会很高,哪怕预测方向完全错误,R 方也可能在 0.9 以上。所以看一眼就行,别把它当作主要依据。
6.3 参数表里看哪些问题
模型参数表会列出常数项、AR/MA 项系数、标准误、t 值和显著性。我一般会看三点。
第一,每个参数是否显著。比如 MA(1) 系数的显著性小于 0.05,说明这项确实对解释序列有帮助。第二,系数的绝对值是否接近边界。如果 MA 项的系数接近 0.99 或 -0.99,有可能是过度差分或者模型存在冗余。第三,常数项在差分模型里的含义和普通回归不一样。差分后的常数项代表“漂移项”,也就是每期平均增加的量,不要直接解释成截距。
6.4 预测置信区间为什么会快速变宽
SPSS 默认输出 95% 置信区间,也就是预测表里的 LCL 和 UCL。预测期越往后,区间越宽,这是正常现象,因为不确定性会随预测步数增加而累积。有些初学者看到第 12 个月的区间宽得离谱,以为是模型出错了,其实并不是。如果区间宽到完全失去参考价值,说明数据本身的确定性低,或者模型对信号的提取不充分,这时可以从业务角度决定要不要缩短预测长度或改用更保守的模型。
7. 常见坑与排查:我从实际项目里总结的七条经验
7.1 日期没定义好,季节分析全是空
症状:专家建模器给出的模型没有任何季节项,即使盯一眼序列图明明有规律性的年末冲高。 排查:去【数据 > 定义日期和时间】看起始日期是否对上,周期是否和真实数据一致。如果数据是月度数据,定义时却选了“年”,SPSS 就完全不知道有月度循环,自然不可能输出季节模型。定义日期之后,打开数据表确认自动生成的 YEAR_、MONTH_ 是从正确起点开始的,这一步值得花十秒钟。
7.2 缺失月份直接留空,模型结果乱跳
症状:ACF/PACF 图上出现奇怪的滞后相关性,预测值突然出现不规律的尖峰。 排查:检查时间轴上是否有缺失的周期节点。比如数据里 5 月之后直接跳到 7 月,6 月没了,SPSS 会把 7 月当成 5 月的下一期,导致所有滞后关系错位。处理办法是先用【转换 > 替换缺失值】,选择“线性插值”,把时间轴补齐。如果缺失值集中在末尾,则要特别注意模型会不会把缺失当趋势外推,最好先说明数据收集中断的原因再决定怎么补。
7.3 过度依赖专家建模器
症状:模型各项统计指标都很好,但预测方向明显不符合实际情况。 排查:专家建模器选择模型靠的是统计准则,不依赖业务经验。比如历史数据里每年 12 月有大促,模型很可能把 12 月的冲高当作固定季节效应,即使明年不准备搞同样力度的大促,它也会照常预测出一个高值。这时候就得靠人来判断:要么手动指定模型,要么在“创建模型”对话框中加入未来的营销变量作为自变量,或者直接手动调整预测结果。统计准则永远替代不了对业务背景的理解。
7.4 差分次数过多导致预测剧烈震荡
症状:差分后的序列出现明显的负自相关,预测结果上下剧烈跳动,模型参数里 MA 项系数接近 -0.99。 排查:一般数据最多做一阶差分就够了,除非确实有明显的二阶趋势。如果一阶差分之后序列仍不平稳,优先尝试对数变换,而不是继续加大差分次数。反复差分会把数据里的随机波动放大,造成过度差分,结果就是模型在训练集里拟合得不错,预测却非常不稳定。
7.5 预测周期和预期不符
症状:设置了预测 12 期,结果只出来 8 行,或者多出来 15 行。 排查:先看数据末尾最后一个日期是什么时候。如果数据实际只到 2023 年 12 月,但在定义日期时把最后一个日期定义成了 2024 年 4 月,模型会在那些“将来的日期”位置上填入预测值,导致行数对不上。另一种情况是数据中间缺月,SPSS 会按日期变量补全,输出和你预期不一样。遇到这类问题,检查“选项”里是否勾选了“在最后一个个案之后指定预测周期”,还是勾了“指定为日期”。
7.6 预测结果出现不可能出现的数值
症状:销售额预测出来是负数,库存量预测超过仓库容量,百分比预测大于 100。 排查:SPSS 的时间序列模型本身不做范围限制,它只会按统计规律外推。如果业务指标不允许出现负值,一种常用做法是先对目标变量取对数,建立模型并预测,再把预测结果用 EXP 函数反变换回来。注意这种还原会有一点系统性偏差,严谨一点可以在反变换后乘以 exp(MSE/2) 做修正,但这个细节在业务汇报中往往可以按需简化。
7.7 数据量不足,却非要识别季节模型
症状:只有 12 个月的数据,却希望模型把“季节性”找出来,结果季节项根本不显著。 排查:时间序列分析中,季节模型需要看到至少两个完整周期,也就是月度数据至少要有 24 个月、季度数据至少要 8 个季度,不然软件算出来的季节因子没有任何稳定性可言。少于这个量级时,别强行上季节 ARIMA,老老实实做指数平滑或者简单趋势模型,预测结果反而更靠谱。这个原则没人写在菜单里,但实际项目里非常常见。
最后分享一个我自己的处理习惯:跑正式模型之前,永远先花几分钟画一张序列图,再把最近半年的走势单独拉出来看两遍。时间序列分析这件事,软件负责计算,但判断始终得靠自己。SPSS 把计算门槛降到了很低,能不能得出可信的预测,最终还是看你有没有把数据准备、模型诊断和业务直觉这三件事做扎实。