3  Decomposição de séries temporais

Autor

Robson Bruno Dutra Pereira

3.1 Decomposição

As séries temporais exibem comportamentos variados. A decomposição destas pode facilitar a análise e previsão. Geralmente considera-se a tendência, sazonalidade e o resto na decomposição, havendo vários métodos para separar tais componentes. Antes, porém, são importantes algumas considerações sobre tratamentos iniciais às vezes necessários.

3.1.1 Ajustes e transformações

Alguns ajustes são comumente necessários antes de realizar a decomposição de uma série temporal. Por exemplo, em alguns casos é importante corrigir a sazonalidades devido à diferenças de calendário. Em séries que exibem alguma variável com frequência mensal, pode haver alguma sazonalidade nos meses com número menor de dias, sendo interessante talvez trabalhar com a média mensal, dividindo a variável pelo número de dias de cada mês.

Dados relacionados à população também podem ser ajustados per capita, ou por pessoa. Este ajuste é muito comum no PIB e em outras variáveis econômicas, por exemplo. Em séries relacionadas a disponibilidade de algum serviço para a população é mais fácil avaliar a disponibilidade ajustando os dados por mil pessoas, por exemplo, de forma a eliminar o efeito do crescimento populacional. O mesmo pode ser feito para séries de saúde pública, por exemplo de número de pessoas infectadas ou a mortalidade pode ser dividida por 1000 ou 100 mil, dependendo da ordem de grandeza de cada série, de forma a viabilizar comparação entre populações de localidades distintas. Em séries econômicas às vezes é importante considerar a inflação, de forma a dar uma dimensão real da série, permitindo comparação em diferentes momentos. Para deflacionar uma série basta dividí-la pelo deflator, um índice que corrige a inflação.

Transformações como a de Box-Cox ou outra mais simples também podem ser úteis para facilitar o tratamento da série. Conforme visto anteriormente, uma série que exibe uma variação sazonal não constante, ou heterocedástica, ao ser transformada pode exibir um padrão de sazonalidade de mais fácil decomposição ou tratamento.

A série plotada na Figura 3.1 consiste na produção mensal de gás natural no Brasil a partir os anos 2000. A série está disponível em Dados estatísticos - Agência nacional de petróleo.

Figura 3.1: Produção mensal de gás natural no Brasil

A Figura 3.2 plota novamente a série considerando a normalização por número de dias no mês.

Figura 3.2: Produção mensal de gás natural no Brasil

A série normalizada é submetida a uma transformação de Box-Cox de forma a corrigir a heterocedasticidade, com \(\lambda=-0.06\), sendo o resultado plotado na Figura 3.3.

Figura 3.3: Produção mensal de gás natural no Brasil com transformação de Box-Cox

3.2 Componentes de uma série

Assumindo uma decomposição aditiva, pode-se escrever:

\[ y_t = S_t+ T_t+R_t, \]

onde \(S_t\) é a componente sazonal, \(T_t\) é a tendência e \(R_t\) é o resto no período \(t\). No caso multiplicativo tem-se:

\[ y_t = S_t \times T_t \times R_t \]

O caso multiplicativo é ideal quando a variação em séries sazonais muda com o tempo, seguindo padrão heterocedástico.

A série plotada na Figura 3.4 exibe o índice de produção física mensal de bens intermediários, ou seja, aqueles empregados na produção de produtos finais, tais como produtos minerais, produtos metalúrgicos, têxteis, papel e celulose, produtos químicos, borracha, plásticos, componentes elétricos e eletrônicos.

Figura 3.4: Produção mensal de produtos intermediários no Brasil

A Tabela 3.1 exibe as primeiras linhas das componentes da série, considerando a decomposição aditiva.

