7 Days of Code - Dia 3

Author

pabsantos

Carregando Pacotes e Dados do CEAPS

library(tidyverse)
library(plotly)
library(prophet)

ceaps_serie <- vroom::vroom("data/dataset_ceaps_forecasting.csv")

Forecasting

Com base nos dados diários, fazer uma previsão de gastos para os próximos três meses. O primeiro passo do processo foi acumular o valor de gastos dos senadores por mês. Verificando a serie temporal:

series_plot <- ggplot(ceaps_serie, aes(ds, y)) +
  geom_line(lwd = 0.2, color = "Grey20") +
  scale_x_date(date_breaks = "6 months") +
  theme_minimal() +
  scale_y_continuous(
    minor_breaks = NULL,
    labels = scales::dollar_format(
      prefix = "R$",
      big.mark = ".",
      decimal.mark = ","
    )
  ) +
  labs(y = "Valor gasto") +
  theme(axis.title.x = element_blank())

ggplotly(series_plot)

Aplicando os métodos do pacote prophet e fazendo a previsão de 30 dias:

model <- prophet(ceaps_serie)

pred_dates <- make_future_dataframe(model, periods = 90)

forecast <- predict(model, pred_dates)

Plotando os resultados do modelo. Parte da previsão mostra valores negativos, o que releva a baixa precisão do modelo.

plot_forecast <- plot(model, forecast) +
  theme_minimal() +
  scale_y_continuous(labels = scales::dollar_format(
    prefix = "R$",
    big.mark = ".",
    decimal.mark = ","
  )) +
  theme(axis.title = element_blank())

ggplotly(plot_forecast)

Plotando os componentes do modelo de previsão. Entre 2018 e 2020 houve uma tendência de redução nos gastos dos senadores. Entre 2020 e 2021 essa tendência bateu o menor valor. Tal evento pode estar correlacionado com a pandemia do COVID-19. Após 2021 esses gastos voltaram a subir. Em relação aos dias da semana, segunda-feira apresenta os maiores gastos. Dezembro é o mês com a maior tendência de gastos, enquanto Janeiro é a menor.

prophet_plot_components(model, forecast)

Diagnósticos do Modelo

Extração do diagnóstico do modelo utilizando Cross Validation.

model_cv <- cross_validation(model, horizon = 90, units = "days")

model_performance <- performance_metrics(model_cv)

Plotando MAPE

plot_cross_validation_metric(model_cv, metric = "mape") +
  theme_minimal() +
  scale_x_continuous(breaks = seq(0, 90, 10), minor_breaks = NULL) +
  scale_y_continuous(minor_breaks = NULL)

Em geral, esse modelo não obteve boa performance. Futuros passos devem testar os hyperparâmetros para chegar a melhores resultados.