Análise de Séries Temporais: Estudo 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.

Este trabalho busca aplicar conceitos de Séries Temporais na análise da inflação mensal no Brasil, compreendendo melhor seus comportamentos cíclicos e identificando padrões que possam fornecer insights sobre a evolução futura dos preços.

Objetivos

Este trabalho tem como objetivos criar e analisar uma série temporal com dados mensais de inflação, aplicando conceitos fundamentais da análise de Séries Temporais. Especificamente, busca-se avaliar a estacionaridade da série, testar a presença de passeio aleatório, examinar a autocorrelação, decompor a série em seus componentes principais, realizar transformações e diferenciação, e utilizar médias móveis para identificar padrões e tendências.

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. O dplyr permite manipulação e transformação dos dados, como sumarização e filtragem. E, para realizar testes de estacionariedade, como o teste ADF, utiliza-se o pacote tseries.

library(DT) # para a tabela
library(readxl) # ler a base
library(dplyr) # para sumarizar, filtrar, etc.
library(tseries) # para teste ADF
library(zoo) # para cálculo de médias móveis
library(urca) # para o passeio aletaório
library(plotly) # para gráficos interativos

Pré processamento

Para garantir que os dados estejam no formato correto para análise, o índice da inflação foi convertido para o tipo numérico, substituindo vírgulas por pontos, e a coluna de datas foi formatada. O dataframe foi atualizado com novos nomes de colunas para maior clareza e, em seguida, a estrutura do dataframe foi revisada para confirmar que as alterações foram aplicadas corretamente. Além disso, a presença de valores nulos foi verificada, assegurando a integridade dos dados antes da análise.

inflacaomensal <- read_excel("C:/Users/laris/Downloads/inflacao_mensal_brasil/infacaomensal.xlsx")
#View(inflacaomensal)

summary(inflacaomensal$`Índice do mês`)
##    Length     Class      Mode 
##        43 character character
str(inflacaomensal)
## tibble [43 × 2] (S3: tbl_df/tbl/data.frame)
##  $ Mês/ano      : POSIXct[1:43], format: "2023-01-01" "2023-02-01" ...
##  $ Índice do mês: chr [1:43] "0,53" "0,84" "0,71" "0,61" ...
# Transformar `Índice do mês` para numérico e garantir que `Mês/ano` esteja no formato correto
inflacaomensal <- inflacaomensal %>%
  mutate(
    `Índice do mês` = as.numeric(gsub(",", ".", `Índice do mês`)),
    `Mês/ano` = as.Date(`Mês/ano`, format="%Y-%m-%d")
  )

inflacaomensal <- inflacaomensal %>%
  rename(
    data = `Mês/ano`,
    indice_do_mes = `Índice do mês`
  )

# Verificar a estrutura do dataframe para garantir que as mudanças foram aplicadas
str(inflacaomensal) # OK
## tibble [43 × 2] (S3: tbl_df/tbl/data.frame)
##  $ data         : Date[1:43], format: "2023-01-01" "2023-02-01" ...
##  $ indice_do_mes: num [1:43] 0.53 0.84 0.71 0.61 0.23 0.08 0.12 0.54 1.01 1.62 ...
# Verificar o número de valores nulos por coluna
colSums(is.na(inflacaomensal))
##          data indice_do_mes 
##             0             0

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 metodologia adotada para o estudo envolveu várias etapas detalhadas. Inicialmente, na Coleta e Pré-processamento dos Dados, foram convertidos os valores do índice de inflação para o formato numérico, ajustado o formato da coluna de datas, renomeadas as colunas para maior clareza e verificados valores nulos. Em seguida, realizou-se a Análise Exploratória de Dados (EDA), que incluiu a criação e visualização da série temporal para identificar padrões iniciais de tendência e sazonalidade, a decomposição da série para separar as componentes de tendência, sazonalidade e ruído, e a verificação da distribuição dos dados com histogramas, gráficos Q-Q e o teste de Shapiro-Wilk para testar a normalidade. Também foram calculadas e analisadas a autocorrelação e autocorrelação parcial utilizando as funções ACF e PACF. A Verificação de Estacionaridade foi feita com o teste de Dickey-Fuller aumentado (ADF), e, em casos de não estacionaridade, a diferenciação foi aplicada para remover tendências e tornar a série estacionária.

