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 مارس 202610 دقائق قراءة2.2k كلمات|

جزء من سلسلة Supply Chain & Procurement

اقرأ الدليل الكامل

تحليلات المخزون باستخدام Power BI: المخزون وحجم التداول والطلب

يكلف المخزون الزائد 25-30٪ من قيمته سنويًا في التكاليف الدفترية. يكلف نفاد المخزون تجار التجزئة ما يقدر بنحو تريليون دولار من المبيعات المفقودة كل عام. بين هذين النقيضين يكمن النطاق الضيق للمخزون الأمثل - وPower BI هي الأداة التي تبقي فرق العمليات على هذا الخط بدقة.

يتمثل التحدي في تحليلات المخزون في Power BI في أن المخزون عبارة عن مقياس لحظي (كم لدينا الآن؟) وليس مقياس تدفق (كم تم بيعه هذا الشهر؟). يحرك هذا التمييز كل قرار تصميم في نموذج البيانات وكل نمط حساب DAX. يغطي هذا الدليل النظام الأساسي الكامل لتحليلات المخزون: نموذج البيانات، وتصنيف ABC، وتحليل معدل الدوران، وحسابات نقاط إعادة الطلب، وتصورات التنبؤ بالطلب.

الوجبات الرئيسية

  • المخزون هو مقياس لحظي (لقطة) يتطلب أنماط DAX مختلفة عن مقاييس المبيعات
  • يصنف تحليل ABC العناصر حسب مساهمة الإيرادات: A (أعلى 80%)، B (التالي 15%)، C (أسفل 5%)
  • معدل دوران المخزون = تكلفة البضائع المبيعة / متوسط المخزون — يختلف بشكل كبير حسب الصناعة
  • نقطة إعادة الطلب = (متوسط الاستخدام اليومي × المهلة الزمنية) + مخزون الأمان
  • تعمل وظيفة DAX RANKX على تشغيل تصنيف ABC تلقائيًا مع تغير البيانات
  • يستخدم التنبؤ بالطلب في Power BI الانحدار الخطي عبر تكامل DAX أو Azure ML
  • يؤدي تحديد المخزون البطيء والمتقادم (SLOB) إلى توفير تكلفة تحمل كبيرة
  • يتصل Power BI بجداول مخزون ERP (Odoo وSAP وNetSuite) دون نقل البيانات

نموذج البيانات لتحليلات المخزون

جداول الجرد الأساسية

Inventory_Snapshot (صف واحد لكل عنصر في اليوم/الأسبوع - مستويات المخزون في الوقت المحدد):

العمودالوصف
SnapshotDateتاريخ جرد الأسهم
ItemIDFK إلى بُعد العنصر/المنتج
LocationIDFK إلى المستودع/الموقع
QuantityOnHandكمية المخزون المادي
QuantityOnOrderالكمية في أوامر الشراء المفتوحة
QuantityReservedالكمية الملتزمة بالأوامر المفتوحة
QuantityAvailableجودة الخدمة - محجوزة
UnitCostالتكلفة المتوسطة أو القياسية
StockValueالكمية المتاحة × تكلفة الوحدة

حركات_المخزون (صف واحد لكل معاملة مخزون):

العمودالوصف
MovementIDمعرف المعاملة
ItemIDFK إلى العنصر
LocationIDFK إلى الموقع
MovementDateتاريخ الحركة
MovementTypeاستلام، بيع، تحويل، تعديل، إرجاع
Quantityالكمية المنقولة (موجب = داخل، سالب = خارج)
UnitCostالتكلفة لكل وحدة في وقت الحركة

خطوط_المبيعات (صف واحد لكل سطر أمر مبيعات لتحليل الطلب):

  • OrderID، ItemID، OrderDate، ShipDate، Quantity، UnitPrice، Revenue، CustomerID

أوامر_الشراء (لتحليل المهلة الزمنية للمشتريات):

  • POID، ItemID، OrderDate، ExpectedDate، ReceiptDate، Quantity، UnitCost

Dim_Item (أبعاد المنتج):

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

مؤشرات الأداء الرئيسية للمخزون الأساسي مع DAX

مقاييس مستوى المخزون

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

دوران المخزون

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

يصنف تحليل ABC عناصر المخزون حسب مساهمتها في الإيرادات أو التكلفة:

  • العناصر A: أعلى 80% من الإيرادات/تكلفة البضائع المباعة — أولوية عالية، ومراقبة مشددة
  • العناصر ب: الـ 15% التالية — تحكم معتدل
  • عناصر C: أدنى 5% — الحد الأدنى من الإشراف
// 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

توسيع ABC مع تصنيف XYZ لتقلب الطلب:

  • X: تقلب الطلب المنخفض (CV < 0.5) - خطة يمكن التنبؤ بها لتحقيق الكفاءة
  • Y: تقلب متوسط (CV 0.5-1.0) — بعض عدم اليقين
  • Z: تباين عالٍ (CV > 1.0) - لا يمكن التنبؤ به، خطة لمستوى الخدمة
