Panel interactivo y análisis de datos para entender las ventas de una máquina de café (vending). El proyecto incluye:
- Una aplicación en Streamlit para explorar ventas por tiempo, producto y momento del día
- Cuadernos (notebooks) con EDA y preprocesamiento
- Documentación de datos y decisiones analíticas
Repositorio listo para ejecutar y presentar a negocio con un lenguaje claro, didáctico y a la vez riguroso.
coffe-sales-study/
├─ app/ # App Streamlit (panel interactivo)
├─ data/ # Datos (CSV procesado)
├─ docs/ # Documentación (EDA, dataset)
├─ notebooks/ # Cuadernos (EDA y preprocessing)
└─ README.md # Este archivo
La app ofrece cuatro secciones principales:
- Explicación del dataset
- Qué columnas incluye el CSV procesado (
ventas_cafe_f.csv) - Qué transformaciones se aplicaron desde el dataset original
- Vista previa de datos
- EDA (Análisis exploratorio)
- KPIs: ventas totales, ingresos, ticket medio
- Coffee Hour (pico horario), día de la semana, momento del día
- Top de productos y café preferido por mes/día
- Conclusiones (enfoque vending)
- Hallazgos numéricos (picos horarios, productos estrella)
- Implicaciones operativas (stock, mantenimiento, pricing)
- Próximos pasos recomendados
- Machine Learning (minimalista y práctico)
- Forecasting de demanda con promedio móvil y métricas (MAE/MAPE)
- Segmentación de productos (K-Means + PCA) con elipses y calidad (Silhouette)
- Detección de anomalías (IQR) con explicación accesible
- Análisis de combinaciones (correlaciones y similitudes entre cafés)
Requisitos: Python 3.11+, virtualenv recomendado.
- Instala dependencias:
pip install -r docs/requirements_pip.txt- Ejecuta la app desde la raíz del repo:
streamlit run app/main.py- Abre el navegador en la URL que indique Streamlit.
Fuente principal: data/ventas_cafe_f.csv (CSV procesado). Ver detalles en docs/raw_dataset_info.md.
Resumen del dataset original (2024):
- 3,547 compras registradas, pagos con tarjeta, franja operativa 6:00–22:00
- Columnas originales:
Hour_of_day,Money,Coffee_name,Time_of_Day,Weekday/Month_name,Date,Time, etc.
Transformaciones aplicadas (ver notebooks/preprocessing.ipynb y notebooks/eda.ipynb):
- Renombrado a español y tipado consistente:
fecha,hora,precio - Variable
precioconvertida de rupias pakistaníes a euros - Derivadas temporales:
hora_num,hora_cat(1..24),dia_semana,nombre_mes,momento_del_dia,año - Orden lógico de categorías (Lunes..Domingo; Enero..Diciembre; 1..24)
- Normalización de nombres de café y arreglos de encoding cuando aplica
- Reindexación de categorías para evitar huecos en gráficos (visualización fiel)
- Validaciones de rango (horas y precios)
Principales hallazgos del EDA (ver docs/eda.md):
- Coffee Hour definida (picos claros a media mañana y media tarde)
- Top productos concentrando gran parte de las ventas
- Patrones semanales estables (días laborables vs fin de semana)
- Estacionalidad mensual con meses pico y valle
- Ticket medio estable con baja dispersión
notebooks/preprocessing.ipynb: limpieza, tipado, derivadas temporales, estandarización de categorías y preparación deventas_cafe_f.csv.notebooks/eda.ipynb: análisis exploratorio, KPIs, hallazgos y blueprint visual reutilizado en la app.
Consejo: ejecuta los notebooks para reproducir el pipeline y validar los supuestos.
- App Streamlit:
app/main.py(secciones, filtros, métricas) yapp/components/*(gráficos y KPIs) - Utilidades:
app/utils/data.py(carga/filtrado) yapp/utils/colors.py(paleta y órdenes) - Datos:
data/ventas_cafe_f.csv - Documentación:
docs/eda.mdydocs/raw_dataset_info.md
-
¿Por qué
hora_cates 1..24 si la franja operativa es 6–22? Para mantener ejes consistentes y comparar periodos, aunque los datos reales se concentran en horas operativas. -
¿Por qué se ven celdas en blanco en matrices de correlación/similitud? La diagonal (comparación consigo mismo) se oculta intencionadamente para centrar la lectura en relaciones útiles.
MIT. Ver LICENSE.