فصل 34 از 50 درس 1 از 1

Session 34 — Ranking، Top N، Pareto 80/20 و ABC Analysis در Power BI

Ranking، Top N، Pareto 80/20 و ABC Analysis در Power BI

بخشی از آموزش جامع Power BI

محتوای درس Ranking، Top N، Pareto 80/20 و ABC Analysis در Power BI

شروع جلسه؛ همه مشتری‌ها و محصولات ارزش یکسانی ندارند

در گزارش مدیریتی معمولاً سؤال این نیست که فقط «چقدر فروختیم؟». سؤال بعدی این است: کدام محصول بیشترین فروش را داشته؟ ۱۰ مشتری اول چه کسانی‌اند؟ چند درصد درآمد از تعداد کمی مشتری می‌آید؟ کدام اقلام گروه A هستند؟

در این Session یاد می‌گیریم Ranking را Context-aware بسازیم؛ یعنی رتبه با فیلتر سال، شعبه، منطقه و انتخاب کاربر درست تغییر کند.

۳۴.۱. Measure پایه

Total Sales = SUM(FactSales[SalesAmount])

مثل همیشه تحلیل حرفه‌ای را از Measure پایه شروع می‌کنیم.

۳۴.۲. RANKX چیست؟

RANKX روی یک مجموعه حرکت می‌کند، Expression را برای اعضای آن ارزیابی می‌کند و رتبه می‌سازد.

Product Rank =
RANKX(
    ALL(DimProduct[ProductName]),
    [Total Sales],
    ,
    DESC,
    DENSE
)

۳۴.۳. مدل ذهنی Ranking

شکل ۳۴-۱ — Ranking ابتدا مجموعه رقبا را مشخص می‌کند و سپس Measure را برای آن‌ها مقایسه می‌کند
شکل ۳۴-۱ — Ranking ابتدا مجموعه رقبا را مشخص می‌کند و سپس Measure را برای آن‌ها مقایسه می‌کند

۳۴.۴. DESC و ASC

برای فروش معمولاً رتبه ۱ را به بیشترین مقدار می‌دهیم، پس DESC استفاده می‌کنیم. برای KPIهایی که کمتر بهتر است، ممکن است ASC معنی‌دار باشد.

۳۴.۵. DENSE

در حالت DENSE اگر دو محصول رتبه یکسان بگیرند، رتبه بعدی بدون پرش ادامه پیدا می‌کند.

۳۴.۶. SKIP

در حالت SKIP رتبه‌های مساوی می‌توانند باعث پرش رتبه بعدی شوند. انتخاب باید با تعریف گزارش هماهنگ باشد.

۳۴.۷. ALL و Ranking

اگر ALL روی ProductName استفاده شود، Filter همان ستون برای ساخت مجموعه رقبا برداشته می‌شود.

۳۴.۸. Ranking با ALLSELECTED

Product Rank Selected =
RANKX(
    ALLSELECTED(DimProduct[ProductName]),
    [Total Sales],
    , DESC, DENSE
)

این الگو برای رتبه‌بندی در بین محصولاتی که کاربر انتخاب کرده مفید است.

۳۴.۹. ALL یا ALLSELECTED؟

ALLALLSELECTED
رقابت در مجموعه گسترده‌تررقابت در Selection کاربر
فیلتر ستون را حذف می‌کندانتخاب بیرونی را بهتر حفظ می‌کند
Global rankingSelection-aware ranking

۳۴.۱۰. رتبه مشتری

Customer Rank =
RANKX(
    ALLSELECTED(DimCustomer[CustomerName]),
    [Total Sales],
    , DESC, DENSE
)

۳۴.۱۱. Rank باید با KPI هم‌معنی باشد

رتبه بر اساس Sales با رتبه بر اساس Profit فرق دارد. اسم Measure باید مشخص کند معیار رتبه‌بندی چیست.

۳۴.۱۲. Profit Rank

Customer Profit Rank =
RANKX(
    ALLSELECTED(DimCustomer[CustomerName]),
    [Profit],
    , DESC, DENSE
)

۳۴.۱۳. Top N ساده با Visual Filter

در Power BI می‌توان روی Visual از Top N Filter استفاده کرد و مثلاً ۱۰ Product اول را بر اساس Total Sales نمایش داد.