Resultados

A Análise Exploratória de Dados (EDA) a seguir ajudará a entender e preparar a série temporal, sendo realizada através de vários tipos de gráficos e testes que revelam padrões e características da série.

Criação da Série Temporal

As séries temporais são conjuntos de observações ordenadas no tempo e podem representar diversos fenômenos observáveis ao longo de um período. Exemplos incluem valores diários de poluição, índices da Bolsa de Valores, temperaturas mensais, precipitação anual, e até mesmo o número de manchas solares registradas ao longo dos anos (MORETTIN, 2018). Em outras palavras, uma série temporal é uma sequência de dados organizados em ordem de tempo.

Exemplos:

  • Preço do petróleo;

  • Taxa de desemprego;

  • Volume de tráfego em estradas;

  • Inflação.

Séries temporais possuem três tipos de padrões, também chamados de componentes:

  • Tendência: ocorre quando a variável na série temporal mostra um crescimento ou declínio de longo prazo;
  • Sazonalidade: refere-se a um padrão que se repete em intervalos regulares, como o aumento da demanda por presentes durante o período de festas de fim de ano;
  • Ciclos: ocorrem quando os dados exibem flutuações que não seguem um período específico;
  • Erro aleatório: refere-se a variações irregulares nos dados causadas por fatores imprevisíveis ou desconhecidos.
# 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

A série de inflação apresenta variações ao longo do tempo, com alguns meses mostrando índices mais baixos e outros mais altos. Por exemplo, o índice foi mais baixo em maio de 2023 (0,08) e mais alto em março de 2022 (1,62). Observa-se também variações sazonais e tendências gerais, com valores mais voláteis nos anos de 2020 e 2021 e uma possível estabilização no final de 2022 e início de 2023.

Estacionaridade

Uma série é estacionária, quando ela se desenvolve no tempo aleatoriamente ao redor de uma média constante, refletindo alguma forma de equilíbrio estável.

Vamos verificar se a série é estacionária ou não. Para isso utilizaremos o Teste de Dickey-Fuller aumentado (ADF). O Teste de Dickey-Fuller Aumentado (ADF) é uma ferramenta estatística usada para verificar se uma série temporal é estacionária, ou seja, se suas propriedades estatísticas, como a média e a variância, permanecem constantes ao longo do tempo.

  • Hipótese Nula: A série é não-estacionária (ou possui uma raiz unitária)
  • Hipótese Alternativa: A série é estacionária
# Teste ADF
adf.test(serie)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  serie
## Dickey-Fuller = -3.1001, Lag order = 3, p-value = 0.1391
## alternative hypothesis: stationary

Como o p-valor é maior que 0.05, não há evidências suficientes para rejeitar a hipótese nula. Portanto, concluímos que a série temporal não é estacionária. Ou seja, precisamos realizar a diferenciação.

Passeio aleatório

Passeio Aleatório é um tipo de série temporal onde o valor futuro depende do valor atual e de uma “surpresa” aleatória, sem tendência clara. É como caminhar aleatoriamente, onde você não tem controle sobre para onde vai. O KPSS Unit Root Test é um teste usado para avaliar a estacionaridade de uma série temporal. O teste pode ser configurado para verificar a estacionaridade em nível (mu) ou em tendência.

  • Hipótese Nula: A série é estacionária.
  • Hipótese Alternativa: A série é não-estacionária (ou possui uma raiz unitária).
# Teste de Passeio Aleatório
rw_test <- ur.kpss(serie)
summary(rw_test)
## 
## ####################### 
## # KPSS Unit Root Test # 
## ####################### 
## 
## Test is of type: mu with 3 lags. 
## 
## Value of test-statistic is: 0.0488 
## 
## Critical value for a significance level of: 
##                 10pct  5pct 2.5pct  1pct
## critical values 0.347 0.463  0.574 0.739

Neste caso, o teste é do tipo “mu” e usa 3 defasagens (lags) para calcular o valor do teste. O valor do teste estatístico obtido é 0,0488. Comparamos o valor do teste estatístico com os valores críticos para diferentes níveis de significância (10%, 5%, 2,5% e 1%). Os valores críticos fornecidos são 0,347 para 10%, 0,463 para 5%, 0,574 para 2,5% e 0,739 para 1%. O valor do teste estatístico (0,0488) é menor do que todos os valores críticos. Ou seja, não podemos rejeitar a hipótese nula de que a série é estacionária em nível, sugerindo que a série temporal analisada não possui uma raiz unitária e é estacionária.

