Power BI · Dashboards Ejecutivos

Análisis de datos de multitienda de curaduría

Cinco paneles interactivos que transforman los datos operacionales en inteligencia accionable para la toma de decisiones.

Descargar base de datos (.7z)

Parte 1 Parte 2 Parte 3
01

Ventas y Comportamiento de Compra

Evolución de ingresos, volumen de pedidos, ticket promedio y patrones de compra en el tiempo. Permite detectar tendencias de crecimiento, estacionalidad y cambios en la demanda para anticipar decisiones comerciales con datos concretos.

Medidas DAX 8
Ingreso Total

Suma del subtotal de todos los detalles de pedidos. Se usa detalle_pedidos en lugar de pedidos[total] para que los filtros por categoría y producto funcionen correctamente.

Ingreso Total = SUM(detalle_pedidos[subtotal])
Cantidad de Pedidos

Cuenta el total de filas en la tabla pedidos, es decir, el número absoluto de pedidos realizados.

Cantidad de Pedidos = COUNTROWS(pedidos)
Ticket Promedio

Ingreso total dividido por la cantidad de pedidos. Indica cuánto gasta en promedio cada cliente por compra.

Ticket Promedio =
DIVIDE(
    SUM(detalle_pedidos[subtotal]),
    COUNTROWS(pedidos),
    BLANK()
)
Ingreso del Mes Anterior

Calcula el ingreso total retrocediendo un mes en DimFecha. Sirve de base para comparar meses consecutivos.

Ingreso del Mes Anterior =
CALCULATE(
    SUM(detalle_pedidos[subtotal]),
    PREVIOUSMONTH(DimFecha[Date])
)
% Crecimiento MoM

Porcentaje de crecimiento del ingreso entre el mes actual y el mes anterior (Month-over-Month). Variables DAX para aislar los rangos de fecha.

% Crecimiento MoM =
VAR UltimoConDatos =
    CALCULATE(
        MAX(pedidos[fecha_pedido]),
        REMOVEFILTERS(DimFecha)
    )
VAR InicioMesActual =
    DATE(YEAR(UltimoConDatos), MONTH(UltimoConDatos), 1)
VAR InicioMesAnterior =
    EOMONTH(InicioMesActual, -2) + 1
VAR FinMesAnterior =
    EOMONTH(InicioMesActual, -1)
VAR IngresoActual =
    CALCULATE(
        [Ingreso Total],
        DimFecha[Date] >= InicioMesActual
    )
VAR IngresoAnterior =
    CALCULATE(
        [Ingreso Total],
        DimFecha[Date] >= InicioMesAnterior,
        DimFecha[Date] <= FinMesAnterior
    )
RETURN
    DIVIDE(IngresoActual - IngresoAnterior, IngresoAnterior)
Unidades Vendidas

Suma de la cantidad de productos vendidos según el detalle de pedidos.

Unidades Vendidas = SUM(detalle_pedidos[cantidad])
Precio Promedio por Producto

Promedio del precio unitario de los productos vendidos.

Precio Promedio por Producto = AVERAGE(detalle_pedidos[precio_unitario])
Desviación vs Promedio

Diferencia entre las unidades vendidas de un producto y el promedio de unidades del catálogo seleccionado. Útil para Top 10 productos.

Desviacion vs Promedio =
VAR PromedioTotal =
    CALCULATE(
        AVERAGEX(VALUES(productos[id_producto]), [Unidades Vendidas]),
        ALLSELECTED(productos)
    )
RETURN [Unidades Vendidas] - PromedioTotal
02

Emprendedores y Proceso de Curaduría

Rendimiento del ecosistema emprendedor: mide la tasa de aprobación de perfiles, el tiempo promedio de evaluación, la distribución por estado y el desempeño de cada curador. Una radiografía operativa del proceso de selección.

Medidas DAX 11
Total Emprendedores

Cuenta el total de emprendedores registrados en la plataforma.