Tabela 3.1: Decomposição aditiva da série do índice de produção mensal de produtos intermediários no Brasil
name .model Data value trend season_year remainder season_adjust
intermediarios stl 2002 Jan 87.97245 95.10887 -7.0894994 -0.0469214 95.06195
intermediarios stl 2002 Feb 85.22869 95.33164 -11.1630761 1.0601292 96.39177
intermediarios stl 2002 Mar 94.94150 95.55440 0.8473573 -1.4602601 94.09414
intermediarios stl 2002 Apr 96.00238 95.77717 -2.0387398 2.2639509 98.04112
intermediarios stl 2002 May 99.12757 95.99987 3.8247141 -0.6970134 95.30286
intermediarios stl 2002 Jun 97.15759 96.22257 1.7226365 -0.7876163 95.43495

A série é plotada novamente na Figura 3.5 com a tendência em destaque. Observam-se dois períodos de queda mais acentuada relativos à crise de 2008/2009 e à pandemia de COVID-19.

Figura 3.5: Produção mensal de produtos intermediários no Brasil com tendência em destaque

As componentes são plotadas separadamente na Figura 3.6.

Figura 3.6: Componentes da série de produtos intermediários

3.3 Dados com sazonalidade ajustada

Pode ser útil remover a sazonalidade da série, resultando em uma série com sazonalidade ajustada. Para casos aditivos a série resultante seria dada por \(y_t-S_t\), enquanto que para casos multiplicativos seria \(y_t/S_t\).

Na Figura 3.7 plota-se a série de produtos intermediários ajustada sazonalmente.

Figura 3.7: Série de produtos intermediários com ajuste da sazonalidade

3.4 Média móvel

Um dos métodos clássicos para estimar a tendência é a média móvel. Uma média móvel de ordem \(m\) pode ser escrita como segue.

\[ \hat{T}_t=\frac{1}{m}\sum_{j=-k}^{k} y_{t+j} \]

Denota-se uma média móvel como \(m\)-MA, ou média móvel de ordem \(m\). A título de exemplo seja a série \(5,10,12,20,23,27\). Considerando \(k = 2\), tem-se uma média móvel de ordem \(m=5\), 5-MA. Para este caso, seguem os cálculos das médias móveis para a terceira e quarta observações, \(t=3,4\). Observa-se que o \(k\) determina o número de observações não suavizadas no ínico e fim da série.

\[ \hat{T}_3=\frac{1}{2\times2+1}(5+10+12+20+23)=14 \]

\[ \hat{T}_4=\frac{1}{2\times2+1}(10+12+20+23+27)=18,4 \]

Na Figura 6.5 observa-se graficamente a média móvel com diferentes ordens, para a série de volume de carros produzidos no Brasil. Quando maior a ordem da série, mais suave o resultado.

Figura 3.8: Média móvel para a série de carros produzidos com distintas defasagens

É interessante em alguns casos realizar a média móvel de uma média móvel, com o objetivo final de centrar médias móveis pares. Uma média móvel \(2\times4\)-MA consiste em uma média móvel \(4\)-MA seguida de uma \(2\)-MA.

Por exemplo, para a série da Tabela 3.2 o problema da média móvel \(4\)-MA é que ela não é simétrica em relação à série original, tendo uma observação não estimada no início e duas no final. Ao tomar desta série resultante uma média móvel de ordem \(2\)-MA, resultando na \(2\times4\)-MA, tem-se uma série média móvel simétrica com a original, com duas observações ausentes no início e fim.

Tabela 3.2: \(2\times4\)-MA
Série \(4\)-MA \(2\times4\)-MA
5
10 11,75
12 16,25 14
20 20,5 18,375
23 25 22,75
27
30

3.5 Estimando a tendência com dados sazonais

Ao realizar uma média móvel \(2\times4\)-MA, a estimativa feita ao final fica conforme a Equação abaixo, consistindo em uma média ponderada.

\[ \hat{T}_t=\frac{1}{8}y_{t-2}+\frac{1}{4}y_{t-1}+\frac{1}{4}y_{t}+\frac{1}{4}y_{t+1}+\frac{1}{8}y_{t+2} \]

