Introdução

1. Estrutura dos Dados

Nesta seção, está uma análise básica da estrutura dos dados

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)
library(naniar)

# Carregar os dados
data_portugal <- read.csv("inflacao_portugal.csv", header = TRUE)
data_alemanha <- read.csv("inflacao_alemanha.csv", header = TRUE)

# Visualizar as primeiras linhas de ambos os datasets
head(data_portugal)
##         DATE TIME.PERIOD HICP...Overall.index...ICP.M.PT.N.000000.4.ANR.
## 1 1996-01-31     1996Jan                                             2.5
## 2 1996-02-29     1996Feb                                             2.5
## 3 1996-03-31     1996Mar                                             2.3
## 4 1996-04-30     1996Apr                                             2.6
## 5 1996-05-31     1996May                                             3.1
## 6 1996-06-30     1996Jun                                             3.4
head(data_alemanha)
##         DATE TIME.PERIOD HICP...Overall.index..ICP.A.DE.N.000000.4.AVR.
## 1 1986-12-31        1986                                           -0.6
## 2 1987-12-31        1987                                           -0.1
## 3 1988-12-31        1988                                            0.9
## 4 1989-12-31        1989                                            2.6
## 5 1990-12-31        1990                                            2.7
## 6 1991-12-31        1991                                            3.6

1.1 Descrição Geral

Número de observações e variáveis nos datasets:

  • Portugal: 346 observações, 3 variáveis.
  • Alemanha: (detalhe número de observações e variáveis após verificar o dataset).

1.2 Descrição das Variáveis

  • Portugal:

    DATE: Representa a data associada a cada observação do índice HICP, no formato YYYY-MM-DD. TIME.PERIOD: Um campo textual descrevendo o período de tempo no formato YYYYMon. HICP…Overall.index…ICP.M.PT.N.000000.4.ANR.: Valores mensais do índice HICP.

  • Alemanha:

    DATE: Representa a data associada a cada observação do índice HICP. TIME.PERIOD: Período de tempo no formato textual YYYYMon. HICP…Overall.index…ICP.M.DE.N.000000.4.ANR.: Valores mensais do índice HICP.

#2. Estrutura e Pré-processamento dos Dados Aqui, ajustaremos os nomes das colunas e verificaremos os dados de ambos os países.

# Renomear colunas para facilitar a manipulação
data_portugal <- data_portugal %>%
  rename(
    Date = "DATE",
    Period = "TIME.PERIOD",
    HICP_Index = "HICP...Overall.index...ICP.M.PT.N.000000.4.ANR."
  )

data_alemanha <- data_alemanha %>%
  rename(
    Date = "DATE",
    Period = "TIME.PERIOD",
    HICP_Index = "HICP...Overall.index..ICP.A.DE.N.000000.4.AVR."
  )

# Converter colunas de data
data_portugal$Date <- as.Date(data_portugal$Date, format = "%Y-%m-%d")
data_alemanha$Date <- as.Date(data_alemanha$Date, format = "%Y-%m-%d")

# Verificar estrutura final
str(data_portugal)
## 'data.frame':    346 obs. of  3 variables:
##  $ Date      : Date, format: "1996-01-31" "1996-02-29" ...
##  $ Period    : chr  "1996Jan" "1996Feb" "1996Mar" "1996Apr" ...
##  $ HICP_Index: num  2.5 2.5 2.3 2.6 3.1 3.4 3.6 3.5 3.3 2.8 ...
str(data_alemanha)
## 'data.frame':    38 obs. of  3 variables:
##  $ Date      : Date, format: "1986-12-31" "1987-12-31" ...
##  $ Period    : int  1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 ...
##  $ HICP_Index: num  -0.6 -0.1 0.9 2.6 2.7 3.6 3.8 3.2 2.2 0.2 ...

3. Análise Exploratória

3.1 Resumo Estatístico

# Resumo estatístico para Portugal
summary(data_portugal$HICP_Index)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -1.800   0.800   2.200   2.211   3.100  10.600
# Resumo estatístico para Alemanha
summary(data_alemanha$HICP_Index)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -0.600   0.725   1.650   1.866   2.450   8.700

3.2 Visualização das Séries Temporais

# Gráfico para Portugal
ggplot(data_portugal, aes(x = Date, y = HICP_Index)) +
  geom_line(color = "blue") +
  labs(
    title = "Evolução do Índice HICP - Portugal",
    x = "Data",
    y = "Índice HICP"
  ) +
  theme_minimal()

