Séries Temporais - Alisamento Exponencial

Autor

Paulo Manoel da Silva Junior

Alisamento Exponencial

É um procedimento geral para obtenção de algoritmos de previsão que conduz a vários procedimentos alternativos dependendo das suposições sobre as características mais importantes da série.

Três tipos: Simples, Holt e Holt-Winters.

Alisamento Exponencial Simples

Referencial Teórico

Apropriado para situações em que a série não apresenta tendência e nem sazonalidade. O objetivo é estimar o nível da série e usar este nível como previsões para próximas observações.

Pergunta: Como em um dado instante de tempo t, estimar o nível da série? Há duas possibilidades:

    1. Usar como estimativa do nível a média de todas as observações até o instante atual de tempo.
    1. Usar a última observação como estimativa do nível.

Problemas:

    1. Desconsidera o fato de que observações mais recentes provavelmente contêm mais informações sobre o nível atual da série.
    1. Desconsidera totalmente todas as informações não contidas na última observação.

Solução: O algoritmo de alisamento exponencial fornece uma solução intermediária entre os dois problemas listados anteriormente.

Ideia básica: O nível atual da série é estimado como uma média ponderada das observações passadas. Os pesos da ponderação decrescem exponencialmente à medida que regredimos no tempo. Mais especificamente, peso \alpha é atribuído a y_t , \alpha(1−\alpha) é atribuído a y_{t−1}, peso \alpha(1−\alpha)^2 é atribuído a y_{t−2}, etc. Aqui $ 0 < < 1$.

Pesos:

\alpha(1−\alpha)^0 +\alpha(1−\alpha)+\alpha(1−\alpha)^2 +...

Pergunta: Isso é uma média ponderada legitima, ou seja, os pesos somam 1?

Interpretação do algoritmo: A estimativa atual do nível da série é uma média ponderada entre a nova observação (observação atual, y_t ) e a estimativa anterior do nível. O peso atribuído a cada um destes dois instantes é controlado por \alpha, constante se suavização. Como escolher o valor de \alpha?

    1. Escolha subjetiva: Se a série evoluir de forma suave, atribua uma valor alto para \alpha. Se a série apresentar um comportamento errático, utiliza um valor pequeno para \alpha.
    1. Escolha objetiva: O algoritmo precisa ser inicializado. Uma solução comumente adotada é N_1 = Y_1. Agora precisamos obter N_2,N_3,.... A previsão de Y_t no tempo t−1 é N_{t−1},ou seja,

\widehat{Y}_{t-1}(1) = N_{t-1}, \quad t = 3,4,....,n Seja e_t o erro de previsão:

e_t = y_t − N_{t−1}, \quad t = 3,4,...,n.

Para obter o valor de α a ser usado podemos tentar vários valores diferentes (\alpha = 0.1,0.2,0.3,...) e para cada valor de \alpha calcular os erros de previsão. Escolhemos então o valor de \alpha que minimize:

S_{\alpha} = \sum_{t=3}^{n} e^2_{t}

Uma outra forma para obter \alpha é utilizar a forma de correção de erros. Conforme vimos anteriormente e_t = y_t − N_{t−1} \Rightarrow y_t = e_t + N_{t−1}. Ainda,

N_t = \alpha y_t + (1−\alpha)N_{t−1} = \alpha(e_t + N_{t−1})+(1−\alpha)N_{t−1} = \alpha e_t + N_{t−1}

A estimativa atual do nível é dada pela estimativa anterior mais um múltiplo do erro de previsão. Sobre a interpretação de \alpha: Este parâmetro controla a magnitude do ajuste após um erro de previsão. Vale notar que o valor de \alpha não depende da escala em que as observações foram medidas, mas sim das propriedades da série temporal. Valores pequenos produzem previsões que dependem de muitas observações passadas. Por outro lado, valores próximos de 1 levam a previsões que dependem das observações mais recentes e no caso extremo (\alpha = 1) a previsão é simplesmente a última observação.

Exemplo

  • Vamos utilizar uma série que se encontra no pacote fpp2, a qual se trata da produção anual de óleo (milhões de toneladas), na Arábia Saudita de 1965-2013.
