Análise de Séries Temporais com ARIMA

Resumo

Este tutorial apresenta uma abordagem prática para análise de séries temporais, com foco na estimativa de modelos ARIMA utilizando a metodologia Box-Jenkins. Inicialmente, ele define séries temporais e descreve o modelo ARIMA, que combina componentes autorregressivos, diferenciais e de médias móveis. A metodologia Box-Jenkins é explicada em quatro etapas: identificação, estimação, diagnóstico e previsão. O tutorial inclui exemplo prático usando dados reais.

1 Conceitos

1.1 Séries Temporais

Uma série temporal é uma sequência de dados observados em intervalos de tempo sucessivos, como, por exemplo, valores mensais de um indicador econômico.

1.2 Modelo ARIMA

O ARIMA (AutoRegressive Integrated Moving Average) é um modelo preditivo que combina três componentes:

- AR (AutoRegressivo): relaciona a série atual com seus próprios valores passados.

- I (Integrado): trata da diferenciação para tornar a série estacionária.

- MA (Média Móvel): utiliza os resíduos dos modelos de médias móveis para ajustar a previsão.

1.3 Metodologia Box-Jenkins

Os passos principais da metodologia Box-Jenkins são: 1. Identificação: Tornar a série estacionária (diferenciação) e identificar os parâmetros AR e MA.

2. Estimação: Ajustar o modelo.

3. Diagnóstico: Verificar resíduos.

4. Previsão: Fazer previsões com o modelo ajustado.

A metodologia Box-Jenkins é um processo recursivo que se baseia na iteração entre três etapas principais: identificação, estimação e diagnóstico. Após cada ciclo de ajuste do modelo, os resíduos são analisados para verificar a adequação do modelo. Se problemas forem detectados, como autocorrelações nos resíduos ou inadequação na captura da estrutura da série, o modelo é reavaliado e ajustado novamente, retornando à fase de identificação. Esse ciclo continua até que o modelo apresente um bom ajuste, capturando as características essenciais da série temporal, como estacionariedade e ausência de correlação nos resíduos, garantindo assim previsões confiáveis. Essa natureza recursiva permite melhorias contínuas no modelo ao longo das iterações.

2 Exemplo Prático: Estimativa de Modelo ARIMA

2.1 Preparação do dados

Na preparação de dados para análise de séries temporais, a leitura dos dados envolve carregar a série temporal em um formato apropriado, como ts no R, a partir de fontes como arquivos CSV ou Excel. A visualização gráfica inicial permite identificar padrões visuais, como tendência ou sazonalidade, geralmente usando gráficos simples (plot) que mostram a evolução dos dados ao longo do tempo.

Para lidar com a remoção da sazonalidade, que é importante em muitas séries temporais, utilizamos técnicas como a decomposição sazonal ou ajustamos sazonalmente com pacotes como seasonal, que remove flutuações periódicas. Isso ajuda a evidenciar a tendência e a parte não sazonal dos dados, facilitando a modelagem subsequente.

# Carregando os pacotes necessários
library(forecast)
library(tseries)
library(seasonal)
library(readxl)

# Carregar a série AirPassengers
data("AirPassengers")
plot(AirPassengers, main="Série AirPassengers", ylab="Passageiros", xlab="Ano")

# usando a série sazonalmente ajustada
passageiros_sa <- final(seas(AirPassengers))
# Visualizando a série temporal
plot(passageiros_sa, main="Passageiros Aéreos Sazonalmente Ajustada", ylab="Produção", xlab="Ano")

# Leitura dos dados da Produção Industrial
dados <- read_excel("tabela8888.xlsx")
# Preparando a série temporal
pimpf <- ts(dados$pimpf, start=c(2002,1), frequency=12)
# Visualizando a série temporal
plot(pimpf, main="Produção Industrial Brasileira", ylab="Produção", xlab="Ano")

# usando a série sazonalmente ajustada
pimpf_sa <- final(seas(pimpf))
# Visualizando a série temporal
plot(pimpf_sa, main="Produção Industrial Brasileira Sazonalmente Ajustada", ylab="Produção", xlab="Ano")

2.2 Identificação

Na etapa de identificação da metodologia Box-Jenkins, o objetivo é determinar se a série temporal é estacionária e identificar os parâmetros iniciais do modelo ARIMA (AutoRegressivo, Integrado e de Médias Móveis). O primeiro passo é avaliar a estacionariedade, que pode ser feita visualmente ou com testes formais, como o teste de Dickey-Fuller Aumentado. Se a série não for estacionária, aplicam-se transformações como a diferenciação para remover tendência ou sazonalidade.

Após tornar a série estacionária, analisam-se os correlogramas (ACF e PACF) para entender as dependências temporais. O gráfico de ACF ajuda a identificar o número de termos MA (média móvel) e o PACF auxilia na escolha dos parâmetros AR (auto regressivos). Esses gráficos fornecem uma base para determinar os valores dos parâmetros ( p ), ( d ) e ( q ) do modelo ARIMA, que serão refinados nas próximas etapas.

# Verificando estacionariedade -Teste de Dickey-Fuller Aumentado
adf.test(passageiros_sa)  

    Augmented Dickey-Fuller Test

data:  passageiros_sa
Dickey-Fuller = -2.0735, Lag order = 5, p-value = 0.5458
alternative hypothesis: stationary
adf.test(pimpf_sa)  

    Augmented Dickey-Fuller Test

data:  pimpf_sa
Dickey-Fuller = -2.2612, Lag order = 6, p-value = 0.4659
alternative hypothesis: stationary
# Fazendo o teste na primeira diferença
adf.test(diff(passageiros_sa))  

    Augmented Dickey-Fuller Test

data:  diff(passageiros_sa)
Dickey-Fuller = -5.2999, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary
adf.test(diff(pimpf_sa))  

    Augmented Dickey-Fuller Test

data:  diff(pimpf_sa)
Dickey-Fuller = -6.7233, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary
# Função de autocorrelação e autocorrelação parcial
acf(diff(passageiros_sa), main="FAC")

pacf(diff(passageiros_sa), main="FACP")

acf(diff(pimpf_sa), main="FAC")

pacf(diff(pimpf_sa), main="FACP")

2.3 Estimação

A etapa de estimação na metodologia Box-Jenkins envolve ajustar os parâmetros do modelo ARIMA selecionado na fase de identificação. A função auto.arima() no R automatiza essa etapa, identificando os melhores valores para os parâmetros (p) (auto regressivo), (d) (diferenciação), e (q) (média móvel) do modelo ARIMA, otimizando critérios como o AIC (Critério de Informação de Akaike).

A auto.arima() testa diferentes combinações de parâmetros e seleciona o modelo que melhor se ajusta à série temporal, considerando também a presença de sazonalidade (caso o parâmetro seasonal = TRUE). A função realiza automaticamente a diferenciação da série, ajusta modelos AR e MA, e retorna o modelo com o menor AIC, indicando o equilíbrio entre qualidade do ajuste e complexidade do modelo. Este processo economiza tempo e evita erros manuais na seleção dos parâmetros.

O comando auto.arima() ajusta automaticamente o modelo ARIMA mais adequado com base na série temporal fornecida, e o summary() exibe os detalhes do modelo escolhido.

# Usando auto.arima para identificar os melhores parâmetros
modelo_arima_pass <- auto.arima(passageiros_sa,seasonal = FALSE)
summary(modelo_arima_pass)
Series: passageiros_sa 
ARIMA(0,1,1) with drift 

Coefficients:
          ma1   drift
      -0.1861  2.5591
s.e.   0.0918  0.3690

sigma^2 = 29.7:  log likelihood = -444.39
AIC=894.78   AICc=894.95   BIC=903.67

Training set error measures:
                        ME     RMSE      MAE        MPE     MAPE      MASE
Training set -0.0005787515 5.392888 4.057481 -0.1725203 1.622041 0.1281636
                   ACF1
Training set 0.01246298
modelo_arima_pim <- auto.arima(pimpf_sa,seasonal = FALSE)
summary(modelo_arima_pim)
Series: pimpf_sa 
ARIMA(0,1,0) 

sigma^2 = 4.407:  log likelihood = -581.17
AIC=1164.34   AICc=1164.35   BIC=1167.93

Training set error measures:
                     ME     RMSE       MAE        MPE      MAPE     MASE
Training set 0.04620561 2.095283 0.8978374 0.02222935 0.8924903 0.192969
                   ACF1
Training set 0.03086195

2.4 Diagnóstico

A etapa de diagnóstico no processo Box-Jenkins verifica a adequação do modelo ajustado, garantindo que os resíduos (erros) sejam aleatórios e sem padrões, o que é crucial para a confiabilidade das previsões. No R, a função checkresiduals(), do pacote forecast, facilita essa análise, realizando uma série de testes e visualizações.

Ao usar checkresiduals(), o objetivo é verificar se os resíduos do modelo seguem um comportamento de “ruído branco”, ou seja, sem autocorrelação significativa e distribuídos de forma aproximadamente normal. A função fornece:

  1. Gráfico dos resíduos: Mostra os resíduos ao longo do tempo, ajudando a visualizar padrões residuais.
  2. ACF dos resíduos: Exibe o correlograma dos resíduos, que deve mostrar que eles não são autocorrelacionados (os pontos devem estar dentro das bandas de confiança).
  3. Teste de Ljung-Box: Avalia a hipótese nula de que não há autocorrelação nos resíduos. Um p-valor alto (geralmente > 0.05) sugere que os resíduos são independentes.
  4. Histograma com curva de densidade: Indica se os resíduos seguem uma distribuição normal.