# Gráfico para Alemanha
ggplot(data_alemanha, aes(x = Date, y = HICP_Index)) +
  geom_line(color = "red") +
  labs(
    title = "Evolução do Índice HICP - Alemanha",
    x = "Data",
    y = "Índice HICP"
  ) +
  theme_minimal()

Interpretação de Resultados

O HICP da Alemanha foi estável até 2020, com oscilações moderadas. A partir de 2020, houve um aumento acentuado, atingindo o pico em 2022, refletindo impactos como a pandemia e inflação global. Comparado a Portugal, a Alemanha foi mais estável, mas também sofreu forte aumento recente.

O Índice HICP em Portugal mostra maior volatilidade em comparação à Alemanha, com quedas acentuadas após 2010 e um pico significativo em 2022, provavelmente devido a eventos globais como a pandemia e inflação. A trajetória é marcada por instabilidade em períodos de crise.

3.3 Verificação de Dados Omissos

# Dados omissos para Portugal
sum(is.na(data_portugal$HICP_Index))
## [1] 0
vis_miss(data_portugal)

# Dados omissos para Alemanha
sum(is.na(data_alemanha$HICP_Index))
## [1] 0
vis_miss(data_alemanha)

4. Modelagem SARIMA

4.1. Preparação dos Dados

Nesta seção, preparamos os dados para análise.

# Carregar bibliotecas
library(tidyverse)
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tseries)

# Carregar os dados
data_portugal <- read.csv("inflacao_portugal.csv", header = TRUE)
data_alemanha <- read.csv("inflacao_alemanha.csv", header = TRUE)

# Renomear colunas para facilitar a manipulação
data_portugal <- data_portugal %>%
  rename(
    Date = "DATE",
    Period = "TIME.PERIOD",
    HICP_Index = "HICP...Overall.index...ICP.M.PT.N.000000.4.ANR."
  )

data_alemanha <- data_alemanha %>%
  rename(
    Date = "DATE",
    Period = "TIME.PERIOD",
    HICP_Index = "HICP...Overall.index..ICP.A.DE.N.000000.4.AVR."
  )

# Converter colunas de data
data_portugal$Date <- as.Date(data_portugal$Date, format = "%Y-%m-%d")
data_alemanha$Date <- as.Date(data_alemanha$Date, format = "%Y-%m-%d")

4.2. Série Temporal e Estacionariedade

# Criar séries temporais
ts_portugal <- ts(data_portugal$HICP_Index, start = c(1996, 1), frequency = 12)
ts_alemanha <- ts(data_alemanha$HICP_Index, start = c(1996, 1), frequency = 12)

# Plotar as séries
par(mfrow = c(2, 1))
plot(ts_portugal, main = "Série Temporal do Índice HICP - Portugal", xlab = "Ano", ylab = "HICP Index")
plot(ts_alemanha, main = "Série Temporal do Índice HICP - Alemanha", xlab = "Ano", ylab = "HICP Index")

# Testar estacionariedade com Dickey-Fuller
adf_portugal <- adf.test(ts_portugal)
## Warning in adf.test(ts_portugal): p-value smaller than printed p-value
adf_alemanha <- adf.test(ts_alemanha)

adf_portugal$p.value
## [1] 0.01
adf_alemanha$p.value
## [1] 0.559377
# Aplicar diferenciação, se necessário
diff_ts_portugal <- diff(ts_portugal)
diff_ts_alemanha <- diff(ts_alemanha)

# Testar novamente a estacionariedade
adf.test(diff_ts_portugal)
## Warning in adf.test(diff_ts_portugal): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff_ts_portugal
## Dickey-Fuller = -5.0662, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
adf.test(diff_ts_alemanha)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff_ts_alemanha
## Dickey-Fuller = -2.8442, Lag order = 3, p-value = 0.244
## alternative hypothesis: stationary
# Plotar ACF e PACF
par(mfrow = c(2, 2))
acf(diff_ts_portugal, main = "ACF - Portugal (Série Diferenciada)")
pacf(diff_ts_portugal, main = "PACF - Portugal (Série Diferenciada)")
acf(diff_ts_alemanha, main = "ACF - Alemanha (Série Diferenciada)")
pacf(diff_ts_alemanha, main = "PACF - Alemanha (Série Diferenciada)")