fpp2::oil
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
Time Series:
Start = 1965 
End = 2013 
Frequency = 1 
 [1] 111.0091 130.8284 141.2871 154.2278 162.7409 192.1665 240.7997 304.2174
 [9] 384.0046 429.6622 359.3169 437.2519 468.4008 424.4353 487.9794 509.8284
[17] 506.3473 340.1842 240.2589 219.0328 172.0747 252.5901 221.0711 276.5188
[25] 271.1480 342.6186 428.3558 442.3946 432.7851 437.2497 437.2092 445.3641
[33] 453.1950 454.4096 422.3789 456.0371 440.3866 425.1944 486.2052 500.4291
[41] 521.2759 508.9476 488.8889 509.8706 456.7229 473.8166 525.9509 549.8338
[49] 542.3405

Conforme observado, temos uma série temporal que se inicial no ano de 1965 à 2013, uma série anual

Estatística Descritiva

skimr::skim(fpp2::oil)
Data summary
Name fpp2::oil
Number of rows 49
Number of columns 1
_______________________
Column type frequency:
ts 1
________________________
Group variables None

Variable type: ts

skim_variable n_missing complete_rate start end frequency deltat mean sd min max median line_graph
x 0 1 1965 2013 1 1 379.98 128.49 111.01 549.83 432.79 ⣀⠔⠉⠤⠒⠉⠉⠉

É observado a partir da estatística descritiva acima que os valores de mínimo e máximo são 111.0091346 e 549.8338076 respectivamente.

  • Visualização gráfica da série
forecast::autoplot(fpp2::oil)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Milhões por Tonelada")+
  ggplot2::labs(title = "Produção Anual de Óleo", subtitle = "Na Arábia Saudita 1965-2013")

O gráfico da série evidencia que possivelmente não tem tendência e nem sazonalidade a série, sendo a não presença destes componentes importantes para o bom ajuste do Alisamento Exponencial Simples, sendo assim vamos verificar através dos teste se a série tem tendência e sazonalidade.

Ajuste do Alisamento Exponencial Simples

Nessa série Temporal vamos estar ajustando um alisamento exponencial simples 3 passos a frente e logo em seguida 5 passos a frente, para observar o seu ajuste.

fit <- forecast::ses(fpp2::oil, h=3)
fit
     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
2014       542.3412 479.4802 605.2022 446.2037 638.4788
2015       542.3412 453.4468 631.2356 406.3890 678.2935
2016       542.3412 433.4701 651.2124 375.8372 708.8453
forecast::autoplot(fit)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Milhões por Tonelada")+
  ggplot2::labs(title = "Produção Anual de Óleo", subtitle = "Na Arábia Saudita 1965-2016 - Utilizando alisamento Exponencial Simples")

fit2 <- forecast::ses(fpp2::oil, h=5)
fit2
     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
2014       542.3412 479.4802 605.2022 446.2037 638.4788
2015       542.3412 453.4468 631.2356 406.3890 678.2935
2016       542.3412 433.4701 651.2124 375.8372 708.8453
2017       542.3412 416.6287 668.0537 350.0805 734.6019
2018       542.3412 401.7911 682.8914 327.3883 757.2941
forecast::autoplot(fit2)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Milhões por Tonelada")+
  ggplot2::labs(title = "Produção Anual de Óleo", subtitle = "Na Arábia Saudita 1965-2018 - Utilizando alisamento Exponencial Simples")

Alisamento Exponencial de Holt

Referencial Teórico

Use o alisamento exponencial de Holt. Motivação: Em muitas situações é possível antecipar um movimento crescente ou decrescente da série e esta informação deve ser incorporada às previsões. Aqui, precisamos estimar duas componentes da série: nível e a tendência.

Algoritmo de Holt

N_t = \alpha y_t +(1−\alpha)(N_{t−1} +T_{t−1}), \quad 0 < \alpha < 1

T_t = \beta(N_t − N_{t−1})+(1−\beta)T_t−1, \quad 0 < \beta < 1

