# 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).