Interpretação de Resultados

ACF: Há correlações significativas nos primeiros atrasos (lags), indicando alguma estrutura na série, mas as correlações se tornam insignificantes rapidamente. PACF: Os primeiros lags apresentam valores significativos, sugerindo que um modelo AR pode capturar a dependência.

ACF: Também apresenta correlações significativas nos primeiros lags, mas menos acentuadas do que em Portugal. PACF: Os primeiros lags são significativos, indicando possível influência de um modelo AR simples.

4.3. Ajuste do Modelo SARIMA

Usamos o auto.arima para identificar o melhor modelo SARIMA para as séries temporais.

# Ajustar o modelo SARIMA para Portugal
sarima_portugal <- auto.arima(ts_portugal, seasonal = TRUE, stepwise = FALSE, approximation = FALSE)
summary(sarima_portugal)
## Series: ts_portugal 
## ARIMA(1,1,1)(0,0,2)[12] 
## 
## Coefficients:
##          ar1      ma1     sma1     sma2
##       0.8656  -0.7755  -0.5198  -0.0981
## s.e.  0.0686   0.0821   0.0576   0.0553
## 
## sigma^2 = 0.1718:  log likelihood = -186.2
## AIC=382.4   AICc=382.58   BIC=401.62
## 
## Training set error measures:
##                       ME      RMSE       MAE MPE MAPE      MASE         ACF1
## Training set 0.003545116 0.4115085 0.3129786 NaN  Inf 0.2021951 -0.005819641
# Ajustar o modelo SARIMA para Alemanha
sarima_alemanha <- auto.arima(ts_alemanha, seasonal = TRUE, stepwise = FALSE, approximation = FALSE)
summary(sarima_alemanha)
## Series: ts_alemanha 
## ARIMA(1,0,1) with non-zero mean 
## 
## Coefficients:
##          ar1     ma1    mean
##       0.1634  0.9343  1.8089
## s.e.  0.1769  0.1126  0.4146
## 
## sigma^2 = 1.371:  log likelihood = -59.54
## AIC=127.07   AICc=128.28   BIC=133.62
## 
## Training set error measures:
##                      ME     RMSE       MAE       MPE     MAPE      MASE
## Training set 0.02834744 1.123675 0.7556357 -36.07958 100.2676 0.4936314
##                     ACF1
## Training set -0.01090041
# Diagnóstico dos modelos
par(mfrow = c(2, 2))
checkresiduals(sarima_portugal)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,1,1)(0,0,2)[12]
## Q* = 45.077, df = 20, p-value = 0.001077
## 
## Model df: 4.   Total lags used: 24
checkresiduals(sarima_alemanha)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,1) with non-zero mean
## Q* = 2.4325, df = 6, p-value = 0.8759
## 
## Model df: 2.   Total lags used: 8

Interpretação

O modelo ARIMA ajustado para Portugal é adequado, pois os resíduos não apresentam padrões, são não correlacionados e possuem uma distribuição aproximadamente normal.

O modelo ARIMA (1,0,1) para a Alemanha é adequado, com resíduos não correlacionados e distribuição aproximadamente normal, indicando bom ajuste.

4.4. Previsões

# Previsões para Portugal
forecast_portugal <- forecast(sarima_portugal, h = 12)
plot(forecast_portugal, main = "Previsão SARIMA - Portugal")

# Previsões para Alemanha
forecast_alemanha <- forecast(sarima_alemanha, h = 12)
plot(forecast_alemanha, main = "Previsão SARIMA - Alemanha")

Interpretação

A previsão do modelo SARIMA para Portugal sugere uma estabilização nos próximos 12 meses, com flutuações moderadas. A banda azul representa o intervalo de confiança, indicando a incerteza nas projeções. O modelo captura bem a dinâmica recente, mantendo a tendência de queda pós-pico de 2022.

O modelo SARIMA prevê estabilidade para os próximos 12 meses, com o índice HICP mantendo-se próximo ao valor atual. A banda azul representa o intervalo de confiança, indicando baixa incerteza nas projeções, o que reforça a confiabilidade do modelo para esta série temporal.

5. Conclusão

A modelagem SARIMA foi realizada com sucesso para os dados de inflação de Portugal e Alemanha. As séries temporais foram ajustadas, e previsões foram geradas para os próximos 12 meses. Os diagnósticos dos modelos mostram resíduos bem comportados, indicando um bom ajuste.