Este modelo pode ser usado para estimar tendência de séries com sazonalidade quadrimestral, por exemplo. Recomenda-se usar uma média móvel de ordem \(2\times m\)-MA para estimar a tendência de uma série com sazonalidade de ordem \(m\).

Na Figura 3.9 observa-se novamente a série de índice de produção de itens intermediários plotada sazonalmente. Como ficou clara a sazonalidade anual, pode-se pensar na suavização de ordem \(2\times 12\)-MA.

Figura 3.9: Gráfico sazonal da série de produtos intermediários

A Figura 3.10 exibe a série do índice de produção de produtos intermediários com média móvel \(2\times 12\)-MA. Pode-se confirmar que a sazonalidade foi eliminada. A tendência estimada é muito similar à obtida anteriormente com método mais sofisticado.

Figura 3.10: Tendência para a série de produtos intermediários estimada com média móvel

3.6 Decomposição clássica

A decomposição clássica tem um século de tradição e é o primeiro método para tal. Ela contempla a forma aditiva e a multiplicativa. A seguir são expostos os passos para a decomposição aditiva:

  1. Se o período sazonal, \(m\), é par, estime a tendência \(\hat{T}_t\) como uma média móvel \(2\times m\)-MA. Se \(m\) é ímpar, estime a tendência com uma média móvel \(m\)-MA.

  2. Calcule a série sem a tendência, \(y_t - \hat{T}_t\).

  3. Calcule a componente sazonal para cada estação como a média de todos os períodos desta. Por exemplo, para uma série com sazonalidade anual. O mês de janeiro terá como valor de \(\hat{S}_t\) a média de todas as observações de janeiro. O procedimento é realizado para todos os meses.

  4. Calcule o resto tomando a diferença da série em relação à tendência a sazonalidade, \(\hat{R}_t=y_t - \hat{T}_t - \hat{S}_t\).

A Figura 3.11 expõe o resultado gráfico da decomposição clássica da série de produtos intermediários. Pode-se observar que neste caso a sazonalidade é constante, diferente do resultado óbtido com método mais sofisticado.

Figura 3.11: Decomposição clássica da série de produtos intermediários

Passos para a decomposição multiplicativa.

  1. Se o período sazonal, \(m\), é par, estime a tendência \(\hat{T}_t\) como uma média móvel \(2\times m\)-MA. Se \(m\) é ímpar, estime a tendência com uma média móvel \(m\)-MA.

  2. Calcule a série sem a tendência, \(y_t / \hat{T}_t\).

  3. Calcule a componente sazonal para cada estação como a média de todos os períodos desta. Por exemplo, para uma série com sazonalidade anual. O mês de janeiro terá como valor de \(\hat{S}_t\) a média de todas as observações de janeiro. O procedimento é realizado para todos os meses.

  4. Calcule o resto tomando a razão da série em relação à tendência e à sazonalidade, \(\hat{R}_t=y_t / (\hat{T}_t \times \hat{S}_t)\).

A Figura 3.12 plota o número de passageiros em vôos no Brasil, disponível em Dados Abertos da Agência Nacional de Aviação Civil (ANAC).

Figura 3.12: Série de passageiros de vôos no Brasil

Observa-se na Figura 3.13 sazonalidade anual com picos nos períodos de férias escolares, em Julho e Dezembro/Janeiro.

Figura 3.13: Gráfico sazonal da série de passageiros de vôos no Brasil

A Figura 3.14 expõe o resultado gráfico da decomposição clássica multiplicativa da série de passageiros em vôos no Brasil.

Figura 3.14: Decomposição clássica multiplicativa da série de passageiros de vôos no Brasil

3.7 Métodos usados por agências de estatística

O método X-11 é discutido em Dagum & Bianconcini (2016). Possibilita a decomposição aditiva e a multiplicativa, é robusto a altas variações e outliers e a estimativa de tendência é disponível em toda série. O método também captura outras formas de sazonalidade e feriados.

