简介:面向时间序列分析课程作业与项目实践的压缩资料,围绕分解、指数平滑、ARIMA等主要方法,展示Excel、Matlab、SPSS软件中的实现思路。资料包共55个文件,以32个m脚本为主,配合17个xlsx与2个xls数据表格,以及docx、md、readme等说明文档,整体约967KB,内容虽小却覆盖从数据预处理、趋势分解到模型预测的完整链路。已有61人学习下载,包内多为可运行的代码与样例数据,包含季节性分解案例(如香槟销量数据)、Holt-Winters平滑、指数平滑变体、Gompertz/Logistic/ExpMod曲线拟合与MAPE对比,适合数据分析与预测初学者按目录逐步练习。项目还附有读取变量工具与README说明,可帮助快速复现实验,并支撑课程报告或项目方案整理。
1. 时间序列分析到底在解决什么问题
先说个我自己的体会。刚接触时间序列分析那会儿,我总觉得它就是"拿历史数据画条线,然后往未来延伸"。真到动手做项目才发现,这个认知太浅了。时间序列分析的核心不是"画线预测",而是从一组按时间顺序排列的数据里,把隐藏在波动背后的规律拆出来——趋势是什么走向、季节性波动有多强、随机噪声占了多少比例。只有把这些成分拆明白了,预测才有依据,决策才靠得住。
这个领域最常见的三个方法就是标题里写的:分解、指数平滑、ARIMA模型。它们之间的逻辑关系不是并列的三个孤岛,而是一条递进的路径:分解是"看结构",指数平滑是"做预测的轻量方案",ARIMA是"把随机性和相关性一起建模"。
适合读这篇文章的人,我默认是这么几类:
- 手头有一批销售、库存、流量或财务数据,想预测下个月或下一季度的走势;
- 学过一点统计学,但没系统用过Excel、SPSS、Matlab做过完整的时间序列案例;
- 或者你已经在用某个工具点菜单做预测,但不太清楚背后到底发生了什么。
这篇文章的价值在于,我会把三个方法的核心逻辑讲透,同时把Excel、SPSS、Matlab三款工具在各个环节里怎么用、哪个环节用哪个最顺手、最容易踩什么坑,一次性说明白。你不需要是统计科班出身,只要会操作表格软件,按步骤走就能跑通一个完整的时间序列分析流程。
2. 数据准备和工具选型:时间序列分析的第一步其实最容易被忽视
很多人拿到数据就直接开始选模型、点按钮,结果预测结果一团糟,还以为是模型不行。我在实际项目里见过太多这样的情况,最后排查下来,问题出在数据本身——数据没洗干净、时间轴不对齐、缺失值没处理,这一步做不好,后面用什么高级模型都是白搭。
2.1 整理时间序列数据的三条铁律
第一条,时间轴必须连续且等间隔。月度数据就每个月一条,周度数据就每周一条,中间缺了某个时间点,后面做差分、算自相关函数都会出问题。Excel里能用"填充-序列"快速生成连续的日期列,SPSS里用"日期和时间向导"也可以,Matlab里用datetime类型生成时间轴最方便。关键是生成之后要对一遍,看看有没有跳过的月份或重复的日期。
第二条,缺失值要显式处理。不能用删除整行的方式处理,因为时间序列的样本点本身就少,删掉意味着信息丢失。常见做法是线性插值,或者用相邻值的均值填充。Excel里可以用"数据-填充-向下填充"配合筛选做简单填充,SPSS里"转换-替换缺失值"提供了线性插值、相邻点均值、中位数等多种方法,Matlab里fillmissing函数一行代码搞定。
第三条,异常值要标记而不是直接改掉。时间序列里的"尖峰"可能是真实业务波动(比如大促那天的销量),也可能是录入错误。直接改成均值会掩盖真实规律,正确的做法是先标记出来,结合业务背景判断是否保留。我一般会在Excel里先做一列差分值,看看哪些点的变化率异常大,再人工判断。
2.2 Excel、SPSS、Matlab:三款工具的定位差异
工具选择这件事,我总结过一个经验:不要神话任何一款软件,也不要鄙视任何一款软件,关键看你的场景和水平阶段。
| 工具 | 最适合的环节 | 上手难度 | 典型用户 |
|---|---|---|---|
| Excel | 数据清洗、快速可视化、简单移动平均和指数平滑 | 低 | 业务分析人员 |
| SPSS | 菜单式统计建模、分解法、ARIMA参数估计 | 中 | 统计初学者、社科研究者 |
| Matlab | 自定义算法、批量实验、复杂模型调试 | 中高 | 工程研发、算法调优人员 |
我用一个实际场景说明:假设你拿到一份过去36个月的销售数据。
- 用Excel做初步探索最舒服,透视表看月度汇总、折线图看趋势,再插入一个数据透视图就能直观看到季节性波动;
- 想正式做分解模型和ARIMA建模时,SPSS的"预测"菜单非常友好,所有选项都有中文提示,不需要写代码;
- 但如果要做滚动预测、多组数据批量跑模型、或者对比不同参数组合的效果,Excel和SPSS就显得笨重了,这时候Matlab脚本的优势就出来了。
我的建议是:新手从Excel起步理解数据,再用SPSS跑通标准建模流程,最后用Matlab实现更灵活的批处理和算法调整。这样每个工具都在它最合适的环节发挥作用,学起来也最有成就感。
3. 分解法:把时间序列拆开看,趋势、季节、残差一目了然
分解法这个名字听起来学术,其实逻辑特别朴素。任何一个时间序列,都可以拆成三部分:
- 趋势(Trend):长期来看的上升或下降方向;
- 季节性(Seasonal):固定周期内的重复波动,比如每年年底销量冲高、夏季空调需求量增大;
- 残差(Residual/Random):剔除趋势和季节后剩下的随机波动。
你把这三部分拆开来看,比直接盯着一堆原始数据点直观得多。这也是为什么我建议每个做时间序列分析的人,第一步先做分解——先看清数据长什么样,再动手建模。
3.1 加法模型还是乘法模型
分解模型有两种基本形式:
- 加法模型:( Y_t = T_t + S_t + R_t ),各部分独立叠加;
- 乘法模型:( Y_t = T_t \times S_t \times R_t ),各成分按比例作用。
选择标准很简单:如果季节性波动的幅度随着趋势升高而变大,用乘法模型;如果波动幅度基本稳定,用加法模型。举个生活化的例子:一家奶茶店月销售额从5万涨到50万,旺季和淡季的销量差距也从1万拉大到10万,这就是典型的乘法效应。
SPSS里做分解,路径是"分析-预测-季节性分解",它会自动生成四个新列:趋势、季节因子、误差和调整后的序列。Excel里虽然没有一键分解,但可以用两次移动平均实现:第一次移动平均去掉季节性得到趋势,再用原值除以趋势得到季节比率。
3.2 Excel手动分解一份销售数据的具体步骤
假设你的数据在A列(日期)、B列(销售额),从2019年1月到2024年12月共72个月,要做乘法分解:
- 计算12个月中心化移动平均:在C列输入公式
=AVERAGE(B2:B13),然后向下填充。注意这里有一个细节,月度数据用12期移动平均时,为了保证移动平均值正好对应到每个时间点,需要做一次中心化处理,即再对相邻两个移动平均值求一次均值。SPSS会自动完成这个步骤,Excel里我一般直接手动把C列结果再平移半格求一次平均。 - 计算季节比率:D列
=B2/C2,这就是每个实际值相对于趋势值的比例。 - 计算季节指数:把D列按月份分组求平均(用透视表最快),得到12个季节指数。比如1月平均是0.85,说明1月比趋势值低15%;8月平均是1.12,说明8月比趋势值高12%。
- 分离残差:E列
=D2/对应月份的季节指数,剩下的就是随机波动部分。
这个手动过程的意义在于:你亲手一步步拆解之后,对"组成成分"这个概念的理解会远超直接点SPSS按钮。我也承认,Excel手动做确实麻烦,所以如果不是为了学习理解,直接用SPSS更高效。
3.3 分解结果能告诉你什么
分解完成后,你会得到以下可落地的结论:
- 趋势线是向上还是向下,斜率有多大,这决定你的长期策略;
- 季节因子强不强,哪些月份是天然高峰,哪些月份需要促销拉动;
- 残差的波动幅度,反映预测的不确定性有多大。残差部分波动很大,说明除了趋势和季节之外,还有不少随机因素在起作用,这时候单独用分解法做预测,置信区间会很宽。
用分解法做预测的方式也很直接:先预测趋势值(用线性回归或简单延展),再乘以对应的季节指数,就得到未来的预测值。Excel里可以用FORECAST函数对趋势列做延伸预测,SPSS的预测功能会直接给你配好置信区间。
我觉得分解法最大的价值不在预测精度,而在于它逼着你先理解数据内部结构,再去做下一步建模决策。这一点是很多直接跳到ARIMA模型的人最容易忽略的。
4. 指数平滑:简单参数背后有大学问,选对平滑系数是关键
指数平滑的原理一句话就能说清:近期数据比远期数据更重要,所以给不同时期的数据分配递减的权重。它不像移动平均那样给所有历史点同样的权重,越靠近当前时刻的数据权重越大。这个思路特别符合业务直觉——上个月的销量肯定比12个月前的销量更能说明下个月的走势。
4.1 三次指数平滑的递进逻辑
指数平滑有三个层级,理解它们的递进关系比记公式重要:
- 一次指数平滑:适合没有趋势也没有季节性的平稳数据,预测值就是历史值的加权平均。
- 二次指数平滑:在一次的基础上加入趋势项的估计,适合有线性趋势但无季节性的数据。
- 三次指数平滑(Holt-Winters):在二次的基础上再加入季节性项的估计,适合既有趋势又有季节性波动的数据。
销售额、流量、用电量这类数据几乎都同时有趋势和季节性,所以实际用得最多的是三次指数平滑。判断方法也很直接:画出原始序列图,如果图里既有明显的上升/下降趋势,又有规律的周期波动,就上三次指数平滑;只有趋势没季节,用二次就够;数据看起来就是围绕一个均值波动,没有明显趋势,一次就行。
4.2 Excel和SPSS里实操要点
Excel做指数平滑很容易:点击"数据-数据分析-指数平滑",输入输入区间和阻尼系数(注意,Excel用的是阻尼系数,不是平滑系数,两者关系是阻尼系数=1-平滑系数),再勾选"图表输出"和"标准误差"。这里有个初学者常见的坑:Excel的指数平滑工具只能做一次指数平滑,做不了趋势和季节性的二次三次。真要完整做,要么用Excel的FORECAST.ETS函数,这个函数支持Holt-Winters算法并自动优化参数;要么就得转SPSS或Matlab。
SPSS里点击"分析-预测-创建模型",把变量拖进去,方法选"指数平滑",SPSS会自动帮你从Holt、Winters、Brown这些模型里选择最优匹配。它的自动模型选择功能对新手特别友好,你基本不用操心参数怎么定。
4.3 平滑系数alpha的选择经验
在三次指数平滑里,有三个参数需要关注:alpha(水平平滑)、gamma(趋势平滑)、delta(季节性平滑),取值范围都在0到1之间。SPSS和Excel的FORECAST.ETS都能自动估计这些参数,但如果你要自己调,我给你几条经验:
- alpha接近1,模型非常"敏感",几乎跟随最新数据点波动,适用于变化剧烈的数据;
- alpha接近0,模型非常"迟钝",大量依赖历史平均值,适用于平稳数据;
- 如果不知道怎么选,先跑一个自动参数模型,看它算出来的参数区间落在哪里,再手动微调对比。
我曾经在做一个零售库存预测项目时,默认让SPSS自动优化参数,预测结果MAPE(平均绝对百分比误差)在11%左右。后来我手动把alpha从0.3调到0.45,误差降到9.6%。这说明自动参数虽然省事,但未必完全贴合你的业务节奏,手动结合业务经验微调往往有惊喜。
指数平滑最让我欣赏的一点是:它不需要复杂的统计检验,计算量也小,放进Excel任何一个数据分析师都能操作。这就是它能活几十年不过时的原因。
5. ARIMA模型:从差分到定阶,三步走通经典建模流程
ARIMA是Auto-Regressive Integrated Moving Average的缩写,中文叫差分自回归移动平均模型。它和指数平滑的区别在于:指数平滑是"加权平均"思想,ARIMA是"利用数据的自相关性"做预测——过去的数据点对当前数据点有解释能力,而不仅仅是做加权。ARIMA的优势是能捕捉指数平滑不容易捕捉的复杂模式,并且有完整的统计检验体系支持。
关于ARIMA,我见过两种极端:一种人把它当万能模型不管什么数据都套,另一种人一看ACF、PACF、差分、白噪声这些术语就被吓退了。实际上,ARIMA建模流程就三步:识别(定阶)、估计、诊断检验。我建议你把这个框架记下来,你会发现SPSS菜单也好、Matlab脚本也好,全是在帮你走这三步。
5.1 第一步:差分让数据平稳
平稳性是ARIMA建模的前提。什么叫平稳?均值、方差在时间上基本稳定,不存在趋势和明显的周期性变化。你可以通过ADF检验来判断,SPSS和Matlab都有现成函数。如果数据不平稳,就先做差分——一阶差分相当于计算"本期较上期的变化量",这样通常能消掉线性趋势;有时需要二阶差分消掉曲线趋势。
实际操作中,SPSS里可以点击"转换-创建时间序列",选择"差分"选项,一次就能生成差分序列。差分阶数d的确定原则是:能够使ADF检验p值小于0.05的最小阶数。不要把数据差分的次数做过头了,差分越多信息损失越大,预测结果越难解释。
5.2 第二步:用ACF和PACF确定p和q
模型里的p(自回归阶数)和q(移动平均阶数)怎么定?看两个图:
- ACF(自相关函数图):ACF呈现拖尾(衰减为零很慢),PACF在某个滞后阶数后突然截断(接近零),适合AR模型,截断的阶数就是p;
- 反过来,ACF截断、PACF拖尾,适合MA模型,ACF截断的阶数就是q;
- 两个图都拖尾,那就要用ARMA或ARIMA组合模型,p和q的确定需要多试几组比较AIC或BIC值。
SPSS里这一步最直观:在做ARIMA建模之前,先点"分析-预测-自相关",把变量和差分阶数填进去,它直接给你画出ACF和PACF图。我放一句话给新手参考:实际项目里很多数据都会同时有趋势和季节性,直接拿原始数据看ACF图完全看不出规律,必须先做非季节性差分和季节性差分。这也就是ARIMA的扩展版本SARIMA(季节性ARIMA)存在的意义。
5.3 第三步:用SPSS和Matlab跑ARIMA
SPSS操作路径是"分析-预测-创建模型",方法选ARIMA,然后分别指定p、d、q和季节性参数。我之前做一个月度零售数据的ARIMA(1,1,1)(0,1,1)12模型,SPSS 5秒出结果,输出包含参数估计值、Ljung-Box Q检验、残差ACF图,白噪声检验p值为0.23(大于0.05说明残差是白噪声,模型拟合充分)。
Matlab实现更灵活,用arima函数,代码非常简单:
% 读取数据(假设Y是列向量,时间是标量) Y = readmatrix('sales_data.xlsx'); % 创建ARIMA(1,1,1)模型,含季节性 Mdl = arima(1,1,1); Mdl.Seasonality = 12; Mdl.SAR = {0.5, 0.3}; % 季节性AR系数初值 Mdl.SMA = {0.2}; % 季节性MA系数初值 % 拟合模型 EstMdl = estimate(Mdl, Y); % 预测未来12个月 [YF, YMSE] = forecast(EstMdl, 12, 'Y0', Y);Matlab的好处是,你想跑100组不同的p、d、q参数组合做自动寻优,写个for循环就行,SPSS里手动点100次会崩溃。我的习惯是:用SPSS确认最终模型结构,用Matlab做批量对比验证。
5.4 ARIMA建模中的常见坑
ARIMA的坑主要集中在这几个地方:
- 数据长度不够:ARIMA对样本量有要求,建议至少50个时间点,否则参数估计不稳定。如果你的数据只有20几个点,建议老实回去用指数平滑。
- 过度追求低AIC:AIC确实越小越好,但参数越多越容易过拟合。一个规则是,参数每增加一个,AIC至少要下降2才算值得。单纯压低AIC而牺牲模型可解释性,最后滚动预测会很惨。
- 忽略季节性差分:月度数据有12个月的季节周期,只用一阶差分做普通ARIMA,残差里会残存明显的季节自相关。这时候要补上季节性差分,把模型变成SARIMA。
6. 三种方法如何配合使用:从结构认知到预测落地的完整路径
很多初学者学完这三种方法之后最大的困惑是:"我到底该用哪一个?"我的答案很明确:不要指望某个方法在所有场景碾压其他方法,而是应该建立一个从粗到细的决策流程。
我的实际操作路径是这样的:
- 先用Excel做初步探索:画出时间序列图,观察趋势、季节性和噪声水平。如果数据已经有明显的趋势+季节模式,直接用Excel的FORECAST.ETS做一个快速基准预测,拿到第一个粗略结果。
- 再用SPSS做分解,理解成分结构:把趋势和季节因子拆开,看看季节波动占多大比例。这个步骤能帮你在选择ARIMA的结构时心里有数,比如季节因子的形态决定了你需要在ARIMA模型里加几阶季节性参数。
- 最后用SPSS或Matlab建立ARIMA模型:拟合完毕做残差白噪声检验、做预测。然后把ARIMA的预测结果和第二步指数平滑的预测结果对比,选误差更小、更符合业务直觉的那个。
有时候三种方法得出的预测结果会相差很大,这时候不要急着怀疑模型,先回头看数据里是否有特殊事件(比如促销、政策变化、极端天气)造成了异常波动。这些异常不会在模型里体现,但会直接影响误差。我做过一个案例,某产品3月的销量异常高,ARIMA把它当作正常季节波动学进去了,结果预测次年3月仍然高估。我手动加了一个虚拟变量修正后,预测误差立刻下降了一半。
所以我把这三个方法并列来看,真正的含义是让你具备一套工具箱:分解帮你看清结构、指数平滑帮你快速出数、ARIMA帮你精细建模。每一层都有它的不可替代性。
7. 预测结果怎么验证:别被漂亮的拟合曲线骗了
这一步我觉得是很多教程不写、但实战里最要命的部分。模型拟合优度R平方很高,不代表预测准。判断模型真实水平,必须做回测或滚动预测验证。
具体操作方式:假设你有72个月的数据,不要拿全部72个月去建模,而是只用前60个月建模,预测后12个月,然后拿预测值和真实值对比,计算误差(MAPE、RMSE)。这才是模型真实预测能力的体现。SPSS里可以通过"预测-创建模型-选项"里设置"实现值进行验证"来做,Matlab里可以手动切分数据,用循环反复验证。我通常会把最后12个月数据当作验证集,看模型在这段时间上的表现,而不是看全样本拟合效果。
我在做一个电力负荷预测项目时,三种方法对比的结果是:ARIMA(含季节性)的MAPE是6.8%,三次指数平滑的MAPE是8.1%,而Excel自带的FORECAST.ETS大概是8.7%。ARIMA确实赢了,但优势并没有想象中大。而代价是ARIMA的建模和调试耗时是其他方法的3倍以上。所以我的建议是:如果你的场景是快速出数、做业务参考,指数平滑和Excel就够了;如果你的场景是高精度预测、支撑正式决策,ARIMA值得花时间。不要为了用高级方法而用高级方法。
8. 从项目实践里总结的三条核心经验
最后总结几条我自己的硬体会,希望你少走弯路:
第一,时间序列分析80%的功夫在数据准备和目标定义上。如果你不知道预测到底用来干什么(库存备货、销售目标、人员排班?),模型精度再高都没意义。动手前先和业务方对齐一个问题:预测结果的误差容忍度是多少?是±10%还是±30%,这决定了你选方法的容错空间。
第二,工具之间没有绝对的优劣之分。Excel适合快速反馈、SPSS适合标准化流程、Matlab适合深度定制。真正的价值在于你理解了方法本身的逻辑,工具只是实现手段。我见过只用Excel就把预测做得比某些用Python的人还准的业务分析师,因为他懂数据、懂业务、懂方法的边界。
第三,永远要保留人工判断的环节。时间序列模型基于的是历史规律,但历史规律未必一直持续。模型输出的是"如果未来规律不变"的预测,而现实里促销、竞争、大环境变化都会打破规律。所以,套用一句我常对同事说的话:模型给出的预测结果,是决策的输入,而不是决策本身。
如果你正好在琢磨自己手头数据能不能用这套方法做预测,我的建议很直接:先用Excel把数据拉出来画个图,看看有没有趋势和季节,然后跟着这篇文章的顺序走一遍分解和指数平滑,最后再考虑要不要上ARIMA。跑通一次完整流程,收获会比看十篇教程都大。
本文还有配套的精品资源,点击获取