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 Mart 202610 dk okuma2.1k Kelime|

Supply Chain & Procurement serimizin bir parçası

Tam kılavuzu okuyun

Power BI ile Envanter Analizi: Stok, Ciro ve Talep

Fazla stok, taşıma maliyetlerinde yıllık olarak değerinin %25-30'una mal olur. Stokların tükenmesi perakendecilere her yıl yaklaşık 1 trilyon dolarlık satış kaybına neden oluyor. Bu iki uç arasında dar bir aralıkta optimum envanter yer alır ve Power BI, operasyon ekiplerini tam olarak bu çizgide tutan araçtır.

Power BI'da envanter analitiğinin zorluğu, stokun bir akış ölçüsünden (bu ay ne kadar satıldı?) ziyade bir anlık görüntü ölçüsü (şu anda ne kadarımız var?) olmasıdır. Bu ayrım, veri modelindeki her tasarım kararını ve her DAX hesaplama modelini yönlendirir. Bu kılavuz, envanter analitiği platformunun tamamını kapsar: veri modeli, ABC sınıflandırması, ciro analizi, yeniden sipariş noktası hesaplamaları ve talep tahmini görselleştirmeleri.

Önemli Çıkarımlar

  • Envanter, satış ölçümlerinden farklı DAX kalıpları gerektiren bir anlık nokta (anlık görüntü) ölçüsüdür
  • ABC analizi, öğeleri gelir katkısına göre sınıflandırır: A (en üstteki %80), B (sonraki %15), C (en alttaki %5)
  • Envanter cirosu = SMM / Ortalama Envanter — sektöre göre önemli ölçüde değişiklik gösterir
  • Yeniden Sipariş Noktası = (Ortalama Günlük Kullanım × Teslim Süresi) + Emniyet Stoku
  • DAX RANKX işlevi, veri değiştikçe ABC sınıflandırmasını otomatik olarak güçlendirir
  • Power BI'daki talep tahmini, DAX veya Azure ML entegrasyonu aracılığıyla doğrusal regresyon kullanır
  • Yavaş hareket eden ve eski (SLOB) envanter tanımlama, taşıma maliyetinden önemli ölçüde tasarruf sağlar
  • Power BI, veri hareketi olmadan ERP envanter tablolarına (Odoo, SAP, NetSuite) bağlanır

Envanter Analitiği için Veri Modeli

Temel Envanter Tabloları

Envanter_Anlık Görüntüsü (öğe başına gün/hafta başına bir satır — belirli bir zamandaki stok seviyeleri):

SütunAçıklama
KOD0Stok sayımı tarihi
KOD0FK - Ürün/Ürün boyutu
KOD0FK'dan Depoya/Konuma
KOD0Fiziksel stok miktarı
KOD0Açık PO'lardaki miktar
KOD0Açık siparişlere taahhüt edilen miktar
KOD0QoH - Ayrılmış
KOD0Ortalama veya standart maliyet
KOD0Eldeki Miktar × BirimMaliyet

Envanter_Hareketleri (hisse senedi işlemi başına bir satır):

SütunAçıklama
KOD0İşlem Kimliği
KOD0FK'den Öğeye
KOD0FK'dan Konum'a
KOD0Hareket tarihi
KOD0Makbuz, Satış, Transfer, Ayarlama, İade
KOD0Taşınan miktar (pozitif = giren, negatif = çıkan)
KOD0Hareket anında birim başına maliyet

Sales_Lines (talep analizi için satış siparişi satırı başına bir satır):

  • KOD0, KOD1, KOD2, KOD3, KOD4, KOD5, KOD6, KOD7

Purchase_Orders (tedarik süresi ve satın alma analizi için):

  • KOD0, KOD1, KOD2, KOD3, KOD4, KOD5, KOD6

Dim_Item (ürün boyutu):

  • ItemID, SKU, Name, Category, SubCategory, Supplier, LeadTimeDays, ReorderPoint, SafetyStock, UnitCost, ListPrice, IsActive

DAX ile Temel Envanter KPI'ları

Stok Seviyesi Ölçümleri

// 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]

Envanter Devri

// 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])
)

ABC Analizi

ABC analizi, envanter kalemlerini gelirlerine veya maliyet katkılarına göre sınıflandırır:

  • A öğeleri: Gelirin/SMM'nin ilk %80'i — yüksek öncelik, sıkı kontrol
  • B maddeleri: Sonraki %15 — orta düzeyde kontrol
  • C öğeleri: Alt %5 — minimum gözetim
