AlimentIA: Predicción de ventas en pequeños comercios

Andrespennafiel
Saturdays.AI
Published in
12 min readJun 29, 2024

La hipótesis de partida de nuestro proyecto se basa en que la mayoría de los comercios pequeños que abren en España, superan el primer año de vida gracias a una eficiente gestión de los activos, como la gestión de pedidos, la gestión de la merma de los productos y la rotación de productos a la venta.

A lo largo de todo nuestro proyecto hemos definido una serie de inferencias obtenidas mediante la ciencia de datos. Las cuales nos permitirán extraer las conclusiones finales del proyecto y confirmar o refutar la hipótesis: “la gestión de la merma de productos puede retornar mayores beneficios y optimizar el ciclo de vida de ventas”.

  1. EXPLORACIÓN DE DATOS

Inferencia: El conjunto de datos contiene 37 características y 79667 muestras.

Las columnas en la tabla incluyen:

  • Año: El año en que se registraron los datos. Tipo entero.
  • Semana: La semana del año. Tipo entero.
  • Día: El día del mes. Tipo texto.
  • Mes: El mes del año. Tipo texto.
  • Fecha: La fecha completa. Tipo fecha.
  • Número: Un número identificador. Tipo texto.
  • TPV: Terminal Punto de Venta. Tipo texto.
  • Tarifa: La tarifa aplicada. Tipo texto.
  • Fecha Creación: La fecha de creación del registro. Tipo fecha.
  • Tipo Doc.: El tipo de documento. Tipo texto.
  • Cliente: El cliente asociado. Tipo texto.
  • País: El país del cliente. Tipo texto.
  • CIF/NIF: El número de identificación fiscal. Tipo texto.
  • Cuenta Contable: Un código que representa una cuenta contable específica. Tipo decimal.
  • Dirección: La dirección del cliente. Tipo texto.
  • Población: La población del cliente. Tipo texto.
  • Provincia: La provincia del cliente. Tipo texto.
  • Código Postal: El código postal del cliente. Tipo decimal.
  • Usuario: El usuario que registró la transacción. Tipo texto.
  • Grupo Mayor: Un grupo mayor al que pertenece el registro. Tipo texto.
Captura de VsCode

Inferencia: Encontramos algunos outliers, en las columnas de Total, Base, Precio y Cantidad. Sin embargo, los consideramos como imprescindibles para comprender el problema del negocio, por esto, no serán eliminados.

Algunas observaciones de las métricas, como de la columna Precio como ejemplo son:

  • count: Hay 37,767 registros de precios.
  • mean: El precio promedio es 18.482779.
  • std: La desviación estándar es 18.411010, lo que indica que los precios varían bastante.
  • min: El precio mínimo es 0.
  • 25%: El 25% de los precios son menores o iguales a 1.000000.
  • 50%: La mediana del precio es 8.000000.
  • 75%: El 75% de los precios son menores o iguales a 37.230000.
  • max: El precio máximo es 210.000000.

2. ANÁLISIS EXPLORATORIO DE DATOS (EDA):

FRECUENCIA DE VENTAS DE FAMILIAS DE PRODUCTOS

La imagen muestra un gráfico de barras que representa la frecuencia de ventas de diferentes familias de productos. Inferencia: El gráfico indica claramente que la familia de productos “Bocadillos” tiene la mayor frecuencia de ventas, con un conteo significativamente más alto que las demás categorías. Las siguientes categorías con mayores ventas son “Aceites”, “Bebidas” y “Snacks”, aunque con una diferencia considerable respecto a “Bocadillos”. Las demás categorías tienen frecuencias de ventas mucho menores en comparación.

FRECUENCIA DE VENTAS DE PRODUCTOS

La imagen muestra un gráfico de barras que representa la frecuencia de ventas de diversos productos. En el eje x se enumeran los diferentes productos, mientras que el eje y muestra el conteo o frecuencia de ventas.

El producto con la mayor frecuencia de ventas es “Bocadillo Ibérico”, con una cantidad significativamente mayor que los demás productos, superando las 20,000 unidades vendidas. Le siguen “Cápsula Tomate” y “Cápsula Aceite de Oliva Virgen Extra”, aunque con una diferencia considerablemente menor en comparación con el “Bocadillo Ibérico”.

FRECUENCIA DE VENTAS DE FAMILIAS DE PRODUCTOS