Total Emprendedores = COUNTROWS(perfiles_emprendedor)
Emprendedores Aprobados

Filtra y cuenta los emprendedores cuyo estado es 'aprobado'.

Emprendedores Aprobados =
CALCULATE(
    COUNTROWS(perfiles_emprendedor),
    perfiles_emprendedor[estado] = "aprobado"
)
Tasa de Aprobación

Porcentaje de emprendedores aprobados sobre el total. Indica la selectividad del proceso de curaduría.

Tasa de Aprobación =
DIVIDE(
    [Emprendedores Aprobados],
    [Total Emprendedores],
    BLANK()
)
Emprendedores Rechazados

Filtra y cuenta los emprendedores cuyo estado es 'rechazado'.

Emprendedores Rechazados =
CALCULATE(
    COUNTROWS(perfiles_emprendedor),
    perfiles_emprendedor[estado] = "rechazado"
)
Emprendedores Pendientes

Filtra y cuenta los emprendedores que aún están en estado 'pendiente' de evaluación.

Emprendedores Pendientes =
CALCULATE(
    COUNTROWS(perfiles_emprendedor),
    perfiles_emprendedor[estado] = "pendiente"
)
Total Evaluaciones

Cuenta el total de evaluaciones de curaduría registradas.

Total Evaluaciones = COUNTROWS(evaluaciones_curaduria)
Evaluaciones por Curador

Cuenta evaluaciones desglosadas por curador. Se usa con la dimensión usuarios[nombre] en el visual.

Evaluaciones por Curador = COUNTROWS(evaluaciones_curaduria)
Productos por Emprendedor

Promedio de productos publicados por cada emprendedor activo.

Productos por Emprendedor =
DIVIDE(
    COUNTROWS(productos),
    DISTINCTCOUNT(perfiles_emprendedor[id_emprendedor]),
    BLANK()
)
Ingreso por Emprendedor

Promedio de ingresos generados por cada emprendedor. Usa detalle_pedidos[subtotal] para que el filtro por emprendedor funcione.

Ingreso por Emprendedor =
DIVIDE(
    SUM(detalle_pedidos[subtotal]),
    DISTINCTCOUNT(perfiles_emprendedor[id_emprendedor]),
    BLANK()
)
Aprobaciones por Mes

Cuenta aprobaciones activando la relación inactiva entre DimFecha y fecha_aprobacion con USERELATIONSHIP.

Aprobaciones por Mes =
CALCULATE(
    COUNTROWS(perfiles_emprendedor),
    perfiles_emprendedor[estado] = "aprobado",
    USERELATIONSHIP(DimFecha[Date], perfiles_emprendedor[fecha_aprobacion])
)
FlujoCuraduria (tabla calculada)

Tabla calculada que construye un embudo de 3 etapas: Registrados → Evaluados → Aprobados. Se usa en un visual de embudo.

FlujoCuraduria =
VAR Total = COUNTROWS(perfiles_emprendedor)
VAR Evaluados =
    CALCULATE(
        COUNTROWS(perfiles_emprendedor),
        perfiles_emprendedor[estado] IN {"aprobado", "rechazado"}
    )
VAR Aprobados =
    CALCULATE(
        COUNTROWS(perfiles_emprendedor),
        perfiles_emprendedor[estado] = "aprobado"
    )
RETURN
UNION(
    ROW("Etapa", "① Registrados",  "Cantidad", Total,     "Orden", 1),
    ROW("Etapa", "② Evaluados",    "Cantidad", Evaluados, "Orden", 2),
    ROW("Etapa", "③ Aprobados",    "Cantidad", Aprobados, "Orden", 3)
)
03

Productos e Inventario

Radiografía completa del catálogo: distribución por categoría y subcategoría, productos en riesgo de quiebre de stock, estados de aprobación y rotación de inventario. Apoya las decisiones de abastecimiento y curaduría de portafolio.

Medidas DAX 12
Total Productos

