Análise de Séries Temporais: Previsão da Inflação Mensal no Brasil (2020-2023)

Introdução

Nos últimos anos, a inflação no Brasil tem sido um tema central nas discussões econômicas e políticas. A inflação, medida principalmente pelo Índice de Preços ao Consumidor Amplo (IPCA), reflete a variação nos preços de bens e serviços e afeta diretamente o poder de compra da população. Entre 2020 e 2023, o Brasil enfrentou desafios significativos, incluindo a pandemia de COVID-19, crises políticas, e instabilidades globais, que influenciaram a trajetória da inflação. Houve períodos de alta inflacionária, impulsionados por fatores como o aumento dos preços dos combustíveis, da energia elétrica e dos alimentos, além de pressões externas como a desvalorização cambial e o impacto das cadeias de suprimento globais.

Nesse contexto, o estudo de séries temporais torna-se bastante relevante. As Séries Temporais permitem analisar a evolução da inflação ao longo do tempo, identificar padrões sazonais e tendências, e prever futuros movimentos com base nos dados históricos. A análise dessas séries auxilia economistas e formuladores de políticas públicas a entenderem a dinâmica inflacionária, tomar decisões informadas e planejar intervenções adequadas.

Objetivos

Este trabalho tem como objetivo testar diversos modelos de Séries Temporais para prever a inflação mensal no Brasil ao longo de um ano. Através da comparação entre os modelos, busca-se identificar aquele que melhor se ajusta aos dados históricos, fornecendo previsões mais precisas para a evolução futura dos preços e permitindo uma análise mais confiável dos padrões cíclicos e tendências inflacionárias.

Pacotes utilizados

Para a análise de séries temporais, diversos pacotes do R foram utilizados, cada um com uma função específica. O pacote DT é empregado para exibir o dataset de forma interativa, facilitando a visualização. O readxl é usado para importar os dados, que oferece suporte a planilhas do Excel. E, para a série, utiliza-se o pacote tseries.

library(DT) 
library(readxl) 
library(plotly) 
library(readr)
library(forecast)
library(Metrics)
library(tseries)

Pré processamento

Todo o pré-processamento dos dados foi realizado anteriormente e pode ser consultado aqui. Nesse estudo, foram feitas etapas como a conversão do índice da inflação para o tipo numérico, ajustes na formatação da coluna de datas, renomeação das colunas para maior clareza e verificação da integridade dos dados. A partir desse ponto, o foco deste trabalho está na continuação do estudo, que trata da modelagem, utilizando diferentes métodos de Séries Temporais para prever a inflação no Brasil para o próximo ano.

inflacaomensal <- read_csv("C:/Users/laris/Downloads/inflacao_dataset.csv")
View(inflacaomensal)

Base de Dados

O conjunto de dados utilizado nesta análise foi obtido do Kaggle, disponível no link Inflação Mensal Brasil. O dataset contém 2 colunas e 43 linhas, contendo dados mensais de inflação no Brasil de 2020 a 2023. As colunas consideradas para esta análise são:

  • a data em que a inflação foi coletada; e
  • a taxa de inflação registrada.
datatable(inflacaomensal, options = list(pageLength = 8), class = 'cell-border stripe', width = '100%')

Metodologia