۳۴.۱۴. Top N با DAX

Top 10 Product Sales =
VAR TopProducts =
    TOPN(
        10,
        ALLSELECTED(DimProduct[ProductName]),
        [Total Sales], DESC
    )
RETURN
    CALCULATE([Total Sales], TopProducts)

۳۴.۱۵. TOPN Table برمی‌گرداند

TOPN خودش یک عدد نهایی نیست؛ یک Table Expression از اعضای برتر برمی‌گرداند که می‌توان آن را داخل CALCULATE استفاده کرد.

۳۴.۱۶. Dynamic Top N

می‌توان یک Disconnected Table برای انتخاب N ساخت تا کاربر بین Top 5، Top 10 و Top 20 انتخاب کند.

۳۴.۱۷. جدول انتخاب N

TopNSelector =
DATATABLE(
    "N", INTEGER,
    {{5},{10},{20},{50}}
)

۳۴.۱۸. دریافت N انتخاب‌شده

Selected N = SELECTEDVALUE(TopNSelector[N], 10)

۳۴.۱۹. Dynamic Rank Filter

Show Top N =
IF(
    [Product Rank Selected] <= [Selected N],
    1,
    0
)

این Measure را می‌توان به عنوان Visual-level filter استفاده کرد.

۳۴.۲۰. Others Category

گاهی مدیر می‌خواهد Top 10 را جدا ببیند و همه بقیه در یک گروه Others جمع شوند. این سناریو از Top N ساده پیچیده‌تر است و معمولاً به طراحی Disconnected Table یا Virtual Table نیاز دارد.

۳۴.۲۱. Pareto چیست؟

تحلیل Pareto می‌پرسد چه تعداد از اقلام، بخش بزرگی از نتیجه را ایجاد می‌کنند. عبارت 80/20 یک قانون قطعی ریاضی برای همه کسب‌وکارها نیست؛ یک الگوی تحلیلی برای تمرکز روی عوامل مهم است.

۳۴.۲۲. مراحل Pareto

شکل ۳۴-۲ — اقلام را مرتب می‌کنیم، فروش تجمعی می‌سازیم و سهم تجمعی را محاسبه می‌کنیم
شکل ۳۴-۲ — اقلام را مرتب می‌کنیم، فروش تجمعی می‌سازیم و سهم تجمعی را محاسبه می‌کنیم

۳۴.۲۳. Product Rank برای Pareto

Product Rank =
RANKX(
    ALLSELECTED(DimProduct[ProductKey]),
    [Total Sales],
    , DESC, DENSE
)

۳۴.۲۴. فروش تجمعی بر اساس رتبه

Cumulative Product Sales =
VAR CurrentRank = [Product Rank]
RETURN
SUMX(
    TOPN(
        CurrentRank,
        ALLSELECTED(DimProduct[ProductKey]),
        [Total Sales], DESC
    ),
    [Total Sales]
)

۳۴.۲۵. فروش کل Selection

Selected Product Sales =
CALCULATE(
    [Total Sales],
    ALLSELECTED(DimProduct[ProductKey])
)

۳۴.۲۶. درصد تجمعی

Cumulative Sales % =
DIVIDE(
    [Cumulative Product Sales],
    [Selected Product Sales]
)

۳۴.۲۷. خواندن Pareto

محصول‌ها را بر اساس Sales نزولی مرتب کن. Cumulative Sales % از مقدار کوچک‌تر شروع می‌شود و به 100% می‌رسد. نقطه‌ای که مثلاً به 80% می‌رسیم تعداد اقلام اثرگذار را نشان می‌دهد.

۳۴.۲۸. Pareto Chart

یک Combo Chart می‌تواند ستون فروش هر Product و Line درصد تجمعی را نمایش دهد. محور درصد تجمعی باید به شکل Percentage خوانا باشد.

۳۴.۲۹. 80% را Hard-code کنیم؟

برای آموزش می‌توان Threshold=0.8 گذاشت، اما در پروژه واقعی بهتر است مشخص شود 80% واقعاً Rule سازمان است یا فقط یک معیار تحلیلی.

۳۴.۳۰. ABC Analysis

