Cómo elegir las visualizaciones adecuadas e implementarlas en Streamlit para depurar mejor sus modelos de previsión
TL; DR
Cuando se trata de modelos de previsiones, el mejor enfoque suele ser iterar continuamente, añadiendo algunas fuentes de data, mejorando la ingeniería de características, retocando los parámetros del modelo... La mayoría de las veces los científicos de Data tienden a fijarse en un solo KPI (es decir. RMSE, Precisión de la previsión...). A menudo hay mucha más información detrás de esos KPI que es necesario analizar para mejorar la predicción. Crear una herramienta de visualización adecuada es un gran medio para profundizar en el comportamiento del modelo, detectar rápidamente los puntos débiles de su modelo y ganar así en precisión de forma eficaz.
Este artículo desarrollará las preguntas clave que uno debe hacerse a la hora de evaluar un modelo de previsión, después presentará las visualizaciones imprescindibles para responder a estas preguntas y, por último, propondrá una implementación rápida bajo una herramienta unificada para reunir todas estas visualizaciones utilizando Streamlit.
Contexto
Este artículo resume lo que aprendimos construyendo una herramienta de visualización unificada para ayudar a Data Científicos, Ingenieros de Software, Propietarios de Producto y Planificadores de la Demanda (expertos comerciales) a desarrollar modelos de previsión de ventas para más de 10 unidades de negocio en una empresa de alimentación y bebidas. Nuestros modelos realizaban previsiones a nivel Diario x Almacén x Producto, para las próximas 14 semanas. Se desarrollaron utilizando métodos de boosting, y tienen en cuenta las características de los productos, las ventas históricas, los eventos y las data promocionales.
Preguntas clave para evaluar un modelo de previsión
1. ¿Es bueno el modelo en comparación con la línea de base?
Tener acceso a las predicciones actuales (por ejemplo, las previsiones del planificador de la demanda) en el mismo ámbito es muy útil. Permite comprender bien el comportamiento del negocio en un periodo, un producto o una ubicación concretos. Cuanto más entreviste al negocio, más conocimientos obtendrá y más podrá implementar las funciones adecuadas.
2. Persecución de pronósticos excesivos o insuficientes y caídas en la precisión de las previsiones
Las preguntas obligadas son: ¿Capta la tendencia global? ¿Capta el modelo los acontecimientos recurrentes conocidos como vacaciones, cierre de almacenes, vacaciones escolares? ¿Tengo algunas caídas de precisión en periodos concretos?
¿Por qué es importante?
Detectar este tipo de eventos es una excelente manera de alcanzar predicciones eficientemente más precisas. A menudo son bien conocidos por los planificadores de la demanda y bastante sencillos de implementar en su modelo cuando dispone de la información. Por ejemplo, en muchas de nuestras unidades de negocio, algunos productos se vendían para los almuerzos escolares. Introducir y preparar una característica que representara las vacaciones escolares hizo que aumentara mucho nuestra precisión en estos periodos concretos.
3. Tratar las especificidades de los productos
¿Es mi rendimiento homogéneo en las marcas / familias de mis productos? ¿Existen otras distinciones entre mis productos (productos vendidos sólo en periodos de promociones, productos superventas frente a productos de bajo volumen, productos )?
¿Por qué es importante?
Estas preguntas le ayudan a comprender el negocio con mayor precisión. Por ejemplo, la división de los modelos en función de la importancia de los productos en términos de volumen conduce a menudo a aumentar el rendimiento. En efecto, la demanda de productos habituales es muy diferente de la demanda de productos promocionales o menos habituales, que pueden estar muy correlacionados con los periodos de promoción o tener un perfil de ventas muy disperso. En la mayoría de nuestros casos, entrenamos modelos distintos para abordar esos diferentes tipos de productos.
4. ¿Se tienen en cuenta correctamente los efectos constitutivos?
¿Capta correctamente el modelo los efectos de las promociones? ¿Existen efectos de canibalización? ¿Se adapta bien el modelo a los fenómenos exógenos (por ejemplo, las huelgas)?
¿Por qué es importante?
No dude en consultar el artículo anterior de nuestra serie de previsiones para abordar la promoción data: 5 consejos para tener mejor en cuenta la promoción data
Cómo analizar su modelo de previsión : de los macro-KPI a la evaluación en un ámbito específico
¿Cuáles son las visualizaciones imprescindibles?
Para construir su herramienta de evaluación, debe combinar dos elementos :

