# 01) Escolhendo uma série temporal do R
# A série AirPassengers contém dados mensais de 1949 a 1960
data("AirPassengers")
serie <- AirPassengers

# 02) Pré-processamento dos dados
# Verificando valores ausentes, estrutura e estatísticas básicas
summary(serie)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   104.0   180.0   265.5   280.3   360.5   622.0
sum(is.na(serie))  # Checar se há valores ausentes
## [1] 0
# 03) Criando a série temporal
# Já é uma série temporal ts, mas vamos confirmar
class(serie)
## [1] "ts"
# 04) Esboçando o gráfico da série temporal estudada
plot(serie, main = "Série Temporal - AirPassengers", col = "blue", ylab = "Nº de Passageiros", xlab = "Ano")

# 05) Gráfico da média móvel (usando janela de 12 meses)
media_movel <- stats::filter(serie, filter = rep(1/12, 12), sides = 2)

plot(media_movel, main = "Média Móvel (12 meses)", col = "red", ylab = "Média Móvel", xlab = "Ano")

# 06) Gráfico da série e da média móvel juntos
plot(serie, main = "Série x Média Móvel", col = "gray", ylab = "Passageiros", xlab = "Ano")
lines(media_movel, col = "red", lwd = 2)
legend("topleft", legend = c("Série Original", "Média Móvel (12m)"),
       col = c("gray", "red"), lwd = 2)

# 07) Decomposição da série (aditiva)
decomposicao <- decompose(serie, type = "multiplicative")
plot(decomposicao)

# 08) Verificação de normalidade dos dados da série
# Usamos o pacote ggplot2 para plotagem
library(ggplot2)

library(tibble)


# Convertendo a série em dataframe
df_serie <- as_tibble(data.frame(valor = as.numeric(serie)))

# Histograma com ggplot
ggplot(df_serie, aes(x = valor)) +
  geom_histogram(fill = "steelblue", bins = 20, color = "black") +
  labs(title = "Histograma da Série Original", x = "Passageiros", y = "Frequência")

# Teste de normalidade Shapiro-Wilk
shapiro.test(df_serie$valor)  # p < 0.05 indica que os dados NÃO seguem distribuição normal
## 
##  Shapiro-Wilk normality test
## 
## data:  df_serie$valor
## W = 0.95196, p-value = 6.832e-05
# 09) Transformações: log e raiz cúbica
log_serie <- log(serie)
raiz3_serie <- serie^(1/3)

# Verificando a normalidade novamente após transformações
df_log <- as_tibble(data.frame(valor = as.numeric(log_serie)))
df_raiz3 <- as_tibble(data.frame(valor = as.numeric(raiz3_serie)))

# Histograma e teste para log
ggplot(df_log, aes(x = valor)) +
  geom_histogram(fill = "green", bins = 20, color = "black") +
  labs(title = "Histograma - Série Log", x = "log(Passageiros)", y = "Frequência")

shapiro.test(df_log$valor)  # Verificar se aproxima normalidade
## 
##  Shapiro-Wilk normality test
## 
## data:  df_log$valor
## W = 0.97324, p-value = 0.006373
# Histograma e teste para raiz cúbica
ggplot(df_raiz3, aes(x = valor)) +
  geom_histogram(fill = "orange", bins = 20, color = "black") +
  labs(title = "Histograma - Série Raiz Cúbica", x = "Passageiros^(1/3)", y = "Frequência")

shapiro.test(df_raiz3$valor)
## 
##  Shapiro-Wilk normality test
## 
## data:  df_raiz3$valor
## W = 0.9746, p-value = 0.008835
# 10) Verificando estacionariedade com KPSS (necessita pacote tseries)
library(tseries)
## Warning: pacote 'tseries' foi compilado no R versão 4.4.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
# Série original
kpss.test(serie)  # p < 0.05 = NÃO estacionária
## Warning in kpss.test(serie): p-value smaller than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  serie
## KPSS Level = 2.7395, Truncation lag parameter = 4, p-value = 0.01
# Fazendo diferenciação
serie_diff <- diff(log_serie)
kpss.test(serie_diff)  # Após a diferenciação, esperamos p > 0.05 (estacionária)
## Warning in kpss.test(serie_diff): p-value greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  serie_diff
## KPSS Level = 0.028205, Truncation lag parameter = 4, p-value = 0.1
# Plotando série diferenciada
plot(serie_diff, main = "Série Diferenciada (log)", col = "purple", ylab = "Diferença", xlab = "Ano")

# 11) Gráficos de autocorrelação e autocorrelação parcial
acf(serie_diff, main = "Autocorrelação - Série Diferenciada")

pacf(serie_diff, main = "Autocorrelação Parcial - Série Diferenciada")

# 12) PREVISÃO DA SÉRIE COM ARIMA

# Carregar o pacote necessário
library(forecast)
## Warning: pacote 'forecast' foi compilado no R versão 4.4.3
# Ajustando o modelo ARIMA automaticamente com auto.arima()
modelo_arima <- auto.arima(log_serie)  # Usamos a série log, pois é mais estabilizada
summary(modelo_arima)
## Series: log_serie 
## ARIMA(0,1,1)(0,1,1)[12] 
## 
## Coefficients:
##           ma1     sma1
##       -0.4018  -0.5569
## s.e.   0.0896   0.0731
## 
## sigma^2 = 0.001371:  log likelihood = 244.7
## AIC=-483.4   AICc=-483.21   BIC=-474.77
## 
## Training set error measures:
##                        ME       RMSE        MAE        MPE      MAPE      MASE
## Training set 0.0005730622 0.03504883 0.02626034 0.01098898 0.4752815 0.2169522
##                    ACF1
## Training set 0.01443892
# Comentário:
# O auto.arima encontra os melhores parâmetros (p, d, q) com base em AIC/BIC
# A série foi transformada com log para reduzir variância e estabilizar a média

# 13) Fazendo a previsão para os próximos 12 meses
previsao <- forecast(modelo_arima, h = 12)

# Como usamos log, precisamos aplicar a exponencial para voltar à escala original
previsao$mean <- exp(previsao$mean)
previsao$lower <- exp(previsao$lower)
previsao$upper <- exp(previsao$upper)

# 14) Plotando a previsão com intervalo de confiança
plot(previsao, 
     main = "Previsão para os próximos 12 meses (ARIMA)",
     ylab = "Passageiros",
     xlab = "Ano",
     col = "darkgreen")

# Adicionando a série original para comparação
lines(serie, col = "blue")

# 15) Avaliação dos resíduos
checkresiduals(modelo_arima)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,1,1)(0,1,1)[12]
## Q* = 26.446, df = 22, p-value = 0.233
## 
## Model df: 2.   Total lags used: 24
# Comentário:
# Essa função mostra o gráfico dos resíduos, ACF dos resíduos e o teste de Ljung-Box.
# Se o p-value do teste for > 0.05, os resíduos são aleatórios (modelo adequado).