Informe de laboratorio · Markdex · Sevilla

Análisis predictivo con Python: prueba de demanda

Test controlado sobre 24 semanas de histórico de ventas. Comparamos tres modelos de clasificación frente a un grupo de control sin modelo predictivo, con una única métrica de decisión: F1 sobre la clase «demanda alta».

Histórico
24 semanas
Modelos
3 + control
F1 mejor modelo
0,81

Contexto del experimento

Un distribuidor de material técnico con dos puntos de venta en Sevilla capital planteó la misma pregunta que aparece en la mayoría de proyectos de Markdex Data Science & IA: ¿podemos anticipar qué semanas tendrán demanda alta antes de cerrar la compra al proveedor? La respuesta no se resuelve con intuición; se resuelve con un experimento reproducible.

El procedimiento se estandarizó en cuatro fases: definición de la hipótesis, construcción del dataset, entrenamiento y validación con partición temporal, y control de resultados contra un escenario sin modelo. Cada fase dejó un registro de parámetros para que otro analista pueda repetir el test con los mismos datos y obtener las mismas cifras.

El informe completo de los bloques de trabajo está publicado en artículos de ciencia de datos, modelos y visualización, y los gráficos de diagnóstico se detallan en el artículo de visualización avanzada con Python. Aquí nos ceñimos al resultado numérico de la prueba.

Cuaderno de análisis en Python con gráficos de demanda
Fig. 1: Entorno de trabajo del test, con la libreta de Python y el registro de parámetros.

Hipótesis y variables de control

Hipótesis nula: la proporción de semanas con demanda alta no cambia al usar un modelo de clasificación frente a la regla histórica de media móvil de cuatro semanas. Hipótesis alternativa: el modelo eleva el F1 al menos 0,15 puntos sobre esa regla.

Para aislar el efecto se fijaron tres condiciones: mismo horizonte de predicción (una semana), mismo conjunto de variables de entrada y cero solapamiento entre el tramo de entrenamiento y el de prueba.

  • Variable objetivo binaria: demanda alta cuando las unidades vendidas superan el percentil 70.
  • Predictores: ventas de las 6 semanas previas, días festivos, temperatura media y campaña activa.
  • Control: regla de media móvil de 4 semanas, sin aprendizaje automático.

Bloques del informe

Tres piezas documentan el experimento por separado: el registro en bruto, la interpretación gráfica y la aplicación real a un cliente. Cada una se puede leer de forma independiente.

Registro

Artículos y modelos publicados

Notas técnicas con parámetros, semillas aleatorias y métricas de cada prueba ejecutada en el taller.

Leer el archivo

Diagnóstico

Visualización de resultados

Matriz de confusión, curva de validación y gráfico de residuos con los mismos datos de este test.

Ver el análisis

Aplicación

Trabajos entregados

Casos reales con entregables: previsión semanal, panel de control y documentación del modelo.

Ver trabajos

Dataset y preparación

El conjunto de partida tenía 168 observaciones semanales repartidas en dos tiendas. Tras descartar cuatro semanas con cierre por inventario, quedaron 164 filas útiles. Ninguna fila se imputó a mano: los huecos se resolvieron con interpolación lineal y se documentó el criterio.

La partición fue temporal, no aleatoria. Entrenamiento: 128 semanas (78 %). Prueba: 36 semanas (22 %) al final de la serie. Este detalle importa: una partición aleatoria filtraría información del futuro al modelo y las métricas saldrían infladas.

El coste de preparar los datos fue de 6 horas de trabajo efectivo; el entrenamiento de los tres modelos, menos de 3 minutos en un portátil convencional.

Series temporales impresas y tablas del dataset de ventas semanales
Fig. 2: Serie semanal depurada, con el corte de entrenamiento y prueba marcado.
Código Python de los modelos de clasificación comparados
Fig. 3: Script de comparación con la validación cruzada temporal configurada.

Método: modelos y validación

