基础介绍
本文是通过实际商业/数据分析应用中的时间序列分析进行介绍,是以应用观点来看待时间序列分析,不对其背后的数学知识进行深究,后期会写文章,讨论其背后的数学知识。
在数据驱动的时代,企业通常会用已有的数据来对未来进行预测。如果历史数据完全是被预测变量过去发生的数值,这种数据被称为时间序列。时间序列分析的目标,就是发现时间序列中存在的规则性状态,然后基于这个状态对未来进行预测。
既然是讲时间序列分析,那么时间序列分析到底是什么?这里给一个比较宽松的定义:时间序列(Time Series)是变量在各个时间点或时间范围上观测值的数列。
想分析一个时间序列的模式,必须绘制时间序列图,一般绘图用横轴代表时间,纵轴代表时间序列中的观察值。
假设,有一个汽油销售公司,记录了过去几周的数据:
我们对前12周绘制的时间序列图如下所示:
时间序列的集中类型
水平变化状态的时间序列(Horizontal Pattern)
从上面的图片中可以看到,前12周的销量其实是围绕着一个19.25左右上下浮动,尽管存在着一些随机性,我们依然愿意把这种时间序列称为水平变化(Horizontal Pattern)的时间序列。
在时间序列的研究中,经常提到一个概念,叫做平稳时间序列(stationary time series),平稳时间序列是指时间序列的统计特性是不随着时间变化而变化的。具体讲,就是符合下面两个要求:
- 数据在产生的过程中,存在着一个常数均值
- 时间序列的波动不会随着时间改变
注意:不能仅仅通过观察时间序列是不是存在水平波动,来判断时间序列是不是平稳。很多高级的关于预测分析的书中,都讲过如何识别一个时间序列是不是平稳的方法,也有把一个不平稳的时间序列变成平稳的方法。
很多商业行为,会把一个水平变化的时间序列,变到一个新的水平上,而且变化后的时间序列依然是水平变化的。比如说,汽油销售公司跟警察局签订了一份合同,从第13周开始,为警察局供应汽油。由于这个合同,第13周开始的销量肯定会有一定程度的增加。
那么,我们对所有数据进行绘制,来看下这个变化。
可以看出,在13周之后,数据在一个新的水平上波动。在实际的建模中,这种情况会对模型有很大影响,而且由于这些行为没法预测,对建模带来了很大的困难,所以选择预测方法很重要。
带趋势的时间序列(Trend Pattern)
时间序列的短期波动很正常,但如果在一个更长的时间范围中,时间序列呈现出向更大或者更小的数值逐渐移动的现象,我们会称之为带趋势的时间序列。趋势现象是长期因素作用的结果,比如人口增长、人口的迁移变化、技术革新等等。
下面这张表是某个生产商过去10年中,每年的自行车销售量。
Year | Sales |
---|---|
1 | 21.6 |
2 | 22.9 |
3 | 25.5 |
4 | 21.9 |
5 | 23.9 |
6 | 27.5 |
7 | 31.5 |
8 | 29.7 |
9 | 28.6 |
10 | 31.4 |
把它们画出来:
可以看出,虽然短期有波动,但是随着时间的推移,整体上是呈现上升趋势的。(比如纳斯达克指数基金等等,短期可能会有不小的涨跌,但长期是涨的)
带季节性波动的时间序列(Seasonal Pattern)
游泳圈,肯定是每年夏天销量高。而感冒药肯定是冬天销量高。这种数据就叫做带有季节性波动的时间序列。
下图是一个雨伞销量,可以很好的解释:
带有周期性波动的时间序列(Cyclical Pattern)
这个就不多解释了,长期围绕着一个趋势上下波动,就是有周期性波动。比如,$sin(x)$就是有周期性波动。
识别这些波动对预测很重要,想识别这些波动,最好先绘制时间序列图之后再判断。
预测准确度问题
常用的准确度衡量公式有3种:
- 平均预测误差(Mean Forecast Error, MFE)
- 平均绝对误差(Mean Absolute Error, MAE)
- 均方误差(Mean Squared Error, MSE)
在它们的基础上,还有一个比较好的衡量公式:
- 绝对值相对误差(Mean Absolutely Percentage Error, MAPE)
假定$t$时刻的实际值为$y_t$,而预测值为$\hat y_t$。那么,预测误差为:
$$ e_t=y_t-\hat y_t $$
平均预测误差MFE的计算公式如下:
$$ MFE=\frac{\sum\limits_{t=k+1}^{n}e_t}{n-k} $$
其中,$n$为样本总数,而无法预测的项数为$k$(比如,建立一个预测模型,$\hat y_{t+1}=y_t$,用前一天的值作为预测值,那么$y_1$是第一天的值,不能预测,所以$k=1$)。
MFE由于会正负相抵,其实不是一个很好的衡量误差的函数。但是,它却可以根据看出来预测算法整体是习惯高估还是低估,如果MFE过大(过小),可能会说明模型整体会习惯高估(低估),这是大部分书中都没有说明的,但却很有用,也说明所有工具,都有其用处。
为了解决MFE正负相抵的问题,可以使用平均绝对误差MAE,其计算公式为:
$$ MAE=\frac{\sum\limits_{t=k+1}^{n}|e_t|}{n-k} $$
由于绝对值不适合用来进行微分等等操作,不适合用来预测,所以MAE通常作为一个误差衡量标准,但是在真正的模型拟合中,通常使用 均方误差MSE,其公式如下:
$$ MSE=\frac{\sum\limits_{t=k+1}^{n}e_t^2}{n-k} $$
无论是绝对值误差还是均方差,都与时间序列观察值的量级有关,想要看相对精度,可以使用绝对值相对误差MAPE,公式如下:
$$ MAPE=\frac{\sum\limits_{t=k+1}^{n}\left(\frac{|e_t|}{y_t} \right)}{n-k} $$
通过这个误差,可以算出误差的百分比,而与量级无关。
保证高精度很重要,但是,在预测的时候,良好的判断和认知也起着重要的作用。一味地追求高精度是无意义的,甚至可能会产生过拟合。
移动平均(Moving Averages)与指数平滑法(Exponential Smoothing)
移动平均(Moving Averages)
在通过过去的数据预测未来的数据时,一个最简单的方法,是利用与该数据最接近的$k$个点的算术平均数作为预测值:
$$ \begin{aligned} \hat y_{t+1} &=\frac{\sum\limits_{i=t-k+1}^ty_i}{k}\\ &=\frac{y_{t-k+1}+...+y_{t-1}+y_t}{k} \end{aligned} $$
指数平滑法(Exponential Smoothing)
指数平滑法,是利用时间序列观察值的加权平均作为预测值,其计算公式为:
$$ \hat y_{t+1}=\alpha y_t+(1-\alpha)\hat y_t $$
其中,$\alpha$是平滑系数,当$\alpha=0$时,等于直接用预测值作为最终的预测结果,$\alpha$越大,则平滑程度越高。
这不就是个加权和吗?为什么叫指数平滑呢?现在来解释一下。
假设,一个最简单的预测。我们的算法是以前一天的值,作为对后一天的值的预测,也就是$\hat y_t=y_{t-1}$,那么可以推出:
$$ \begin{aligned} \hat y_2 &= \alpha y_1 +(1-\alpha)y_1\\ &=y_1 \end{aligned} $$
那么把对第2天的预测数据,带到第3天的预测中接着往下推:
$$ \begin{aligned} \hat y_3 &= \alpha y_2 +(1-\alpha)\hat y_2\\ &=\alpha y_2 +(1-\alpha)y_1 \end{aligned} $$
接着往下推:
$$ \begin{aligned} \hat y_4 &= \alpha y_3 +(1-\alpha)\hat y_3\\ &=\alpha y_3 +(1-\alpha)[\alpha y_2 +(1-\alpha)\hat y_2]\\ &=\alpha y_3 +(1-\alpha)[\alpha y_2 +(1-\alpha)y_1]\\ &=\alpha y_3 +\alpha(1-\alpha)y_2 +(1-\alpha)^2y_1\\ \end{aligned} $$
可以看出对$t+1$天的预测,其实是前面$t$天的加权平均数。而越往前,其权值就越以指数级下降,下降速度与$\alpha$的大小有关,$\alpha$越大,则下降的速度快。所以,这就是指数平滑法中的指数的由来。
下面是使用移动平均方法($k=3$)加上指数平滑法($\alpha=0.2$) 对汽油销量的预测的图片:
其中,蓝色为真实值,黑色为预测值,可以看出,指数平滑方法把波动平滑掉了,看起来比较光滑。