Solución — Laboratorio 3: Mini-ETL — De Fuentes OLTP al Análisis

Semana 3 · W03 · Unidad 1 · Big Data y Analytics · Universidad San Sebastián

Warning

Documento de uso exclusivo del docente. No distribuir a estudiantes antes de que completen el laboratorio.


1 Parte 1 — Extraer: conocer y auditar las fuentes

1.1 Paso 2: Tabla de diagnóstico de inconsistencias — Respuesta completa

Problema detectado Tabla afectada Columna Detalle del problema
Nombre de columna inconsistente oltp_ventas Cant Abreviación — debe renombrarse a cantidad para estandarizar
Nombre de columna inconsistente oltp_ventas Cod_Prod Debe renombrarse a producto_id para que coincida con oltp_productos
Formato de fecha distinto oltp_ventas Fecha_Venta Formato YYYY/MM/DD (barras, no guiones), distinto al estándar ISO
Llave de unión con nombres distintos oltp_ventas / oltp_clientes ID_Cliente / CustomerID El mismo identificador tiene nombre diferente en cada tabla
Llave de unión con nombres distintos oltp_ventas / oltp_productos Cod_Prod / Cod_Producto Distintos nombres para la misma llave de unión
Categoría con nombre inconsistente oltp_productos Linea Nombre diferente al estándar — debe renombrarse a categoria
Columna de nombre compuesto oltp_clientes NombreCompleto Nombre y apellido juntos en un solo campo — debe separarse
Formato de fecha distinto oltp_clientes FechaRegistro Formato DD/MM/YYYY — distinto al de oltp_ventas

1.2 Paso 3: Auditoría de calidad — 4 dimensiones

Dimensión oltp_ventas oltp_clientes oltp_productos
Exactitud Los precios y montos parecen consistentes; sin valores negativos detectados Emails con formato válido; nombres en capitalización variada Precios y costos positivos; márgenes calculables y razonables
Completitud ~100% de campos con valor; revisar si hay Total_Venta con nulos Algunos campos pueden tener nulos; revisar Correo Activo presente en todas las filas; sin nulos obvios
Consistencia Formato de fecha YYYY/MM/DD inconsistente con ISO; nombres de columnas abreviados Ciudad con nombre Ciudad en vez de region; NombreCompleto en vez de campos separados Linea en vez de categoria; capitalización puede variar entre filas
Oportunidad Datos de 2023; verificar si reflejan el período de análisis requerido Fecha de registro en formato chileno (DD/MM/YYYY) Sin columna de fecha de actualización de precios — no se puede verificar oportunidad

1.3 Paso 4: Llaves de unión

Relación Columna en oltp_ventas Columna en dimensión ¿Compatible?
Ventas → Clientes ID_Cliente CustomerID No — mismo valor, distinto nombre. Hay que renombrar una
Ventas → Productos Cod_Prod Cod_Producto No — mismo valor, distinto nombre. Hay que renombrar una
Note

Para el docente: La incompatibilidad de nombres es la causa más frecuente de errores al construir relaciones en Power BI. Los estudiantes deben entender que el sistema no une tablas automáticamente por el valor, sino por el nombre de la columna al definir la relación.


2 Parte 2 — Transformar: limpiar, estandarizar y enriquecer

2.1 Paso 5: Estandarizar oltp_ventas — Resumen de transformaciones

Transformación Descripción Resultado esperado
Renombrar columnas 8 columnas renombradas según tabla del lab Nombres consistentes en minúsculas y snake_case
Corregir tipo de fecha Fecha_Venta de texto a tipo Fecha Power BI reconoce la columna como fecha
Corregir tipos numéricos cantidad → Entero; precio_unitario y venta_total → Decimal fijo Operaciones matemáticas correctas
Filtrar valores inválidos Filtrar venta_total > 0 y cantidad > 0 Se eliminan filas erróneas (si existen)
Columna calculada venta_neta [precio_unitario] * [cantidad] * (1 - [descuento_pct] / 100) Ingreso real descontado por transacción
Columnas de fecha mes (nombre) y anio (número) Análisis temporal en el dashboard

Fórmula venta_neta detallada:

= [precio_unitario] * [cantidad] * (1 - [descuento_pct] / 100)