ABC Analysis اقلام را بر اساس سهم تجمعی ارزش به گروه‌هایی مثل A، B و C تقسیم می‌کند. مثلاً A تا 80%، B تا 95% و C بقیه.

۳۴.۳۱. ABC Measure

ABC Class =
VAR CumPct = [Cumulative Sales %]
RETURN
SWITCH(
    TRUE(),
    CumPct <= 0.80, "A",
    CumPct <= 0.95, "B",
    "C"
)

۳۴.۳۲. Thresholdهای ABC

کلاسنمونه تعریف
Aتا 80% تجمعی
B80% تا 95%
C95% تا 100%

۳۴.۳۳. ABC باید Business-driven باشد

در بعضی شرکت‌ها A=70% و B=20% بعدی است. Threshold را از فرآیند تصمیم‌گیری سازمان بگیر، نه اینکه عدد اینترنتی را بدون سؤال وارد مدل کنی.

۳۴.۳۴. ABC فروش با ABC سود فرق دارد

محصولی ممکن است فروش بالا ولی Margin پایین داشته باشد. ABC بر اساس Revenue و ABC بر اساس Profit دو تحلیل متفاوت‌اند.

۳۴.۳۵. ABC موجودی

در مدیریت موجودی، ABC می‌تواند بر اساس Annual Consumption Value یا معیار مورد توافق کسب‌وکار ساخته شود. Measure باید دقیقاً همان تعریف را منعکس کند.

۳۴.۳۶. Customer Concentration

Pareto روی مشتری‌ها کمک می‌کند بفهمیم چه درصدی از درآمد به چند مشتری وابسته است؛ این موضوع برای Risk Management هم مهم است.

۳۴.۳۷. Top 5 Customer Share

Top 5 Customer Sales =
CALCULATE(
    [Total Sales],
    TOPN(
        5,
        ALLSELECTED(DimCustomer[CustomerKey]),
        [Total Sales], DESC
    )
)

Top 5 Customer Share % =
DIVIDE([Top 5 Customer Sales], [Total Sales])

۳۴.۳۸. Context مخرج Top 5

قبل از استفاده نهایی بررسی کن Total Sales در مخرج دقیقاً Context موردنظر را دارد. اگر Visual روی Customer Row باشد، ممکن است نیاز باشد Filter مشتری را برای مخرج مناسب مدیریت کنی.

۳۴.۳۹. Top Customer Share در کل Selection

Selected Customer Sales =
CALCULATE(
    [Total Sales],
    ALLSELECTED(DimCustomer)
)

۳۴.۴۰. Concentration Risk

اگر 70% فروش از سه مشتری باشد، رقم فروش شاید عالی باشد ولی وابستگی تجاری بالاست. BI باید فقط عدد نشان ندهد؛ باید ساختار ریسک را قابل مشاهده کند.

۳۴.۴۱. Bottom N

Product Rank Asc =
RANKX(
    ALLSELECTED(DimProduct[ProductName]),
    [Total Sales],
    , ASC, DENSE
)

Bottom N برای شناسایی محصولات کم‌فروش، شعب ضعیف یا KPIهای نامطلوب کاربرد دارد.

۳۴.۴۲. صفر فروش و Blank

قبل از Bottom N مشخص کن محصولات بدون تراکنش باید در Ranking باشند یا نه. Blank و Zero از نظر کسب‌وکار ممکن است معنی متفاوتی داشته باشند.

۳۴.۴۳. حذف Blank از Ranking

Product Rank NonBlank =
IF(
    NOT ISBLANK([Total Sales]),
    RANKX(
        FILTER(
            ALLSELECTED(DimProduct[ProductName]),
            NOT ISBLANK([Total Sales])
        ),
        [Total Sales],
        , DESC, DENSE
    )
)

۳۴.۴۴. Ranking داخل Category

گاهی Product باید فقط بین محصولات Category خودش Rank شود، نه کل شرکت.

۳۴.۴۵. Category Rank

Product Rank in Category =
RANKX(
    CALCULATETABLE(
        VALUES(DimProduct[ProductName]),
        ALLEXCEPT(DimProduct, DimProduct[Category])
    ),
    [Total Sales],
    , DESC, DENSE
)

۳۴.۴۶. Ranking داخل Region

