Prevendo múltiplas séries temporais do Wallmart com Modeltime.pdf

MironChaves 12 views 14 slides Sep 20, 2025
Slide 1
Slide 1 of 14
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14

About This Presentation

Nesse tutorial temos um passo a passo com script R reproduzível para modelarmos e produzir previsões h passos a frente em séries temporais de produtos do Wallmart


Slide Content

Adaptadode : https://business-science.github.io/modeltime/articles/nested-forecasting.html
Tutorial
(com exemplo reproduzível)
Forecastingde vendas semanais de múltiplas
séries temporais com os algoritmos Prophete
XGBoost

A ideia é converter um conjunto de dados contendo muitas séries temporais em um conjunto de dados aninhado, e
então ajustar um ou muitos modelos a cada série.
Fonte: https://business-science.github.io/modeltime/articles/nested-forecasting.html

Utilizando um conjunto de dados contendo múltiplas séries temporais de vendas semanais de departamentos do
Wallmart, vamos prever as vendas para semanas futuras
install.packages("pacman")
library(pacman)
#Carrega as bibliotecas
p_load(tidymodels, modeltime, tidyverse, timetk)
#seleciona as colunas de interesse e atualiza os nomes
data_tbl<-walmart_sales_weekly%>% select(id, Date, Weekly_Sales) %>% set_names(c("id", "date", "value"))
#visualiza osdados
data_tbl%>% glimpse()
As colunas importantes nesse momento são:
"id":Isso separa os grupos de séries temporais (neste caso, representam vendas de departamentos em uma loja do Walmart)
"data":Este é o período semanal de vendas
"valor":Este é o valor das vendas durante a semana e loja/departamento
Ou seja, cada id é uma série temporal. Vamos modelar cada uma individualmente

Podemos visualizar cada série
data_tbl%>%
group_by(id) %>%
plot_time_series(
date,
value,
.interactive = T,
.facet_ncol= 2
)

1. Estrutura de Dados Aninhada:
•Esta é a preparação dos seus dados para que estejam
na forma correta para a previsão aninhada.
•Basicamente,vocêprecisaorganizarseusdadosde
formaquecadasériestemporaisestejacontidoemsua
própria"célula“dentrododataframe.
2.Fluxo de Trabalho Modeltime
Aninhado:
•Esta é a etapa onde você realmente cria os modelos de
séries temporais e os ajusta aos seus dados.
•Depois que os modelos são ajustados, você pode usá-los
para gerar previsões para cada séries temporal.

nested_data_tbl<-data_tbl%>%
# 1. Extending: Vamos prever 52 semanas no futuro.
extend_timeseries(
.id_var= id,
.date_var= date,
.length_future= 52
) %>%
# 2. Nesting: Vamos agrupar por id e criar um conjunto de
dados futuro
# que prevê 52 semanas de dados estendidos e
# um conjunto de dados atual que contém 104 semanas (2
anos de dados)
nest_timeseries(
.id_var= id,
.length_future= 52,
.length_actual= 52*2
) %>%
# 3. Splitting: Vamos pegar os dados reais e criar divisões
# para estimar a acurácia e o intervalo de confiança de 52
semanas (teste) e o restante será os dados de treinamento
split_nested_timeseries(
.length_test= 52
)
nested_data_tbl
Preparação dos dados em três etapas

Principais funções

