Suavização exponencial é um método para produzir previsões de séries temporais usando médias ponderadas com pesos de observações passadas. O diferencial destes métodos é que as observações mais recentes possuem um peso maior do que as mais antigas, o que tende a produzir previsões mais acuradas.
Nesse texto, apresentamos uma visão geral dos seguintes métodos:
- Método de suavização exponencial simples
- Método de tendência linear de Holt
- Método de tendência linear amortecida
- Método de sazonalidade aditiva e multiplicativa de Holt e Winters
Começamos apresentando a mecânica e intuição de cada método e, então, progredimos com a aplicação para previsão de séries temporais da economia do Brasil com distintas e complexas características. São demonstrados exemplos práticos em R e Python.
A referência técnica utilizada é o livro-texto de previsão de séries temporais intitulado “Forecasting: Principles and Practice” de Hyndman e Athanasopoulos (2021).
Para aprender mais e ter acesso a códigos confira o curso de Modelagem e Previsão usando Python ou comece do zero em análise de dados com a formação Do Zero à Análise de Dados com Python.
Método de suavização exponencial simples
O método de suavização exponencial simples (SES) é, como o nome sugere, o mais simples dos métodos, sendo aplicável a dados sem tendência ou sazonalidade com padrão claro.
Por exemplo, veja a série do Produto Interno Bruto - Taxa de variação real no ano:
Para modelar e prever essa série sem características de tendência ou sazonalidade claras, poderíamos utilizar o método do passeio aleatório, onde todas as previsões para o futuro são iguais ao último valor observado da série:
Dessa forma, o método do passeio aleatório assume que a última observação é a única e mais importante para produzir previsões para a série temporal. Todas as outras observações não possuem importância para prever o futuro. Podemos pensar que esse método é uma média ponderada onde todos os pesos são dados apenas para a última observação.
Outra possibilidade é prever a série temporal com o método da média, onde todas as previsões para o futuro são iguais à média dos dados observados:
Dessa forma, o método da média assume que todas as observações da série temporal possuem igual importância (pesos) para produzir previsões para o futuro.
Note que estes métodos são dois extremos e, na verdade, queremos um método que é um meio termo. É razoável pensar que pesos maiores devem ser dados para as observações mais recentes do que para observações do passado distante. Esse é o conceito por trás do método de suavização exponencial simples, onde as previsões são geradas utilizando médias ponderadas, onde os pesos decaem exponencialmente (os menores pesos são associados com as observações mais antigas):
onde é o parâmetro de suavização que controla a taxa em que os pesos decaem até as observações mais antigas.
A ilustração abaixo retrata esse decaimento do valor de conforme as observações ficam mais antigas, por isso o método se chama "suavização exponencial":
Note que, conforme andamos para o passado, os pesos sobre as observações ficam próximas de zero muito rapidamente. Se o valor de for próximo de 1, maiores pesos serão dados para as observações do passado recente, caso contrário, se o valor de for próximo de 0, maiores pesos serão dados para as observações do passado distante.
Podemos observar como o decaimento exponencial para diferentes valores de atua sobre dados reais. Tomando como exemplo os dados do PIB e usando a Equação 1 do método de suavização exponencial simples:
O comportamento desse parâmetro é no mínimo interessante, não?
O método SES pode ser representado por essas equações:
A equação de previsão diz que a previsão para o período é o nível estimado para o período . A equação de suavização (ou nível) define a estimativa do nível a cada período .
Note que esse processo precisa iniciar em algum momento, portanto um valor ótimo de início e um valor de precisa ser escolhido.
De forma similar a regressão linear, a escolha dos parâmetros ótimos podem ser feita minimizando a soma dos quadrado dos resíduos.
Em termos de código, podemos estimar o método de suavização exponencial simples e gerar previsões, usando o exemplo de dados do PIB. Abaixo reportamos (a) o sumário do modelo, (b) as métricas de acurácia de treino/teste e (c) o gráfico de valores observados e estimados/previstos dentro da amostra e fora da amostra.
R
Código
Series: pib
Model: ETS(A,N,N)
Smoothing parameters:
alpha = 0.0001000181
Initial states:
l[0]
2.817876
sigma^2: 10.7957
AIC AICc BIC
211.6478 212.4220 216.3139
.model | .type | ME | RMSE | MAE | MPE | MAPE | MASE | RMSSE | ACF1 |
---|---|---|---|---|---|---|---|---|---|
ses | Training | 0.0004363 | 3.190418 | 2.554470 | 186.73657 | 325.5248 | 0.7444242 | 0.7314324 | 0.0267742 |
ses | Test | -2.5553774 | 3.961013 | 3.118939 | 36.85039 | 112.5396 | NaN | NaN | 0.0702402 |
Note que o parâmetro estimado é aproximadamente zero, por isso a linha reta dentro da amostra. É possível definir o valor do parâmetro manualmente (veja a documentação do pacote).
Python
Código
Dep. Variable: | pib | No. Observations: | 35 |
Model: | ETS(ANN) | Log Likelihood | -90.268 |
Date: | Fri, 25 Aug 2023 | AIC | 186.536 |
Time: | 15:23:10 | BIC | 191.202 |
Sample: | 01-01-1980 | HQIC | 188.147 |
- 01-01-2014 | Scale | 10.179 | |
Covariance Type: | approx |
coef | std err | z | P>|z| | [0.025 | 0.975] | |
smoothing_level | 0.0001 | nan | nan | nan | nan | nan |
initial_level | 2.8180 | 0.540 | 5.217 | 0.000 | 1.759 | 3.877 |
Ljung-Box (Q): | 0.38 | Jarque-Bera (JB): | 0.52 |
Prob(Q): | 0.83 | Prob(JB): | 0.77 |
Heteroskedasticity (H): | 0.27 | Skew: | -0.29 |
Prob(H) (two-sided): | 0.03 | Kurtosis: | 2.84 |
Warnings:
[1] Covariance matrix calculated using numerical (complex-step) differentiation.
RMSE de treino: 3.1904176843135197
RMSE de teste: 3.961092520409291
Note que o parâmetro estimado é aproximadamente zero, por isso a linha reta dentro da amostra. É possível definir o valor do parâmetro manualmente (veja a documentação do pacote).
A linha preta no gráfico mostra os dados observados, enquanto que as linhas vermelha e azul mostram o ajuste dentro da amostra e a previsão fora da amostra, respectivamente, pelo método SES.
Note que avaliar pontos de previsão sem levar em consideração o intervalo de confiança pode esconder uma grande incerteza e levar a conclusões errôneas.
Método de tendência linear de Holt
Para contemplar séries temporais que apresentam tendência, o método de suavização exponencial de tendência linear de Holt foi desenvolvido.
Por exemplo, veja a série da População do Brasil:
Para modelar e prever essa série com característica de tendência clara, podemos utilizar o método tendência linear de Holt. Esse método possui uma equação de previsão e duas equações de suavização (uma para o nível e outra para a tendência):
onde:
- é o nível estimado da série temporal
- é a tendência estimada da série temporal
- é o parâmetro de suavização para o nível, restrito a
- é o parâmetro de suavização para a tendência, restrito a
Agora a previsão não é mais plana, mas com tendência. A previsão passos a frente é igual ao último nível estimado mais vezes a última tendência estimada. Dessa forma, a previsão é uma função linear de .
Os parâmetros , , e devem ser escolhidos de forma a minimizar a SQR.
Em termos de código, podemos estimar o método de tendência linear de Holt e gerar previsões, usando o exemplo de dados da população do Brasil. Abaixo reportamos (a) o sumário do modelo, (b) as métricas de acurácia de treino/teste e (c) o gráfico de valores observados e estimados/previstos dentro da amostra e fora da amostra.
R
Código
Series: pop
Model: ETS(A,A,N)
Smoothing parameters:
alpha = 0.9999
beta = 0.9990316
Initial states:
l[0] b[0]
160.965 2.581412
sigma^2: 0.0065
AIC AICc BIC
-34.11905 -29.50366 -29.39685
.model | .type | ME | RMSE | MAE | MPE | MAPE | MASE | RMSSE | ACF1 |
---|---|---|---|---|---|---|---|---|---|
holt | Training | -0.0456989 | 0.0718448 | 0.0507484 | -0.0246847 | 0.0274228 | 0.0239254 | 0.0335204 | 0.1641402 |
holt | Test | -0.1830038 | 0.2763105 | 0.1967748 | -0.0858301 | 0.0925869 | NaN | NaN | 0.5460862 |