El proyecto de «Definición del stock mediante aprendizaje automático» ha sido realizado para una empresa que vende un gran catálogo de productos de más de 90.000 referencias, a través de tiendas físicas y online. El objetivo principal ha sido proponer soluciones para optimizar la gestión el stock existente, mejorar los indicadores económicos de la empresa y conseguir aumento de las ventas a través de la gestión del stock.

En la la primera parte del proyecto aplicamos análisis de texto y aprendizaje automático para clasificación de productos en una categoría de venta. En la segunda, sobre la que trata este artículo, analizamos la asignación de stock mínimo a los productos vendidos por la empresa, centrándonos en si es necesario tenerlos en stock o no, según diferentes variables, con el objetivo de optimizar el stock de la empresa.

Dataset, preparación y limpieza de datos

El dataset para análisis, proporcionado directamente por la empresa, contenía descripción de los artículos gestionado (>90.000 artículos), información de stock, precio, etc. Además de este dataset, disponíamos también de dataset de ventas acumuladas en las tiendas físicas y online durante casi dos años. Adicionalmente a las variables disponibles, creamos variables nuevas en varias ventanas temporales (< 3 meses, 3-6 meses, > 6 meses), calculando número de unidades:

  • ventas últimos meses
  • pedidos venta
  • ventas primeros meses desde la fecha de alta de artículo en el catálogo
  • número de días desde la última venta
  • promedio de días entre ventas sucesivas

A partir de la variable numérica que indica la cantidad mínima de unidades para tener en stock (StockMinimo), creamos una variable nueva DebemosTenerStock con estas clases:

  • sí = caso que StockMinimo es mayor que 0
  • no = caso que StockMinimo es 0
  • por_definir = caso que StockMinimo no está definido

Antes de construir modelos predictivos, excluimos del dataset varios artículos que no proporcionaban suficiente información, para siguiente análisis el dataset contiene >71.000 artículos.

Análisis exploratorio

El proyecto desarrollado comienza con una fase imprescindible: la exploración de datos y búsqueda de patrones para entender la organización y el funcionamiento del negocio.

Para mejorar la gestión de productos en stock, identificamos los productos que no interesa mantener en stock basándose en sus características, ventas históricas y comportamiento en las fases de lanzamiento o novedad. Identificamos también varias situaciones anómalas en varios ámbitos, por ejemplo, artículos obsoletos con stock, artículos con stock mínimo sin ventas, artículos sin stock mínimo con ventas, etc. De todos artículos analizados, 69% no tiene definido el stock mínimo por la empresa. De los artículos con stock definido por la empresa, para 26% de los artículos se debería tener stock mínimo, y para 74% no se debería tener en stock mínimo.

Análisis predictivo

Para predecir si tener artículo en stock o no creamos varios modelos aplicando tres diferentes algoritmos:

  • Regresión logística (RL)
  • Random forest (RF)
  • Support vector machines (SVM)

Seleccionamos 17 variables independientes relacionadas con ventas en diferentes ventanas temporales, antigüedad de artículo, categoría de artículo y precio para construir los modelos. Las clases de variable dependiente (stock sí o no) no eran balanceadas, es decir, había mucho menos datos de la clase “sí” (26%) comparando con la clase “no” (74%). Esto podría llevar a la generalización del modelo y limitar la predicción a la clase mayoritaria. Para evitar esta situación y para mejorar los modelos, creamos también un training dataset balanceando para ambas clases con método de “submuestreo” (subsampling). Evaluamos también el modelo random forest incluyendo el muestro estratificado por clases.

Construimos todos modelos utilizando el training dataset (80% del dataset) y evaluamos su capacidad predictiva en el test dataset (20% del dataset) según varias métricas (precisión, exactitud, sensibilidad, F1) (tabla 1). Además, calculamos la métrica AUC (área bajo la curva ROC, area under ROC curve), y visualizamos las curvas ROC (curva de rendimiento diagnóstico, receiver operator curve) para cada modelo (figura 1).

El mejor modelo ha sido el random forest con submuestreo con capacidad de predecir si tener producto en stock o no con la precisión de 87%. Para identificar artículos que deberían tenerse en stock la exactitud era 0.68 y sensibilidad 0.93. Para identificar artículos que no deberían tenerse en stock la exactitud era 0.97 y especificidad 0.85.

Tabla 1: Métricas de evaluación de modelos utilizados en el proyecto sobre el test dataset, con clase “SI” como referencia. El mejor modelo, seleccionado según métricas F1 y AUC es el RF.sub (random forest con submuestreo), resaltado en negrita. (RL=regresión logística, RF = random forest, SVM= supported vector machines, sub=submuestreo de dataset para obtener clases balanceadas, strata=muestreo estratificado por clases).

Figura 1: Curvas ROC, cada línea corresponde a un modelo. La línea gris diagonal indica los resultados en caso aleatorio. Observamos que en general, todos modelos presentan resultados mejores que al azar (la línea gris). El mejor modelo es RF.sub (random forest con submuestreo). (RL=regresión logística, RF = random forest, SVM= supported vector machines, sub=submuestreo de dataset para obtener clases balanceadas, strata=muestreo estratificado por clases).

Conclusiones

En este proyecto proponemos aplicación de método supervisado de aprendizaje automático para evaluar si tener los artículos en stock o no. En este trabajo nos basamos en asignación del stock según el dataset proporcionado por la empresa. Para evaluar y construir mejores modelos es imprescindible saber con mayor certeza los criterios utilizados por la empresa para dicha asignación y según esta información afinar los modelos predictivos.

Los resultados del modelo también pueden indicar que la asignación del stock mínimo a los artículos por la empresa (usados para construir y evaluar los modelos) no es adecuada, no corresponde a la demanda y la venta real de los productos. Por ejemplo, observamos que ciertos artículos tenían stock mínimo asignado, aunque no había ventas en el pasado. Esto puede tener influencia al momento de construir los modelos y las predicciones.

Utilizamos el método se submuestreo para obtener dataset balanceado por clases, pero existen otros métodos para ajustar el dataset con clases no balanceadas, antes de construir modelos definitivos se podrían explorar otros algoritmos con este fin. Otra manera de mejorar las predicciones es explorar y ajustar en más detalle los hiperparámetros de los modelos.

Análisis

Para desarrollo de este proyecto utilizamos el programa R (R Core Team, 2018), con siguientes librerías: dplyr, tidyr, caret, randomForest, e1071, Boruta, ROCR, ggplot2, janitor, kableExtra.