在本公众号的第4篇推文里,我们向大家分享过Power BI进行时间序列预测的几种方法。其中提到,Power BI的折线图自带有预测功能。当时简单地以为PBI使用移动平均方法。最近查阅官方文档发现,Power View的预测功能用的是指数平滑法(Exponential Smoothing),同时按是否季节性做了区分。PBI跟Power View一脉相承,可以推测应该也是沿用指数平滑法。
For Power View in Excel, we provided two versions of exponential smoothing, one for seasonal data (ETS AAA), and one for non-seasonal data (ETS AAN). Power View uses the appropriate model automatically when you start a forecast for your line chart, based on an analysis of the historical data. https://powerbi.microsoft.com/es-es/blog/describing-the-forecasting-models-in-power-view/#ETSAAA
两个极端与移动平均
在介绍指数平滑法的基本原理之前,我们来看两个极端的预测情况。
极端一:
假设历史数据中上一期(最近一期)的值最重要,因此所有预测值都等于上一期的实际值。用公式表示如下:
其中,T为时期,h为预测期,y为变量,y上面有帽子的表示预测值,下同。
极端二:
假设所有历史数据都同等重要,因此预测值就是所有历史数据的平均值,公式如下:
而在Power BI里常用的移动平均值,介于这两个极端之间,既认为时间比较近(区间S期)的历史数据才有价值,因而放弃时间比较久远的历史数据,但同时也认为这S期的数据都同等重要,因此对这个区间内的历史数据直接加以平均。在Power BI里可以这么做。
代码语言:javascript复制Indicator_MA =
AVERAGEX(
DATESINPERIOD( 'Dates'[Date] , max( 'Dates'[Date] ) , -[Parameter] , DAY ) ,
[Indicator Measure]
)
一次指数平滑法
一次指数平滑法是介于两个极端的另一种方法。该方法认为,所有历史数据都值得参考,但时间越久远的数据,重要性越低。也即预测值是对历史数据的加权平均。
其中α为最近一期的权重(0<α<1),称为指数平滑系数。从该公式中似乎没有指数的符号存在。但需要注意到,第T 1期的预测值,等于第T期的实际值与第T期的预测值的加权平均数。而第T期的预测值又等于第T-1期的实际值与第T-1期的预测值的加权平均。依次不断展开,将有:
看到最后一行,表明完全展开后,预测值是各期实际值与(1-α)的指数函数的和。因此该方法得名为指数平滑法。
一次指数平滑法适合用于没有明显趋势性的数据预测。在Excel里实现非常简单,点开【数据分析】,即可选择指数平滑法,如下图所示。其中阻尼系数即为α。
PBI中如果用DAX设计度量值,对于数据量较大时不容易实现。有兴趣的伙伴们可参考《Power BI中使用DAX计算股票RSI及股票均线相关》(https://zhuanlan.zhihu.com/p/81458611),原理接近。或在Power Query里,参考递归函数的原理生成(https://pqfans.com/2196.html)。
二次指数平滑法
二次指数平滑法(Holt’s Linear Trend Method),适合于有一定线性趋势(单调递增或递减)的时间序列。公式如下:
其中第一行为预测值公式,包括两个部分,加号左边为一次指数平滑法,加上趋势项b,加号右边为趋势项的函数(也是一个一次指数平滑函数)。而这个模型,也就是文章开篇里提到,Power BI折线图自带的对非季节性数据的预测算法。
三次指数平滑法
三次指数平滑法(Holt & Winters Seasonal Method) ,是Power BI折线图预测季节性数据时用到的算法。在二次指数平滑的基础上,增加了一个季节项s,公式如下:
二次和三次指数平滑法模型对于DAX和M来说相对复杂,硬算的意义不大。除了折线图自带的预测功能外,还有第三方的视觉控件可以实现这个算法。下期再为大家介绍,敬请留意。
注:本文公式截图来源于Forecasting: Principles and Pratices. Rob J Hyndman and George Athanasopoulos . https://otexts.com/fpp2/expsmooth.html