// 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 (إيرادات مرتفعة، طلب يمكن التنبؤ به) إدارة إعادة الطلب الأكثر إحكامًا. قطاع CZ (إيرادات منخفضة، لا يمكن التنبؤ بها) مرشح للإلغاء أو التصنيع حسب الطلب.


إعادة ترتيب نقطة وحسابات مخزون السلامة

إعادة ترتيب صيغة النقطة

نقطة إعادة الطلب = (متوسط الاستخدام اليومي × المهلة الزمنية) + مخزون الأمان

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

حساب مخزون السلامة

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

المخزون البطيء والمتقادم (SLOB).

يعد تحديد مخزون SLOB أمرًا بالغ الأهمية لتحسين رأس المال العامل:

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

تصور التنبؤ بالطلب

يمكن لـ Power BI تصور توقعات الطلب باستخدام:

التنبؤ المدمج (جزء التحليلات)

انقر بزر الماوس الأيمن على المخطط الخطي ← جزء التحليلات ← التنبؤ:

  • المدة المتوقعة: 12 شهرًا
  • فاصل الثقة: 95%
  • الموسمية: الكشف التلقائي

يستخدم هذا خوارزمية التجانس الأسي (ETS) - وهي مناسبة لأنماط الطلب البسيطة والثابتة.

توقعات DAX الخطية المخصصة

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

للتنبؤ بالطلب المتطور، قم بدمج التعلم الآلي من Azure:

  1. تدريب نموذج النبي أو ARIMA على بيانات الطلب التاريخية في Azure ML
  2. النشر كخدمة ويب Azure ML
  3. الاتصال من تدفقات بيانات Power BI باستخدام تكامل AI Insights
  4. قم بإظهار قيم التنبؤ كعمود في بُعد العنصر

هندسة لوحة معلومات المخزون

الصفحة 1: ملخص الجرد التنفيذي

  • إجمالي قيمة المخزون (بطاقة مؤشرات الأداء الرئيسية مع التغيير الشهري)
  • معدل دوران المخزون (المقياس مقابل معيار الصناعة)
  • مخزون الأيام المعلقة (مؤشر الأداء الرئيسي مع الاتجاه)
  • عدد عناصر المخزون (بطاقة التنبيه، باللون الأحمر إذا كان > 0)
  • قيمة SLOB (مؤشر الأداء الرئيسي بنسبة % من الإجمالي)
  • قيمة المخزون حسب الفئة (الخريطة الهيكلية)
  • تنبيهات إعادة الطلب (الجدول: العنصر، جودة الخدمة، نقطة إعادة الطلب، أيام التوريد)

الصفحة 2: تحليل ABC

  • مخطط باريتو (العناصر مرتبة حسب الإيرادات، النسبة التراكمية)
  • توزيع ABC (مخطط دائري: العدد والقيمة حسب الفئة)
  • مصفوفة ABC-XYZ (مخطط مبعثر: الإيرادات على X، السيرة الذاتية على Y، حجم الفقاعة = قيمة السهم)
  • أعلى جدول العناصر (العنصر، الإيرادات، معدل الدوران، قيمة المخزون، الهامش)

الصفحة 3: مراقبة المخزون

  • خريطة الحرارة لمستوى المخزون (الموقع × الفئة)
  • أسفل عناصر نقطة إعادة الطلب (الجدول مع لون خطر نفاد المخزون)
  • الجدول الزمني لأمر الشراء الوارد (جانت أو مخطط شريطي)
  • تحليل عمر المخزون (مخطط شريطي: 0-30، 30-60، 60-90، 90+ يومًا)

الصفحة 4: الطلب والتوقعات

  • الطلب الفعلي مقابل التوقعات (مخطط خطي مع توقعات مظللة)
  • تباين الطلب حسب الفئة (مخطط مربع أو شريط به أشرطة خطأ)
  • أنماط الطلب الموسمية (الخريطة الحرارية: الأشهر × يوم الأسبوع)
  • أعلى 20 محركًا سريعًا (مخطط شريطي حسب الوحدات الأسبوعية المباعة)

الأسئلة المتداولة

ما هي أفضل طريقة لتوصيل Power BI بنظام تخطيط موارد المؤسسات (ERP) لبيانات المخزون؟

تعتمد طريقة الاتصال على نظام تخطيط موارد المؤسسات الخاص بك. بالنسبة إلى Odoo، اتصل مباشرة بـ PostgreSQL على نسخة طبق الأصل للقراءة. بالنسبة لـ SAP، استخدم موصل SAP HANA مع طرق عرض CDS الخاصة بالمخزون. بالنسبة إلى NetSuite، استخدم SuiteAnalytics Connect ODBC. بالنسبة لـ Dynamics 365 Business Central، استخدم موصل Business Central. بالنسبة لجميع اتصالات ERP، استخدم حساب مستخدم تحليلي مخصص مع إمكانية الوصول للقراءة فقط إلى جداول المخزون، وقم بتحديث الجدول خارج ساعات الذروة لتقليل تحميل ERP.