Engenharia de variáveis
Vamos criar uma receita pra cada modelo, no estilo tidymodels, aqui você pode usar a criatividade e conhecimento
técnico e do domínio para criar suas variáveis.
# 'value' é a variáveldependentee 'date' a variávelindependente
# A função'extract_nested_train_split' extraiosdados de treinamentodo
conjunto de dados nested_data_tbl
rec_prophet<-recipe(value ~ date, extract_nested_train_split(nested_data_tbl)) # Criaçãode um workflow (fluxode trabalho)
wflw_prophet<-workflow() %>%
# Instanciao modeloProphet
add_model(
prophet_reg("regression", seasonality_yearly= TRUE) %>%
# Define a bibliotecade origemcomo'prophet' para que o workflow saiba
qual pacoteusar
set_engine("prophet")
) %>%
# Adicionaa receita'rec_prophet' criadaacima, que define comoosdados
serãopreparadospara o modelo
add_recipe(rec_prophet)
Instanciando um Prophet:
# A função 'extract_nested_train_split' extrai os dados de
treinamento do conjunto de dados nested_data_tbl
rec_xgb<-recipe(value~ ., extract_nested_train_split(nested_data_tbl)) %>%
# Adiciona a assinatura temporal da variável 'date' para capturar
características temporais (ex.: ano, mês, dia da semana, etc.)
step_timeseries_signature(date) %>%
# Remove a variável 'date', que não é mais necessária após a
criação da assinatura temporal
step_rm(date) %>%
# Remove variáveis preditoras com variância zero (que são
constantes e não contribuem para o modelo)
step_zv(all_predictors()) %>%
# Converte variáveis categóricas nominais em variáveis binárias
(one-hot encoding) para uso no modelo
step_dummy(all_nominal_predictors(), one_hot= TRUE)
# Criação de um workflow (fluxo de trabalho)
wflw_xgb<-workflow() %>%
# Adiciona o modelo XGBoostde árvore de decisão para
regressão
add_model(
boost_tree("regression") %>%
# Define a biblioteca de origem do 'xgboost' para que o
workflow saiba qual pacote usar
set_engine("xgboost")
) %>%
# Adiciona a receita 'rec_xgb' criada acima, que define como os
dados serão preparados para o modelo
add_recipe(rec_xgb)
Instanciando um XGBoost:

Ajustando os modelos instanciados
Um Prophete um XGBoostserá ajustado a cada série temporal
# Com os dois fluxos de trabalho de modelagem em mãos, agora estamos prontos para testá-los
# em cada uma das séries temporais. Vamos usar a função modeltime_nested_fit(),
# que ajusta iterativamente cada modelo a cada uma das séries temporais aninhadas na coluna de .splits.
nested_modeltime_tbl<-modeltime_nested_fit(
# Dados aninhados que contêm as séries temporais a serem usadas
nested_data= nested_data_tbl,
# Adicionando os fluxos de trabalho de modelagem
# Aqui estamos adicionando dois workflows: o Prophete o XGBoost
wflw_prophet,
wflw_xgb
)
# Visualizando o resultado que contém
#os modelos ajustados
nested_modeltime_tbl

Visualizar as métricas de performance de cada modelo, em cada série, na base de teste
nested_modeltime_tbl%>%
# Extrai a acurácia do conjunto de teste para
cada um dos modelos ajustados nas séries
temporais aninhadas
extract_nested_test_accuracy() %>%
# Exibe a acurácia dos modelos de forma
tabular.
# O parâmetro '.interactive= F' desativa a
interatividade, exibindo uma tabela estática.
table_modeltime_accuracy(.interactive= F)

Vamos visualizar como as previsões acompanham os dados de teste
nested_modeltime_tbl%>%
# extrai as previsões feitas pelos modelos ajustados para o
conjunto de teste. Assim, podemos visualizar o quão bem os
modelos se saíram ao prever as séries temporais no futuro
(horizonte de teste).
extract_nested_test_forecast() %>%
group_by(id) %>%
# plota as previsões feitas pelos modelos
plot_modeltime_forecast(
.facet_ncol= 2,
.interactive= TRUE
)

Selecionando o melhor modelo para cada série temporal
best_nested_modeltime_tbl<-nested_modeltime_tbl%>%
#seleciona o melhormodelopeloRMSE
modeltime_nested_select_best( metric = "rmse",
minimize = TRUE,
filter_test_forecasts= TRUE )
best_nested_modeltime_tbl%>%
#gera o relatóriocom as métricasdo melhormodelo
extract_nested_best_model_report()

Para finalizar, podemos pegar os melhores modelos, ajustar na base completa e fazer a previsão
para períodos futuros (além dos períodos disponíveis no dataset)
nested_modeltime_refit_tbl<-
#Extrai o melhormodelopara cadasériebest_nested_modeltime_tbl%>%
#ajusta novamenteconsiderandoa base inteira
da série
modeltime_nested_refit( control =
control_nested_refit(verbose = TRUE) )
nested_modeltime_refit_tbl
nested_modeltime_refit_tbl%>%
#Extrai as previsõesfuturas
extract_nested_future_forecast() %>%
group_by(id) %>%
#e plota
plot_modeltime_forecast( .interactive =
FALSE, .facet_ncol= 2 )

Código completo: https://dontpad.com/tutorial_nested_forecasting
Happyforecasting!
https://www.linkedin.com/in/maironchaves/