همین منطق را می‌توان برای Branch Rank within Region ساخت. Scope رقابت باید بخشی از تعریف KPI باشد.

۳۴.۴۷. Dynamic Ranking Metric

در پروژه پیشرفته کاربر ممکن است بخواهد Rank را بر اساس Sales، Profit یا Quantity تغییر دهد. Field Parameter یا Disconnected Metric Selector می‌تواند این تجربه را بسازد.

۳۴.۴۸. Metric Selector

انتخابMeasure
SalesTotal Sales
ProfitProfit
QuantityTotal Qty

۳۴.۴۹. Dynamic Metric Measure

Selected Metric =
SWITCH(
    SELECTEDVALUE(MetricSelector[Metric]),
    "Profit", [Profit],
    "Quantity", [Total Qty],
    [Total Sales]
)

۳۴.۵۰. Dynamic Rank

Dynamic Product Rank =
RANKX(
    ALLSELECTED(DimProduct[ProductName]),
    [Selected Metric],
    , DESC, DENSE
)

۳۴.۵۱. Tie در Ranking

اگر دو Product دقیقاً Sales برابر داشته باشند، Tie ایجاد می‌شود. باید مشخص باشد Business انتظار رتبه مساوی دارد یا Tie-breaker دیگری لازم است.

۳۴.۵۲. Tie-breaker

برای Ranking کاملاً یکتا می‌توان معیار ثانویه طراحی کرد، ولی این تصمیم باید قابل توضیح باشد؛ مثلاً Sales سپس ProductKey.

۳۴.۵۳. Rank و Total Row

نمایش Rank در Total معمولاً معنی ندارد. می‌توان با ISINSCOPE جلوی نمایش آن را گرفت.

۳۴.۵۴. Rank فقط در Product Level

Product Rank Display =
IF(
    ISINSCOPE(DimProduct[ProductName]),
    [Product Rank Selected],
    BLANK()
)

۳۴.۵۵. پروژه شرکت هانا؛ Product Analysis

KPIهدف
Product Rankرتبه فروش
Top Nمحصولات برتر
Cumulative Sales %Pareto
ABC ClassA/B/C
Profit Rankرتبه سود
Bottom Nمحصولات ضعیف

۳۴.۵۶. پروژه شرکت هانا؛ Customer Analysis

KPIهدف
Customer Rankرتبه مشتری
Top 5 Shareتمرکز درآمد
Cumulative %Pareto مشتری
ABC Customerطبقه‌بندی ارزش
Profit Rankارزش سودآوری

۳۴.۵۷. صفحه مدیریتی پیشنهادی

سمت بالا Cardهای Top Customer Share، تعداد مشتریان A و سهم محصولات A را بگذار. وسط Pareto Chart محصولات و مشتری‌ها. پایین Table رتبه، Sales، Profit، Margin، Cumulative % و ABC Class.

۳۴.۵۸. Drill-through

از جدول Ranking می‌توان Drill-through به صفحه جزئیات Product یا Customer ساخت تا مدیر از رتبه به علت عملکرد برسد.

۳۴.۵۹. Tooltip

Tooltip برای هر Product می‌تواند Rank، Sales، Profit، Margin، YoY Growth و ABC Class را نشان دهد.

۳۴.۶۰. Ranking و Time Context

اگر Year یا Month تغییر کند، Ranking هم باید بر اساس همان Context زمانی دوباره محاسبه شود. این رفتار یکی از مزایای Measure نسبت به رتبه ثابت ETL است.

۳۴.۶۱. Ranking ثابت چه زمانی؟

اگر طبقه‌بندی رسمی ABC فقط سالی یک بار توسط واحد برنامه‌ریزی تصویب می‌شود، شاید بهتر باشد Classification رسمی در Source ذخیره شود. هر تحلیل پویا الزاماً جای Master Data رسمی را نمی‌گیرد.

۳۴.۶۲. Performance

RANKX و Pareto روی Dimension بسیار بزرگ می‌توانند هزینه‌بر شوند. تعداد اعضای مجموعه، Measure پایه و Virtual Tableها را بررسی کن.

۳۴.۶۳. Performance؛ روی Key کار کن

در بسیاری از سناریوها Ranking روی ProductKey/CustomerKey قابل اعتمادتر از Text Name است، مخصوصاً وقتی Name یکتا نیست.