A abordagem metodológica adotada foi dividida em cinco etapas e é descrita a seguir:

  1. O conjunto de dados foi dividido em treino e teste.

  2. Diferentes modelos de Séries Temporais foram aplicados e comparados, buscando identificar o que melhor se ajusta à série de inflação. Os modelos testados foram:

    • Autoregressivo (AR): Utiliza uma relação linear entre o valor atual e valores passados da própria série.

    • Média Móvel (MA): Baseia-se em uma média ponderada dos erros de previsão passados.

    • ARMA (Autoregressivo e Média Móvel): Combina os modelos AR e MA.

    • ARIMA (Autoregressivo Integrado e Média Móvel): Estende o ARMA ao lidar com séries não estacionárias, introduzindo uma etapa de diferenciação.

    • SARIMA (ARIMA Sazonal): Considera a presença de sazonalidade na série temporal.

    • AUTOARIMA: Ajusta automaticamente os melhores parâmetros de ordem do modelo ARIMA, economizando tempo e esforço.

  3. Após o ajuste dos modelos, foram geradas previsões para o próximo ano (período de teste) para cada modelo. As previsões foram comparadas aos valores reais observados no período de teste para avaliar a performance de cada método.

  4. Em seguida, as métricas de erro foram utilizadas para avaliar a precisão das previsões, considerando as seguintes métricas:

    • Erro Médio Absoluto (MAE): Mede a média das diferenças absolutas entre os valores previstos e os valores reais, fornecendo uma noção clara da magnitude do erro médio.

    • Erro Quadrático Médio (MSE): Calcula a média dos quadrados das diferenças entre os valores previstos e observados, penalizando com mais severidade os erros maiores.

    • Raiz do Erro Quadrático Médio (RMSE): É a raiz quadrada do MSE, expressando o erro na mesma unidade dos dados originais, o que facilita a interpretação do erro médio.

    • Erro Percentual Absoluto Médio (MAPE): Mede o erro percentual médio entre as previsões e os valores reais, permitindo uma avaliação relativa da precisão.

    • Critério de Informação de Akaike (AIC): Compara diferentes modelos, penalizando a complexidade e favorecendo aqueles que conseguem um bom ajuste com o menor número de parâmetros.

    • Critério de Informação Bayesiano (BIC): Similar ao AIC, porém mais rigoroso, penaliza fortemente a complexidade do modelo, favorecendo modelos mais simples ao comparar ajustes.

  5. Por fim, foi realizada uma comparação entre os modelos com base nas métricas de desempenho para identificar aquele que apresentou os melhores resultados na previsão.

Resultados

Visualização da Série Temporal para a modelagem

# Criar a série temporal
serie <- ts(inflacaomensal$indice_do_mes, start = c(2020, 1), frequency = 12)
print(serie)
##       Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
## 2020 0.53 0.84 0.71 0.61 0.23 0.08 0.12 0.54 1.01 1.62 1.06 0.47
## 2021 0.67 0.68 0.36 0.29 0.59 0.41 0.62 0.25 0.86 0.93 0.31 0.83
## 2022 0.53 0.96 0.87 1.16 1.25 0.95 0.73 0.21 0.25 0.07 0.31 0.38
## 2023 0.26 0.36 0.24 0.64 0.86 0.89 1.35
# Converter a série temporal para um data frame
df <- data.frame(
  Tempo = time(serie),
  Índice = as.numeric(serie)
)

# Criar o gráfico interativo
fig <- plot_ly(df, x = ~Tempo, y = ~Índice, type = 'scatter', mode = 'lines+markers', 
                line = list(color = 'black'), 
                marker = list(color = 'black',
                text = ~paste("Tempo:", round(Tempo, 2), "<br>Índice:", round(Índice, 2)),
                hoverinfo = 'text'))

# Adicionar título e rótulos
fig <- fig %>%
  layout(title = "Série Temporal do Índice de Inflação no Brasil",
         xaxis = list(title = "Tempo"),
         yaxis = list(title = "Índice"))
fig

Implementação dos modelos

Foram testados seis modelos de séries temporais: AR, MA, ARMA, ARIMA, SARIMA, e AUTOARIMA. A função Arima da biblioteca forecast foi utilizada para ajustar os modelos, enquanto a função auto.arima foi aplicada para a escolha automática dos parâmetros nos modelos ARIMA e AUTOARIMA.

# Obtendo os períodos de treinamento e teste
start_ano <- start(serie)
end_ano <- end(serie)

train <- window(serie, end = c(end_ano[1] - 1, end_ano[2]))
test <- window(serie, start = c(end_ano[1], 1))

# Função para calcular as métricas
calcular_metricas <- function(previstos, reais, modelo) {
  mae_val <- mae(reais, previstos)
  mse_val <- mse(reais, previstos)
  rmse_val <- rmse(reais, previstos)
  mape_val <- mape(reais, previstos) * 100
  aic_val <- AIC(modelo)
  bic_val <- BIC(modelo)
  
  return(list(MAE = mae_val, MSE = mse_val, RMSE = rmse_val, MAPE = mape_val, AIC = aic_val, BIC = bic_val))
}