Ejemplo: precio_unitario=14.990, cantidad=1, descuento_pct=0 → venta_neta = 14.990 Ejemplo: precio_unitario=40.491, cantidad=3, descuento_pct=10 → venta_neta = 109.326,70

2.2 Paso 6: Estandarizar oltp_clientes — Resumen

Transformación Descripción
Renombrar 6 columnas CustomerIDcliente_id, NombreCompleto → separar en nombre/apellido, etc.
Separar NombreCompleto Dividir por espacio en primera aparición → columnas nombre y apellido
Estandarizar region Normalizar capitalización + reemplazar variantes (ver tabla abajo)
Corregir fecha_registro DD/MM/YYYY → tipo Fecha con configuración regional Español (Chile)
Validar emails Columna email_valido = Text.Contains([email],"@") and Text.Contains([email],".")
Calcular meses_cliente Duration.TotalDays(DateTime.LocalNow() - [fecha_registro]) / 30 → Entero

Estandarización de región — reemplazos esperados:

"STGO." → "Metropolitana"
"RM" → "Metropolitana"
"SANTIAGO" → "Metropolitana"
"REGION METROPOLITANA" → "Metropolitana"
"VINA DEL MAR" → "Valparaíso"   (si aplica)

2.3 Paso 7: Estandarizar oltp_productos — Resumen

Transformación Descripción
Renombrar 7 columnas Cod_Productoproducto_id, Descripcionnombre_producto, Lineacategoria, etc.
Estandarizar categoria Poner en mayúsculas cada palabra (Electrónica, Ropa, Hogar, Accesorios)
Filtrar productos inactivos Filtrar activo = TRUE / SI — ningún producto inactivo en este dataset
Columna margen_pct ([precio_venta] - [costo]) / [precio_venta] * 100
Columna clasificacion_margen Condicional: ≥40% → “Alto”, ≥20% → “Medio”, else → “Bajo”
Columna alerta_stock Condicional: =0 → “Sin stock”, <20 → “Stock crítico”, <50 → “Stock bajo”, else → “Stock normal”

Resultado esperado de clasificacion_margen (basado en los datos reales): - margen_pct para productos de Electrónica oscila entre 55–70% → todos clasifican como “Alto” - margen_pct para Ropa, Hogar y Accesorios similarmente alto → “Alto”


3 Parte 3 — Cargar: modelo estrella y medidas DAX

3.1 Paso 9: Relaciones del modelo estrella

oltp_clientes (1) ←── (∗) oltp_ventas (∗) ──→ (1) oltp_productos
    cliente_id                cliente_id            producto_id
                              producto_id

Configuración correcta en Power BI:

Relación Cardinalidad Dirección de filtro Activa
oltp_ventas[cliente_id] → oltp_clientes[cliente_id] Varios a uno (∗:1) Único (clientes → ventas)
oltp_ventas[producto_id] → oltp_productos[producto_id] Varios a uno (∗:1) Único (productos → ventas)
Note

Para el docente: Este es el modelo estrella clásico que los estudiantes ya conocen de Power BI desde su curso anterior. La diferencia es que ahora lo construyeron desde cero con fuentes OLTP separadas. Reforzar esta conexión conceptual.

3.2 Paso 10: Medidas DAX — Implementación completa

-- Medida 1: Total de ventas
Total Ventas = SUM(oltp_ventas[venta_neta])

-- Medida 2: Número de pedidos
Num Pedidos = COUNTROWS(oltp_ventas)

-- Medida 3: Ticket promedio
Ticket Promedio = DIVIDE([Total Ventas], [Num Pedidos], 0)

-- Medida 4: Clientes únicos
Clientes Unicos = DISTINCTCOUNT(oltp_ventas[cliente_id])

-- Medida 5: Ventas del mes actual
Ventas Mes Actual =
CALCULATE(
    [Total Ventas],
    MONTH(oltp_ventas[fecha]) = MONTH(TODAY()),
    YEAR(oltp_ventas[fecha]) = YEAR(TODAY())
)

-- Medida 6: Margen promedio de productos vendidos
Margen Promedio =
AVERAGE(oltp_productos[margen_pct])

Errores comunes a monitorear: - Usar SUM en vez de AVERAGE para el margen promedio. - No usar DIVIDE (división segura) → error de división por cero si no hay pedidos. - En Medida 5: comparar contra TODAY() cuando los datos son de 2023 dará 0. Aceptar también versión sin filtro de fecha.