۳۴.۶۴. Performance؛ Measure پایه

اگر [Total Sales] خودش سنگین باشد، RANKX آن را برای اعضای متعدد ارزیابی می‌کند. ابتدا Measure پایه را بهینه کن.

۳۴.۶۵. خطای رایج؛ Rank روی Name تکراری

اگر دو مشتری نام یکسان داشته باشند، Ranking روی CustomerName می‌تواند آن‌ها را یک گروه ببیند. Entity Key باید درست انتخاب شود.

۳۴.۶۶. خطای رایج؛ ALL بی‌دلیل

اگر کاربر Region را انتخاب کرده ولی Ranking با حذف بیش از حد Filterها کل شرکت را Rank کند، نتیجه با انتظار کاربر نمی‌خواند.

۳۴.۶۷. خطای رایج؛ Pareto بدون Sort

Pareto معنی‌دار نیازمند ترتیب نزولی معیار است. Cumulative روی ترتیب تصادفی تحلیل 80/20 نیست.

۳۴.۶۸. خطای رایج؛ ABC به عنوان حقیقت مطلق

ABC یک Classification بر اساس Rule است. Rule، Metric و Period باید در مستندات مشخص باشند.

۳۴.۶۹. خطای رایج؛ Top Sales = Best Product

محصول پرفروش ممکن است Profit پایین، Return بالا یا ریسک تأمین داشته باشد. Ranking را با KPI مناسب تصمیم ترکیب کن.

۳۴.۷۰. Best Practiceها

Entity Set رقابت را قبل از RANKX مشخص کن.

ALL و ALLSELECTED را آگاهانه انتخاب کن.

Rank را بر اساس Key معتبر بساز.

Blank و Zero را قبل از Bottom N تعریف کن.

Pareto را بر اساس Sort نزولی بساز.

ABC Threshold را با Business تأیید کن.

Sales Rank و Profit Rank را جدا نگه دار.

Total Rank را با ISINSCOPE کنترل کن.

Performance را روی Cardinality بالا تست کن.

۳۴.۷۱. تمرین ۱

Product Rank بر اساس Total Sales بساز و آن را با Slicer Year و Region تست کن.

۳۴.۷۲. تمرین ۲

Dynamic Top N با مقادیر 5، 10 و 20 بساز و فقط Productهای منتخب را در Visual نشان بده.

۳۴.۷۳. تمرین ۳

Cumulative Product Sales و Cumulative Sales % را بساز و Pareto Chart ایجاد کن.

۳۴.۷۴. تمرین ۴

ABC Class با Thresholdهای 80% و 95% بساز. سپس Thresholdها را به 70% و 90% تغییر بده و اثر را تحلیل کن.

۳۴.۷۵. تمرین ۵

Top 5 Customer Share را بساز و مشخص کن آیا مخرج باید کل شرکت، Region یا Selection کاربر باشد.

۳۴.۷۶. تمرین چالشی

Dynamic Ranking بساز که کاربر بتواند Metric را بین Sales، Profit و Quantity تغییر دهد و Top N هم همزمان Dynamic باشد.

۳۴.۷۷. پروژه Session؛ Pareto & Ranking Pack شرکت هانا

خروجیشرح
Product RankingSales + Profit
Customer RankingSales + Profit
Dynamic Top N5/10/20/50
ParetoCumulative value/%
ABCA/B/C
ConcentrationTop customer share
Bottom NWeak performers
QAContext + ties + blanks

خروجی نهایی باید فقط بگوید چه کسی اول است؛ باید نشان دهد چند Product یا Customer واقعاً بخش اصلی ارزش کسب‌وکار را می‌سازند.

جمع‌بندی Session 34

Ranking زمانی ارزش دارد که Context رقابت روشن باشد. Pareto زمانی ارزش دارد که مدیر بفهمد تمرکز ارزش کجاست. ABC زمانی ارزش دارد که Rule آن به تصمیم عملی وصل شود.

Rank → Concentration → Classification → Action

Session 35 را وارد DAX پیشرفته برای Segmentation می‌کنیم: Customer Segmentation، RFM، Dynamic Bands، What-if Parameters و ساخت گروه‌بندی‌های پویا.