Previsão: \widehat{y}_t (h) = N_t +hT_t, \hspace{0.2cm} h = 1,2,... Como escolher os valores de \alpha e \beta?

  • Subjetivamente: difícil;

  • Objetivamente: \alpha e \beta podem ser escolhidos de tal forma que minimizem a soma dos erros de previsão um passo a frente elevados ao quadrado.

Uma possibilidade é fazer um grid dos valores de \alpha e \beta e escolher a combinação de \alpha e \beta que minimizam \sum_{t=1}^{n} \widehat{e}^2_t.

Exemplo

  • Vamos utilizar uma série temporal anual de passageiros em milhões incluindo passageiros domésticos e internacionais de companhias aéreas registradas na Austrália, de 1970-2016.
fpp2::ausair
Time Series:
Start = 1970 
End = 2016 
Frequency = 1 
 [1]  7.31870  7.32660  7.79560  9.38460 10.66470 11.05510 10.86430 11.30650
 [9] 12.12230 13.02250 13.64880 13.21950 13.18790 12.60150 13.23680 14.41210
[17] 15.49730 16.88020 18.81630 15.11430 17.55340 21.86010 23.88660 26.92930
[25] 26.88850 28.83140 30.07510 30.95350 30.18570 31.57970 32.57757 33.47740
[33] 39.02158 41.38643 41.59655 44.65732 46.95177 48.72884 51.48843 50.02697
[41] 60.64091 63.36031 66.35527 68.19795 68.12324 69.77935 72.59770

Conforme observado, temos uma série temporal que se inicial no ano de 1970 à 2016, uma série anual.

Estatística Descritiva

skimr::skim(fpp2::ausair)
Data summary
Name fpp2::ausair
Number of rows 47
Number of columns 1
_______________________
Column type frequency:
ts 1
________________________
Group variables None

Variable type: ts

skim_variable n_missing complete_rate start end frequency deltat mean sd min max median line_graph
x 0 1 1970 2016 1 1 30.11 20.02 7.32 72.6 26.89 ⣀⣀⣀⣀⠤⠔⠒⠉

É observado a partir da estatística descritiva acima que os valores de mínimo e máximo são 7.3187 e 72.5977008 respectivamente.

  • Visualização gráfica da série
forecast::autoplot(fpp2::ausair)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Milhões de Passageiros")+
  ggplot2::labs(title = "Total Anual de Viagens Áereas", subtitle = "Na Australia 1970-2016")

De acordo com o gráfico acima, podemos observar uma tendência crescente na série anual.

Verificando Tendência

O Alisamento Exponencial Holt é utilizado quando tem uma tendência e queremos estimar a componente relacionado a tendência para ter uma boa precisão nos valores preditos.

randtests::cox.stuart.test(fpp2::ausair)

    Cox Stuart test

data:  fpp2::ausair
statistic = 23, n = 23, p-value = 2.384e-07
alternative hypothesis: non randomness

Resultado: Conforme o resultado da análise gráfica, vemos que a hipótese nula foi rejeitada a um nível de confiança de 95%, ou seja, é observado que existe uma tendência na série temporal. O resultado do p-valor foi de 2.38^{-7}.

randtests::cox.stuart.test(fpp2::ausair, alternative = "right.sided")

    Cox Stuart test

data:  fpp2::ausair
statistic = 23, n = 23, p-value = 1.192e-07
alternative hypothesis: increasing trend

Conforme podemos observar é visto que a tendência é crescente.

Ajuste do Alisamento Exponencial Holt

Nessa série Temporal vamos estar ajustando um alisamento exponencial simples 3 passos a frente e logo em seguida 5 passos a frente, para observar o seu ajuste.

fit3 <- forecast::holt(fpp2::ausair, h = 3)
fit3
     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
2017       74.74216 72.08236 77.40197 70.67434 78.80998
2018       76.96124 73.30183 80.62066 71.36465 82.55784
2019       79.18033 74.59003 83.77063 72.16007 86.20059
forecast::autoplot(fit3)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Milhões de Passageiros")+
  ggplot2::labs(title = "Total Anual de Viagens Áereas", subtitle = "Na Australia 1970-2019 - Utilizando Alisamento Exponencial Holt")

