Inventory Analytics with Power BI: Stock, Turnover, and Demand

Build Power BI inventory analytics dashboards covering stock levels, inventory turnover, ABC analysis, demand forecasting, and reorder point calculations with DAX formulas.

E
ECOSIRE Research and Development Team
|19 de marzo de 202611 min de lectura2.5k Palabras|

Parte de nuestra serie Supply Chain & Procurement

Leer la guía completa

Aná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):

ColumnaDescripción
CÓDIGO0Fecha del recuento de existencias
CÓDIGO0FK a dimensión de artículo/producto
CÓDIGO0FK al almacén/ubicación
CÓDIGO0Cantidad de existencias físicas
CÓDIGO0Cantidad de órdenes de compra abiertas
CÓDIGO0Cantidad comprometida para pedidos abiertos
CÓDIGO0QoH - Reservado
CÓDIGO0Costo medio o estándar
CÓDIGO0Cantidad disponible × costo unitario

Movimientos_de_inventario (una fila por transacción de acciones):

ColumnaDescripción
CÓDIGO0ID de transacción
CÓDIGO0FK al artículo
CÓDIGO0FK a la ubicación
CÓDIGO0Fecha de movimiento
CÓDIGO0Recibo, Venta, Transferencia, Ajuste, Devolución
CÓDIGO0Cantidad movida (positiva = entrada, negativa = salida)
CÓDIGO0Coste 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:

  1. Entrene un modelo Prophet o ARIMA con datos históricos de demanda en Azure ML
  2. Implementar como un servicio web de Azure ML
  3. Llame desde flujos de datos de Power BI mediante la integración de AI Insights
  4. 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.

E

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.

Chatea en whatsapp