Observação: A presença de resultados contraditórios entre o Teste de Dickey-Fuller Aumentado (ADF) e o Teste KPSS pode ocorrer devido às diferenças nas hipóteses nulas dos testes. O ADF testa a estacionaridade em nível, enquanto o KPSS pode ser configurado para verificar a estacionaridade em nível ou em tendência. Se o p-valor do ADF é alto, sugere que a série pode ser não-estacionária, enquanto um valor baixo no KPSS (em nível) indica que a série pode ser estacionária em nível. A contradição pode surgir se a série apresentar tendências ou sazonalidades não detectadas por um dos testes. Por isso, é importante considerar ambas as abordagens e, se necessário, aplicar diferenciação ou outras transformações para alcançar a estacionaridade.

Autocorrelação

Autocorrelação é a correlação entre os valores de uma série temporal em diferentes pontos no tempo. Em outras palavras, é a medida de como os valores passados de uma série influenciam os valores futuros.

# Autocorrelação
acf(serie, main = "Função de Autocorrelação - Série Temporal")

pacf(serie, main = "Função de Autocorrelação Parcial - Série Temporal")

O gráfico ACF mostra a autocorrelação das observações da série temporal com suas defasagens, revelando como uma observação está correlacionada com as anteriores. Picos significativos fora da faixa de confiança indicam autocorrelação importante, sugerindo a necessidade de modelar essas correlações. Um decaimento exponencial no ACF pode sugerir um modelo de suavização exponencial, enquanto um corte rápido indica a presença de um componente autoregressivo (AR). O gráfico PACF, por sua vez, mostra a autocorrelação parcial, que revela a correlação entre uma observação e uma defasagem, após remover o efeito das defasagens intermediárias. Picos significativos no PACF ajudam a identificar a ordem do componente AR, enquanto um decaimento gradual pode sugerir a necessidade de um componente de média móvel (MA) no modelo.

O teste de Ljung-Box é utilizado para verificar a presença de autocorrelação em uma série temporal e avaliar a adequação de um modelo ajustado à série. Ele testa a hipótese de que os resíduos da série temporal (ou do modelo) são independentes e não apresentam autocorrelação significativa em vários lags.

  • Hipótese Nula: Os resíduos são independentes e não possuem autocorrelação significativa até o lag especificado.
  • Hipótese Alternativa: Os resíduos apresentam autocorrelação significativa em pelo menos um dos lags especificados.