Se os resíduos não forem independentes ou mostrarem autocorrelações significativas, isso sugere que o modelo precisa ser revisado e ajustado.

O comando checkresiduals() executa o diagnóstico sobre os resíduos do modelo ajustado fornecendo gráficos e testes para ajudar a avaliar a qualidade do ajuste.

# Diagnóstico de resíduos
checkresiduals(modelo_arima_pass)


    Ljung-Box test

data:  Residuals from ARIMA(0,1,1) with drift
Q* = 37.642, df = 23, p-value = 0.02782

Model df: 1.   Total lags used: 24
checkresiduals(modelo_arima_pim)


    Ljung-Box test

data:  Residuals from ARIMA(0,1,0)
Q* = 42.584, df = 24, p-value = 0.01109

Model df: 0.   Total lags used: 24

2.5 Retornando ao início

A verificação de outliers é uma etapa crucial na análise de séries temporais, pois outliers podem distorcer significativamente os resultados de modelagem e previsão. Outliers são valores anômalos que se desviam drasticamente do padrão geral da série, podendo ser causados por eventos únicos, erros de medição ou variações inesperadas.

Se os outliers não forem identificados e tratados adequadamente, eles podem afetar a estimativa dos parâmetros do modelo, levar à superestimação ou subestimação nas previsões, e dificultar a análise de componentes como tendência e sazonalidade. Além disso, outliers podem aumentar a variabilidade nos resíduos, tornando mais difícil validar o modelo.

Por isso, é essencial detectar e lidar com esses pontos fora da curva. Métodos como a função tsoutliers() no R, ou pacotes como anomalize, podem identificar outliers e propor soluções, como substituição por valores interpolados ou ajuste específico. Após a correção, a série torna-se mais confiável para modelagem e previsão, resultando em estimativas mais robustas e precisas.

Para mais detalhes sobre, consulte: https://robjhyndman.com/hyndsight/tsoutliers/

# Identificação de outliers
outliers <- tsoutliers(pimpf_sa)
print(outliers)
$index
 [1]  81  82  84  85  86  87  88  89  90 197 220 221 222

$replacements
 [1] 115.69792 113.43771 111.12658 110.51091 109.79317 110.01062 109.64673
 [8] 109.52436 108.84025 104.16756  98.78535  99.24077  99.81395
# Retorna a série com outliers removidos e substituídos

pimpf_sa_clean <- tsclean(pimpf_sa)
pimpf_sa_clean[c(81,82,84,85,86,87,88,89,197,220,221,222)]
 [1] 115.69792 113.43771 111.12658 110.51091 109.79317 110.01062 109.64673
 [8] 109.52436 104.16756  98.78535  99.24077  99.81395

2.5.1 Identificação

# Verificando estacionariedade -Teste de Dickey-Fuller Aumentado
adf.test(pimpf_sa_clean)  

    Augmented Dickey-Fuller Test

data:  pimpf_sa_clean
Dickey-Fuller = -2.3566, Lag order = 6, p-value = 0.4258
alternative hypothesis: stationary
# Fazendo o teste na primeira diferença
adf.test(diff(pimpf_sa_clean))  

    Augmented Dickey-Fuller Test

data:  diff(pimpf_sa_clean)
Dickey-Fuller = -3.9245, Lag order = 6, p-value = 0.01324
alternative hypothesis: stationary
# Fazendo o teste na segunda diferença
adf.test(diff(diff(pimpf_sa_clean)))  

    Augmented Dickey-Fuller Test

data:  diff(diff(pimpf_sa_clean))
Dickey-Fuller = -8.6923, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary
# Função de autocorrelação e autocorrelação parcial
acf(diff(pimpf_sa_clean), main="FAC")

pacf(diff(pimpf_sa_clean), main="FACP")

2.5.2 Estimação

# Usando auto.arima para identificar os melhores parâmetros
modelo_arima_pim <- auto.arima(pimpf_sa_clean,seasonal = FALSE)
summary(modelo_arima_pim)
Series: pimpf_sa_clean 
ARIMA(2,2,2) 

Coefficients:
          ar1     ar2      ma1      ma2
      -0.0095  0.4604  -0.9109  -0.0698
s.e.   0.1685  0.0586   0.1976   0.1877

sigma^2 = 0.4797:  log likelihood = -281.08
AIC=572.16   AICc=572.39   BIC=590.12

Training set error measures:
                      ME      RMSE       MAE         MPE      MAPE      MASE
Training set -0.02543919 0.6848883 0.5162394 -0.02013386 0.4830226 0.1349548
                     ACF1
Training set -0.008365072

2.5.3 Diagnóstico

# Diagnóstico de resíduos
checkresiduals(modelo_arima_pim)


    Ljung-Box test

data:  Residuals from ARIMA(2,2,2)
Q* = 41.624, df = 20, p-value = 0.003095

Model df: 4.   Total lags used: 24

2.6 Previsão

A previsão é a etapa final da metodologia Box-Jenkins, onde o modelo ajustado (como ARIMA ou SARIMA) é utilizado para prever os valores futuros da série temporal. O objetivo da previsão é estimar a evolução da série com base nas tendências, padrões sazonais e relações autorregressivas identificadas no modelo.

Uma vez que o modelo foi ajustado e diagnosticado como adequado (resíduos comportando-se como ruído branco), a função forecast() no R pode ser usada para gerar previsões para períodos futuros. Essa função retorna tanto os valores previstos quanto os intervalos de confiança, que indicam a incerteza associada às previsões.

A precisão da previsão é avaliada com métricas como RMSE (Root Mean Squared Error), MAE (Mean Absolute Error) e MAPE (Mean Absolute Percentage Error), que indicam o quão próximo o modelo está dos valores observados. A verificação contínua dessas previsões ajuda a garantir a robustez e utilidade do modelo ajustado para tomadas de decisão baseadas em dados.

# Previsão para os próximos 12 meses
previsao_arima_pim <- forecast(modelo_arima_pim, h=12)
plot(previsao_arima_pim)

# Comparação dos valores previstos e reais
accuracy(previsao_arima_pim)
                      ME      RMSE       MAE         MPE      MAPE      MASE
Training set -0.02543919 0.6848883 0.5162394 -0.02013386 0.4830226 0.1349548
                     ACF1
Training set -0.008365072

2.7 Considerações sobre previsão com modelos ARIMA

Em termos de previsão, os modelos ARIMA também apresentam algumas limitações importantes que afetam sua eficácia em certos contextos:

  1. Desempenho em Longo Prazo: ARIMA tende a funcionar bem em previsões de curto prazo, mas seu desempenho pode se deteriorar significativamente em previsões de longo prazo. Isso ocorre porque ele depende muito dos padrões observados nos dados recentes, e não consegue prever mudanças estruturais ou eventos futuros inesperados.

  2. Previsões Constantes a Longo Prazo: Como o ARIMA é um modelo linear e estacionário, quando a série temporal é diferenciada e estabilizada, ele tende a prever valores futuros que convergem para uma média ou tendência linear, sem levar em conta mudanças sazonais ou tendências complexas de longo prazo.

  3. Sensibilidade a Mudanças nas Tendências: O ARIMA pode ter dificuldade em se ajustar rapidamente a mudanças repentinas nas tendências da série temporal, como mudanças econômicas abruptas, crises ou inovações tecnológicas que alteram a dinâmica subjacente dos dados.

  4. Falta de Integração com Variáveis Externas: O ARIMA clássico não incorpora variáveis exógenas que possam influenciar a série temporal. Para séries temporais que dependem de fatores externos (como taxas de câmbio, inflação, clima, etc.), o ARIMA não pode modelar diretamente essas influências, a menos que se use extensões como o ARIMAX (ARIMA com variáveis exógenas).

  5. Suposição de Estabilidade Estrutural: ARIMA assume que a estrutura da série temporal permanecerá estável no futuro, ou seja, que os padrões observados no passado (de autocorrelação, tendência, e sazonalidade) continuarão a existir. No entanto, eventos disruptivos ou mudanças estruturais significativas podem invalidar essa suposição e levar a previsões imprecisas.

  6. Impacto de Outliers nas Previsões: Como o ARIMA é sensível a outliers, eles podem distorcer as previsões se não forem adequadamente identificados e tratados. Um ou mais outliers podem levar a previsões errôneas, especialmente em períodos mais longos.

  7. Não Capta Comportamentos Cíclicos Complexos: Embora o ARIMA possa capturar algumas repetições sazonais simples (no caso de SARIMA), ele não lida bem com comportamentos cíclicos mais complexos ou variáveis, como padrões com mudanças na amplitude ou frequência ao longo do tempo.

Essas limitações fazem com que o ARIMA, apesar de ser uma ferramenta poderosa, seja mais apropriado para previsões de curto prazo e séries temporais com padrões relativamente estáveis. Em situações onde há influências externas significativas ou mudanças estruturais frequentes, outros modelos, como redes neurais, modelos híbridos ou com variáveis exógenas, podem ser mais eficazes.