fit4 <- forecast::holt(fpp2::ausair, h = 5)
fit4
     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
2017       74.74216 72.08236 77.40197 70.67434 78.80998
2018       76.96124 73.30183 80.62066 71.36465 82.55784
2019       79.18033 74.59003 83.77063 72.16007 86.20059
2020       81.39941 75.89975 86.89907 72.98841 89.81042
2021       83.61849 77.21143 90.02556 73.81974 93.41725
forecast::autoplot(fit4)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Milhões de Passageiros")+
  ggplot2::labs(title = "Total Anual de Viagens Áereas", subtitle = "Na Australia 1970-2021 - Utilizando Alisamento Exponencial Holt")

Alisamento Exponencial de Holt-Winters

  • O alisamento Exponencial de Holt-Winters é utilizado quando se tem como componente da série temporal tendência e sazonalidade

  • PERGUNTA: E se houver sazonalidade? Modificar o algoritmo de Holt de forma a acomodar as flutuações sazonais. A sazonalidade pode ser aditiva ou multiplicativa.

Exemplo

  • Número mensais de mortes por doença do pulmão.

UKLungDeaths apresenta os números mensais de mortes por doenças do pulmão (bronquite, efisema e asma) no Reino Unido entre janeiro de 1974 e dezembro de 1979. A variável é composta por 3 séries: ambos os sexos (ldeaths), sexo feminino (fdeaths) e sexo masculino (mdeaths).

ldeaths
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
1974 3035 2552 2704 2554 2014 1655 1721 1524 1596 2074 2199 2512
1975 2933 2889 2938 2497 1870 1726 1607 1545 1396 1787 2076 2837
1976 2787 3891 3179 2011 1636 1580 1489 1300 1356 1653 2013 2823
1977 3102 2294 2385 2444 1748 1554 1498 1361 1346 1564 1640 2293
1978 2815 3137 2679 1969 1870 1633 1529 1366 1357 1570 1535 2491
1979 3084 2605 2573 2143 1693 1504 1461 1354 1333 1492 1781 1915

Estatística Descritiva

skimr::skim(ldeaths)
Data summary
Name ldeaths
Number of rows 72
Number of columns 1
_______________________
Column type frequency:
ts 1
________________________
Group variables None

Variable type: ts

skim_variable n_missing complete_rate start end frequency deltat mean sd min max median line_graph
x 0 1 1974 1979 12 0.08 2056.62 609.85 1300 3891 1870 ⠡⠌⡈⣀⢂⠢⡐⡠

É observado a partir da estatística descritiva acima que os valores de mínimo e máximo são 1300 e 3891 respectivamente.

  • Visualização gráfica da série
forecast::autoplot(ldeaths)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Mortos")+
  ggplot2::labs(title = "Número mensal de mortos por doença no pulmão", subtitle = "Reino Unido - Janeiro de 1974 à Dezembro de 1979")

Conforme é observado na visualização gráfica podemos observar que existe sazonalidade na série considerada.

Verificação de Sazonalidade

  • É importante a presença da componente sazonal para o bom ajuste do alisamento exponencial Holt-Winters.

Visualização Gráfica

forecast::ggseasonplot(ldeaths, main = "Série Temporal de mortes por doença de pulmão no Reino Unido")

Através da Análise Gráfica existe uma evidência de que a série tem a componente sazonal.

Aplicando um teste para verificar a sazonalidade

H_0: A \hspace{0.1cm} série \hspace{0.1cm} não \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade H_1: A \hspace{0.1cm} série \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade

seastests::combined_test(ldeaths)
Test used:  WO 
 
Test statistic:  0 
P-value:  1.635685e-06 1 0.04445113

Resultado: De acordo com o resultado do teste a série possui sazonalidade, ao nível de confiança de 95%.

Logo, podemos realizar o alisamento exponencial de holt-Winters

Ajuste do Alisamento Exponencial de Holt-Winters Aditivo

fit5 <- HoltWinters(ldeaths, seasonal = "addit")
fit5
Holt-Winters exponential smoothing with trend and additive seasonal component.