// 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
)

ABC-XYZ Matrisi

Talep değişkenliği için ABC'yi XYZ sınıflandırmasıyla genişletin:

  • X: Düşük talep değişkenliği (CV < 0,5) — öngörülebilir, verimlilik planı
  • Y: Orta değişkenlik (CV 0,5-1,0) — biraz belirsizlik
  • Z: Yüksek değişkenlik (CV > 1,0) — öngörülemez, hizmet seviyesi için plan
// 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"
)

AX segmenti (yüksek gelir, öngörülebilir talep) en sıkı yeniden sipariş yönetimine tabidir. CZ segmenti (düşük gelirli, öngörülemeyen) ortadan kaldırılmaya veya sipariş üzerine üretilmeye adaydır.


Yeniden Sipariş Noktası ve Emniyet Stok Hesaplamaları

Yeniden Sıralama Noktası Formülü

Yeniden Sipariş Noktası = (Ortalama Günlük Kullanım × Teslim Süresi) + Güvenlik Stoku

// 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
)

Emniyet Stoku Hesaplaması

// 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)

Yavaş Hareket Eden ve Eski (SLOB) Envanter

SLOB envanterinin belirlenmesi işletme sermayesi optimizasyonu için kritik öneme sahiptir:

// 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)

Talep Tahmini Görselleştirmesi

Power BI aşağıdakileri kullanarak talep tahminlerini görselleştirebilir:

Yerleşik Tahmin (Analiz Bölmesi)

Bir çizgi grafiğine sağ tıklayın → Analiz bölmesi → Tahmin:

  • Tahmin süresi: 12 ay
  • Güven aralığı: %95
  • Mevsimsellik: Otomatik algılama

Bu, basit, sabit talep kalıpları için uygun olan Üstel Düzeltme (ETS) algoritmasını kullanır.

Özel DAX Doğrusal Tahmini

// 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

Azure ML Talep Tahmini

Gelişmiş talep tahmini için Azure Machine Learning'i entegre edin:

  1. Azure ML'deki geçmiş talep verileri üzerinde bir Prophet veya ARIMA modeli eğitin
  2. Azure ML web hizmeti olarak dağıtın
  3. AI Insights entegrasyonunu kullanarak Power BI veri akışlarından çağrı yapın
  4. Öğe boyutunda bir sütun olarak yüzey tahmin değerleri

Envanter Kontrol Paneli Mimarisi