# Modelos
modelos <- list()

# Modelo AR
modelos$ar <- Arima(train, order = c(1, 0, 0))
prev_ar <- forecast(modelos$ar, h = length(test))$mean
metricas_ar <- calcular_metricas(prev_ar, test, modelos$ar)

# Modelo MA
modelos$ma <- Arima(train, order = c(0, 0, 1))
prev_ma <- forecast(modelos$ma, h = length(test))$mean
metricas_ma <- calcular_metricas(prev_ma, test, modelos$ma)

# Modelo ARMA
modelos$arma <- Arima(train, order = c(1, 0, 1))
prev_arma <- forecast(modelos$arma, h = length(test))$mean
metricas_arma <- calcular_metricas(prev_arma, test, modelos$arma)

# Modelo ARIMA
modelos$arima <- auto.arima(train)
prev_arima <- forecast(modelos$arima, h = length(test))$mean
metricas_arima <- calcular_metricas(prev_arima, test, modelos$arima)

# Modelo SARIMA
modelos$sarima <- Arima(train, order = c(1, 1, 1), seasonal = list(order = c(1, 1, 1), period = 12))
prev_sarima <- forecast(modelos$sarima, h = length(test))$mean
metricas_sarima <- calcular_metricas(prev_sarima, test, modelos$sarima)

# Modelo AUTOARIMA
modelos$autoarima <- auto.arima(train)
prev_autoarima <- forecast(modelos$autoarima, h = length(test))$mean
metricas_autoarima <- calcular_metricas(prev_autoarima, test, modelos$autoarima)

# Exibir as métricas
print("Métricas para os Modelos:")
## [1] "Métricas para os Modelos:"
metricas <- list(
  AR = metricas_ar,
  MA = metricas_ma,
  ARMA = metricas_arma,
  ARIMA = metricas_arima,
  SARIMA = metricas_sarima,
  AUTOARIMA = metricas_autoarima
)

print(metricas)
## $AR
## $AR$MAE
## [1] 0.3673702
## 
## $AR$MSE
## [1] 0.1374776
## 
## $AR$RMSE
## [1] 0.3707797
## 
## $AR$MAPE
## [1] 124.3516
## 
## $AR$AIC
## [1] 19.53809
## 
## $AR$BIC
## [1] 23.84005
## 
## 
## $MA
## $MA$MAE
## [1] 0.3665764
## 
## $MA$MSE
## [1] 0.1368783
## 
## $MA$RMSE
## [1] 0.3699706
## 
## $MA$MAPE
## [1] 124.0798
## 
## $MA$AIC
## [1] 20.39415
## 
## $MA$BIC
## [1] 24.69612
## 
## 
## $ARMA
## $ARMA$MAE
## [1] 0.3658407
## 
## $ARMA$MSE
## [1] 0.1363419
## 
## $ARMA$RMSE
## [1] 0.3692451
## 
## $ARMA$MAPE
## [1] 123.8375
## 
## $ARMA$AIC
## [1] 21.23932
## 
## $ARMA$BIC
## [1] 26.97527
## 
## 
## $ARIMA
## $ARIMA$MAE
## [1] 0.3673702
## 
## $ARIMA$MSE
## [1] 0.1374776
## 
## $ARIMA$RMSE
## [1] 0.3707797
## 
## $ARIMA$MAPE
## [1] 124.3516
## 
## $ARIMA$AIC
## [1] 19.53809
## 
## $ARIMA$BIC
## [1] 23.84005
## 
## 
## $SARIMA
## $SARIMA$MAE
## [1] 0.8106981
## 
## $SARIMA$MSE
## [1] 0.6572437
## 
## $SARIMA$RMSE
## [1] 0.8107057
## 
## $SARIMA$MAPE
## [1] 268.3135
## 
## $SARIMA$AIC
## [1] 27.13622
## 
## $SARIMA$BIC
## [1] 31.58808
## 
## 
## $AUTOARIMA
## $AUTOARIMA$MAE
## [1] 0.3673702
## 
## $AUTOARIMA$MSE
## [1] 0.1374776
## 
## $AUTOARIMA$RMSE
## [1] 0.3707797
## 
## $AUTOARIMA$MAPE
## [1] 124.3516
## 
## $AUTOARIMA$AIC
## [1] 19.53809
## 
## $AUTOARIMA$BIC
## [1] 23.84005
# Função para plotar previsões e dados reais
plotar_previsao <- function(modelo, test, titulo) {
  previsao <- forecast(modelo, h = length(test))
  plot(previsao, main = titulo, ylab = "Valores")
  lines(test, col = "blue", lwd = 2)  # Linha azul para os dados reais
}

