AI para mejorar el Supply Chain: Utilizando modelos de forecasting en una empresa farmacéutica

Applied Intelligence Arg
Data & AI Accenture Argentina
7 min readApr 22, 2024

--

Autores: Diego Juarez y Delfina Iriarte

Hoy en día es esencial anticiparse, con la mayor precisión posible, que puede ocurrir en el futuro, y es aquí donde entra en juego forecasting. Cuando hablamos de forecasting, nos referimos al proceso de predecir o estimar eventos futuros o tendencias basándonos en datos. Esto ayuda en la toma de decisiones del día a día en casi cualquier parte de un negocio.

Al vender productos resulta particularmente útil intentar predecir la demanda, es decir, cuanto (y donde) se demandará un producto particular, para asegurarnos cumplir con esa demanda y obtener el beneficio de la venta realizada. Por ese motivo, a la hora de hacer forecasting vamos a intentar balancear dos fuerzas opuestas: las ventas perdidas y el costo de inventario (stock), ya que excederse en el inventario traerá costos por almacenamiento, por inmovilizar capital que podría alocarse a otros fines y más, mientras que tener inventario de menos generará quiebres de stock y que gente, que estaría dispuesta a comprar un producto no lo hará por no encontrarlo.

Entonces, si hacemos pronósticos precisos intentaremos aumentar el valor de las ventas o minimizar el costo de inventario (y en algunos casos, ¡podremos lograr ambos objetivos!). En este artículo, nos enfocaremos en un caso de éxito de predicción de demanda de productos en promoción para una importante cadena farmacéutica ubicada en Estados Unidos.

Problema

El objetivo principal era el de mejorar el proceso actual de predicción de demanda para productos en promoción de nuestro cliente. Su equipo de planeación regularmente define cuanto stock de cada producto se envía a cada tienda, y su sistema predictivo anterior generaba sobre-stock innecesario, además de que requería un proceso manual de carga de datos para generar una predicción. Considerando la gran variedad de productos vendidos, nuestra solución debía realizar el pronóstico semanal de decenas de millones de combinaciones de producto-local de modo automático, prediciendo las ventas que ocurrirán en 8 semanas (dado el lead time de los proveedores). Esto requirió un minucioso proceso de procesamiento y modelado, utilizando todas las variables históricas disponibles y que pudieran ser de utilidad para estimar la demanda futura.

Solución

Proporcionamos una solución utilizando modelos de machine learning que permitía calcular la demanda con 8 semanas de anticipación. Para analizar en detalle el diseño de esta solución podemos dividirlo de la siguiente manera:

Preprocesamiento

En esta etapa se computan todas las variables a utilizar, tomando los datos históricos, y se preparan para poder entrenar al modelo. Para perfeccionarlo, fue necesario considerar no solo las ventas históricas, sino también una serie de factores adicionales, tales como variables que capturen la estacionalidad, tendencia, características específicas de los productos y sus tiendas, precio, e impacto de productos alternativos, entre otros. Además, al estar hablando de productos en promoción, no podemos obviar la importancia de las características de los distintos tipos de promociones, descuentos y cupones, que impactan de distintas formas a la demanda.

Nuestro objetivo era el de predecir la demanda de los productos y no las ventas en sí. Es por esto es que es necesario hacer un procesamiento a los datos de ventas, para poder estimar la demanda. Para lograr esto, consideramos también las pérdidas de ventas debidas a la falta de disponibilidad del producto (out-of-stock, u OOS) y la transferencia de demanda entre productos alternativos cuando el producto principal no está disponible.

Cuando hablamos de ventas perdidas, nos referimos a aquellas ventas que no se concretaron porque un producto estaba agotado. Para calcularlo, evaluamos dos escenarios, que varían en función de la cantidad de out-of-stock que sufrió un producto. En uno de los casos, corregimos el cálculo utilizando un promedio de ventas históricas cuando el producto estuvo en stock. En otro enfoque, cuando el producto tuvo demasiadas instancias sin stock en la historia reciente para poder utilizar el método anterior, realizamos un promedio de las ventas de productos similares. Teniendo en cuenta esto, podemos “corregir” las ventas para obtener la demanda real cuando un producto estaba OOS de la siguiente manera:

Por otro lado, cuando hablamos de transferencia de demanda, nos referimos a las ventas que se generan en productos alternativos debido a la falta de disponibilidad del producto principal. En otras palabras, es el fenómeno en el cual los consumidores optan por adquirir un producto sustituto cuando el producto que originalmente buscaban no está disponible. Para cuantificar la demanda de un producto en el que una transferencia ocurrió, corregimos las ventas del producto substituto substrayendo la cantidad de transferencia:

donde la transferencia se calcula multiplicando un índice de transferencia, previamente computado, por las ventas perdidas del producto principal.

