Parte de nuestra serie Supply Chain & Procurement
Leer la guía completaAnálisis de inventario con Power BI: stock, facturación y demanda
El exceso de inventario cuesta entre el 25 y el 30% de su valor anualmente en costos de mantenimiento. Los desabastecimientos cuestan a los minoristas aproximadamente 1 billón de dólares en ventas perdidas cada año. Entre estos dos extremos se encuentra la estrecha banda del inventario óptimo, y Power BI es la herramienta que mantiene a los equipos de operaciones precisamente en esa línea.
El desafío con el análisis de inventario en Power BI es que el stock es una medida instantánea (¿cuánto tenemos ahora?) en lugar de una medida de flujo (¿cuánto se vendió este mes?). Esta distinción impulsa cada decisión de diseño en el modelo de datos y cada patrón de cálculo DAX. Esta guía cubre la plataforma completa de análisis de inventario: modelo de datos, clasificación ABC, análisis de rotación, cálculos de puntos de reorden y visualizaciones de pronóstico de demanda.
Conclusiones clave
- El inventario es una medida de un momento determinado (instantánea) que requiere patrones DAX diferentes a los de las métricas de ventas.
- El análisis ABC clasifica los artículos por contribución a los ingresos: A (80% superior), B (15% siguiente), C (5% inferior).
- Rotación de inventario = COGS / Inventario promedio: varía dramáticamente según la industria
- Punto de reorden = (Uso diario promedio × Plazo de entrega) + Stock de seguridad
- La función DAX RANKX potencia la clasificación ABC automáticamente a medida que cambian los datos
- La previsión de la demanda en Power BI utiliza regresión lineal a través de la integración de DAX o Azure ML
- La identificación de inventarios obsoletos y de movimiento lento (SLOB) ahorra costos de mantenimiento significativos
- Power BI se conecta a tablas de inventario de ERP (Odoo, SAP, NetSuite) sin movimiento de datos
Modelo de datos para análisis de inventario
Tablas de inventario principal
Inventory_Snapshot (una fila por artículo por día/semana - niveles de existencias en un momento dado):
| Columna | Descripción |
|---|---|
| CÓDIGO0 | Fecha del recuento de existencias |
| CÓDIGO0 | FK a dimensión de artículo/producto |
| CÓDIGO0 | FK al almacén/ubicación |
| CÓDIGO0 | Cantidad de existencias físicas |
| CÓDIGO0 | Cantidad de órdenes de compra abiertas |
| CÓDIGO0 | Cantidad comprometida para pedidos abiertos |
| CÓDIGO0 | QoH - Reservado |
| CÓDIGO0 | Costo medio o estándar |
| CÓDIGO0 | Cantidad disponible × costo unitario |
Movimientos_de_inventario (una fila por transacción de acciones):
| Columna | Descripción |
|---|---|
| CÓDIGO0 | ID de transacción |
| CÓDIGO0 | FK al artículo |
| CÓDIGO0 | FK a la ubicación |
| CÓDIGO0 | Fecha de movimiento |
| CÓDIGO0 | Recibo, Venta, Transferencia, Ajuste, Devolución |
| CÓDIGO0 | Cantidad movida (positiva = entrada, negativa = salida) |
| CÓDIGO0 | Coste unitario en el momento del movimiento |
Sales_Lines (una fila por línea de pedido de ventas para análisis de demanda):
OrderID,ItemID,OrderDate,ShipDate,Quantity,UnitPrice,Revenue,CustomerID
Purchase_Orders (para análisis de plazos de entrega y adquisiciones):
POID,ItemID,OrderDate,ExpectedDate,ReceiptDate,Quantity,UnitCost
Dim_Item (dimensión del producto):
ItemID,SKU,Name,Category,SubCategory,Supplier,LeadTimeDays,ReorderPoint,SafetyStock,UnitCost,ListPrice,IsActive
KPI de inventario principal con DAX
Medidas de nivel de existencias
// Current Stock on Hand (point-in-time)
Stock on Hand =
CALCULATE(
SUM(Inventory_Snapshot[QuantityOnHand]),
Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)
// Stock Value (current)
Stock Value =
CALCULATE(
SUM(Inventory_Snapshot[StockValue]),
Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)
// Available to Promise (ATP)
Available to Promise =
CALCULATE(
SUM(Inventory_Snapshot[QuantityAvailable]),
Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)
// Stock on Order (incoming POs)
Stock on Order =
CALCULATE(
SUM(Inventory_Snapshot[QuantityOnOrder]),
Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)
// Projected Stock (current + on order - reserved)
Projected Stock = [Stock on Hand] + [Stock on Order] - [Stock Reserved]
Rotación de inventario
// COGS in Period (for turnover denominator)
Total COGS =
SUMX(
FILTER(Inventory_Movements, Inventory_Movements[MovementType] = "Sale"),
Inventory_Movements[Quantity] * Inventory_Movements[UnitCost]
)
// Average Inventory Value (beginning + ending / 2)
Avg Inventory Value =
AVERAGEX(
VALUES(Date[Month]),
CALCULATE(
SUM(Inventory_Snapshot[StockValue]),
Inventory_Snapshot[SnapshotDate] = MAX(Inventory_Snapshot[SnapshotDate])
)
)
// Inventory Turnover Ratio
Inventory Turnover =
DIVIDE([Total COGS], [Avg Inventory Value], 0)
// Days Inventory Outstanding (DIO)
Days Inventory Outstanding =
DIVIDE(365, [Inventory Turnover], 0)
// Benchmark comparison (industry varies widely)
// Manufacturing: 6-12x | Retail: 4-6x | Electronics: 8-15x
Turnover vs Benchmark =
[Inventory Turnover] -
LOOKUPVALUE(
Industry_Benchmark[InventoryTurnover],
Industry_Benchmark[Category],
SELECTEDVALUE(Dim_Item[Category])
)
Análisis ABC
El análisis ABC clasifica los artículos del inventario por su contribución a los ingresos o costos:
- Artículos A: 80% superior de los ingresos/COGS: alta prioridad, control estricto
- Elementos B: siguiente 15 %: control moderado
- Elementos C: 5% inferior: supervisión mínima
// Revenue contribution per item (last 12 months)
Item Revenue 12M =
CALCULATE(
SUM(Sales_Lines[Revenue]),
DATESINPERIOD(Date[Date], TODAY(), -12, MONTH)
)
// Cumulative revenue % (for ABC cutoff)
Cumulative Revenue % =
DIVIDE(
SUMX(
FILTER(
ALL(Dim_Item),
RANKX(ALL(Dim_Item), [Item Revenue 12M], , DESC) <=
RANKX(ALL(Dim_Item), [Item Revenue 12M], , DESC)
),
[Item Revenue 12M]
),
CALCULATE([Item Revenue 12M], ALL(Dim_Item)),
0
)
// ABC Classification (calculated column in Dim_Item, refreshed periodically)
ABC Class =
VAR CumPct = [Cumulative Revenue %]
RETURN
SWITCH(TRUE(),
CumPct <= 0.80, "A",
CumPct <= 0.95, "B",
"C"
)
// ABC Summary measure
A Items Count = CALCULATE(COUNTROWS(Dim_Item), Dim_Item[ABC Class] = "A")
A Items Revenue % = DIVIDE(
CALCULATE([Item Revenue 12M], Dim_Item[ABC Class] = "A"),
CALCULATE([Item Revenue 12M], ALL(Dim_Item)),
0
)
Matriz ABC-XYZ
Ampliar ABC con clasificación XYZ para la variabilidad de la demanda:
- X: Baja variabilidad de la demanda (CV < 0,5): predecible, plan para la eficiencia
- Y: variabilidad media (CV 0,5-1,0): cierta incertidumbre
- Z: Alta variabilidad (CV > 1,0): impredecible, planifique el nivel de servicio
// Coefficient of Variation for demand variability
Demand CV =
DIVIDE(
STDEV.P(Sales_Lines[Quantity]),
AVERAGE(Sales_Lines[Quantity]),
0
)
// XYZ Classification
XYZ Class =
SWITCH(TRUE(),
[Demand CV] < 0.5, "X",
[Demand CV] < 1.0, "Y",
"Z"
)
El segmento AX (altos ingresos, demanda predecible) recibe la gestión de reordenes más estricta. El segmento CZ (bajos ingresos, impredecible) es candidato a ser eliminado o fabricado bajo pedido.
Cálculos de puntos de reorden y existencias de seguridad
Fórmula de punto de reorden
Punto de reorden = (Uso diario promedio × Plazo de entrega) + Stock de seguridad
// Average Daily Usage (last 90 days)
Avg Daily Usage =
DIVIDE(
CALCULATE(
SUM(Sales_Lines[Quantity]),
DATESINPERIOD(Date[Date], TODAY(), -90, DAY)
),
90,
0
)
// Reorder Point calculation
Calculated Reorder Point =
ROUND(
[Avg Daily Usage] * AVERAGE(Dim_Item[LeadTimeDays]) +
Dim_Item[SafetyStock],
0
)
// Below Reorder Point flag
Below Reorder Point =
IF([Stock on Hand] < [Calculated Reorder Point], "Reorder Required", "OK")
// Days of Supply remaining
Days of Supply =
DIVIDE([Stock on Hand], [Avg Daily Usage], 0)
// Stockout Risk Score (0-100)
Stockout Risk =
SWITCH(TRUE(),
[Days of Supply] < 7, 100, -- Critical
[Days of Supply] < 14, 75, -- High risk
[Days of Supply] < 30, 50, -- Medium risk
[Days of Supply] < 60, 25, -- Low risk
0 -- OK
)
Cálculo del stock de seguridad
// Safety Stock using statistical method
// SS = Z-score × σ(demand) × √Lead Time
Safety Stock Calculated =
VAR ZScore = 1.645 -- 95% service level
VAR DemandStdDev = STDEV.P(Sales_Lines[Quantity]) -- per day
VAR LeadTime = AVERAGE(Dim_Item[LeadTimeDays])
RETURN ROUND(ZScore * DemandStdDev * SQRT(LeadTime), 0)
Inventario obsoleto y de lento movimiento (SLOB)
Identificar el inventario SLOB es fundamental para la optimización del capital de trabajo:
// Days Since Last Sale
Days Since Last Sale =
DATEDIFF(
CALCULATE(
MAX(Sales_Lines[OrderDate]),
ALL(Date)
),
TODAY(),
DAY
)
// SLOB Classification
SLOB Class =
SWITCH(TRUE(),
[Days Since Last Sale] > 365, "Obsolete",
[Days Since Last Sale] > 180, "Slow Moving",
[Days Since Last Sale] > 90, "At Risk",
"Active"
)
// SLOB Inventory Value
SLOB Value =
CALCULATE(
[Stock Value],
Dim_Item[SLOB Class] IN {"Slow Moving", "Obsolete"}
)
// SLOB as % of total inventory
SLOB % =
DIVIDE([SLOB Value], [Stock Value], 0)
Visualización de previsión de demanda
Power BI puede visualizar pronósticos de demanda usando:
Pronóstico integrado (panel de análisis)
Haga clic derecho en un gráfico de líneas → panel Análisis → Pronóstico:
- Duración de la previsión: 12 meses
- Intervalo de confianza: 95%
- Estacionalidad: Detección automática
Utiliza el algoritmo de suavizado exponencial (ETS), adecuado para patrones de demanda simples y estacionarios.
Pronóstico lineal DAX personalizado
// Simple Linear Regression Forecast
Demand Forecast =
VAR LastPeriod = MAX(Date[MonthNum])
VAR ForecastPeriod = LastPeriod + 1 -- Next month
VAR N = COUNTROWS(VALUES(Date[Month]))
VAR SumX = SUMX(VALUES(Date[MonthNum]), Date[MonthNum])
VAR SumY = SUMX(VALUES(Date[Month]), [Monthly Sales Qty])
VAR SumXY = SUMX(VALUES(Date[Month]), Date[MonthNum] * [Monthly Sales Qty])
VAR SumX2 = SUMX(VALUES(Date[MonthNum]), Date[MonthNum]^2)
VAR Slope = DIVIDE(N*SumXY - SumX*SumY, N*SumX2 - SumX^2, 0)
VAR Intercept = DIVIDE(SumY - Slope*SumX, N, 0)
RETURN Intercept + Slope * ForecastPeriod
Previsión de la demanda de aprendizaje automático de Azure
Para realizar una previsión de la demanda sofisticada, integre Azure Machine Learning:
- Entrene un modelo Prophet o ARIMA con datos históricos de demanda en Azure ML
- Implementar como un servicio web de Azure ML
- Llame desde flujos de datos de Power BI mediante la integración de AI Insights
- Valores de pronóstico superficiales como una columna en la dimensión del artículo
Arquitectura del panel de inventario
Página 1: Resumen ejecutivo del inventario
- Valor total de las existencias (tarjeta KPI con cambio mensual)
- Rotación de inventario (medidor versus punto de referencia de la industria)
- Días de Inventario Pendientes (KPI con tendencia)
- Recuento de artículos agotados (tarjeta de alerta, roja si >0)
- Valor SLOB (KPI con % del total)
- Valor de las acciones por categoría (mapa de árbol)
- Alertas de reorden (tabla: artículo, QoH, punto de reorden, días de suministro)
Página 2: Análisis ABC
- Gráfico de Pareto (artículos clasificados por ingresos, porcentaje acumulado)
- Distribución ABC (gráfico de anillos: recuento y valor por clase)
- Matriz ABC-XYZ (gráfico de dispersión: ingresos en X, CV en Y, tamaño de burbuja = valor de las acciones)
- Tabla de artículos principales A (artículo, ingresos, facturación, valor de stock, margen)
Página 3: Seguimiento de stock
- Mapa de calor a nivel de existencias (ubicación × categoría)
- Debajo de los artículos del punto de pedido (tabla con color de riesgo de desabastecimiento)
- Cronograma de orden de compra entrante (Gantt o gráfico de barras)
- Análisis de antigüedad del stock (gráfico de barras: 0-30, 30-60, 60-90, 90+ días)
Página 4: Demanda y previsión
- Demanda real frente a previsión (gráfico de líneas con previsión sombreada)
- Variabilidad de la demanda por categoría (diagrama de caja o barra con barras de error)
- Patrones de demanda estacionales (mapa de calor: meses × día de la semana)
- Los 20 productos más rápidos (gráfico de barras por unidades vendidas semanales)
Preguntas frecuentes
¿Cuál es la mejor manera de conectar Power BI a un ERP para datos de inventario?
El método de conexión depende de su ERP. Para Odoo, conéctese directamente a PostgreSQL en una réplica de lectura. Para SAP, utilice el conector SAP HANA con vistas CDS de inventario. Para NetSuite, utilice SuiteAnalytics Connect ODBC. Para Dynamics 365 Business Central, utilice el conector Business Central. Para todas las conexiones de ERP, utilice una cuenta de usuario de análisis dedicada con acceso de solo lectura a las tablas de inventario y programe actualizaciones en horas de menor actividad para minimizar la carga de ERP.
¿Cómo manejo el inventario de varios almacenes en Power BI?
Agregue una dimensión de Ubicación a su modelo de datos con atributos como nombre del almacén, ciudad, país y tipo (centro de distribución, tienda minorista, etc.). Todas las filas de instantáneas del inventario incluyen un ID de ubicación. Cree medidas que se agreguen en todas las ubicaciones o filtren por ubicación seleccionada mediante segmentación de datos. Para el análisis de transferencias entre almacenes, la tabla Inventory_Movements con MovementType = "Transfer" rastrea el movimiento de existencias entre ubicaciones.
¿Qué es un buen índice de rotación de inventario?
Depende en gran medida de la industria. Electrónica: 8-15x (alta velocidad, márgenes bajos). Comestibles/FMCG: 15-30x. Piezas de automóvil: 3-6x. Venta minorista de moda: 4-8x (estacional). Fabricación industrial: 3-8x. Compare su índice de rotación con el punto de referencia de su industria en lugar de con un objetivo genérico. Una relación "ideal" equilibra el nivel de servicio (evitar desabastecimientos) con el costo de mantenimiento (evitar excesos).
¿Puede Power BI predecir cuándo me quedaré sin existencias?
Sí, la medida "Días de suministro" calcula cuántos días cubre el stock actual a la tasa de ventas diaria promedio. Cuando esto cae por debajo del tiempo de entrega + reserva de existencias de seguridad, Power BI puede marcar el artículo como en riesgo y mostrarlo en una tabla de alertas de reorden. Para un abastecimiento predictivo, integre el pronóstico de la demanda de Azure ML para proyectar las ventas futuras y calcular cuándo el riesgo de desabastecimiento se vuelve crítico en función de la demanda pronosticada en lugar de la histórica.
¿Cómo debo visualizar el envejecimiento del inventario en Power BI?
Utilice un gráfico de barras apiladas que muestre el porcentaje del valor de las acciones en cada grupo de edad (0-30 días, 31-60, 61-90, 91-180, más de 180 días). El envejecimiento se calcula a partir de la fecha de recepción del lote más antiguo. Realice un seguimiento de esta tendencia a lo largo del tiempo para ver si su perfil de antigüedad está mejorando (moviéndose hacia existencias más frescas) o deteriorándose (acumulando inventario más antiguo). Resalte las acciones de más de 90 días en rojo como indicador de riesgo SLOB.
Próximos pasos
El análisis de inventario eficaz en Power BI reduce los costos de mantenimiento, evita el desabastecimiento y mejora el flujo de caja: las tres métricas más importantes para el liderazgo de operaciones y cadena de suministro. Obtener el modelo de datos correcto (niveles de stock basados en instantáneas, análisis de flujo basado en movimientos) es la base sobre la que se construye todo lo demás.
El equipo de Power BI de ECOSIRE crea paneles de control de inventario y cadena de suministro conectados a sus sistemas ERP: Odoo, SAP, NetSuite, Dynamics 365 y otros. Implementamos análisis ABC, sistemas de alerta de reordenamiento y visualización de pronósticos de demanda como paneles de control listos para producción.
Explore nuestros servicios de desarrollo de paneles de Power BI para la implementación de análisis de la cadena de suministro, o póngase en contacto con nuestro equipo para analizar sus fuentes de datos de inventario y requisitos de análisis.
Escrito por
ECOSIRE Research and Development Team
Construyendo productos digitales de nivel empresarial en ECOSIRE. Compartiendo perspectivas sobre integraciones Odoo, automatización de eCommerce y soluciones empresariales impulsadas por IA.
Artículos relacionados
Building Financial Dashboards with Power BI
Step-by-step guide to building financial dashboards in Power BI covering data connections to accounting systems, DAX measures for KPIs, P&L visualisations, and best practices.
Blockchain for Supply Chain Transparency: Beyond the Hype
A grounded analysis of blockchain in supply chains—what actually works, real-world deployments, traceability use cases, and how to evaluate blockchain for your business.
Case Study: Power BI Analytics for Multi-Location Retail
How a 14-location retail chain unified their reporting in Power BI connected to Odoo, replacing 40 spreadsheets with one dashboard and cutting reporting time by 78%.
Más de Supply Chain & Procurement
Blockchain for Supply Chain Transparency: Beyond the Hype
A grounded analysis of blockchain in supply chains—what actually works, real-world deployments, traceability use cases, and how to evaluate blockchain for your business.
ERP for Agriculture: Farm Management and Supply Chain
Complete guide to ERP for agriculture — farm management, crop tracking, supply chain integration, compliance reporting, and precision agriculture for 2026.
ERP for Government: Procurement, Finance, and Citizen Services
How ERP systems modernize government operations by automating procurement, fund accounting, grants management, and citizen service delivery with full auditability.
ERP for Logistics: 3PL and 4PL Operations Management
Complete guide to ERP for logistics providers — 3PL and 4PL operations management, WMS integration, customer billing, and supply chain visibility for 2026.
Warehouse Automation with ERP: Efficiency and ROI Analysis
Quantify warehouse automation ROI with ERP integration — labor savings, throughput improvement, inventory accuracy, and technology investment frameworks for 2026.
Odoo Inventory and Warehouse Management Deep Dive
Complete guide to Odoo 19 Inventory: multi-warehouse setup, lot tracking, reordering rules, putaway strategies, and warehouse operations.