# Plotar gráficos para cada modelo
plotar_previsao(modelos$ar, test, "Previsão AR")

plotar_previsao(modelos$ma, test, "Previsão MA")

plotar_previsao(modelos$arma, test, "Previsão ARMA")

plotar_previsao(modelos$arima, test, "Previsão ARIMA")

plotar_previsao(modelos$sarima, test, "Previsão SARIMA")

plotar_previsao(modelos$autoarima, test, "Previsão AUTOARIMA")

Métricas

Na escolha das métricas de avaliação, foram selecionadas MAE, MSE, RMSE, MAPE, AIC, BIC. O MAE e MSE fornecem uma ideia da magnitude dos erros. O RMSE amplifica grandes erros, sendo útil para identificar desvios nas previsões. O MAPE oferece a porcentagem de erro em relação aos valores reais, facilitando a interpretação. Já as métricas AIC e BIC, desempenham um papel importante na seleção de modelos, especialmente em séries temporais.

# Criando a tabela comparativa de métricas
tabela_metricas <- data.frame(
  Modelo = c("AR", "MA", "ARMA", "ARIMA", "SARIMA", "AUTOARIMA"),
  MAE = c(metricas$AR$MAE, metricas$MA$MAE, metricas$ARMA$MAE, metricas$ARIMA$MAE, metricas$SARIMA$MAE, metricas$AUTOARIMA$MAE),
  MSE = c(metricas$AR$MSE, metricas$MA$MSE, metricas$ARMA$MSE, metricas$ARIMA$MSE, metricas$SARIMA$MSE, metricas$AUTOARIMA$MSE),
  RMSE = c(metricas$AR$RMSE, metricas$MA$RMSE, metricas$ARMA$RMSE, metricas$ARIMA$RMSE, metricas$SARIMA$RMSE, metricas$AUTOARIMA$RMSE),
  MAPE = c(metricas$AR$MAPE, metricas$MA$MAPE, metricas$ARMA$MAPE, metricas$ARIMA$MAPE, metricas$SARIMA$MAPE, metricas$AUTOARIMA$MAPE),
  AIC = c(metricas$AR$AIC, metricas$MA$AIC, metricas$ARMA$AIC, metricas$ARIMA$AIC, metricas$SARIMA$AIC, metricas$AUTOARIMA$AIC),
  BIC = c(metricas$AR$BIC, metricas$MA$BIC, metricas$ARMA$BIC, metricas$ARIMA$BIC, metricas$SARIMA$BIC, metricas$AUTOARIMA$BIC)
)

# Exibindo a tabela
print(tabela_metricas)
##      Modelo       MAE       MSE      RMSE     MAPE      AIC      BIC
## 1        AR 0.3673702 0.1374776 0.3707797 124.3516 19.53809 23.84005
## 2        MA 0.3665764 0.1368783 0.3699706 124.0798 20.39415 24.69612
## 3      ARMA 0.3658407 0.1363419 0.3692451 123.8375 21.23932 26.97527
## 4     ARIMA 0.3673702 0.1374776 0.3707797 124.3516 19.53809 23.84005
## 5    SARIMA 0.8106981 0.6572437 0.8107057 268.3135 27.13622 31.58808
## 6 AUTOARIMA 0.3673702 0.1374776 0.3707797 124.3516 19.53809 23.84005

Desempenho Geral dos Modelos