كيف أتعامل مع مخزون المستودعات المتعددة في Power BI؟

أضف بُعد الموقع إلى نموذج البيانات الخاص بك باستخدام سمات مثل اسم المستودع، والمدينة، والبلد، والنوع (مركز التوزيع، متجر البيع بالتجزئة، وما إلى ذلك). تتضمن جميع صفوف لقطة المخزون معرف الموقع. أنشئ مقاييس يتم تجميعها عبر جميع المواقع أو التصفية حسب الموقع المحدد عبر أداة تقسيم البيانات. لتحليل النقل بين المستودعات، يتتبع جدول Inventory_Movements الذي يحتوي على MovementType = "Transfer" حركة المخزون بين المواقع.

ما هي نسبة دوران المخزون الجيدة؟

يعتمد بشكل كبير على الصناعة. الإلكترونيات: 8-15x (سرعة عالية، هوامش منخفضة). البقالة/السلع الاستهلاكية سريعة الحركة: 15-30x. قطع غيار السيارات: 3-6x. بيع الأزياء بالتجزئة: 4-8x (موسمي). التصنيع الصناعي: 3-8x. قارن نسبة دوران أعمالك بمعايير الصناعة الخاصة بك بدلاً من الهدف العام. تعمل النسبة "المثالية" على موازنة مستوى الخدمة (تجنب نفاد المخزون) مقابل تكلفة الحمل (تجنب الزيادة).

هل يستطيع Power BI التنبؤ بموعد نفاد المخزون؟

نعم - يحسب مقياس "أيام التوريد" عدد الأيام التي يغطيها المخزون الحالي بمتوسط ​​معدل المبيعات اليومي. عندما يقل هذا عن وقت التسليم + المخزن المؤقت للمخزون الآمن، يمكن لـ Power BI وضع علامة على العنصر على أنه معرض للخطر وإظهاره في جدول تنبيه إعادة الطلب. بالنسبة للتخزين التنبؤي، قم بدمج التنبؤ بالطلب على Azure ML لتوقع المبيعات المستقبلية وحساب متى تصبح مخاطر نفاد المخزون حرجة بناءً على الطلب المتوقع بدلاً من الطلب التاريخي.

كيف يمكنني تصور تقادم المخزون في Power BI؟

استخدم مخططًا شريطيًا مكدسًا يوضح النسبة المئوية لقيمة المخزون في كل مجموعة عمرية (0-30 يومًا، 31-60، 61-90، 91-180، أكثر من 180 يومًا). يتم حساب التقادم من تاريخ استلام الدفعة الأقدم. تتبع هذا الاتجاه بمرور الوقت لمعرفة ما إذا كان ملف تعريف الشيخوخة الخاص بك يتحسن (يتجه نحو المخزون الأحدث) أو يتدهور (تراكم المخزون الأقدم). قم بتمييز المخزون الذي يزيد عن 90 يومًا باللون الأحمر كمؤشر لمخاطر SLOB.


الخطوات التالية

تقلل تحليلات المخزون الفعالة في Power BI من تكاليف الحمل، وتمنع نفاد المخزون، وتحسن التدفق النقدي - وهي المقاييس الثلاثة الأكثر أهمية لسلسلة التوريد وقيادة العمليات. إن الحصول على نموذج البيانات بشكل صحيح (مستويات المخزون المستندة إلى اللقطة، وتحليل التدفق المستند إلى الحركة) هو الأساس الذي يبني عليه كل شيء آخر.

يقوم فريق Power BI التابع لـ ECOSIRE ببناء لوحات معلومات سلسلة التوريد والمخزون المتصلة بأنظمة تخطيط موارد المؤسسات (ERP) الخاصة بك - Odoo، وSAP، وNetSuite، وDynamics 365، وغيرها. نقوم بتنفيذ تحليل ABC، وإعادة ترتيب أنظمة التنبيه، وتصور التنبؤ بالطلب كلوحات معلومات جاهزة للإنتاج.

استكشف خدمات تطوير لوحة معلومات Power BI لتنفيذ تحليلات سلسلة التوريد، أو اتصل بفريقنا لمناقشة مصادر بيانات المخزون ومتطلبات التحليلات.

E

بقلم

ECOSIRE Research and Development Team

بناء منتجات رقمية بمستوى المؤسسات في ECOSIRE. مشاركة رؤى حول تكاملات Odoo وأتمتة التجارة الإلكترونية وحلول الأعمال المدعومة بالذكاء الاصطناعي.

الدردشة على الواتساب