# Teste de Autocorrelação (Ljung-Box)
# Ho = não é autocorrelacionado: p > 0.05
# Ha = é autocorrelacionado: p <= 0.05
Box.test(serie, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  serie
## X-squared = 13.563, df = 1, p-value = 0.0002307

Com um p-valor de 0.0002307, que é menor que 0.05, rejeitamos a hipótese nula. Portanto, os dados apresentam autocorrelação, ou seja, os valores da série temporal estão de fato relacionados com seus valores anteriores.

Decomposição

A decomposição é uma técnica que permite analisar e entender uma série temporal ao separá-la em seus diferentes componentes.

# Decompor a série temporal
decomp <- decompose(serie)

# Plotar a decomposição
plot(decomp)

O gráfico acima divide a série em três componentes principais: tendência, sazonalidade e resíduos. A tendência revela uma diminuição geral da inflação ao longo do tempo. A sazonalidade destaca padrões repetitivos, como variações mensais ou anuais. Já os resíduos representam as flutuações aleatórias não explicadas pelos outros dois componentes.

Transformação

Na transformação de dados, aplica-se uma função matemática para estabilizar a variância ou aproximar a série de uma distribuição normal. Entre as transformações comuns, como logaritmo e raiz quadrada, optamos pela transformação logarítmica. Essa escolha se deve ao fato de que a transformação logarítmica é eficaz na redução da variabilidade e na mitigação de diversos problemas que podem afetar a análise dos dados.

Vamos começar verificando a normalidade dos dados, usando o Teste de Shapiro-Wilk; Ele verifica se um conjunto de dados segue uma distribuição normal e é amplamente utilizado devido à sua alta precisão em amostras pequenas e médias.

  • Hipótese Nula: Os dados seguem uma distribuição normal.
  • Hipótese Alternativa: Os dados não seguem uma distribuição normal.
# Histograma
hist(serie, main = "Histograma", xlab = "Valores", ylab = "Frequência", breaks = 10)

# Q-Q Plot
qqnorm(serie)
qqline(serie, col = "blue")

# Teste de Shapiro-Wilk
shapiro.test(serie)
## 
##  Shapiro-Wilk normality test
## 
## data:  serie
## W = 0.96094, p-value = 0.15

Com um p-valor de 0.15, que é maior que 0.05, não rejeitamos a hipótese nula. Portanto, os dados podem ser considerados normalmente distribuídos.

Mesmo com o Teste de Shapiro-Wilk indicando que os dados podem se aproximar da normalidade, aplicaremos a transformação logarítmica. Isso é feito para reduzir a variabilidade e estabilizar a variância, o que pode melhorar a qualidade da análise e a performance de modelos que exigem dados com distribuição mais homogênea.

# Aplicar a transformação logarítmica
serie_log <- log(serie)

# Plotar a série transformada
plot(serie_log, main = "Série Temporal Transformada (Log)", ylab = "Log(Índice)", xlab = "Tempo")

# Histograma
hist(serie_log, main = "Histograma", xlab = "Valores", ylab = "Frequência", breaks = 10)

# Q-Q Plot
qqnorm(serie_log)
qqline(serie_log, col = "blue")

# Teste de Shapiro-Wilk
shapiro.test(serie_log)
## 
##  Shapiro-Wilk normality test
## 
## data:  serie_log
## W = 0.93555, p-value = 0.01811

Mesmo com a transformação, a normalidade dos dados não foi totalmente atingida, pois o p-valor é menor que 0,05. A transformação logarítmica ajudou a reduzir a variabilidade e estabilizar a variância, mas os dados ainda não seguem uma distribuição normal perfeita.

Diferenciação

Na diferenciação, calcula-se a diferença entre observações consecutivas para eliminar a tendência e a sazonalidade. A primeira diferença é a diferença entre um valor e o valor anterior, a segunda diferença é a diferença entre as primeiras diferenças, e assim por diante.

# Diferenciar a série
serie_dif <- diff(serie_log)

# Plotar a série diferenciada
plot(serie_dif, main = "Série Diferenciada", ylab = "Diferença", xlab = "Tempo")

## Identificar parâmetros do modelo

acf(serie_dif, main = "ACF")

pacf(serie_dif, main = "PACF")

# Teste ADF novamente
adf.test(serie_dif)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  serie_dif
## Dickey-Fuller = -4.7013, Lag order = 3, p-value = 0.01
## alternative hypothesis: stationary

Após a diferenciação, mostra um p-valor de 0.01, que é menor que o nível de significância de 0.05. Isso indica que podemos rejeitar a hipótese nula de que a série possui uma raiz unitária, sugerindo que a série diferenciada agora é estacionária.

Média móvel

A média móvel é uma técnica de suavização que calcula a média de um conjunto fixo de observações anteriores e posteriores para substituir cada valor em uma série temporal. Essa abordagem reduz a variabilidade e suaviza a série, facilitando a identificação de tendências e ciclos. No gráfico abaixo, essa suavização é representada pela linha azul.

media_movel <- rollmean(serie_dif, k = 7, fill = NA)
plot(serie_dif, type = "l", main = "Média Móvel", ylab = "Inflação", xlab = "Tempo")
lines(media_movel, col = "blue")

Conclusão

Neste trabalho, foram explorados conceitos essenciais para a criação e análise de séries temporais utilizando a linguagem R. A série temporal do índice de inflação revelou características sazonais e tendências marcantes, sendo a diferenciação eficaz para alcançar a estacionaridade. Embora a transformação logarítmica tenha contribuído para a redução da variabilidade, a normalidade completa não foi alcançada. A aplicação da média móvel permitiu suavizar a série e destacar padrões de longo prazo. As análises realizadas fornecem uma base para modelagem e previsões futuras.

Referências