Solución integral de Business Intelligence end-to-end: Data Warehouse, ETL automatizado y visualización interactiva para análisis estratégico de datos de negocio.
- Descripción General
- Características Principales
- Arquitectura del Sistema
- Modelo de Datos
- Análisis Implementados
- Instalación y Configuración
- Estructura del Proyecto
- Stack Tecnológico
- Uso y Operación
- Troubleshooting
- Contribución
- Licencia
- Autor
Chinook Strategy Command Center es un proyecto de análisis de datos que implementa una solución completa de Business Intelligence (BI) para transformar datos transaccionales en insights accionables. El proyecto simula un entorno corporativo real de una tienda de medios digitales, abarcando desde la extracción de datos hasta la visualización interactiva de métricas de negocio.
Chinook es una tienda global de música y video digital con operaciones en múltiples países. A pesar de contar con un sistema transaccional robusto, la organización enfrentaba desafíos críticos:
- Silos de información: Datos dispersos en tablas normalizadas sin visión consolidada.
- Latencia analítica: Consultas complejas degradaban el rendimiento operacional.
- Ausencia de segmentación: Sin metodología para identificar clientes de alto valor o en riesgo de churn.
- Decisiones reactivas: Falta de métricas en tiempo real para estrategia comercial.
Este proyecto resuelve estos desafíos mediante:
- Migración OLTP → OLAP: Construcción de un Data Warehouse optimizado para análisis.
- Pipeline ETL automatizado: Transformación y carga de datos sin intervención manual al iniciar el contenedor.
- Modelo dimensional: Esquema de estrella (Star Schema) para consultas de alto rendimiento.
- Segmentación avanzada: Algoritmo RFM para clasificación de clientes directamente en SQL.
- Dashboard interactivo: Visualización en tiempo real con Metabase pre-cargado.
- Infraestructura como código: Despliegue reproducible "One-Click" con Docker Compose.
- ✅ Despliegue automatizado: Un solo comando (
docker compose up) levanta toda la infraestructura. - ✅ ETL sin código: Scripts SQL ejecutados automáticamente al iniciar.
- ✅ Pre-configurado: Dashboard con visualizaciones y conexiones listas para usar.
- ✅ Análisis avanzado: Segmentación RFM, análisis de cohortes, series temporales.
- ✅ Escalable: Arquitectura modular basada en microservicios.
- ✅ Portable: Funciona en cualquier sistema (Windows, Mac, Linux) con Docker.
- ✅ Open Source: Stack tecnológico completamente libre y gratuito.
El proyecto implementa una arquitectura de datos moderna basada en contenedores, siguiendo el patrón ELT (Extract, Load, Transform).
graph TD
subgraph Docker_Compose_Network [Docker Compose Network]
direction TB
METABASE[Metabase<br/>Port 3000]
DB[(PostgreSQL 16<br/>Port 5432)]
PGADMIN[pgAdmin 4<br/>Port 5050]
METABASE -->|Conecta JDBC| DB
PGADMIN -->|Administra| DB
end
subgraph Database_Internal [Dentro de PostgreSQL]
direction TB
OLTP[(Esquema OLTP<br/>Source)]
ETL_PROCESS{Scripts ETL<br/>SQL Automatizado}
OLAP[(Esquema OLAP<br/>Data Warehouse)]
OLTP -->|Extract| ETL_PROCESS
ETL_PROCESS -->|Transform & Load| OLAP
end
USER((Usuario)) -->|Visualiza| METABASE
USER -->|Administra| PGADMIN
-
Imagen:
postgres:16 -
Función: Aloja tanto el esquema OLTP (fuente) como el OLAP (Data Warehouse) en la base de datos
chinook. -
Inicialización: Ejecuta automáticamente scripts SQL en
/docker-entrypoint-initdb.d/: -
01_oltp.sql: Crea y puebla el esquema transaccional. -
02_olap.sql: Crea el esquema dimensionalanalyticsy ejecuta transformaciones ETL. -
Persistencia: Volumen Docker
postgres_datapara garantizar durabilidad.
- Imagen:
metabase/metabase:latest - Función: Plataforma de BI para visualización interactiva.
- Configuración: Base de datos H2 embebida restaurada desde backup local.
- Conectividad: Se conecta automáticamente al esquema OLAP del contenedor
db.
- Imagen:
dpage/pgadmin4:latest - Función: Interfaz web para administración de PostgreSQL.
- Uso: Inspección de esquemas, ejecución de queries, debugging.
El esquema transaccional sigue la Tercera Forma Normal (3NF), optimizado para integridad referencial y operaciones CRUD.
erDiagram
Artist ||--|{ Album : "tiene"
Album ||--|{ Track : "contiene"
Genre ||--|{ Track : "clasifica"
MediaType ||--|{ Track : "formato"
Track ||--|{ InvoiceLine : "en"
Invoice ||--|{ InvoiceLine : "tiene"
Customer ||--|{ Invoice : "compra"
Employee ||--|{ Customer : "soporta"
Employee ||--|{ Employee : "reporta_a"
Artist {
int ArtistId PK
string Name
}
Album {
int AlbumId PK
string Title
int ArtistId FK
}
Track {
int TrackId PK
string Name
int AlbumId FK
int GenreId FK
}
Customer {
int CustomerId PK
string FirstName
string LastName
string Email
}
Invoice {
int InvoiceId PK
datetime InvoiceDate
numeric Total
}
Limitaciones del modelo OLTP para análisis:
- Requiere 6+ JOINs para consultas analíticas básicas.
- Alto costo computacional para agregaciones.
- Diseñado para escritura (INSERT/UPDATE), no para lectura intensiva.
El Data Warehouse implementa un Star Schema optimizado para consultas analíticas de alto rendimiento, alojado en el esquema analytics.
erDiagram
fact_sales }|..|| dim_customer : "cliente"
fact_sales }|..|| dim_track : "producto"
fact_sales }|..|| dim_employee : "vendedor"
fact_sales }|..|| dim_date : "fecha"
fact_sales {
int sales_key PK
int quantity
numeric unit_price
numeric total_revenue
int customer_key FK
int track_key FK
int date_key FK
}
dim_customer {
int customer_key PK
string full_name
string country
string customer_segment
}
dim_track {
int track_key PK
string track_name
string genre_name
string media_type_name
}
dim_date {
int date_key PK
int year
int month
string is_weekend
}
Ventajas del modelo OLAP:
- Reducción de JOINs: De 6+ a 1-2 uniones máximo.
- Performance: Consultas drásticamente más rápidas.
- Desnormalización estratégica: Datos redundantes para acelerar lectura.
El proyecto implementa un algoritmo de RFM (Recency, Frequency, Monetary) directamente en SQL mediante Window Functions (NTILE).
Lógica de Segmentación:
- Recencia (R): Días desde la última compra.
- Frecuencia (F): Cantidad de facturas únicas.
- Monetización (M): Total gastado histórico.
| Segmento | Descripción | Estrategia Sugerida |
|---|---|---|
| 🥇 Campeones (VIP) | Score RFM alto (R=5, F=5, M=5) | Programas de fidelidad exclusivos. |
| 💎 Leales Potenciales | Compran seguido, buen gasto | Upselling y Cross-selling. |
| Gastaban mucho pero no volvieron | Campañas de reactivación agresivas. | |
| 💤 Perdidos | Baja frecuencia y recencia | Evaluar costo de retención vs adquisición. |
El dashboard implementa los siguientes indicadores clave:
| Métrica | Definición |
|---|---|
| Total Revenue | Suma total de facturación histórica. |
| AOV (Ticket Promedio) | Ingreso promedio por transacción única. |
| Métrica | Definición |
|---|---|
| Top Géneros | Géneros musicales con mayor volumen de ventas. |
| Top Países | Regiones geográficas con mayor penetración de mercado. |
| Performance Empleados | Ranking de ventas por agente de soporte. |
Antes de comenzar, asegúrese de tener instalado:
- Docker: v20.10 o superior.
- Docker Compose: v2.0 o superior (incluido en Docker Desktop).
- Git: Para clonar el repositorio.
- Puertos Libres: 3000 (Metabase), 5432 (Postgres), 5050 (pgAdmin).
git clone https://github.com/tu-usuario/devlights-data-analysis-final-project.git
cd devlights-data-analysis-final-projectEjecute el siguiente comando en la raíz del proyecto:
docker compose up -d¿Qué sucede al ejecutar esto?
- Descarga las imágenes de Postgres, Metabase y pgAdmin.
- Crea la red
chinook_net. - Inicia la base de datos
chinook. - Ejecuta
01_oltp.sql(Crea tablas fuente). - Ejecuta
02_olap.sql(Crea DW y procesa datos). - Inicia Metabase y restaura el dashboard desde el backup local.
⏳ Nota: El primer inicio puede demorar unos 60 segundos mientras se inicializan los servicios.
docker compose psTodos los contenedores (chinook_db, chinook_bi, chinook_pgadmin) deberían estar en estado "Up" o "Running".
El sistema ya viene con usuarios y dashboards precargados.
- URL: http://localhost:3000
- Email:
[email protected] - Password:
helloworld2025
Para inspección técnica y consultas SQL manuales.
- URL: http://localhost:5050
- Email:
[email protected] - Password:
root
Datos para conectar el servidor (Register Server):
- Host name:
db - Username:
devlights_user - Password:
devlights_password - Database:
chinook
devlights-data-analysis-final-project/
│
├── docker-compose.yml # Orquestación de contenedores
│
├── assets/ # Scripts SQL de inicialización
│ ├── 01_oltp.sql # Script Fuente (OLTP)
│ └── 02_olap.sql # Script Data Warehouse (OLAP + ETL)
│
├── metabase_backup_data/ # Backup persistente del Dashboard
│ └── metabase.db.mv.db # Base de datos H2 de Metabase
│
└── README.md # Documentación del proyecto
| Componente | Tecnología | Versión | Uso |
|---|---|---|---|
| Base de Datos | PostgreSQL | 16 | Motor Relacional & Data Warehouse |
| Contenedores | Docker | Latest | Empaquetado y ejecución |
| Orquestación | Docker Compose | v2+ | Gestión de servicios y redes |
| Visualización | Metabase | Latest | Dashboarding y BI |
| Administración | pgAdmin 4 | Latest | GUI para PostgreSQL |
| Lenguaje | SQL (PL/pgSQL) | Standard | Lógica de negocio y transformación |
Detener el entorno (conservando datos):
docker compose stopReiniciar el entorno:
docker compose startDestruir entorno (BORRA DATOS y volúmenes):
docker compose down -vVer logs de la base de datos:
docker logs -f chinook_db
- Causa: El script SQL falló o tardó demasiado.
- Solución: Revisa los logs con
docker logs chinook_db. Si hubo un error en los scripts, corrige el SQL y ejecutadocker compose down -vseguido dedocker compose up -d.
- Causa: No leyó correctamente el archivo de backup.
- Solución: Asegúrate de que la carpeta
metabase_backup_datacontenga el archivometabase.db.mv.dbdirectamente (sin subcarpetas extra) y reinicia el contenedorchinook_bi.
- Causa: Otro servicio en tu PC usa el puerto 3000.
- Solución: Edita
docker-compose.ymly cambia el mapeo de puertos de Metabase a"3001:3000".
Las contribuciones son bienvenidas. Para cambios importantes:
- Fork el repositorio.
- Crea una rama (
git checkout -b feature/AmazingFeature). - Commit tus cambios (
git commit -m 'Add some AmazingFeature'). - Push a la rama (
git push origin feature/AmazingFeature). - Abre un Pull Request.
Este proyecto está bajo la Licencia MIT. Ver archivo LICENSE para más detalles.
Facundo Nicolás González
- Proyecto: Trabajo final Data Analytics - Devlights
- GitHub: @titesen
- LinkedIn: Facundo N. González
Última actualización: Diciembre 2025