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
۳۴.۴. 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؟
| ALL | ALLSELECTED |
|---|---|
| رقابت در مجموعه گستردهتر | رقابت در Selection کاربر |
| فیلتر ستون را حذف میکند | انتخاب بیرونی را بهتر حفظ میکند |
| Global ranking | Selection-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% تجمعی |
| B | 80% تا 95% |
| C | 95% تا 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 |
|---|---|
| Sales | Total Sales |
| Profit | Profit |
| Quantity | Total 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 Class | A/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 Ranking | Sales + Profit |
| Customer Ranking | Sales + Profit |
| Dynamic Top N | 5/10/20/50 |
| Pareto | Cumulative value/% |
| ABC | A/B/C |
| Concentration | Top customer share |
| Bottom N | Weak performers |
| QA | Context + 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 و ساخت گروهبندیهای پویا.