A Figura 3.15 exibe o resultado da decomposição aditiva pelo método X-11 na série do índice de produção de produtos intermediários.

Figura 3.15: Decomposição da série de produtos intermediários via X-11

O método SEATS consiste em uma decomposição sazonal de séries temporais por ARIMA (ARIMA será discutida futuramente) e foi proposto pelo Banco da Espanha. A Figura 3.16 expõe o resultado gráfico do método SEATS para decompor a série de passageiros em vôos do Brasil.

Figura 3.16: Decomposição da série de produtos intermediários via SEATS

3.8 Decomposição via STL

A sigla STL significa Seasonal and Trend decomposition using Loess”* que em português seria decomposição de tendência e sazonalidade usando LOESS, enquanto LOESS é um método de regressão não linear, locally estimated scatterplot smoothing, ou em tradução livre suavização por regressão local.

O método STL apresenta diversas vantagens em relação aos anteriores:

  • Trata qualquer tipo de sazonalidade;
  • A componente sazonal pode mudar com o tempo;
  • A suavização da tendência pode ser controlada pelo usuário;
  • Pode ser robusto a outliers (há uma opção para tal), de forma que desvios não usuáis não afetarão a tendência e ciclo, mas o resto.

O método, entretanto, tem algumas limitações. As possibilidades elencadas são disponíveis apenas para decomposições aditivas. Para casos multiplicativs, recomenda-se trasnformar a série via logaritmo e depois fazer a decomposição aditiva.

A Figura 3.17 expõe os gráficos da decomposição do logarítmo da série de passageiros em vôos do Brasil.

Figura 3.17: Decomposição da série log(passageiros) em vôos no Brasil via STL

3.9 Previsão via decomposição

A Figura Figura 3.18 apresenta a previsão via decomposição para o caso anterior. Foi considerado até o ano de 2018 para treinamento e pode-se observar a previsão para 2019 e 2020 junto com as observações disponíveis.

Figura 3.18: Previsão via decomposição da série de log(passageiros) de vôos no Brasil

A Figura 3.19 apresenta os resíduos obtidos da decomposição para o caso anterior. Observa-se que apresentam boa aderência à normal e sem presença de autocorrelação.

Figura 3.19: Resíduos do modelo obtido via decomposição por STL da série de log(passageiros)

3.10 Implementação em R

A seguir apresenta-se parte das implementações na linguagem R para obter os dados, gráficos e análises expostos no presente capítulo. Os dados utilizados estão disponíveis em Previsão, por Robson Bruno Dutra Pereira.

Carregando pacotes.

library(tsibble)
library(dplyr)
library(fpp3)
library(ggplot2)
theme_set(theme_bw())

Série mensal de produção de gás natural no Brasil.

gn <- read.csv("gasnatural.csv", header=T)

gn_ts <- gn |>
  mutate(Data = yearmonth(as.Date(Data, 
                                  format= "%m/%d/%Y"))) |>
  as_tsibble(index=Data)

Visualizando.

gn_ts |> 
  autoplot(Producao) +
  ggtitle("Produção mensal de GNV no Brasil")

Normalizando a série por número de dias de cada mês.

gn_norm <- gn_ts |>
  mutate(dias_no_mes = days_in_month(Data),
         Producao_normalizada = Producao/dias_no_mes) 

Visualizando.

gn_norm |> 
  autoplot(Producao_normalizada) +
  ggtitle("Produção mensal média de gás natural no Brasil")

Aplicando transformação de Box-Cox na série.

lambda <- gn_norm |>
  features(Producao_normalizada, features = guerrero) |>
  pull(lambda_guerrero)

gn_norm |>
  autoplot(box_cox(Producao_normalizada, lambda)) +
  ggtitle("Série transformada de LGN no Brasil")

Série do índice de produção de bens intermediários.