La imagen muestra un gráfico de barras que representa la frecuencia de ventas por día de la semana. Lo raro en la imagen es que los días de la semana están escritos en dos idiomas diferentes: inglés y español. Esto puede causar confusión al interpretar los datos, ya que parece que hay una duplicación de los días de la semana en dos idiomas distintos.

FRECUENCIA DE VENTAS POR MES

La imagen muestra un gráfico de barras que representa la frecuencia de ventas por mes. Al observar los nombres de los meses, se puede notar algo inusual: algunos meses están escritos en inglés (e.g., “December”, “January”, “February”), mientras que otros están en español (e.g., “abril”, “mayo”). Esta mezcla de idiomas es inconsistente y puede causar confusión. Además, “abril” y “mayo” están en minúsculas, lo cual es diferente del formato de los otros meses que están en mayúsculas.

Todas estas rarezas serán tratadas más adelante.

Captura de pantalla de VsCode

La correlación entre variables es positiva entre order_id y AÑO, además de Precio y Precio Coste. Hay correlación negativa entre Año y Semana, además de, order_id y semana. Así pues se tratan de variables temporales y variables económicas. Para esta investigación no se tendrán en cuenta estas columnas.

3. PREPROCESAMIENTO DE DATOS:

COMPROBACIÓN DE LOS VALORES ÚNICOS DE LAS COLUMNAS

Comprobación de valores nulos:

  • El código utiliza la función df.isnull().sum() para verificar cuántos valores nulos hay en el conjunto de datos. En términos simples, estamos contando cuántas celdas están vacías en cada columna.
  • Si hay muchos valores nulos, esto podría afectar nuestras predicciones.
  • Inferencia: El conjunto de datos tiene muchos elementos nulos.

Columnas con datos nulos en el conjunto de datos:

  • Número: Un identificador único para cada transacción.
  • TPV: El punto de venta donde se realizó la venta.
  • Otras muchas más.

El procedimiento para preprocesar los datos consta de los siguientes pasos:

  1. Reemplazar los valores de la columna Familia mediante replace
  2. Reemplazar los valores de la columna Dia mediante replace
  3. Reemplazar los valores de la columna Mes mediante replace
  4. Eliminar columnas con más del 79600 valores nulos
  5. Eliminar filas con valores nulos
  6. Crear una nueva columna con la hora de la compra a partir de la columna Fecha Creación
  7. Sustituir valores en la columna Dia con replace para convertirlos en números
  8. Crear una columna llamada days_since_prior_order que indica el número de días desde la última compra de un producto en función de la columna Fecha
  9. Crear columna llamada client_id que indica el id del cliente en función de la columna Número de forma ascendentemente empezando desde 0
  10. Crear columna llamada product_id que indica el id del producto en función de la columna Producto de forma ascendentemente empezando desde 0
  11. Crear columna llamada user_id en función de la columna order_id de forma aleatoriaEs decir, cogemos un conjunto de datos y devolvemos otro, modificado.

El código que hemos utilizado es:

En resumen, este código realiza varias transformaciones en el conjunto de datos para prepararlo para el análisis visual de las variables, la clasificación en clusters y la predicción de ventas. Inferencia: Después del preprocesamiento, el conjunto de datos no tiene elementos nulos ni duplicados

VENTAS POR FECHA

Se observan fluctuaciones en las ventas a lo largo del tiempo, con un pico notable alrededor de enero de 2024, donde las ventas alcanzan su punto más alto, superando las 25 unidades en un solo día. En general, las ventas parecen mantenerse en un rango más bajo, con la mayoría de los días registrando menos de 10 ventas.

FRECUENCIAS DE VENTAS POR HORA

La imagen muestra un gráfico de barras que representa la frecuencia de ventas por hora. Observándose que los picos de ventas ocurren entre las 12.00 y las 14.00 horas durante la mañana y entre las 19.00 y las 20.00 horas por la tarde.

FRECUENCIAS DE VENTAS POR MES

La imagen muestra un gráfico de barras que representa la frecuencia de ventas por mes. Si bien el volumen de ventas es bastante estable a lo largo de todo el año, diciembre es el mes con más ventas por diferencia y también podemos observar que los meses de verano (en concreto mayo y agosto) las ventas caen de manera muy significativa.

FRECUENCIAS DE VENTAS POR DÍA DE LA SEMANA

