跳至主要內容

时间序列预测简介 - 分析过去,预测未来

A1exlindev大约 4 分钟计算机

时间序列预测简介 - 分析过去,预测未来

什么是时间序列分析

时间序列,顾名思义,就是在时间轴上的一系列数据点。所谓时间序列预测,就是利用统计学模型,通过历史数据预报未来数据点的过程。

数据点显然有两个要素,分别是时间要素和数值要素。

若数值累加后仍有意义,则称数据系列是时期序列,否则称时点序列。

时间序列分析在商业,科学等多个领域有重要的实际作用。

时间序列数据的不同组分

时间序列分析在分析有一定规律的数据时才有较好的效果。而现实生活中的很多指标往往都有明确的规律,比如,游乐园的游客人数往往和节假日相关。

传统理论中,时间序列数值变化有以下四个组分

  • 长期变动趋势 T
  • 季节(月级规模的周期)变动规律,也称季节性调整因子 S(SAF)
  • 周期(指更高频)变动规律 C
  • 不规则变动(随机扰动项,或残差、误差值)I(ERR)

四种变动与指标数值最终变动的关系可能是叠加关系,也可能是乘积关系。

如果四种变动之间是相互独立,则相加。如果四种变动之间存在相互影响关系,则相乘。

(1)数据具有年内的周期性时才能使用时间序列分解,例如数据是月份数据(周期为12)、季度数据(周期为4) ,如果是年份数据则不行。

(2)在具体的时间序列图上,如果随着时间的推移,序列的季节波动变得越来越大,则反映各种变动之间的关系发生变化,建议使用乘积模型;反之,如果时间序列图的波动保持恒定,则可以直接使用叠加模型;当然,如果不存在季节波动,则两种分解均可以。

时间序列分析的结果常以四种变动因子之间的组合(加或乘)呈现,比如

  • 季节性调整后序列(SAS, T+C+I)
  • 趋势循环成分(STC,T+C)

详细的理论研究不是我在团队里的职责。下面,我将展示如何用开源软件进行时序预测。

使用 Prophet 进行时序预测

Prophet 时 Facebook 开发的开源时序预测库。下面将以"女装销售数据"(课后作业)为例,进行时间序列预测和简要分析。

首先,打开数据集,用SPSS画出时序图并观察

时序数据
时序数据

可以看到,女装销售具有总体向上的趋势,且具有一定的季节性规律,符合我们的常识,故可以用现成的模型进行预测。

在SPSS中导出数据,就可以用开源库进行预测了。

首先,引入依赖并导入数据

from prophet import Prophet
import pandas as pd

df = pd.read_csv("Sales_Data.csv")

创建预测器实例

m = Prophet(
    mcmc_samples=600,
    seasonality_mode="multiplicative",
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
)
m.add_country_holidays(country_name='US')

按月给出的数据属于较低频数据。根据 Prophet 的文档,需要对数据进行重采样后,才能够运行预测。这里,只需要在预测时给出参数即可。显然,对于有趋势的数据,我们的季节性应选择乘法模型模式。

根据上面的观察,每年年末都会出现消费的尖峰,我们猜测是圣诞节,故添加美国的节日列表,让预测器能够处理突发事件。

调整好参数之后,就可以运行自动预测了。

m.fit(df)

拟合完成之后,就可以进行预测。输入预测未来的12个数据点,生成时间戳数据帧,然后运行预测即可。这里,1MS 指定的是我们给出的数据点只在每月初。

future = m.make_future_dataframe(periods=12, freq='1MS')
forecast = m.predict(future)

运行完毕之后,我们可以观察预测的结果和模型拟合的序列分量。

m.plot(forecast)
预测结果输出
预测结果输出

可以看到预测未来一年的曲线形状和以前大致相似,但是存在一定的不确定范围。

然后,我们观察以下程序拟合出的分量

m.plot_components(forecast)
分量输出
分量输出

趋势分量逐年上升,符合我们的常识。季节分量也符合我们的常识,每年年末都会有一个尖峰,可以解释成圣诞节的影响。

但是,数据中仍存在噪声,使得结果的不确定度较大。

我们尝试将离群点标记为节日,然后重新运行拟合。

spikes = pd.DataFrame(
    {
        "holiday": "spikes",
        "ds": pd.to_datetime(["3/1/1989", "6/1/1991", "5/1/1993", "9/1/1994"]),
        "lower_window": 0,
        "upper_window": 20,
    }
)

重新运行的结果如下

重新运行预测
重新运行预测
重新运行拟合分量
重新运行拟合分量

可以看到,预测结果的不确定度降低了,预测结果的形状也发生了变化。

上次编辑于:
贡献者: Alexlin625