Como escolher as visualizações certas e implementá-las no Streamlit para depurar melhor seus modelos de previsão
TL; DR
Ao lidar com modelos de previsões, a melhor abordagem costuma ser iterar continuamente, adicionando algumas fontes de data, aprimorando a engenharia de recursos, ajustando os parâmetros do modelo... Na maioria das vezes, os cientistas de Data tendem a ser fixados em apenas um KPI (Ou seja. RMSE, Precisão da previsão...). Muitas vezes, há muito mais informações por trás desses KPIs que precisam ser analisadas para melhorar a previsão. A criação de uma ferramenta de visualização adequada é uma ótima maneira de se aprofundar no comportamento do modelo, identificar rapidamente os pontos problemáticos do seu modelo e, assim, aumentar a precisão de forma eficiente.
Este artigo desenvolverá as principais perguntas que devem ser feitas ao avaliar um modelo de previsão, depois apresentará as visualizações obrigatórias para responder a essas perguntas e, por fim, proporá uma implementação rápida em uma ferramenta unificada para reunir todas essas visualizações usando o Streamlit.
Contexto
Este artigo resume o que aprendemos com a criação de uma ferramenta de visualização unificada para ajudar os cientistas Data, engenheiros de software, proprietários de produtos e planejadores de demanda (especialistas em negócios) a desenvolver modelos de previsão de vendas para mais de 10 unidades de negócios em uma empresa de alimentos e bebidas. Nossos modelos fizeram previsões em nível de Diário x Armazém x Produto, para as próximas 14 semanas. Eles foram desenvolvidos com o uso de métodos de boosting e levam em conta as características do produto, o histórico de vendas, os eventos e o data promocional.
Principais perguntas a serem feitas ao avaliar um modelo de previsão
1. O modelo é bom em comparação com a linha de base?
Ter acesso a previsões atuais (por exemplo, previsões do planejador de demanda) no mesmo escopo é muito útil. Isso permite uma boa compreensão do comportamento dos negócios em um período, produto ou local específico. Quanto mais o senhor entrevistar a empresa, mais obterá insights e mais poderá implementar os recursos certos.
2. Perseguição de previsões excessivas ou insuficientes e quedas na precisão da previsão
As perguntas obrigatórias são: Eu capto a tendência global? O modelo capta eventos recorrentes conhecidos, como feriados, fechamento de armazéns, férias escolares? Há alguma queda de precisão em determinados períodos?
Por que isso é importante?
Identificar esses eventos é uma ótima maneira de obter previsões mais precisas e eficientes. Esses eventos geralmente são bem conhecidos pelos planejadores de demanda e bastante simples de implementar em seu modelo quando o senhor tem as informações. Por exemplo, em muitas de nossas unidades de negócios, alguns produtos eram vendidos para a merenda escolar. A introdução e a preparação de um recurso que representasse as férias escolares levaram a um grande aumento em nossa precisão nesses períodos específicos.
3. Lidar com as especificidades do produto
Meu desempenho é homogêneo em minhas marcas/famílias de produtos? Há alguma outra distinção entre meus produtos (produtos vendidos somente durante períodos de promoções, produtos mais vendidos versus produtos de baixo volume, produtos)?
Por que isso é importante?
Essas perguntas ajudam o senhor a entender o negócio com mais precisão. Por exemplo, a divisão de modelos com base na importância dos produtos em termos de volume geralmente leva ao aumento do desempenho. De fato, a demanda por produtos regulares é muito diferente da demanda por produtos promocionais ou menos comuns, que podem estar altamente correlacionados com períodos de promoção ou ter um perfil de vendas muito esparso. Na maioria dos nossos casos, treinamos modelos distintos para lidar com esses diferentes tipos de produtos.
4. Os efeitos constitutivos são levados em conta corretamente?
O modelo está capturando corretamente os efeitos das promoções? Há efeitos de canibalização? O modelo se adapta bem a fenômenos exógenos (ex.: greves)?
Por que isso é importante?
O senhor pode consultar o artigo anterior de nossa série Forecasting Series para abordar a promoção data: 5 dicas para levar em conta o data promocional
Como analisar seu modelo de previsão: dos macro-KPIs à avaliação em um escopo específico
Quais são as visualizações obrigatórias?
Para criar sua ferramenta de avaliação, o senhor deve combinar dois elementos:

A parte do filtro deve permitir a filtragem em vários eixos: período de análise, locais (varejista, depósito...), produtos (um conjunto de produtos) e, por fim, categorias de produtos.
Recomendamos pelo menos as 4 visualizações a seguir:
Como começar a criar o painel do seu estúdio de previsão usando o Streamlit?
Streamlit é uma biblioteca python de código aberto para criar aplicativos da Web compartilháveis em minutos e ainda está ganhando popularidade na comunidade científica Data. Neste artigo, não apresentaremos a ferramenta, pois muitos artigos já estão disponíveis sobre esse tópico, mas nos concentraremos na implementação fácil de uma visualização.
A escolha de usar o Streamlit para esse tipo de projeto foi motivada por vários pré-requisitos:
1. Estrutura global de seu painel de previsão
Antes de mergulhar na implementação, o pré-requisito para criar um painel é desenhar as partes do seu aplicativo.
Para que sua implementação seja limpa, o senhor pode dividir o código em várias partes:
| ├── config.py | ||
| ├── forecasting_studio | ||
| │ ├── previsão_análise | ||
| │ │ └── fig_forecast_analysis.py | ||
| │ └── páginas | ||
| │ └── forecast_analysis.py | ||
|
A página principal definirá a estrutura global do aplicativo, ou seja, o layout global do aplicativo: no nosso caso, um layout amplo e uma barra lateral para exibir o nome do aplicativo e as páginas disponíveis.
| importação iluminado como st | |
| de forecasting_studio.páginas importação forecast_analysis | |
| PÁGINAS = | |
| def write_page(página): | |
| página.escrever() | |
| def principal(): | |
| st.barra lateral.título("Forecasting Studio" (Estúdio de previsão)") | |
| seleção = st.barra lateral.caixa de seleção("", lista(PÁGINAS.chaves())) | |
| página = PÁGINAS[seleção] | |
| write_page(página) | |
| se __name__ == "__main__": | |
| st.set_page_config(layout="largo") | |
| principal() |
O arquivo de configuração, que reúne as cores e as diferentes configurações de todas as figuras do Plotly.
| X_AXIS_TEMPLATE = ditar(linha de exibição=Verdadeiro, | |
| Mostrar grade=Falso, | |
| showticklabels=Verdadeiro, | |
| cor da linha=“cinza”, | |
| largura de linha=2, | |
| carrapatos=“externo”, | |
| tickfont=ditar(família=“Arial”, tamanho=12, cor=“rgb(82, 82, 82)”)) | |
| Y_AXIS_TEMPLATE = ditar(linha de exibição=Verdadeiro, | |
| Mostrar grade=Verdadeiro, | |
| cor da linha=“cinza”, | |
| cor da grade=“lightgrey” (cinza claro)”) | |
| LEGENDA = ditar(orientação=“h”, âncora=“bottom” (fundo)”, y=1.02, xanchor=“direito”, x=1) | |
| COLORDISCRETE = [“#002244”, “#ff0066”, “#66cccc”, “#ff9933”, “#337788”, | |
| “#429e79”, “#474747”, “#f7d126”, “#ee5eab”, “#b8b8b8”] |
2.Construção “Evolução da visualização da precisão da previsão”
Primeiro, reuniremos nossas figuras do Plotly em um script:
| importação pandas como pd | |
| de digitação importação Lista | |
| importação plotagem.objetos_gráficos como ir | |
| de configurar importação COLORDISCRETE, LEGENDA, X_AXIS_TEMPLATE, Y_AXIS_TEMPLATE | |
| def fig_evolution_of_fa(forecasts_per_target_date: pd.DataFrame, | |
| eventos: Lista = Nenhum) -> ir.Figura: | |
| “””Figura que representa a evolução da Precisão da Previsão | |
| no período de backtest | |
| Parâmetros | |
| ---- | |
| previsões_por_data_alvo : pd.DataFrame | |
| Previsão dataset contendo pelo menos 3 colunas : | |
| - ‘target_date’ : a data para a qual o senhor faz a previsão | |
| - ‘forecast_accuracy’ : seu KPI de precisão | |
| - ‘week_nb’ : ID da semana (de 0 a 52) | |
| - (opcional) ‘demand_planner_forecast_accuracy’ : sua previsão de linha de base | |
| Chave primária : ‘target_date’ (data_alvo)’ | |
| eventos : Lista, opcional | |
| uma lista de pares de datas, representando períodos, por padrão None | |
| “”” | |
| fig_fa_score = ir.Figura() | |
| fig_fa_score.add_trace( | |
| ir.Dispersão( | |
| nome=“Precisão da previsão do modelo”, | |
| x=forecasts_per_target_date[‘target_date’ (data_alvo)’], | |
| y=forecasts_per_target_date[‘forecast_accuracy’ (precisão da previsão)’], | |
| hovertext=forecasts_per_target_date[‘week_nb’], | |
| marker_color=COLORDISCRETE[0])) | |
| # Se o senhor tiver uma linha de base, poderá adicionar uma coluna adicional ao seu | |
| # dataset para exibi-lo em um gráfico de linhas | |
| se ‘demand_planner_forecast_accuracy’ em forecasts_per_target_date.colunas: | |
| fig_fa_score.add_trace( | |
| ir.Dispersão( | |
| nome=“Precisão da previsão dos planejadores de demanda”, | |
| x=forecasts_per_target_date[‘target_date’ (data_alvo)’], | |
| y=forecasts_per_target_date[‘demand_planner_forecast_accuracy’], | |
| hovertext=forecasts_per_target_date[‘week_nb’], | |
| marker_color=COLORDISCRETE[2])) | |
| fig_fa_score.update_xaxes(alcance=(min(forecasts_per_target_date[‘target_date’ (data_alvo)’]), | |
| máximo(forecasts_per_target_date[‘target_date’ (data_alvo)’]))) | |
| fig_fa_score.update_traces(modo=‘lines+markers’ (linhas+marcadores)’, forma de linha=‘spline’) | |
| fig_fa_score.update_layout( | |
| xaxis_title=“Data-alvo”, | |
| yaxis_title=“FA Score” (Pontuação FA)”, | |
| plot_bgcolor=‘branco’, | |
| lenda=LEGENDA, | |
| eixo x=X_AXIS_TEMPLATE, | |
| eixo y=Y_AXIS_TEMPLATE) | |
| se eventos: | |
| fig_fa_score.update_layout( | |
| formas=[get_vertical_filled_area(segmento[0], segmento[1], ‘rgb(102, 204, 204)’) | |
| para segmento em eventos]) | |
| retorno fig_fa_score | |
| def get_vertical_filled_area(iniciar: flutuar, fim: flutuar, cor: str = “azul”) -> ditar: | |
| “””Return a plotly vertical shape dict, used to highlight events on figures””” | |
| retorno ditar(tipo=“rect”, | |
| xref=“x”, | |
| yref=“papel”, | |
| x0=iniciar, | |
| y0=0, | |
| x1=fim, | |
| y1=1, | |
| cor de preenchimento=cor, | |
| camada=“abaixo”, | |
| line_width=0, | |
| opacidade=0.5) |
Finalmente, implementaremos nossa página de análise de previsão, que carregará nosso dataset, distribuirá nossos números em diferentes colunas, ...
| importação pandas como pd | |
| importação iluminado como st | |
| de forecasting_studio.forecast_analysis.fig_forecast_analysis importação fig_evolution_of_fa | |
| def escrever() -> Nenhum: | |
| st.título(‘Forecast Analysis’ (Análise de previsão)’) | |
| df = pd.read_csv(‘your_dataset.csv’) | |
| # O senhor pode carregar aqui alguns eventos personalizados para exibir | |
| # ex : events = [(‘2019-07-01’, ‘2019-09-01’), (‘2020-07-01’, ‘2020-09-01’)]. | |
| eventos = Nenhum | |
| evo_cont1, evo_cont2 = st.beta_columns(2) | |
| evo_cont1.subtítulo(‘Evolução da precisão da previsão’) | |
| fig_evo_fa = fig_evolution_of_fa(df, eventos) | |
| evo_cont1.plolty_fig(fig_evo_fa) | |
| se __name__ == “__main__”: | |
| escrever() |
Tadam! Aqui está nosso aplicativo :

Vamos dar uma olhada na figura apresentada. Com relação aos pontos anteriores que discutimos, aqui estão os pontos principais de nossa figura:
Conclusão:
Depois de criar sua ferramenta de visualização, é hora de implementá-la. Aqui está um ótimo recurso para compartilhar seu aplicativo: Como implementar e proteger seu aplicativo Streamlit no GCP?
Muito obrigado por ler até agora. Se o senhor tiver alguma dúvida, não hesite em entrar em contato. O senhor pode saber mais sobre nossos projetos visitando nossa blog.

BLOG