La parte de filtrado debe permitir filtrar sobre varios ejes: periodo de análisis, ubicaciones (minorista, almacén...), productos (un conjunto de productos) y, por último, categorías de productos.
Recomendamos al menos las 4 visualizaciones siguientes:
¿Cómo empezar a construir su cuadro de mandos del estudio de previsión utilizando Streamlit?
Streamlit es una biblioteca python de código abierto para crear aplicaciones web compartibles en cuestión de minutos y sigue ganando popularidad en la comunidad científica Data. En este artículo no presentaremos la herramienta, pues ya hay muchos artículos disponibles sobre este tema, sino que nos centraremos en la fácil implementación de una visualización.
La elección de utilizar Streamlit para este tipo de proyecto estuvo motivada por varios requisitos previos :
1. Estructura global de su cuadro de mando de previsiones
Antes de sumergirse en la implementación, el requisito previo para construir un cuadro de mando es dibujar las partes de su aplicación.
Para ser limpio en su implementación, puede dividir su código en varias partes:
| ├── config.py | ||
| ├── forecasting_studio | ||
| │├── forecast_analysis | ||
| ││└── fig_forecast_analysis.py | ||
| │└── páginas | ||
| │└── forecast_analysis.py | ||
|
La página principal configurará la estructura global de su aplicación, es decir, el diseño global de su aplicación: en nuestro caso, un diseño ancho, y una barra lateral para mostrar el nombre de su aplicación y las páginas disponibles.
| importar streamlit como st | |
| de estudio_previsiones.páginas importar análisis_previsiones | |
| PÁGINAS = | |
| def escribir_página(página): | |
| página.escriba a() | |
| def principal(): | |
| st.barra lateral.título("Estudio de previsiones") | |
| selección = st.barra lateral.selectbox("", lista(PÁGINAS.llaves())) | |
| página = PÁGINAS[selección] | |
| escribir_página(página) | |
| si __name__ == "__main__": | |
| st.set_page_config(diseño="ancho") | |
| principal() |
El archivo de configuración, que recogemos los colores y diferentes configuraciones para todas sus figuras Plotly.
| PLANTILLA_EJE_X = dic(showline=Verdadero, | |
| showgrid=Falso, | |
| mostrar etiquetas=Verdadero, | |
| linecolor=“gris”, | |
| ancho de línea=2, | |
| garrapatas=“fuera”, | |
| tickfont=dic(familia=“Arial”, tamaño=12, color=“rgb(82, 82, 82)”)) | |
| Y_AXIS_TEMPLATE = dic(showline=Verdadero, | |
| showgrid=Verdadero, | |
| linecolor=“gris”, | |
| gridcolor=“gris claro”) | |
| LEYENDA = dic(orientación=“h”, yanchor=“fondo”, y=1.02, xanchor=“derecha”, x=1) | |
| COLORDISCRETE = [“#002244”, “#ff0066”, “#66cccc”, “#ff9933”, “#337788”, | |
| “#429e79”, “#474747”, “#f7d126”, “#ee5eab”, “#b8b8b8”] |
2.Edificio “Evolución de la visualización de la precisión de las previsiones”
Primero reuniremos nuestras cifras Plotly en un guión:
| importar pandas como pd | |
| de escribiendo importar Lista | |
| importar plotly.objetos_gráficos como vaya a | |
| de config importar COLORDISCRETE, LEYENDA, PLANTILLA_EJE_X, Y_AXIS_TEMPLATE | |
| def fig_evolution_of_fa(previsiones_por_fecha_objetivo: pd.DataFrame, | |
| eventos: Lista = Ninguno) -> vaya a.Figura: | |
| “””Figura que representa la evolución de la precisión de las previsiones | |
| en el periodo de backtest | |
| Parámetros | |
| ---- | |
| previsiones_por_fecha_objetivo : pd.DataFrame | |
| Previsión dataset que contiene al menos 3 columnas : | |
| - ‘target_date’ : la fecha para la que realiza la previsión | |
| - ‘exactitud_previsiones’ : su KPI de exactitud | |
| - ‘semana_nb’ : ID de la semana (de 0 a 52) | |
| - (opcional) ‘exactitud_previsión_planificador_demanda’ : su previsión de referencia | |
| Clave primaria : ‘target_date’ | |
| eventos : Lista, opcional | |
| una lista de un par de fechas, que representan periodos, por defecto Ninguna | |
| “”” | |
| fig_fa_score = vaya a.Figura() | |
| fig_fa_score.add_trace( | |
| vaya a.Dispersión( | |
| nombre=“Precisión de las previsiones del modelo”, | |
| x=previsiones_por_fecha_objetivo[‘fecha_objetivo’], | |
| y=previsiones_por_fecha_objetivo[‘precision_prevision’], | |
| hovertext=previsiones_por_fecha_objetivo[‘semana_nb’], | |
| marcador_color=COLORDISCRETE[0])) | |
| # Si dispone de una línea de base, puede añadir una columna adicional a su | |
| # dataset para visualizarlo en un gráfico de líneas | |
| si ‘exactitud_previsiones_planificador_demanda’ en previsiones_por_fecha_objetivo.columnas: | |
| fig_fa_score.add_trace( | |
| vaya a.Dispersión( | |
| nombre=“Precisión de las previsiones de los planificadores de la demanda”, | |
| x=previsiones_por_fecha_objetivo[‘fecha_objetivo’], | |
| y=previsiones_por_fecha_objetivo[‘exactitud_previsiones_planificador_demanda’], | |
| hovertext=previsiones_por_fecha_objetivo[‘semana_nb’], | |
| marcador_color=COLORDISCRETE[2])) | |
| fig_fa_score.actualizar_ejes(gama=(min(previsiones_por_fecha_objetivo[‘fecha_objetivo’]), | |
| max(previsiones_por_fecha_objetivo[‘fecha_objetivo’]))) | |
| fig_fa_score.actualizar_huellas(modo=‘líneas+marcadores’, forma_de_línea=‘spline’) | |
| fig_fa_score.actualizar_disposición( | |
| xaxis_title=“Fecha objetivo”, | |
| yaxis_title=“Puntuación FA”, | |
| plot_bgcolor=‘blanco’, | |
| leyenda=LEYENDA, | |
| eje x=PLANTILLA_EJE_X, | |
| eje y=Y_AXIS_TEMPLATE) | |
| si eventos: | |
| fig_fa_score.actualizar_disposición( | |
| formas=[get_vertical_filled_area(segmento[0], segmento[1], ‘rgb(102, 204, 204)’) | |
| para segmento en eventos]) | |
| devuelva fig_fa_score | |
| def get_vertical_filled_area(inicie: float, fin: float, color: str = “azul”) -> dic: | |
| “””Devuelve un dictado de formas verticales trazadas, utilizado para resaltar eventos en las figuras””” | |
| devuelva dic(tipo=“rect”, | |
| xref=“x”, | |
| yref=“papel”, | |
| x0=inicie, | |
| y0=0, | |
| x1=fin, | |
| y1=1, | |
| fillcolor=color, | |
| capa=“debajo”, | |
| anchura_de_línea=0, | |
| opacidad=0.5) |
Finalmente implementaremos nuestra página de análisis de previsiones, que cargará nuestro dataset, distribuirá nuestras cifras en diferentes columnas, ...
| importar pandas como pd | |
| importar streamlit como st | |
| de estudio_previsiones.análisis_previsiones.fig_previsión_análisis importar fig_evolution_of_fa | |
| def escriba a() -> Ninguno: | |
| st.título(‘Análisis de previsiones’) | |
| df = pd.leer_csv(‘su_dataset.csv’) | |
| # Puede cargar aquí algunos eventos personalizados para mostrarlos | |
| # ex : eventos = [(‘2019-07-01’, ‘2019-09-01’), (‘2020-07-01’, ‘2020-09-01’)]. | |
| eventos = Ninguno | |
| evo_cont1, evo_cont2 = st.columnas_beta(2) | |
| evo_cont1.subencabezado(‘Evolución de la precisión de las previsiones’) | |
| fig_evo_fa = fig_evolution_of_fa(df, eventos) | |
| evo_cont1.plolty_fig(fig_evo_fa) | |
| si __name__ == “__main__”: | |
| escriba a() |
¡Tadam ! Aquí está nuestra aplicación :

Echemos un vistazo a la figura presentada. En relación con los puntos anteriores que hemos tratado, he aquí los puntos clave de nuestra figura :
Conclusión:
Una vez que haya construido su herramienta de visualización, es hora de desplegarla. Aquí tiene un gran recurso para compartir su aplicación : ¿Cómo desplegar y asegurar su Streamlit App en GCP?
Muchas gracias por leer hasta aquí, no dude en ponerse en contacto con nosotros si tiene alguna pregunta. Puede encontrar más información sobre nuestros proyectos visitando nuestro blog.

BLOG







