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 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:
- Reemplazar los valores de la columna Familia mediante change
- Reemplazar los valores de la columna Dia mediante change
- Reemplazar los valores de la columna Mes mediante change
- Eliminar columnas con más del 79600 valores nulos
- Eliminar filas con valores nulos
- Crear una nueva columna con la hora de la compra a partir de la columna Fecha Creación
- Sustituir valores en la columna Dia con change para convertirlos en números
- 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
- 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
- Crear columna llamada product_id que indica el id del producto en función de la columna Producto de forma ascendentemente empezando desde 0
- 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 visible 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
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 common, las ventas parecen mantenerse en un rango más bajo, con la mayoría de los días registrando menos de 10 ventas.
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.
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.
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 remaining de la semana son los más flojos en nivel de ventas.
La imagen anterior es una gráfica round que nos muestra el conjunto remaining 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 remaining 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.
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.
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.
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:
La gráfica del Silhouette Rating 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.
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.
En resumen, el mejor número de clusters según estos resultados es probablemente 8, ya que este tiene el Davies-Bouldin Rating 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 collection temporales utilizando el modelo Prophet de Fb para predecir datos de diferentes familias.
El algoritmo Prophet, desarrollado por Fb, es una herramienta para la predicción de collection temporales. Prophet se basa en un modelo aditivo de collection 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 common 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 collection temporales, incluyendo TimeSeriesSplit para la validación cruzada, Prophet para el modelado, y joblib para guardar los modelos comprimidos.
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).
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.
Para cada familia en family_data:
- Se extraen los datos correspondientes.
- Se realiza la validación cruzada dividiendo los datos en conjuntos de entrenamiento y prueba.
- Se crea y ajusta un modelo Prophet con los datos de entrenamiento.
- Se guarda el modelo entrenado en un archivo.
- Se realizan predicciones para el período de prueba.
- Se calculan las métricas de evaluación para las predicciones.
- Se almacenan las métricas de cada iteración de validación cruzada.
- 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 synthetic 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 inventory 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 inventory para mejorar las ventas permite reducir la merma de una tienda del comercio native.
Participantes: