Sistema integral para la optimización y analítica predictiva de incidentes en HelpPeople, combinando Python (FastAPI), Modelos de Machine Learning (Scikit-Learn: Random Forest & Regresión Lineal), Microsoft SQL Server 2022 y una interfaz interactiva de alto rendimiento en React.js.
A continuación se detalla la validación punto por punto de todos los requerimientos técnicos y criterios de evaluación solicitados en el reto oficial:
| Requisito / Componente | Descripción en reto.md
|
Estado | Archivos / Evidencia de Implementación |
|---|---|---|---|
| Frontend Framework | Desarrollar el frontend utilizando React.js | CUMPLIDO |
frontend/src/App.jsx, frontend/package.json (React 18 + Vite) |
| Interactividad y Gráficos | Gráficos interactivos de datos históricos y predicciones futuras | CUMPLIDO |
ComparativeVolumeChart.jsx, RiskPriorityChart.jsx
|
| Simulador de Parámetros | Módulo para ajustar parámetros (meses, prioridades, categorías) y actualizar predicciones en tiempo real | CUMPLIDO |
PredictionSimulationPanel.jsx con sliders dinámicos y llamadas reactivas a /predict
|
| Diseño y Accesibilidad | Componentes modernos y accesibles (estilo PrimeReact/Vuetify/Tailwind) | CUMPLIDO | Interfaz ejecutiva moderna con Tailwind CSS, Lucide Icons, paleta dark theme y tipografía Plus Jakarta Sans |
| Filtros Dinámicos | Filtros personalizables por rango de fechas, prioridad y categoría | CUMPLIDO | Barra de filtrado global en App.jsx que actualiza consultas en /historical-data
|
| Visualización Comparativa | Comparativa visual entre datos reales históricos y predicciones | CUMPLIDO | Curva de transición continua en ComparativeVolumeChart.jsx (Datos Reales vs. Proyección IA) |
| Módulo de Recomendaciones | Módulo para mostrar las recomendaciones estratégicas generadas | CUMPLIDO |
RecommendationsModule.jsx con tarjetas de acción, impacto y estimación de mejora |
| Módulo de Analytics & Estadísticas | Generación de estadísticas descriptivas y cuantitativas en tiempo real | CUMPLIDO |
AnalyticsModule.jsx, endpoint /analytics/statistics, cálculo de momentos (P25-P95), días pico y exportador JSON/CSV |
| Backend Framework | Desarrollar el backend en Python | CUMPLIDO |
backend/main.py construido con FastAPI y servidor asíncrono Uvicorn |
| Base de Datos SQL Server | Manejar datos históricos de solicitudes en SQL Server | CUMPLIDO |
schema.sql con índices, seed_data.sql (4,000 tickets), init_db.py y Docker SQL Server 2022 |
| Endpoint: GET /historical-data | Enviar datos históricos al frontend con filtros y agregaciones | CUMPLIDO | Implementado en backend/main.py con cálculo de KPIs, tendencias mensuales y muestra de tickets |
| Endpoint: POST /predict | Recibir parámetros (meses, prioridad) y devolver resultados predictivos | CUMPLIDO | Implementado en backend/main.py conectado al motor Scikit-Learn |
| Endpoint: GET /recommendations | Generar estrategias basadas en las predicciones | CUMPLIDO | Implementado en backend/main.py con diagnósticos de capacidad, cuellos de botella y SLA |
| Modelo: Volumen Futuro | Predecir volumen de solicitudes para los próximos meses (abiertas/cerradas/vencidas) | CUMPLIDO | Random Forest Regressor (ml_service.py
|
| Modelo: Tasa de Vencimiento | Predecir porcentaje de solicitudes que podrían quedar vencidas según prioridad | CUMPLIDO | Random Forest Classifier (83.62% de accuracy) en ml_service.py
|
| Modelo: Tiempo de Resolución | Estimar tiempos promedio de resolución | CUMPLIDO | Regresor multivariado según severidad, categoría y departamento solicitante en ml_service.py
|
| Organización del Código | Carpetas estructuradas: database, backend, frontend
|
CUMPLIDO | Arquitectura modular estricta solicitada por el reto |
| Extra: Alertas Automáticas | Notificación/alerta en dashboard ante alta probabilidad de vencimiento | CUMPLIDO |
RiskAlertBanner.jsx detecta umbrales críticos de SLA y emite alertas automáticas |
| Extra: Despliegue en 1 Comando | Despliegue automatizado con contenedores | CUMPLIDO |
docker-compose.yml orquesta SQL Server, FastAPI y React Nginx con docker-compose up --build
|
El sistema se encuentra 100% contenerizado para su despliegue con un único comando:
flowchart LR
subgraph Docker_Network["Red Virtual Docker (helppeople-net)"]
direction TB
subgraph FE["Contenedor Frontend (Puerto 3000)"]
React["React 18 + Tailwind CSS"]
Nginx["Nginx Reverse Proxy"]
end
subgraph BE["Contenedor Backend (Puerto 8000)"]
API["FastAPI App"]
ML["Servicio ML: Random Forest & LR"]
Sync["Auto-Sync DB (init_db.py)"]
end
subgraph DB["Contenedor Base de Datos (Puerto 1433)"]
MSSQL["Microsoft SQL Server 2022"]
DB_Data[("HelpPeopleDB\n(dbo.Solicitudes - 4,000 registros)")]
end
React -->|Solicitudes UI| Nginx
Nginx -->|Proxy API| API
API -->|Inferencia / Entrenamiento| ML
Sync -->|Crea Esquema y Pobla Datos| MSSQL
API -->|Consultas Analíticas| DB_Data
end
User["Usuario / Evaluador (Navegador)"] -->|http://localhost:3000| Nginx
API_Client["Swagger UI / Postman"] -->|http://localhost:8000/docs| API
- Tener instalado Docker Desktop en ejecución.
Abre tu terminal en la raíz del proyecto (d:\ProyectosWEB\TalentoTech) y ejecuta:
docker-compose up --build(o si usas la sintaxis moderna: docker compose up --build)
- Levanta SQL Server 2022: Se crea el contenedor
helppeople-sqlservery se inicia el motor en el puerto1433. - Espera el Healthcheck: El contenedor backend aguarda hasta que SQL Server esté listo para recibir conexiones.
- Inicialización y Poblado de Datos: El script
backend/entrypoint.shejecutadatabase/init_db.py, el cual crea la base de datosHelpPeopleDB, aplica el esquema de tablas e inserta los 4,000 registros históricos. - Entrenamiento de Modelos de Machine Learning: Al arrancar FastAPI, el servicio entrena los algoritmos predictivos en memoria.
- Compilación y Servidor Web del Frontend: Node compila los artefactos de React y Nginx los expone en
http://localhost:3000.
| Servicio | URL / Puerto | Descripción |
|---|---|---|
| Frontend Web | http://localhost:3000 | Dashboard ejecutivo interactivo, simulador de predicciones y alertas SLA. |
| Backend API | http://localhost:8000 | API REST en FastAPI. |
| Documentación Swagger | http://localhost:8000/docs | Explorador interactivo OpenAPI con pruebas en vivo de todos los endpoints. |
| SQL Server | localhost:1433 |
Motor de base de datos relacional (Usuario: sa, Contraseña: HelpPeople*2024Secure). |
Para detener el servicio:
docker-compose down- Esquema Relacional (
schema.sql):- Define la tabla
dbo.Solicitudescon tipos de datos adecuados (DATETIME2,NVARCHAR,FLOAT,BIT). - Incluye índices no agrupados (
IX_Solicitudes_FechaSolicitud,IX_Solicitudes_Estado,IX_Solicitudes_Prioridad, etc.) para garantizar un alto rendimiento en consultas analíticas de series temporales.
- Define la tabla
- Poblado Masivo (
seed_data.sqlydataset_solicitudes.csv):- Contiene 4,000 registros sintéticos con correlaciones realistas entre prioridad, canales (Chatbot, Web, Teléfono, Correo), tiempos de resolución y satisfacción de clientes.
- Sincronización Automática (
init_db.py):- Conecta a la base de datos maestra, valida si existe
HelpPeopleDB, ejecuta el esquema y puebla las filas si la tabla está vacía. - Cuenta con un fallback transparente a SQLite en caso de ejecutarse fuera de Docker sin un servicio SQL Server activo.
- Conecta a la base de datos maestra, valida si existe
El servicio de IA implementa 3 modelos complementarios desarrollados con Scikit-Learn:
-
Algoritmo:
Random Forest Regressor(100 estimadores) + Comparativa conLinear Regression. -
Variables de Entrada:
- Tendencia lineal en el tiempo (
$t$ ). - Mes del año (
$1..12$ ). - Componentes estacionales cíclicos (
$\sin(2\pi \cdot m / 12)$ y $\cos(2\pi \cdot m / 12)$). - Variable de retardo temporal (
$Lag_1$ ).
- Tendencia lineal en el tiempo (
-
Métricas Obtenidas:
-
$R^2$ :0.965(96.5% de varianza explicada). -
Margen de Error Promedio:
±3.65%. -
MAE:
5.83solicitudes.
-
- Algoritmo:
Random Forest Regressormultivariado. - Variables: Nivel de severidad, departamento solicitante, categoría de soporte y día de la semana.
- Salida: Horas promedio estimadas de resolución por cada ticket futuro.
- Algoritmo:
Random Forest Classifier. - Exactitud (Accuracy):
83.62%. - Salida: Probabilidad calibrada de que una solicitud quede vencida según su prioridad (Crítica: ~35%, Alta: ~24%, Media: ~16%, Baja: ~10%).
La API cumple estrictamente con las especificaciones del reto:
GET /historical-data:- Parámetros opcionales:
start_date,end_date,prioridad,categoria,limit. - Respuesta: Resumen de KPIs (tasa de vencimiento, SLA cumplido, tiempo medio), agregados mensuales temporales, distribuciones categóricas y muestra paginada de registros.
- Parámetros opcionales:
POST /predict:- Cuerpo JSON:
{ "months_ahead": 4, "prioridad": "Todas", "categoria": "Todas" } - Respuesta: Proyección mensual de solicitudes (abiertas, cerradas, vencidas), tasa estimada de vencimiento, tiempo medio de resolución y métricas de exactitud del modelo.
- Cuerpo JSON:
GET /recommendations:- Respuesta: Estrategias automáticas basadas en la demanda proyectada y patrones de riesgo (cola rápida para tickets críticos, redistribución de especialistas en áreas con cuellos de botella y metas de capacidad de agentes).
GET /analytics/statistics:- Parámetros opcionales:
start_date,end_date,prioridad,categoria. - Respuesta: Reporte estadístico y descriptivo completo (distribución Lunes a Domingo con día pico, momentos de resolución P25 a P95, matriz de canales, departamentos y resumen ejecutivo).
- Parámetros opcionales:
GET /filter-options:- Provee las opciones dinámicas para los selectores del frontend (categorías, prioridades, rangos de fechas).
GET /db-status:- Diagnóstico de la conexión a la base de datos (informa si se encuentra conectada a SQL Server o en modo contingencia).
Desarrollado en React.js con Tailwind CSS, Recharts y Lucide Icons:
- Dashboard de Métricas Clave (KPIs):
- Tarjetas dinámicas con indicadores de volumen, tasa de vencimiento, porcentaje de cumplimiento SLA y satisfacción del cliente (CSAT).
- Simulador Predictivo en Tiempo Real:
- Controles interactivos (deslizador de horizonte temporal de 1 a 12 meses, filtros por severidad y categoría).
- Recálculo en tiempo real contra el endpoint
/predict.
- Gráfico Comparativo Histórico vs. Predicción:
- Curva de área interactiva que integra la historia confirmada con la proyección futura de Machine Learning, identificando visualmente la frontera entre datos reales y pronosticados.
- Alternancia entre Curva Predictiva y Desglose Apilado por Estado (Cerradas, Vencidas, Abiertas).
- Análisis de Riesgo y Carga Operativa:
- Gráfico de barras horizontales con el porcentaje de riesgo de vencimiento y tiempos de resolución promedio clasificados por prioridad.
- Gráfico circular de distribución de carga por categoría de soporte.
- Banner de Alerta Preventiva de SLA (Extra Opcional):
- Notificación destacada en el encabezado del panel cuando la tasa de vencimiento proyectada supera los umbrales seguros.
- Módulo de Estrategias y Recomendaciones Prescriptivas:
- Vista dedicada con recomendaciones tácticas automatizadas, impacto esperado y estimaciones de mejora operativa.
- Explorador y Auditoría de Tickets:
- Tabla interactiva con búsqueda en vivo, badges de SLA y paginación.
Si deseas ejecutar los componentes de manera manual en tu entorno local sin usar docker-compose, sigue estos pasos:
El sistema soporta tres modalidades flexibles para la base de datos:
No necesitas instalar ni iniciar ningún servicio adicional de base de datos.
- El backend cuenta con un mecanismo de contingencia transparente: al iniciarse, si no detecta una conexión activa a SQL Server, crea y conecta automáticamente la base de datos local
backend/helppeople_local.dbcon los 4,000 registros históricos de solicitudes, el esquema relacional y las tablas de planificación SLA. - Puedes pasar directamente al Paso 2 (Backend).
Si cuentas con una instalación local de SQL Server (Express, Developer o Standard):
- Asegúrate de que el servicio de SQL Server esté en ejecución en tu máquina (ej.
MSSQLSERVERoSQLEXPRESS). - Configura los parámetros de conexión en
backend/.env:(Si utilizas autenticación integrada de Windows, dejaDB_SERVER=localhost DB_NAME=HelpPeopleDB DB_USER=sa DB_PASSWORD=TuPasswordSeguro DB_DRIVER=ODBC Driver 17 for SQL Server DB_TRUSTED_CONNECTION=no
DB_USERyDB_PASSWORDvacíos y defineDB_TRUSTED_CONNECTION=yes). - Inicializa la base de datos, crea el esquema relacional y carga los 4,000 registros históricos ejecutando:
(Alternativamente, puedes abrir SQL Server Management Studio (SSMS) y ejecutar manualmente
& "d:\ProyectosWEB\TalentoTech\backend\venv\Scripts\python.exe" database/init_db.py
database/schema.sqlydatabase/seed_data.sql).
Si tienes Docker Desktop y solo quieres levantar el motor de base de datos mientras ejecutas el backend y frontend en local:
docker-compose up -d sqlserver(El contenedor inicializará SQL Server 2022 en el puerto 1433 con el usuario sa y la contraseña HelpPeople*2024Secure).
Una vez definida la base de datos, inicia la API y el motor predictivo:
# Desde la raíz del proyecto:
& "d:\ProyectosWEB\TalentoTech\backend\venv\Scripts\python.exe" backend/main.py(O si tienes activo el entorno virtual en la terminal: cd backend; python main.py).
La API estará disponible en http://localhost:8000 y la documentación Swagger en http://localhost:8000/docs.
En una segunda terminal, inicia el servidor de desarrollo del cliente web:
cd frontend
npm run devAccede desde tu navegador a http://localhost:5173.