Call:
HoltWinters(x = ldeaths, seasonal = "addit")

Smoothing parameters:
 alpha: 0.00527852
 beta : 0.4923091
 gamma: 0.1085724

Coefficients:
           [,1]
a   1873.442832
b     -7.830926
s1   779.551577
s2   750.371497
s3   693.192083
s4   228.633314
s5  -302.564569
s6  -460.273086
s7  -502.309749
s8  -674.244273
s9  -654.902198
s10 -280.628726
s11 -120.328442
s12  338.305360
fit5$fitted[1:15]
 [1] 2918.185 2875.283 2928.995 2505.538 1892.758 1737.344 1716.836 1506.272
 [9] 1551.593 2017.901 2145.961 2457.356 2880.460 2836.189 2896.914
plot(fit5, xlab = "Ano", ylab = "Valores Observados/Valores Preditos", main = "Ajuste de Alisamento Exponencial Holt-Winters")

z = ts(cbind(fit5$fitted[,2],fit5$fitted[,3],fit5$fitted[,4]),start=c(1950,1),freq=12)
plot(z,main="",xlab="")

Ajuste do Alisamento Exponencial de Holt-Winters Multiplicativo

  • Série AirPassengers - Totais mensais de passageiros das companhias aéreas internacionais, 1949-1960.
Estatística Descritiva
AirPassengers
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 112 118 132 129 121 135 148 148 136 119 104 118
1950 115 126 141 135 125 149 170 170 158 133 114 140
1951 145 150 178 163 172 178 199 199 184 162 146 166
1952 171 180 193 181 183 218 230 242 209 191 172 194
1953 196 196 236 235 229 243 264 272 237 211 180 201
1954 204 188 235 227 234 264 302 293 259 229 203 229
1955 242 233 267 269 270 315 364 347 312 274 237 278
1956 284 277 317 313 318 374 413 405 355 306 271 306
1957 315 301 356 348 355 422 465 467 404 347 305 336
1958 340 318 362 348 363 435 491 505 404 359 310 337
1959 360 342 406 396 420 472 548 559 463 407 362 405
1960 417 391 419 461 472 535 622 606 508 461 390 432
skimr::skim(AirPassengers)
Data summary
Name AirPassengers
Number of rows 144
Number of columns 1
_______________________
Column type frequency:
ts 1
________________________
Group variables None

Variable type: ts

skim_variable n_missing complete_rate start end frequency deltat mean sd min max median line_graph
x 0 1 1949 1960 12 0.08 280.3 119.97 104 622 265.5 ⣀⣀⣀⠔⠤⠊⠑⠊

É observado a partir da estatística descritiva acima que os valores de mínimo e máximo são 104 e 622 respectivamente.

  • Visualização gráfica da série
forecast::autoplot(AirPassengers)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Passagens áereas internacionais")+
  ggplot2::labs(title = "Série Mensal de Passagens Áereas", subtitle = "Janeiro de 1949 à Dezembro de 1960")

Conforme é observado na visualização gráfica podemos observar que existe sazonalidade na série considerada.

Verificação de Sazonalidade

  • É importante a presença da componente sazonal para o bom ajuste do alisamento exponencial Holt-Winters.

Visualização Gráfica

forecast::ggseasonplot(AirPassengers, main = "Série Temporal de Vendas de Passagens de 1949 à 1960.")

Através da Análise Gráfica existe uma evidência de que a série tem a componente sazonal.

Aplicando um teste para verificar a sazonalidade

H_0: A \hspace{0.1cm} série \hspace{0.1cm} não \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade H_1: A \hspace{0.1cm} série \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade

seastests::combined_test(AirPassengers)
Test used:  WO 
 
Test statistic:  1 
P-value:  0 0 0

Resultado: De acordo com o resultado do teste a série possui sazonalidade, ao nível de confiança de 95%.

Logo, podemos realizar o alisamento exponencial de holt-Winters

fit6 <- HoltWinters(AirPassengers, seasonal = "multiplicative")
fit6
Holt-Winters exponential smoothing with trend and multiplicative seasonal component.