Sayfa 1: Yönetici Envanter Özeti

  • Toplam Stok Değeri (Aylık değişimli KPI kartı)
  • Envanter Devri (gösterge ve sektör karşılaştırması)
  • Bekleyen Gün Envanteri (trendli KPI)
  • Stokta Olmayan Ürün Sayısı (uyarı kartı, >0 ise kırmızı)
  • SLOB Değeri (Toplamın %'si ile KPI)
  • Kategoriye Göre Stok Değeri (ağaç haritası)
  • Yeniden Sipariş Uyarıları (tablo: ürün, QoH, yeniden sipariş noktası, tedarik günleri)

Sayfa 2: ABC Analizi

  • Pareto grafiği (gelire göre sıralanmış öğeler, kümülatif yüzde)
  • ABC dağıtımı (halka grafiği: sınıfa göre sayım ve değer)
  • ABC-XYZ matrisi (dağılım grafiği: X'te gelir, Y'de CV, kabarcık boyutu = hisse senedi değeri)
  • En iyi A kalemleri tablosu (kalem, gelir, ciro, stok değeri, marj)

Sayfa 3: Stok Takibi

  • Stok düzeyinde ısı haritası (konum × kategori)
  • Yeniden sipariş noktası öğelerinin altında (stok riski renginin bulunduğu tablo)
  • Gelen PO zaman çizelgesi (Gantt veya çubuk grafik)
  • Stok yaş analizi (çubuk grafik: 0-30, 30-60, 60-90, 90+ gün)

Sayfa 4: Talep ve Tahmin

  • Gerçek talep ve tahmin (tahmini gölgeli çizgi grafik)
  • Kategoriye göre talep değişkenliği (kutu grafiği veya hata çubuklu çubuk)
  • Mevsimsel talep modelleri (ısı haritası: ay × haftanın günü)
  • İlk 20 hızlı hareket eden (haftalık satılan adetlere göre çubuk grafik)

Sıkça Sorulan Sorular

Envanter verileri için Power BI'ı bir ERP'ye bağlamanın en iyi yolu nedir?

Bağlantı yöntemi ERP'nize bağlıdır. Odoo için okuma kopyası üzerinden doğrudan PostgreSQL'e bağlanın. SAP için envanter CDS görünümleriyle SAP HANA bağlayıcısını kullanın. NetSuite için SuiteAnalytics Connect ODBC'yi kullanın. Dynamics 365 Business Central için Business Central bağlayıcısını kullanın. Tüm ERP bağlantıları için, envanter tablolarına salt okunur erişime sahip özel bir analitik kullanıcı hesabı kullanın ve ERP yükünü en aza indirmek için yenilemeleri yoğun olmayan saatlerde planlayın.

Power BI'da çoklu depo envanterini nasıl yönetirim?

Depo adı, şehir, ülke ve tür (dağıtım merkezi, perakende mağaza vb.) gibi özellikleri içeren veri modelinize bir Konum boyutu ekleyin. Tüm envanter anlık görüntüsü satırları bir LocationID içerir. Tüm konumlarda toplanan ölçümler oluşturun veya dilimleyici aracılığıyla seçilen konuma göre filtreleyin. Depolar arası transfer analizi için, MovementType = "Transfer" özelliğine sahip Inventory_Movements tablosu, konumlar arasında hareket eden stokları izler.

İyi bir stok devir hızı oranı nedir?

Büyük ölçüde endüstriye bağlıdır. Elektronik: 8-15x (yüksek hız, düşük marjlar). Bakkal/FMCG: 15-30x. Otomotiv parçaları: 3-6x. Moda perakende satış: 4-8x (sezonluk). Endüstriyel üretim: 3-8x. Ciro oranınızı genel bir hedef yerine sektör ölçütünüzle karşılaştırın. "İdeal" bir oran, hizmet seviyesini (stokların önlenmesi) taşıma maliyetine (fazlalığın önlenmesi) karşı dengeler.

Power BI stoklarımın ne zaman tükeneceğini tahmin edebilir mi?

Evet — "Tedarik Günleri" ölçümü, ortalama günlük satış oranında mevcut stokun kaç günü kapsadığını hesaplar. Bu, teslim süresi + emniyet stoğu tamponunuzun altına düştüğünde Power BI, öğeyi riskli olarak işaretleyebilir ve yeniden sipariş uyarı tablosunda gösterebilir. Tahmine dayalı stoklama için, gelecekteki satışları tahmin etmek amacıyla Azure ML talep tahminini entegre edin ve stok tükenmesi riskinin, geçmiş talep yerine tahmin edilen talebe göre ne zaman kritik hale geldiğini hesaplayın.

Power BI'da envanter yaşlanmasını nasıl görselleştirmeliyim?

Her yaş grubundaki (0-30 gün, 31-60, 61-90, 91-180, 180+ gün) hisse senedi değerinin yüzdesini gösteren yığılmış bir çubuk grafik kullanın. Yaşlandırma, en eski partinin teslim alındığı tarihten itibaren hesaplanır. Yaşlanma profilinizin iyileşip iyileşmediğini (daha yeni stoklara doğru ilerleme) veya kötüleşme (eski envanter biriktirme) durumunu görmek için bu eğilimi zaman içinde takip edin. SLOB risk göstergesi olarak 90+ günlük hisse senetlerini kırmızıyla vurgulayın.


Sonraki Adımlar

Power BI'daki etkili envanter analitiği, tedarik zinciri ve operasyon liderliği açısından en önemli üç ölçüm olan taşıma maliyetlerini azaltır, stok tükenmesini önler ve nakit akışını iyileştirir. Veri modelini doğru şekilde kullanmak (anlık görüntüye dayalı stok seviyeleri, harekete dayalı akış analizi), diğer her şeyin üzerine inşa edildiği temeldir.

ECOSIRE'ın Power BI ekibi, ERP sistemlerinize (Odoo, SAP, NetSuite, Dynamics 365 ve diğerleri) bağlı tedarik zinciri ve envanter kontrol panelleri oluşturur. ABC analizini, yeniden sipariş uyarı sistemlerini ve talep tahmini görselleştirmesini üretime hazır gösterge tabloları olarak uyguluyoruz.

Tedarik zinciri analizi uygulaması için Power BI kontrol paneli geliştirme hizmetlerimizi keşfedin veya envanter veri kaynaklarınızı ve analiz gereksinimlerinizi görüşmek için ekibimizle iletişime geçin.

E

Yazan

ECOSIRE Research and Development Team

ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.

WhatsApp'ta Sohbet Et