La imagen muestra un gráfico de barras que representa la frecuencia de ventas por día a lo largo de una semana. Los días intermedios, en concreto jueves y viernes son los que más ventas reflejan, mientras que el inicio y el final de la semana son los más flojos en nivel de ventas.

MUESTRAS DEL CONJUNTO DE DATOS FINAL

La imagen anterior es una gráfica circular que nos muestra el conjunto final de datos utilizados una vez pre procesados, de manera que podemos trabajar con los mejores datos posibles, evitando valores nulos e incorrectos. Inferencia: El conjunto de datos final después de su limpieza tiene 37551 filas y 28 columnas.

Además, hemos añadido una función “reduce_mem_usage” que recorre a través de todas las columnas del conjunto de datos y modifica el tipo de variable para reducir el uso de la memoria. El objetivo es optimizar los datos numéricos para obtener un mayor grado de precisión a la hora de realizar la predicción.

Captura de VsCode

4. PCA y KMEANS (OPCIONAL)

De manera opcional, se ha realizado una clasificación de los datos pre procesados. En este análisis se han utilizado todos los campos del dataset que no sean temporales, pues se ha considerado que no aportan información relevante para este ámbito de análisis. Se eliminan las columnas Fecha y Fecha Creación.

Luego, se usa la clase LabelEncoder del módulo sklearn.preprocessing, para realizar tareas de preprocesamiento en datos antes de clasificar los datos. Este objeto se utilizará para transformar etiquetas de texto en valores numéricos.

El método .fit_transform() aprende la asignación de cada cadena única en la columna a un valor único y luego transforma esas cadenas en sus valores enteros correspondientes.

El resultado de esta transformación reemplaza los datos de texto originales en df2.

REEMPLAZO DE DATOS DE TEXTO

El proceso es el siguiente:

Estandarización: Se ajustan los datos (reduce_preprocessed_df) para tener una media de 0 y una desviación estándar de 1 usando StandardScaler.

División de Datos: Se dividen los datos estandarizados en conjuntos de entrenamiento y prueba. 80% de los datos van al conjunto de entrenamiento (X_train). 20% de los datos van al conjunto de prueba (X_test).

PCA con el 95% de la Varianza: Se utiliza PCA para seleccionar el número mínimo de componentes que explican el 95% de la varianza.

Transformación de Datos: Los datos de entrenamiento y prueba se transforman para reducir su dimensionalidad.

Visualización: Se visualiza cómo la varianza explicada acumulada cambia con el número de componentes, ayudando a entender cuántos componentes son necesarios para capturar la mayor parte de la información en los datos.

TRANSFORMACIÓN DE DATOS DE ENTRENAMIENTO Y VISUALIZACIÓN DE LA VARIANZA EXPLICADA ACUMULADA.

La siguiente imagen muestra que 15 componentes pueden explicar el 95% de la varianza acumulada de los datos. Es decir, que el conjunto de datos de 37 columnas puede ser simplificado en 15 componentes principales.

Para determinar el número de clusters, se han empleado tres métodos diferentes con los siguientes resultados:

SILHOUETTE SCORE

La gráfica del Silhouette Score y los valores específicos indican que entre 7 y 8 clusters, ambos son adecuados, pero 7 clusters ofrecen una buena combinación de simplicidad y alta calidad de agrupamiento.

CALINSKI SCORES

Se podría considerar usar 7 y 9 clusters, ya que este número tiene un buen equilibrio entre ambos scores, indicando una buena calidad de agrupamiento sin ser demasiado simplista.

DAVIES SCORES

En resumen, el mejor número de clusters según estos resultados es probablemente 8, ya que este tiene el Davies-Bouldin Score más bajo (1.1354), lo que indica que en este punto los clusters son más compactos y están mejor separados.

Se toman 7 clústeres como referencia para la clasificación KMeans.

Los puntos en la gráfica representan datos. Los “clusters” son grupos de puntos cercanos entre sí. Los puntos grandes llamados “centroides” son los centros de cada grupo.

5. TRANSFORMACIÓN DE DATOS PARA EL MODELADO PREDICTIVO

Se realiza un análisis de series temporales utilizando el modelo Prophet de Facebook para predecir datos de diferentes familias.