Call:
HoltWinters(x = AirPassengers, seasonal = "multiplicative")

Smoothing parameters:
 alpha: 0.2755925
 beta : 0.03269295
 gamma: 0.8707292

Coefficients:
           [,1]
a   469.3232206
b     3.0215391
s1    0.9464611
s2    0.8829239
s3    0.9717369
s4    1.0304825
s5    1.0476884
s6    1.1805272
s7    1.3590778
s8    1.3331706
s9    1.1083381
s10   0.9868813
s11   0.8361333
s12   0.9209877
fit6$fitted[1:15]
 [1] 111.0818 122.3315 137.4390 132.3234 123.4797 147.6673 162.4432 165.5296
 [9] 153.8877 136.3186 119.0906 133.9887 134.8304 149.7051 166.5408
z1 = ts(cbind(fit6$fitted[,2],fit6$fitted[,3],fit6$fitted[,4]),start=c(1949,1),freq=12)
plot(z1,main="",xlab="")

p = predict(fit6, n.ahead=24, prediction.interval = T)
p
              fit      upr      lwr
Jan 1961 447.0559 466.8057 427.3061
Feb 1961 419.7123 440.2920 399.1326
Mar 1961 464.8671 486.7712 442.9630
Apr 1961 496.0839 519.3350 472.8329
May 1961 507.5326 531.9278 483.1375
Jun 1961 575.4509 602.1935 548.7083
Jul 1961 666.5923 696.5558 636.6288
Aug 1961 657.9137 688.6454 627.1821
Sep 1961 550.3088 578.9777 521.6398
Oct 1961 492.9853 520.9553 465.0153
Nov 1961 420.2073 446.9458 393.4688
Dec 1961 465.6345 487.9686 443.3004
Jan 1962 481.3732 517.8126 444.9337
Feb 1962 451.7258 488.0308 415.4207
Mar 1962 500.1008 538.8928 461.3088
Apr 1962 533.4477 574.3831 492.5122
May 1962 545.5202 587.8399 503.2005
Jun 1962 618.2550 664.8185 571.6915
Jul 1962 715.8704 768.3289 663.4118
Aug 1962 706.2524 759.2423 653.2626
Sep 1962 590.4954 638.2882 542.7027
Oct 1962 528.7681 574.2084 483.3279
Nov 1962 450.5242 492.7194 408.3290
Dec 1962 499.0281 535.8450 462.2112
plot(fit6, p, xlab="Tempo", ylab="Valor observado/previsto")

Exercício

Vamos utilizar a série temporal sobre taxa de desemprego no Brasil fornecida pelo pacote BETS, onde ela é atualizada através do IBGE (Instituto Brasileiro de Geografia e Estatística), onde o objetivo vai ser fazer previsão de valores para os anos futuros.

taxaDesemprego <- BETS::BETSget(24369, data.frame = FALSE)
taxaDesemprego
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2012            8.0  7.8  7.7  7.6  7.5  7.4  7.1  7.0  6.8  6.9
2013  7.3  7.8  8.1  7.9  7.7  7.5  7.4  7.2  7.0  6.8  6.6  6.3
2014  6.5  6.8  7.2  7.2  7.1  6.9  7.0  7.0  6.9  6.7  6.6  6.6
2015  6.9  7.5  8.0  8.1  8.3  8.4  8.7  8.9  9.0  9.1  9.1  9.1
2016  9.6 10.4 11.1 11.3 11.3 11.4 11.7 11.9 11.9 11.9 12.0 12.2
2017 12.7 13.3 13.9 13.7 13.4 13.1 12.9 12.7 12.5 12.3 12.1 11.9
2018 12.3 12.7 13.2 13.0 12.8 12.6 12.4 12.3 12.0 11.9 11.7 11.7
2019 12.2 12.6 12.8 12.6 12.4 12.1 12.0 11.9 11.9 11.8 11.3 11.1
2020 11.4 11.8 12.4 12.7 13.1 13.6 14.1 14.8 14.9 14.6 14.4 14.2
2021 14.5 14.6 14.9 14.8 14.7 14.2 13.7 13.1 12.6 12.1 11.6 11.1
2022 11.2 11.2 11.1 10.5  9.8  9.3  9.1  8.9  8.7  8.3  8.1  7.9
2023  8.4                                                       

Estatística Descritiva

skimr::skim(taxaDesemprego)
Data summary
Name taxaDesemprego
Number of rows 131
Number of columns 1
_______________________
Column type frequency:
ts 1
________________________
Group variables None

Variable type: ts

skim_variable n_missing complete_rate start end frequency deltat mean sd min max median line_graph
x 0 1 2012 2023 12 0.08 10.5 2.62 6.3 14.9 11.3 ⣀⣀⡠⠊⠒⠒⠉⢄

É observado a partir da estatística descritiva acima que os valores de mínimo e máximo são 6.3 e 14.9 respectivamente.

Sendo o valor mínimo registrado no mês de Dezembro de 2013, e o valor máximo em Março de 2021 e Setembro de 2020.

  • Visualização gráfica da série
forecast::autoplot(taxaDesemprego)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Taxa de Desemprego")+
  ggplot2::labs(title = "Série Temporal da Taxa de Desemprego", subtitle = "Brasil - Março de 2012 à Janeiro de 2023")

Verificação de Suposições

  • É importante verificar as componentes das séries temporais para utilizar o melhor ajuste exponencial disponível, sendo assim é importante saber se existe sazonalidade e tendência para aplicar o melhor método.
Sazonalidade
forecast::ggseasonplot(taxaDesemprego, main = "Série Temporal da Taxa de Desemprego no Brasil") + ggplot2::xlab("Mês") + 
  ggplot2::ylab("Taxa de Desemprego")

Através da Análise Gráfica existe uma evidência de que a série tem a componente sazonal.

Aplicando um teste para verificar a sazonalidade

H_0: A \hspace{0.1cm} série \hspace{0.1cm} não \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade H_1: A \hspace{0.1cm} série \hspace{0.1cm} possui \hspace{0.1cm} sazonalidade

seastests::combined_test(taxaDesemprego)
Test used:  WO 
 
Test statistic:  1 
P-value:  3.690038e-10 1.098155e-11 2.75027e-06
seastests::isSeasonal(taxaDesemprego)
[1] TRUE

Resultado: De acordo com o resultado do teste a série possui sazonalidade, ao nível de confiança de 95%.

Tendência
randtests::cox.stuart.test(taxaDesemprego)

    Cox Stuart test

data:  taxaDesemprego
statistic = 51, n = 65, p-value = 4.475e-06
alternative hypothesis: non randomness

Resultado: Conforme o resultado da análise gráfica, vemos que a hipótese nula foi rejeitada a um nível de confiança de 95%, ou seja, é observado que existe uma tendência na série temporal. O resultado do p-valor foi de 4.48 \times 10^{-7}.

randtests::cox.stuart.test(taxaDesemprego, alternative = "right.sided")

    Cox Stuart test

data:  taxaDesemprego
statistic = 51, n = 65, p-value = 2.238e-06
alternative hypothesis: increasing trend

Conforme podemos observar é visto que a tendência é crescente.

Como se tem tendência e sazonalidade, vamos utilizar o método Holt-Winters

Primeiro vamos guardar os seis últimos meses para analisar o desempenho da série

fit7 <- HoltWinters(taxaDesemprego, seasonal = "additive")
fit7
Holt-Winters exponential smoothing with trend and additive seasonal component.

Call:
HoltWinters(x = taxaDesemprego, seasonal = "additive")

Smoothing parameters:
 alpha: 0.9466689
 beta : 0.9505339
 gamma: 1

Coefficients:
           [,1]
a    8.49815514
b   -0.04730852
s1   0.38129524
s2   0.77673535
s3   0.54643668
s4   0.29871755
s5   0.11151419
s6   0.09842891
s7   0.02102909
s8  -0.28070997
s9  -0.54454639
s10 -0.67669368
s11 -0.63582903
s12 -0.09815514
fit8 <- HoltWinters(taxaDesemprego, seasonal = "multiplicative")
fit8
Holt-Winters exponential smoothing with trend and multiplicative seasonal component.