Se entrenaron tres clasificadores con la librería scikit-learn: regresión logística con escalado estándar, bosque aleatorio de 300 árboles y gradient boosting con 150 estimadores y profundidad máxima 3. Los hiperparámetros se ajustaron solo sobre el tramo de entrenamiento con validación cruzada de 5 particiones temporales.

Métrica principal: F1 sobre la clase positiva, porque el coste de un falso negativo (quedarse sin stock una semana) es mayor que el de un falso positivo. Métricas de control: precisión, exhaustividad y exactitud global. Umbral de decisión fijado en 0,5 para los tres modelos, sin ajuste posterior.

  • Semilla fija en 42 para reproducibilidad de resultados.
  • Sin fuga de datos: los rezagos se generan antes de la partición.
  • Control de referencia: media móvil de 4 semanas, sin modelo.

«La diferencia entre acertar por costumbre y acertar por modelo fueron 11 semanas bien previstas de 36. Ese es todo el resultado; el resto es ruido.»

Resultados del control de calidad

El bosque aleatorio fue el mejor de los tres con un F1 de 0,81 sobre las 36 semanas de prueba. La regresión logística quedó en 0,74 y el boosting en 0,79. La regla de control, la media móvil, se quedó en 0,66: la hipótesis alternativa se confirma con una mejora de 0,15 puntos exactos respecto al control.

Modelo Precisión Exhaustividad F1
Bosque aleatorio 0,84 0,78 0,81
Gradient boosting 0,82 0,76 0,79
Regresión logística 0,77 0,71 0,74
Control (media móvil) 0,69 0,63 0,66

El error se concentra en las semanas con campaña activa y festivo simultáneo, donde el modelo tiende a subestimar. Los detalles gráficos de la matriz de confusión están en visualización avanzada de datos con Python.

Limitaciones observadas

La muestra es corta. Con 36 semanas de prueba, un intervalo de confianza razonable para el F1 se mueve entre 0,68 y 0,88: la mejora sobre el control es real, pero la cifra exacta no debe tomarse como constante.

El modelo tampoco cubre productos nuevos sin historial ni cambios de surtido. En esos casos el sistema cae automáticamente sobre la regla de media móvil, y así se documenta en el entregable.

  • Sin datos de competencia ni de tráfico en tienda física.
  • Horizonte útil máximo verificado: 2 semanas.
  • Requiere revisión de parámetros cada trimestre.

Conclusiones del ensayo

La prueba de demanda con Python aporta una mejora medible y verificable frente a la regla histórica. El modelo recomendado para producción es el bosque aleatorio con umbral 0,5, reentrenado cada trimestre con las 128 semanas más recientes.

El coste de implantación en este caso fue de una jornada de preparación de datos y una tarde de validación. El presupuesto por este tipo de trabajo se detalla en tarifas de talleres y análisis de datos, y los entregables tipo, en el archivo de trabajos.

Para replicar el ensayo basta con el histórico de ventas semanales y las variables de calendario. Todo lo demás —partición temporal, métricas y control— es procedimiento fijo.

Preguntas frecuentes sobre la prueba

¿Cuántas semanas de histórico hacen falta?

Con menos de 60 semanas el modelo no supera de forma estable a la media móvil. A partir de 100 semanas los resultados se repiten con variaciones por debajo de 0,04 puntos de F1.

¿Por qué F1 y no exactitud global?

Porque la clase «demanda alta» representa solo el 30 % de las semanas. Un modelo que prediga siempre «normal» acierta el 70 % y no sirve para nada operativo.

¿Se puede usar con varias tiendas a la vez?

Sí, añadiendo la tienda como variable categórica. En este ensayo se probó también un modelo por tienda; el resultado conjunto fue ligeramente mejor por disponer de más filas.

¿Qué pasa si el modelo falla una semana?

Se registra la desviación y se revisan los predictores de esa semana. Los fallos aislados no justifican reentrenar; tres fallos consecutivos, sí.

Reproduce el ensayo con tu propio histórico

El procedimiento completo, los scripts y los criterios de validación están documentados. Puedes empezar por el archivo de artículos o revisar los trabajos ya entregados.