El algoritmo Prophet, desarrollado por Facebook, es una herramienta para la predicción de series temporales. Prophet se basa en un modelo aditivo de series temporales, que se puede descomponer en tres componentes principales:

  • Tendencia: Representa la evolución a largo plazo de la serie temporal.
  • Estacionalidad: Captura los patrones repetitivos en diferentes periodos (diarios, semanales, anuales).
  • Festivos: Considera los efectos de días festivos y eventos especiales.

La fórmula general del modelo aditivo es:

y(t)=g(t)+s(t)+h(t)+ϵt

donde:

  • g(t) es la función de tendencia,
  • 𝑠(𝑡) es la función de estacionalidad,
  • ℎ(𝑡) h(t) es el efecto de los días festivos,
  • 𝜖𝑡 es el término de error.

A continuación, se explica cada parte del código en detalle:

from sklearn.model_selection import TimeSeriesSplit

import numpy as np

import pandas as pd

from prophet import Prophet

from sklearn.metrics import mean_absolute_error, mean_squared_error

import matplotlib.pyplot as plt

import joblib

Se importan las librerías necesarias para el análisis de series temporales, incluyendo TimeSeriesSplit para la validación cruzada, Prophet para el modelado, y joblib para guardar los modelos comprimidos.

Captura de VsCode

Esta función calcula tres métricas de evaluación: el error absoluto medio (MAE), el error cuadrático medio (MSE) y la raíz del error cuadrático medio (RMSE).

Captura de VsCode

Se inicializan listas para almacenar las métricas de cada familia y las métricas promedio de validación cruzada, así como un diccionario para guardar los modelos entrenados. La variable tscv se utiliza para realizar la validación cruzada con 5 divisiones.

Captura de VsCode

Para cada familia en family_data:

  1. Se extraen los datos correspondientes.
  2. Se realiza la validación cruzada dividiendo los datos en conjuntos de entrenamiento y prueba.
  3. Se crea y ajusta un modelo Prophet con los datos de entrenamiento.
  4. Se guarda el modelo entrenado en un archivo.
  5. Se realizan predicciones para el período de prueba.
  6. Se calculan las métricas de evaluación para las predicciones.
  7. Se almacenan las métricas de cada iteración de validación cruzada.
  8. Se calculan las métricas promedio de validación cruzada para la familia.

Estos últimos pasos permiten extraer los datos que se cargan en la interfaz de streamlit.

Algunas inferencias extraídas de sus predicciones:

ACEITES

Inferencia: el consumo de Aceite presenta una tendencia decreciente y aunque su estacionalidad sea estable. Esto se puede deber al incremento del precio del aceite en los últimos meses.

BEBIDAS

Inferencia: La venta de bebidas presenta una tendencia decreciente, al igual que el caso anterior, su estacionalidad es estable pero nuestro modelo nos indica que puede ser preferible reducir el abastecimiento de estos productos en los próximos pedidos.

BOCADILLOS

La venta de bocadillos presenta una ligera tendencia decreciente en los últimos meses, aunque anualmente sea creciente. Inferencia: La venta cruzada de bocadillos y bebidas puede empujar las ventas de estas últimas. Alguna promoción o descuento puede ser una medida para incentivar las ventas de bebidas.

MERMA

La predicción indica que la tendencia de la merma es decreciente. Inferencia: las últimas medidas de venta cruzada y promociones de descuento están permitiendo al comercio reducir el número de productos que acaban en la basura.

6. RESULTADOS Y CONCLUSIONES DEL PROYECTO

En primer lugar, los modelos de predicción basados en inteligencia artificial han demostrado una mejora significativa en la precisión de las predicciones de demanda y en la adaptabilidad a tendencias del mercado. En comparación con la predicción de los métodos tradicionales basados en el principio de Pareto, que sólo tiene en consideración el volumen de ventas.

En segundo lugar, la implementación de este análisis predictivo permite reducir la merma de productos, gracias a la visión del ciclo de vida de los productos, ya sea para crear promociones, ventas cruzadas u optimizar el abastecimiento del stock de la tienda.

En tercer lugar, con una mejor predicción de la demanda, la empresa ha logrado optimizar sus niveles de inventario, lo que se traduce en una mayor eficiencia y ahorros.

Finalmente, la hipótesis de partida resulta ser cierta, es decir, una correcta gestión del stock para mejorar las ventas permite reducir la merma de una tienda del comercio local.

Participantes:

--

--