Call:
HoltWinters(x = taxaDesemprego, seasonal = "multiplicative")

Smoothing parameters:
 alpha: 0.9698712
 beta : 1
 gamma: 1

Coefficients:
           [,1]
a    8.56551714
b   -0.03898617
s1   1.05051773
s2   1.10049728
s3   1.07424062
s4   1.04245224
s5   1.01826865
s6   1.01377903
s7   1.00011903
s8   0.95979486
s9   0.93255425
s10  0.91302830
s11  0.91812388
s12  0.98067634
preditos_aditivo = predict(fit7, n.ahead=6, prediction.interval = T)
preditos_aditivo
              fit       upr      lwr
Feb 2023 8.832142  9.176747 8.487537
Mar 2023 9.180273  9.903911 8.456636
Apr 2023 8.902666 10.094025 7.711307
May 2023 8.607639 10.339146 6.876131
Jun 2023 8.373127 10.708145 6.038109
Jul 2023 8.312733 11.308433 5.317033
preditos_multiplicativo <- predict(fit8, n.ahead = 6, prediction.interval = T)
preditos_multiplicativo
              fit       upr      lwr
Feb 2023 8.957272  9.426107 8.488437
Mar 2023 9.340520 10.402318 8.278722
Apr 2023 9.075785 10.794415 7.357154
May 2023 8.766578 11.200898 6.332258
Jun 2023 8.523506 11.743707 5.303304
Jul 2023 8.446401 12.577268 4.315535
plot(fit7, preditos_aditivo, xlab="Tempo", ylab="Valor observado/previsto")

plot(fit8, preditos_multiplicativo, xlab="Tempo", ylab="Valor observado/previsto")

fit9 <- forecast::hw(taxaDesemprego, seasonal = "mult", h = 6, level = 0.95)
fit9
         Point Forecast    Lo 95    Hi 95
Feb 2023       8.396771 7.998906 8.794636
Mar 2023       8.510961 7.990355 9.031566
Apr 2023       8.202925 7.575962 8.829888
May 2023       7.958009 7.216625 8.699393
Jun 2023       7.684219 6.828434 8.540004
Jul 2023       7.507305 6.523273 8.491336
forecast::autoplot(fit9)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Taxa de Desemprego")+
  ggplot2::labs(title = "Série Temporal da Taxa de Desemprego no Brasil - Março de 2012 à Janeiro de 2023", subtitle = "Previsão de valores utilizando o método de alisamento exponencial Holt-Winters multiplicativo")

forecast::accuracy(fit9)
                      ME      RMSE       MAE      MPE     MAPE      MASE
Training set -0.00270097 0.2503288 0.1835556 0.129622 1.733959 0.1166833
                  ACF1
Training set 0.7658195
fit10 <- forecast::hw(taxaDesemprego, seasonal = "additive", level = 0.95, h = 6)
fit10
         Point Forecast    Lo 95    Hi 95
Feb 2023       8.601123 8.168842 9.033404
Mar 2023       8.806965 8.176428 9.437501
Apr 2023       8.513597 7.698695 9.328499
May 2023       8.168526 7.172095 9.164957
Jun 2023       7.926048 6.746833 9.105263
Jul 2023       7.837514 6.472367 9.202661
forecast::autoplot(fit10)+
  ggplot2::xlab("Ano") + 
  ggplot2::ylab("Taxa de Desemprego")+
  ggplot2::labs(title = "Série Temporal da Taxa de Desemprego no Brasil - Março de 2012 à Janeiro de 2023", subtitle = "Previsão de valores utilizando o método de alisamento exponencial Holt-Winters aditivo")

forecast::accuracy(fit10)
                       ME      RMSE       MAE       MPE     MAPE       MASE
Training set -0.002555245 0.2066481 0.1572781 0.1225657 1.512004 0.09997914
                  ACF1
Training set 0.6228404

É observado que o intervalo do método Holt-Winters Multiplicativo tem uma variabilidade maior do que o Aditivo.