prod <- read.csv("Producao_bens.csv", header = T)

prod$Data <- yearmonth(seq(as.Date("2002/1/1"), 
                           length=271, 
                           by="month"))

prod <- prod |> 
  pivot_longer(cols = capital:nao_duraveis)

prod_ts <- prod |>
  as_tsibble(key = name, index = Data)
prod_ts |>
  autoplot(value)
prod_inter <- prod_ts |>
  filter(name=="intermediarios") |>
  select(!name)

prod_inter |>
  autoplot(value) +
  ggtitle("Índice de produção de produtos intermediários")

Gráfico sazonal da série de produtos intermediários.

prod_inter |> 
  gg_season(value)

Tendência para a série de produção de produtos intermediários via média móvel.

prod_inter <- prod_inter |>
  mutate(`12-MA` = slider::slide_dbl(value, mean,
                                     .before = 5,
                                     .after = 6, 
                                     .complete = T),
         `2x12-MA` = slider::slide_dbl(`12-MA`, mean,
                                     .before = 1,
                                     .after = 0, 
                                     .complete = T))

prod_inter |>
  autoplot(value, colour = "grey") +
  geom_line(aes(y=`2x12-MA`), colour = "seagreen") +
  ggtitle("Índice de produção de produtos intermediários")

Decomposição clássica aditiva da série de produtos intermediários.

dcomp <- prod_inter |>
  model(classical_decomposition(value, 
                                type = "additive")) |>
  components()

dcomp
dcomp |> autoplot() 

Decomposição via X-11 da série de produtos intermediários.

x11_dcmp <- prod_inter |>
  model(x11 = X_13ARIMA_SEATS(value ~ x11())) |>
  components()

autoplot(x11_dcmp)

Modelagem via decomposição. Modelo STL para a série de produtos intermediários.

pi_stl_fit <- prod_inter |>
  filter(year(Data)<2022) |>
  model(stl = decomposition_model(
    STL(value ~ trend(window = 7), robust = TRUE),
    NAIVE(season_adjust)
  ))
pi_stl_fit |> gg_tsresiduals()

Previsão para 2 anos e 7 meses à frente.

pi_stl_fit |>
  forecast(h=31) |>
  autoplot(prod_inter) +
  ggtitle("Previsão para o índice de produção de produtos intermediários")

Métricas de desempenho para a previsão.

pi_stl_fc <- pi_stl_fit |>
  forecast(h=31)

pi_future <- prod_inter |>
  filter(year(Data)>=2022)

accuracy(pi_stl_fc, pi_future) |>
  select(.model, RMSE, MAE, MAPE)

Série de número de passageiros em vôos no Brasil. Estes dados não estão disponíveis no github do autor, mas no link citado no capítulo. Caso não consiga fazer o download, sugere-se pular os dois blocos de código seguinters e seguir com a leitura dos dados já tratados disponibilizados em seguida.

library(vroom)
voosbr <- vroom("voos_BR_comp.csv", 
                col_names = T, 
                skip = 1)

Agregando os dados e transformando em série temporal.

voosbr_ts <- voosbr |>
  select(MES,ANO,PASSAGEIROS_PAGOS,PASSAGEIROS_GRATIS) |>
  mutate(Passageiros = PASSAGEIROS_GRATIS+PASSAGEIROS_PAGOS) |>
  mutate(data = yearmonth(ymd(
    paste(ANO, MES, "01", sep = "-")))) |>
  select(!c(MES,ANO,PASSAGEIROS_PAGOS,PASSAGEIROS_GRATIS)) |>
  group_by(data) |>
  summarise(Passageiros = sum(Passageiros, na.rm = T)) |> 
  as_tsibble(index=data)

Usando os dados simplificados voosbr_ts.csv para trabalhar a série de passageiros em vôos no Brasil.