Cuenta el total de productos en el catálogo.

Total Productos = COUNTROWS(productos)
Productos Aprobados

Filtra y cuenta los productos con estado 'aprobado'.

Productos Aprobados =
CALCULATE(
    COUNTROWS(productos),
    productos[estado] = "aprobado"
)
Tasa de Aprobación de Productos

Porcentaje de productos aprobados sobre el total del catálogo.

Tasa de Aprobación de Productos =
DIVIDE(
    [Productos Aprobados],
    [Total Productos],
    BLANK()
)
Stock Total

Suma de la cantidad de unidades disponibles en inventario.

Stock Total = SUM(inventario[cantidad])
Productos bajo Stock Mínimo

Cuenta los productos cuyo stock actual es menor o igual al stock mínimo definido.

Productos bajo Stock Mínimo =
CALCULATE(
    COUNTROWS(inventario),
    inventario[cantidad] <= inventario[stock_minimo]
)
% Productos en Riesgo de Quiebre

Porcentaje del catálogo que está en riesgo de quiebre de stock.

% Productos en Riesgo de Quiebre =
DIVIDE(
    [Productos bajo Stock Mínimo],
    COUNTROWS(inventario),
    BLANK()
)
Precio Promedio del Catálogo

Promedio del precio de todos los productos del catálogo.

Precio Promedio del Catálogo = AVERAGE(productos[precio])
Unidades Vendidas

Suma de cantidades vendidas desde el detalle de pedidos.

Unidades Vendidas = SUM(detalle_pedidos[cantidad])
Rotación de Inventario

Unidades vendidas divididas por stock disponible. Valores mayores a 1 indican alta rotación.

Rotación de Inventario =
DIVIDE(
    SUM(detalle_pedidos[cantidad]),
    SUM(inventario[cantidad]),
    BLANK()
)
Stock Actual (columna calculada)

Trae el stock actual desde la tabla inventario usando RELATED. Alternativa con LOOKUPVALUE si RELATED no funciona.

Stock Actual = RELATED(inventario[cantidad])

-- Alternativa:
Stock Actual =
LOOKUPVALUE(
    inventario[cantidad],
    inventario[id_producto],
    productos[id_producto]
)
Stock Mínimo (columna calculada)

Trae el stock mínimo desde inventario. Misma lógica que Stock Actual.

Stock Minimo = RELATED(inventario[stock_minimo])

-- Alternativa:
Stock Minimo =
LOOKUPVALUE(
    inventario[stock_minimo],
    inventario[id_producto],
    productos[id_producto]
)
Alerta Stock

Medida de formato condicional: devuelve 1 si el stock actual es menor o igual al mínimo, 0 en caso contrario.

Alerta Stock =
IF(
    [Stock Actual] <= [Stock Minimo],
    1,
    0
)
04

Pagos y Métodos de Pago

Análisis financiero de transacciones: distribución por método de pago, tasa de aprobación y rechazo, ingresos por canal, y comportamiento de reembolsos. Revela de inmediato qué métodos funcionan mejor y dónde hay fricción.

Medidas DAX 10
Monto Total Pagado

Suma del monto de todas las transacciones de pago.

Monto Total Pagado = SUM(pagos[monto])
Cantidad de Transacciones

Cuenta el total de transacciones registradas en la tabla pagos.

Cantidad de Transacciones = COUNTROWS(pagos)
Ticket Promedio por Pago

Monto total dividido por la cantidad de transacciones. Valor promedio por operación.

Ticket Promedio por Pago =
DIVIDE(
    [Monto Total Pagado],
    [Cantidad de Transacciones],
    BLANK()
)
Pagos Aprobados

Cuenta las transacciones cuyo estado es 'aprobado'.

Pagos Aprobados =
CALCULATE(
    [Cantidad de Transacciones],
    pagos[estado] = "aprobado"
)
Tasa de Aprobación de Pagos

Porcentaje de transacciones aprobadas sobre el total.

