Loading repository data…
Loading repository data…
jmeza-data / repository
Sistema ML para predicción de tiempos de entrega usando Random Forest (R²=0.802). Incluye pipeline completo, API REST, dashboard Streamlit con integración LLM y análisis SQL.
Sistema de predicción de tiempos de entrega con 80% de precisión usando Random Forest e integración con LLM.
Este proyecto aborda un desafío crítico en la logística urbana: predecir con precisión los tiempos de entrega de pedidos de comida. La solución combina análisis SQL operacional con machine learning y despliegue en producción. El componente de SQL identifica patrones de negocio, rutas problemáticas y factores operacionales mediante queries sobre un modelo relacional de 4 tablas. El modelo de ML (Random Forest con R²=0.802) predice tiempos en tiempo real, mientras que la integración con LLM proporciona recomendaciones contextualizadas. Además de estimar tiempos de entrega, la solución permite identificar las variables que más influyen en los retrasos y aporta insights relevantes tanto para la operación logística del negocio como para la experiencia del cliente. contextualizadas para operaciones y comunicación con clientes.
Machine Learning
API REST
Dashboard Interactivo
Análisis SQL
| Métrica | Valor |
|---|---|
| R² Score | 0.802 |
| RMSE | 9.42 minutos |
| MAE | 6.57 minutos |
| MAPE | 12.6% |
| Tiempo respuesta API | <100ms |
Decisión técnica destacada: Creé la variable Estimated_Base_Time = (Distance × 2) + Prep_Time que se convirtió en el predictor más importante del modelo (importance = 0.232). Esto demuestra que el conocimiento de dominio puede superar features más complejas.
Probé tres algoritmos y Random Forest superó a los demás:
Random Forest mostró mejor balance entre precisión, estabilidad y capacidad para capturar relaciones no lineales.
Pruébalo aquí: food-delivery-time-prediction-z3c8fxrjyqn3nbwe784grg.streamlit.app
Nota: Puede tardar 1 minutito en cargar inicialmente, revisalo quedo muy chevre
Funcionalidades:
El dashboard muestra:
El LLM (Llama 3.3 70B de Groq) genera:
Decidí usar Groq porque tiene tokens gratuitos y agrega valor sin costo adicional al sistema.
Documentación interactiva disponible en /docs
Ejemplo de uso:
curl -X POST "http://localhost:8000/predict" \
-H "Content-Type: application/json" \
-d '{
"Distance_km": 10.5,
"Weather": "Rainy",
"Traffic_Level": "High",
"Time_of_Day": "Evening",
"Vehicle_Type": "Car",
"Preparation_Time_min": 20,
"Courier_Experience_yrs": 3.5
}'
Respuesta:
{
"predicted_delivery_time_minutes": 67.3,
"confidence_level": "high",
"model_version": "v1.0"
}
El diseño captura la operación completa con 4 tablas:
Relaciones: Un repartidor realiza muchas entregas (1:N), un restaurante prepara muchas órdenes (1:N), una entrega contiene muchas órdenes (1:N).
Carpeta SQL/ contiene:
5 Queries Principales:
8 Análisis Adicionales:
Ver detalles en: SQL/sql_insights.md
Los análisis revelaron patrones claros: horas pico de 12-14h y 19-21h son altamente predecibles. Clima adverso incrementa tiempos en 15-20%. Couriers con más de 2 años de experiencia son 15% más rápidos. El rating cae drásticamente cuando el tiempo supera 60 minutos.
Identifiqué rutas específicas consistentemente lentas y tipos de cocina con mejor rentabilidad por minuto. El ratio óptimo es 3-4 entregas por courier por hora.
Feature Engineering
Diseñé Estimated_Base_Time = (Distance × 2) + Prep_Time que se convirtió en la feature más importante. Esto demuestra que el conocimiento de dominio simple puede superar features más complejas.
Arquitectura API + Dashboard
Implementé dos interfaces: API para integración con sistemas existentes (apps móviles, herramientas internas) y dashboard para equipo de operaciones y demos. Esto cubre necesidades técnicas y de negocio.
Integración LLM
Las predicciones numéricas necesitan contexto para tomar decisiones. El LLM genera recomendaciones accionables y mejora la comunicación con clientes.
Desafíos
Ver análisis completo en: reports/strategic_reflections.md
Prerequisitos: Python 3.10+
Clonar repositorio:
git clone https://github.com/jmeza-data/food-delivery-time-prediction.git
cd food-delivery-time-prediction
Instalar dependencias:
pip install -r requirements.txt
Entrenar modelos:
python model_pipeline/run_pipeline.py
Este comando carga datos, crea 32 features, entrena 3 modelos, guarda el mejor y genera reporte de comparación.
Ejecutar API:
cd api
python main.py
Disponible en:
Ejecutar Dashboard:
streamlit run streamlit_app.py
Se abrirá en: http://localhost:8501
food-delivery-time-prediction/
│
├── SQL/
│ ├── sql_queries.sql
│ └── sql_insights.md
│
├── model_pipeline/
│ ├── config.py
│ ├── data_loader.py
│ ├── preprocessor.py
│ ├── feature_engineer.py
│ ├── model_trainer.py
│ ├── predictor.py
│ └── run_pipeline.py
│
├── api/
│ ├── main.py
│ └── README.md
│
├── models/
│ ├── delivery_time_model_v1.0.pkl
│ ├── preprocessor_v1.0.pkl
│ └── feature_engineer_v1.0.pkl
│
├── data/
│ └── Food_Delivery_Times.csv
│
├── reports/
│ ├── model_comparison_*.csv
│ └── strategic_reflections.md
│
├── images/
├── notebooks/
├── streamlit_app.py
├── requirements.txt
└── README.md
| Método | Endpoint | Descripción |
|---|---|---|
| GET | / | Información de la API |
| GET | /health | Estado del modelo |
| POST | /predict | Predicción de tiempo |
| GET | /model-info | Metadata y métricas |
| GET | /examples | Ejemplos de requests |
Ejemplo en Python:
import requests
order = {
"Distance_km": 10.5,
"Weather": "Rainy",
"Traffic_Level": "High",
"Time_of_Day": "Evening",
"Vehicle_Type": "Car",
"Preparation_Time_min": 20,
"Courier_Experience_yrs": 3.5
}
response = requests.post("http://localhost:8000/predict", json=order)
result = response.json()
print(f"Tiempo estimado: {result['predicted_delivery_time_minutes']:.1f} min")
Valores válidos:
Categóricos:
Numéricos:
Jhoan Sebastian Meza Garcia
Estudiante de Economía ! Universidad Nacional de Colombia
Gracias por llegar hasta aqui, tengo muchos proyectos chevres si quires revisar
Desarrollado por Jhoan Meza