Sys.setlocale("LC_TIME", "en_GB.UTF-8")
library(zoo)
voosbr_ts <- read.csv("voosbr_ts.csv", header = T)
voosbr_ts <- voosbr_ts |> 
  mutate(data = yearmonth(as.yearmon(data, format = "%Y %b"))) |>
  as_tsibble(index = data)

Vizualizando a série.

voosbr_ts |>
  filter(year(data)<2020) |>
  autoplot(Passageiros) +
  labs(title="Passageiros em vôos no Brasil", x="")
voosbr_ts |> 
  filter(year(data)<2020) |>
  gg_season(Passageiros) + labs(x="", y = "")

Decomposição clássica multiplicativa da série de passageiros.

voosbr_ts |>
  filter(year(data)<2020) |>
  model(
    classical_decomposition(Passageiros, type = "multiplicative")
  ) |>
  components() |>
  autoplot() +
  labs(title = "Decomposição clássica multiplicativa da série Passageiros")

Modelo via decomposição por STL.

fit_dcmp <- voosbr_ts |>
  filter(year(data)<2018) |>
  model(stlf = decomposition_model(
    STL(log(Passageiros) ~ trend(window = 7), robust = TRUE),
    NAIVE(season_adjust)
  ))

Visualizando a previsão para 2019 e 2020 juntamente com os dados.

fit_dcmp |>
  forecast() |>
  autoplot(voosbr_ts |> 
             filter(year(data)<2020)) +
  labs(y = "",
       title = "Previsão via decomposição da série de log(passageiros)")

Resíduos do modelo via decomposição por STL.

fit_dcmp |> gg_tsresiduals()

Métricas de desempenho para os dois anos separados para teste.

voos_future <- voosbr_ts |>
  filter(year(data)<2020) |>
  filter(year(data)>=2018)

voos_fc <- fit_dcmp |>
  forecast(h=24) 
  
accuracy(voos_fc, voos_future) |>
  select(.model, RMSE, MAE, MAPE)

3.11 Exercícios propostos

  1. A seguir exibe-se o código para obtenção da série temporal mensal do volume em \(m^3\) de produção de asfalto no Brasil, um derivado do petróleo. A série aparenta apresentar um padrão de sazonalidade anual com variação não aditiva. Aplique uma transformação de Box-Cox na série. Qual o valor ótimo do parâmetro \(\lambda\)? Faça o gráfico da série transformada.
petro <- read.csv("petroleo_e_derivados.csv", header=T)
petro <- petro |> select(-c(gasolina_aviao,
                            outros_energeticos))

petro_ts <- petro |>
  pivot_longer(cols = petroleo:solvente) |>
  mutate(data = as.Date(data, format="%m/%d/%Y"))

petro_ts <- petro_ts |> 
  as_tsibble(key = name, 
             index = data) |>
  mutate(data = yearmonth(data))

asfalto <- petro_ts |>
  filter(name == "asfalto") |>
  select(!name)
  1. Uma vez que a série exibe um padrão de sazonalidade anual e tem frequência mensal, qual a ordem de média móvel seria adequada para estimar a tendência via método clássico?

  2. Faça um gráfico da série transformada de produção de asfalto com curva da tendência usando média móvel com a ordem adequada, segundo sua resposta na questão anterior.

  1. Faça a decomposição aditiva da série do índice de produção de bens de consumo duráveis usando o método clássico.

  1. Faça a decomposição clássica da série transformada de produção de asfalto usando o método clássico. Uma vez que a série foi transformada, você recomenda usar o método aditivo ou multiplicativo?
  1. Estime um modelo via decomposição por STL da série de produção de asfalto. Porém, neste caso, considere a série sem transformação de Box-Cox, utilize apenas transformação logarítimica para o volume produzido. Faça um gráfico da série com a previsão obtida com o modelo STL para os 32 meses disponíveis a partir de 2023 (h=32).
  1. Calcule as métricas de desempenho para o modelo avaliado nos meses separados para teste.