Ejemplo de ventas históricas y cálculo de la demanda real del producto principal y uno de sus alternativos. En el primer gráfico las ventas pérdidas ocasionadas por la falta del producto se corrigen para capturar la demanda real. En el segundo gráfico, la demanda del producto alternativo se corrige restando la cantidad de transferencia debido a las ventas perdidas del producto principal. Nótese que hay transferencia con más de un producto alternativo siempre y cuando exista suficientes ventas perdidas.

Modelo

Dada la gran cantidad de datos que requeríamos para entrenar, al momento de seleccionar el algoritmo tuvimos que considerar tanto la precisión como la viabilidad técnica, dadas las restricciones de tiempo y recursos disponibles. En ese sentido, desarrollar un modelo por serie de tiempo era prohibitivo en cuanto al tiempo total de ejecución del proceso. Por ese motivo, se optó por utilizar LightGBM, teniendo en cuenta su rapidez, eficiencia y, sobre todo, precisión como algoritmo. Teniendo un número tan alto de series de tiempo para predecir, algunos algoritmos más complejos no eran viables por su costo computacional.

La decisión del algoritmo fue solo una parte de la estrategia para abordar esta inmensa cantidad de datos. Otro factor importante fue el de definir la granularidad con la que entrenaríamos cada modelo. En particular, se decidió entrenar el modelo en segmentos. Estos segmentos se definieron considerando las similitudes en las ventas históricas entre productos de la misma categoría mediante el uso de Dynamic Time Warping. Asimismo, se incorporaron variables de negocio para lograr una subdivisión aún más precisa al momento de conformar grupos de productos. Además, se utilizó un optimizador (Hyperopt) para calcular los parámetros óptimos que cada modelo de un segmento tendría.

Finalmente, para reducir la dimensionalidad de los datos, se utilizaron los SHAP values de cada variable, para solo tomar los atributos más relevantes en cada modelo a la hora de entrenar. Así, se eliminaron las variables que no eran priorizadas en los modelos y se logró también a una mejor interpretabilidad del resultado.

Optimizaciones

Un problema usual al momento de estimar demanda son las innovaciones, es decir, productos (o combinaciones producto-tienda) nuevos y sin historia para utilizar en el proceso predictivo. Para estimar su demanda, se tuvo en cuenta el promedio de ventas de productos o tiendas similares, basándose en características inherentes de la combinación producto-tienda, es decir las características que lo definen, pero no son datos históricos, sino propios. Para segmentar la similitud de estos se utilizó KMedoids que permite tener en cuenta outliers en el modelo y también definir un producto-tienda principal que identifica a cada grupo.

Por otro lado, utilizamos distintas herramientas de MLOps para lograr una solución más robusta, con una mayor capacidad de experimentación y cambio. Por un lado, utilizamos Feature Store, que permite tener todos los atributos en un único repositorio común, dando una mejor trazabilidad de los datos y permitiendo que distintos desarrolladores sumen nuevas variables fácilmente. Por otro lado, aprovechamos las capacidades de MLflow, que permite almacenar modelos junto con sus respectivos parámetros, atributos e importancias, lo que mejora significativamente la visibilidad y la capacidad de interpretación.

También trabajamos en la mejora y optimización del código ya existente, permitiendo una parametrización más sencilla de las funciones. Esto no solo facilitó el proceso de mejora continua, sino que permitió considerar otros horizontes de predicción y otras variables que antes eran difíciles de abordar.

Interacción con los usuarios finales y resultados

Dado que el proceso desarrollado reemplazó al legacy system utilizado por el cliente, es importante que, desde nuestro lado, apoyemos a la gestión del cambio, y ayudemos a generar confianza en los usuarios finales sobre la herramienta. Es por eso que, una parte importante de nuestro trabajo fue juntarnos semanalmente con los demand planners, ir respondiendo sus consultas, y tomar su feedback para mejorar nuestra herramienta. Ellos son los especialistas en los productos que conocen hace más tiempo, y sus inputs serán siempre valiosos para mejorar los modelos y las predicciones realizadas.

A través de las sinergias conseguidas entre los equipos de ingeniería y demand planning del cliente con nuestro equipo de data science hemos conseguido resultados tanto a nivel técnico como a nivel negocio: en primer lugar, hemos mejorado la precisión del modelo de forecasting en un 37%, mientras que además, hemos aumentado el margen conseguido por las promociones en un 4% y hemos logrado colaborar a reducir el capital de trabajo en un 9%.

Conclusión

En conclusión, nuestra mejora no solo permitió un incremento en las ventas, sino que también logró reducir significativamente los costos de inventario. Esto debido a que proporciona un forecast más preciso que el sistema anterior, permitiendo tomar decisiones más informadas y efectivas.

Además, un cambio fundamental fue la eliminación de un proceso manual previo que requería la solución reemplazada, sustituyéndolo por una herramienta automática basada en machine learning. Antes los usuarios debían ingresar datos para generar un forecast y ahora simplemente reciben el valor y lo validan, lo que incrementa su productividad.

Desde nuestro punto de vista, este proyecto fue una gran oportunidad para aprender y desarrollar nuevas ideas en un problema complejo de predicción de millones de series de tiempo en simultaneo.

--

--