4 Parte 4 — Dashboard CMI

4.1 Página 1 “Resumen Ejecutivo” — Configuración esperada

Visualización Configuración Resultado con los datos
Tarjeta Total Ventas Medida Total Ventas, formato CLP ~$X.XXX.XXX (total del dataset)
Tarjeta Ticket Promedio Medida Ticket Promedio, formato CLP $XX.XXX aprox.
Tarjeta Clientes Activos Medida Clientes Unicos Número de IDs únicos en ventas
Tarjeta Margen Promedio Medida Margen Promedio, formato % ~60–65% (estimado)
Gráfico de líneas Eje: anio + mes; Valores: Total Ventas Evolución mensual de 2023
Gráfico de barras Eje: categoria; Valores: Total Ventas; orden desc. Electrónica líder
Barras horizontales Eje: region; Valores: Total Ventas RM con mayor proporción
Segmentador 1 Campo: segmento de clientes Premium / Estándar / Básico
Segmentador 2 Campo: anio de ventas 2023

4.2 Página 2 “Análisis de Productos” — Configuración esperada

Visualización Configuración
Tabla Top 10 productos nombre_producto, categoria, Total Ventas, Num Pedidos, margen_pct, clasificacion_margen; ordenar por Total Ventas desc.
Dispersión Ventas vs. Margen Eje X: margen_pct; Eje Y: Total Ventas; Detalle: nombre_producto; Leyenda: clasificacion_margen
Barras apiladas Eje: categoria; Valores: Total Ventas; Leyenda: segmento
Tabla stock crítico nombre_producto, stock, alerta_stock; filtrado por “Sin stock” o “Stock crítico”; formato condicional rojo

5 Parte 5 — Síntesis y reflexión

5.1 Paso 13: Mini-reporte ejecutivo para Roberto — Respuesta modelo

Análisis de Performance TechStyle — 2023

KPI Financiero: Las ventas totales del período alcanzan valores consolidados de las tres fuentes integradas. El ticket promedio refleja la combinación de productos de alta gama (Electrónica) con accesorios de menor valor.

Hallazgo 1 — Perspectiva Cliente: Los clientes segmentados como “Premium” concentran una proporción significativa de los ingresos con un ticket promedio superior al de los segmentos Estándar y Básico, lo que sugiere que las acciones de retención de clientes Premium tienen alto impacto financiero.

Hallazgo 2 — Perspectiva Procesos: La categoría Electrónica lidera en volumen de ventas, aunque su margen porcentual es el más bajo de las cuatro categorías (~57%). Accesorios y Ropa tienen el mayor margen (>64%) pero menor volumen. La categoría con mejor equilibrio margen-volumen para la campaña es Ropa.

Alerta — Stock: Productos con stock igual a 0 o inferior a 20 unidades representan ventas potencialmente perdidas. Estos deben reabastecerse antes de la campaña.

Recomendación para María: Invertir los $15.000.000 en Electrónica dado su liderazgo en ventas y tendencia de crecimiento hacia T4. Como alternativa, Ropa ofrece el mayor margen entre las categorías de alto volumen, con menor riesgo de saturación.

5.2 Paso 14: Reflexión — Respuestas esperadas

Pregunta Respuesta esperada
¿Qué paso del ETL fue más largo? Transform — la estandarización de columnas, fechas y regiones requiere más pasos que la extracción o la carga
¿Dimensión de calidad más problemática? Consistencia — nombres de columna distintos, formatos de fecha distintos, variantes de región
Si se ejecutara cada noche, ¿qué arquitectura sería? ETL batch nocturno (batch pipeline). En empresas: Azure Data Factory, dbt, Apache Airflow
¿Qué cambiaría con 8,5 millones de filas? Power Query no escalaría. Se necesitaría Spark, Databricks, BigQuery o Snowflake
¿El modelo estrella es OLTP u OLAP? OLAP — está optimizado para consultas analíticas agregadas, no para transacciones individuales. La tabla de hechos centraliza los números y las dimensiones proveen contexto
¿Qué KPI no pudiste calcular? Aprendizaje/Crecimiento del CMI — no hay datos sobre capacitación, satisfacción de empleados, ni nuevos clientes registrados (no hay tabla de clientes con fecha de registro)