AR (Auto-Regressivo):

  • Erro: O modelo AR apresentou um MAE de 0.367, MSE de 0.137, e RMSE de 0.371, o que indica um bom ajuste aos dados. O MAPE de 124.35% demonstra que o erro percentual relativo é razoável, e o AIC de 19.54 sugere um modelo de boa qualidade.

  • Complexidade: Com BIC de 23.84, o AR mostrou ser relativamente simples, sendo uma escolha eficiente tanto em precisão quanto em simplicidade.

MA (Média Móvel):

  • Erro: O modelo MA obteve métricas bastante similares ao AR, com MAE de 0.367, MSE de 0.137, e RMSE de 0.370. O MAPE foi de 124.08%, o menor entre os modelos testados, indicando um desempenho ligeiramente melhor na previsão dos valores percentuais de inflação.

  • Complexidade: Com AIC de 20.39 e BIC de 24.70, o MA é um pouco mais complexo que o AR, mas ainda assim mantém um bom equilíbrio entre erro e complexidade.

ARMA (Auto-Regressivo e Médias Móveis):

  • Erro: O ARMA apresentou o melhor desempenho geral em termos de erro, com MAE de 0.366, MSE de 0.136, e RMSE de 0.369. Seu MAPE foi de 123.84%, também o mais baixo entre os modelos. Isso indica que o ARMA foi o mais preciso na previsão da inflação.

  • Complexidade: Apesar de seu bom desempenho, o ARMA tem um AIC de 21.24 e o maior BIC entre os modelos simples (26.98), indicando que ele adiciona mais complexidade ao modelo.

ARIMA (Auto-Regressivo Integrado de Médias Móveis):

  • Erro: O ARIMA teve resultados idênticos aos do AR, com MAE de 0.367, MSE de 0.137, e RMSE de 0.371. O MAPE foi de 124.35%. Isso sugere que, para esse conjunto de dados, a integração adicional no modelo ARIMA não trouxe benefícios significativos em termos de erro.

  • Complexidade: O ARIMA compartilha os mesmos AIC e BIC do modelo AR (19.54 e 23.84), sugerindo que, em termos de simplicidade, ele também não se diferencia muito do AR.

SARIMA (Sazonalidade no ARIMA):

  • Erro: O modelo SARIMA teve o pior desempenho, com MAE de 0.811, MSE de 0.657, e RMSE de 0.811. O MAPE de 268.31% indica que o modelo foi ineficaz em prever com precisão os valores da inflação. Isso pode indicar que os dados não apresentam uma forte componente sazonal que o modelo pudesse capturar.

  • Complexidade: O SARIMA também teve o maior AIC (27.14) e BIC (31.59), confirmando que ele foi o mais complexo e menos eficaz entre todos os modelos testados.

AUTOARIMA:

  • Erro: O AUTOARIMA apresentou os mesmos resultados de erro que o ARIMA e o AR, com MAE de 0.367, MSE de 0.137, e RMSE de 0.371, além de um MAPE de 124.35%. A escolha automática de parâmetros não melhorou significativamente o ajuste.

  • Complexidade: O AIC e o BIC também foram idênticos ao AR e ARIMA, sugerindo que o AUTOARIMA não trouxe uma vantagem substancial em termos de seleção automática de parâmetros.

Conclusão

Ao comparar os modelos de séries temporais para prever a inflação mensal no Brasil, o modelo ARMA se destacou pela maior precisão, apresentando o menor MAE (0.3658), MSE (0.1363) e MAPE (123.84%). No entanto, esse modelo também é mais complexo, com um dos maiores valores de BIC (26.98), o que pode aumentar os custos computacionais e exigir maior ajuste.

Os modelos AR e MA também tiveram bons resultados, com métricas de erro semelhantes ao ARMA, mas com menor complexidade, tornando-os boas alternativas quando se busca um equilíbrio entre precisão e simplicidade. Já o ARIMA e AUTOARIMA não trouxeram melhorias significativas. O SARIMA, com o pior desempenho, não se mostrou adequado para esse cenário, possivelmente pela falta de sazonalidade nos dados.

Em resumo, para máxima precisão, o ARMA é a melhor escolha. Se a simplicidade for priorizada, AR e MA são opções mais eficientes. Modelos como SARIMA devem ser evitados.

Referências