Fait partie de notre série Supply Chain & Procurement
Lire le guide completAnalyse des stocks avec Power BI : stock, chiffre d'affaires et demande
Les stocks excédentaires coûtent chaque année 25 à 30 % de leur valeur en frais de possession. Les ruptures de stock coûtent aux détaillants environ 1 000 milliards de dollars de ventes perdues chaque année. Entre ces deux extrêmes se trouve la bande étroite de l’inventaire optimal – et Power BI est l’outil qui maintient les équipes opérationnelles précisément sur cette ligne.
Le défi de l’analyse des stocks dans Power BI est que le stock est une mesure instantanée (combien avons-nous actuellement ?) plutôt qu’une mesure de flux (combien vendu ce mois-ci ?). Cette distinction détermine chaque décision de conception dans le modèle de données et chaque modèle de calcul DAX. Ce guide couvre la plateforme complète d'analyse des stocks : modèle de données, classification ABC, analyse du chiffre d'affaires, calculs des points de commande et visualisations de prévision de la demande.
Points clés à retenir
- L'inventaire est une mesure ponctuelle (instantané) nécessitant des modèles DAX différents de ceux des mesures de ventes
- L'analyse ABC classe les éléments par contribution aux revenus : A (80 % supérieurs), B (15 % suivants %), C (5 % inférieurs)
- Rotation des stocks = COGS / Inventaire moyen — varie considérablement selon le secteur
- Point de commande = (Utilisation quotidienne moyenne × Délai) + Stock de sécurité
- La fonction DAX RANKX alimente automatiquement la classification ABC à mesure que les données changent
- La prévision de la demande dans Power BI utilise la régression linéaire via l'intégration DAX ou Azure ML
- L'identification des stocks lents et obsolètes (SLOB) permet d'économiser des coûts de possession importants
- Power BI se connecte aux tables d'inventaire ERP (Odoo, SAP, NetSuite) sans mouvement de données
Modèle de données pour l'analyse des stocks
Tableaux d'inventaire de base
Inventory_Snapshot (une ligne par article par jour/semaine — niveaux de stock à un moment donné) :
| Colonne | Descriptif |
|---|---|
SnapshotDate | Date de l'inventaire |
ItemID | FK vers la dimension Article/Produit |
LocationID | FK vers entrepôt/emplacement |
QuantityOnHand | Quantité du stock physique |
QuantityOnOrder | Quantité sur bons de commande ouverts |
QuantityReserved | Quantité engagée pour les commandes ouvertes |
QuantityAvailable | QoH - Réservé |
UnitCost | Coût moyen ou standard |
StockValue | Quantité en main × Coût unitaire |
Inventory_Movements (une ligne par transaction boursière) :
| Colonne | Descriptif |
|---|---|
MovementID | Identifiant de transaction |
ItemID | FK à l'article |
LocationID | FK à l'emplacement |
MovementDate | Date du mouvement |
MovementType | Réception, vente, transfert, ajustement, retour |
Quantity | Quantité déplacée (positive = entrée, négative = sortie) |
UnitCost | Coût par unité au moment du mouvement |
Sales_Lines (une ligne par ligne de commande client pour l'analyse de la demande) :
OrderID,ItemID,OrderDate,ShipDate,Quantity,UnitPrice,Revenue,CustomerID
Purchase_Orders (pour l'analyse des délais de livraison et des achats) :
POID,ItemID,OrderDate,ExpectedDate,ReceiptDate,Quantity,UnitCost
Dim_Item (dimension du produit) :
ItemID,SKU,Name,Category,SubCategory,Supplier,LeadTimeDays,ReorderPoint,SafetyStock,UnitCost,ListPrice,IsActive
KPI d'inventaire de base avec DAX
Mesures du niveau de stock
// 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]
Rotation des stocks
// 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])
)
Analyse ABC
L'analyse ABC classe les articles en stock en fonction de leur contribution aux revenus ou aux coûts :
- Articles A : 80 % des revenus/COGS supérieurs – haute priorité, contrôle strict
- Éléments B : 15 % suivants – contrôle modéré
- Articles C : 5 % inférieurs – surveillance minimale
// 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
)
Matrice ABC-XYZ
Étendez ABC avec la classification XYZ pour la variabilité de la demande :
- X : Faible variabilité de la demande (CV < 0,5) — prévisible, plan pour l'efficacité
- Y : Variabilité moyenne (CV 0,5-1,0) — une certaine incertitude
- Z : Forte variabilité (CV > 1,0) — imprévisible, planifiez le niveau de service
// 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"
)
Le segment AX (revenus élevés, demande prévisible) bénéficie de la gestion des réapprovisionnements la plus stricte. Le segment CZ (faibles revenus, imprévisible) est candidat à l'élimination ou à la fabrication sur commande.
Calculs du point de commande et du stock de sécurité
Formule de point de commande
Point de commande = (utilisation quotidienne moyenne × délai de livraison) + stock de sécurité
// 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
)
Calcul du stock de sécurité
// 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)
Inventaire lent et obsolète (SLOB)
L'identification des stocks SLOB est essentielle pour l'optimisation du fonds de roulement :
// 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)
Visualisation de la prévision de la demande
Power BI peut visualiser les prévisions de demande en utilisant :
Prévisions intégrées (volet Analyses)
Cliquez avec le bouton droit sur un graphique linéaire → volet Analyses → Prévisions :
- Durée de la prévision : 12 mois
- Intervalle de confiance : 95%
- Saisonnalité : détection automatique
Celui-ci utilise l'algorithme de lissage exponentiel (ETS), adapté aux modèles de demande simples et stationnaires.
Prévisions linéaires DAX personnalisées
// 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
Prévision de la demande Azure ML
Pour des prévisions de demande sophistiquées, intégrez Azure Machine Learning :
- Former un modèle Prophet ou ARIMA sur les données de demande historiques dans Azure ML
- Déployer en tant que service Web Azure ML
- Appel à partir de flux de données Power BI à l'aide de l'intégration AI Insights
- Afficher les valeurs de prévision sous forme de colonne dans la dimension de l'article
Architecture du tableau de bord d'inventaire
Page 1 : Sommaire de l'inventaire exécutif
- Valeur totale du stock (carte KPI avec changement MoM)
- Rotation des stocks (jauge vs référence du secteur)
- Jours d'inventaire en suspens (KPI avec tendance)
- Nombre d'articles en rupture de stock (carte d'alerte, rouge si >0)
- Valeur SLOB (KPI avec % du total)
- Valeur du stock par catégorie (treemap)
- Alertes de réapprovisionnement (tableau : article, QoH, point de réapprovisionnement, jours d'approvisionnement)
Page 2 : Analyse ABC
- Graphique de Pareto (éléments classés par chiffre d'affaires, pourcentage cumulé
- Distribution ABC (graphique en anneau : nombre et valeur par classe)
- Matrice ABC-XYZ (nuage de points : chiffre d'affaires sur X, CV sur Y, taille de bulle = valeur du stock)
- Tableau des articles Top A (article, chiffre d'affaires, chiffre d'affaires, valeur du stock, marge)
Page 3 : Suivi des stocks
- Carte thermique du niveau de stock (emplacement × catégorie)
- Sous les articles au point de réapprovisionnement (tableau avec couleur du risque de rupture de stock)
- Chronologie du bon de commande entrant (Gantt ou diagramme à barres)
- Analyse de l'âge des stocks (graphique à barres : 0-30, 30-60, 60-90, 90+ jours)
Page 4 : Demande et prévisions
- Demande réelle par rapport aux prévisions (graphique linéaire avec prévisions ombrées)
- Variabilité de la demande par catégorie (box plot ou barre avec barres d'erreur)
- Modèles de demande saisonnière (carte thermique : mois × jour de la semaine)
- Top 20 des plus rapides (graphique à barres par unités hebdomadaires vendues)
Questions fréquemment posées
Quelle est la meilleure façon de connecter Power BI à un ERP pour les données d'inventaire ?
La méthode de connexion dépend de votre ERP. Pour Odoo, connectez-vous directement à PostgreSQL sur un réplica en lecture. Pour SAP, utilisez le connecteur SAP HANA avec les vues CDS d'inventaire. Pour NetSuite, utilisez SuiteAnalytics Connect ODBC. Pour Dynamics 365 Business Central, utilisez le connecteur Business Central. Pour toutes les connexions ERP, utilisez un compte utilisateur d'analyse dédié avec un accès en lecture seule aux tables d'inventaire et planifiez les actualisations pendant les heures creuses pour minimiser la charge de l'ERP.
Comment gérer l'inventaire multi-entrepôts dans Power BI ?
Ajoutez une dimension Emplacement à votre modèle de données avec des attributs tels que le nom de l'entrepôt, la ville, le pays et le type (centre de distribution, magasin de détail, etc.). Toutes les lignes d'instantanés d'inventaire incluent un LocationID. Créez des mesures qui se regroupent sur tous les emplacements ou filtrent par emplacement sélectionné via un slicer. Pour l'analyse des transferts inter-entrepôts, la table Inventory_Movements avec MovementType = "Transfer" suit le stock se déplaçant entre les emplacements.
Qu'est-ce qu'un bon taux de rotation des stocks ?
Cela dépend fortement de l’industrie. Electronique : 8-15x (haute vitesse, faibles marges). Épicerie/produits de grande consommation : 15-30x. Pièces automobiles : 3-6x. Vente au détail de mode : 4-8x (saisonnier). Fabrication industrielle : 3-8x. Comparez votre taux de rotation à celui de votre secteur d'activité plutôt qu'à un objectif générique. Un ratio « idéal » équilibre le niveau de service (éviter les ruptures de stock) et les coûts de possession (éviter les excès).
Power BI peut-il prédire quand je serai en rupture de stock ?
Oui, la mesure « Jours d'approvisionnement » calcule le nombre de jours couverts par le stock actuel au taux de vente quotidien moyen. Lorsque celui-ci tombe en dessous de votre délai de livraison + tampon de stock de sécurité, Power BI peut signaler l'article comme à risque et l'afficher dans un tableau d'alerte de réapprovisionnement. Pour un stockage prédictif, intégrez la prévision de la demande Azure ML pour projeter les ventes futures et calculer le moment où le risque de rupture de stock devient critique en fonction de la demande prévue plutôt que de la demande historique.
Comment visualiser l'ancienneté des stocks dans Power BI ?
Utilisez un graphique à barres empilées montrant le pourcentage de la valeur du stock dans chaque tranche d'âge (0-30 jours, 31-60, 61-90, 91-180, 180+ jours). Le vieillissement est calculé à partir de la date de réception du lot le plus ancien. Suivez cette tendance au fil du temps pour voir si votre profil de vieillissement s'améliore (évoluant vers des stocks plus frais) ou se détériore (accumulation de stocks plus anciens). Mettez en surbrillance les actions de plus de 90 jours en rouge comme indicateur de risque SLOB.
Prochaines étapes
Une analyse efficace des stocks dans Power BI réduit les coûts de possession, évite les ruptures de stock et améliore les flux de trésorerie : les trois indicateurs les plus importants pour la direction de la chaîne d'approvisionnement et des opérations. Obtenir le bon modèle de données (niveaux de stock basés sur un instantané, analyse des flux basée sur les mouvements) est la base sur laquelle tout le reste s'appuie.
L'équipe Power BI d'ECOSIRE crée des tableaux de bord de chaîne d'approvisionnement et d'inventaire connectés à vos systèmes ERP — Odoo, SAP, NetSuite, Dynamics 365 et autres. Nous mettons en œuvre l'analyse ABC, les systèmes d'alerte de réorganisation et la visualisation des prévisions de la demande sous forme de tableaux de bord prêts pour la production.
Découvrez nos services de développement de tableaux de bord Power BI pour la mise en œuvre de l'analyse de la chaîne d'approvisionnement, ou contactez notre équipe pour discuter de vos sources de données d'inventaire et de vos besoins en matière d'analyse.
Rédigé par
ECOSIRE Research and Development Team
Création de produits numériques de niveau entreprise chez ECOSIRE. Partage d'analyses sur les intégrations Odoo, l'automatisation e-commerce et les solutions d'entreprise propulsées par l'IA.
Articles connexes
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%.
Plus 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.