Tasa de Aprobación de Pagos =
DIVIDE(
    [Pagos Aprobados],
    [Cantidad de Transacciones],
    BLANK()
)
Pagos Rechazados

Cuenta las transacciones cuyo estado es 'rechazado'.

Pagos Rechazados =
CALCULATE(
    [Cantidad de Transacciones],
    pagos[estado] = "rechazado"
)
Tasa de Rechazo

Porcentaje de transacciones rechazadas sobre el total.

Tasa de Rechazo =
DIVIDE(
    [Pagos Rechazados],
    [Cantidad de Transacciones],
    BLANK()
)
Monto Reembolsado

Suma del monto de las transacciones con estado 'reembolsado'.

Monto Reembolsado =
CALCULATE(
    SUM(pagos[monto]),
    pagos[estado] = "reembolsado"
)
Tasa de Reembolso

Porcentaje del monto reembolsado sobre el monto total pagado.

Tasa de Reembolso =
DIVIDE(
    [Monto Reembolsado],
    [Monto Total Pagado],
    BLANK()
)
Transacciones por Método de Pago

Cuenta transacciones desglosadas por método de pago. Se usa con pagos[metodo_pago] como dimensión.

Transacciones por Método de Pago = COUNTROWS(pagos)
05

Geografía de Clientes y Ventas

Mapa de penetración regional: identifica qué regiones, ciudades y comunas concentran los ingresos y la base de clientes, dónde hay mayor densidad de ventas y qué zonas representan oportunidades de expansión territorial.

Medidas DAX 10
Ingreso Total

Suma del subtotal de detalles de pedidos. Permite filtrar por región, ciudad o comuna correctamente.

Ingreso Total = SUM(detalle_pedidos[subtotal])
Clientes Únicos

Cuenta los usuarios distintos que han realizado pedidos.

Clientes Únicos = DISTINCTCOUNT(usuarios[id_usuario])
Pedidos por Región

Cuenta pedidos, se desglosa automáticamente al usar direcciones[region] como dimensión.

Pedidos por Región = COUNTROWS(pedidos)
Ticket Promedio por Ciudad

Ingreso total dividido por pedidos en cada ciudad.

Ticket Promedio por Ciudad =
DIVIDE(
    SUM(detalle_pedidos[subtotal]),
    COUNTROWS(pedidos),
    BLANK()
)
Densidad de Clientes

Cuenta clientes únicos por comuna. Se usa con direcciones[comuna] como dimensión.

Densidad de Clientes = DISTINCTCOUNT(usuarios[id_usuario])
% del Ingreso Nacional

Contribución porcentual de cada región al ingreso nacional. Usa ALL(direcciones) para remover el filtro de región y obtener el total.

% del Ingreso Nacional =
DIVIDE(
    SUM(detalle_pedidos[subtotal]),
    CALCULATE(
        SUM(detalle_pedidos[subtotal]),
        ALL(direcciones)
    ),
    BLANK()
)
Región #1

Nombre de la región con mayor ingreso, usando TOPN y CONCATENATEX.

Región #1 =
CONCATENATEX(
    TOPN(
        1,
        VALUES(direcciones[region]),
        [Ingreso Total],
        DESC
    ),
    direcciones[region],
    ", "
)
Ingreso Región #1

Monto de ingreso de la región líder, usando TOPN y MAXX.

Ingreso Región #1 =
MAXX(
    TOPN(
        1,
        VALUES(direcciones[region]),
        [Ingreso Total],
        DESC
    ),
    [Ingreso Total]
)
Regiones con Ventas

Cuenta cuántas regiones distintas tienen ventas registradas.

Regiones con Ventas =
DISTINCTCOUNT(direcciones[region])
Ciudades con Ventas

Cuenta cuántas ciudades distintas tienen ventas registradas.

Ciudades con Ventas =
DISTINCTCOUNT(direcciones[ciudad])

Presentación en video