library(tidyverse)
library(plotly)
library(prophet)
ceaps_serie <- vroom::vroom("data/dataset_ceaps_forecasting.csv")7 Days of Code - Dia 3
Carregando Pacotes e Dados do CEAPS
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.