Session 35 — Customer Segmentation، تحلیل RFM، Dynamic Bands و What-if Parameters در Power BI
Customer Segmentation، تحلیل RFM، Dynamic Bands و What-if Parameters در Power BI
بخشی از آموزش جامع Power BI
محتوای درس Customer Segmentation، تحلیل RFM، Dynamic Bands و What-if Parameters در Power BI
شروع جلسه؛ مشتریها را فقط بر اساس فروش مرتب نکن
در جلسه قبل فهمیدیم چه مشتریهایی بیشترین فروش را دارند. ولی یک مدیر فروش سؤال عمیقتری دارد: مشتری وفادار کیست؟ مشتری ارزشمند ولی در خطر ریزش کدام است؟ مشتری تازهوارد کیست؟ چه کسی زیاد خرید میکند ولی مبلغ خریدش پایین است؟
برای جواب دادن به این سؤالها وارد Segmentation و مدل معروف RFM میشویم.
۳۵.۱. Segmentation یعنی چه؟
Segmentation یعنی مشتریها یا محصولات را بر اساس رفتار و ارزش به گروههای قابل اقدام تقسیم کنیم؛ نه فقط برای رنگی کردن Dashboard، بلکه برای اینکه هر گروه Strategy متفاوتی داشته باشد.
۳۵.۲. RFM چیست؟
RFM از سه معیار Recency، Frequency و Monetary ساخته میشود.
| معیار | معنی ساده |
|---|---|
| Recency | آخرین خرید مشتری چقدر نزدیک بوده؟ |
| Frequency | چند بار خرید کرده؟ |
| Monetary | چقدر پول خرج کرده؟ |
۳۵.۳. مدل ذهنی RFM
۳۵.۴. Recency
هرچه فاصله آخرین خرید تا تاریخ مرجع کمتر باشد، مشتری از نظر Recency بهتر است.
۳۵.۵. Last Purchase Date
Last Purchase Date =
MAX(FactSales[OrderDate])
۳۵.۶. Reference Date
برای تحلیل تاریخی بهتر است همیشه TODAY را مرجع نگیریم. میتوان Last Data Date یا یک تاریخ انتخابی را مرجع قرار داد.
Reference Date =
CALCULATE(
MAX(FactSales[OrderDate]),
REMOVEFILTERS(DimCustomer)
)
۳۵.۷. Recency Days
Recency Days =
DATEDIFF(
[Last Purchase Date],
[Reference Date],
DAY
)
۳۵.۸. Frequency
Frequency تعداد دفعات خرید است. اگر Grain Fact خط سفارش باشد، COUNTROWS تعداد خرید نیست.
Purchase Frequency =
DISTINCTCOUNT(FactSales[OrderNo])
۳۵.۹. Monetary
Customer Monetary = [Total Sales]
Monetary میتواند Revenue، Profit یا Contribution Margin باشد؛ تعریف باید با هدف کسبوکار هماهنگ شود.
۳۵.۱۰. RFM روی Customer Context
Measureهای RFM را در Table یا Matrix با CustomerKey/CustomerName بررسی کن تا هر مشتری Recency، Frequency و Monetary خودش را داشته باشد.
۳۵.۱۱. Score کردن RFM
معمولاً هر معیار را به امتیازهایی مثل 1 تا 5 تبدیل میکنیم. برای Recency امتیاز بیشتر یعنی خرید تازهتر؛ برای Frequency و Monetary امتیاز بیشتر یعنی مقدار بالاتر.
۳۵.۱۲. Threshold ثابت
Recency Score =
SWITCH(
TRUE(),
[Recency Days] <= 30, 5,
[Recency Days] <= 60, 4,
[Recency Days] <= 90, 3,
[Recency Days] <= 180, 2,
1
)
۳۵.۱۳. مشکل Threshold ثابت
مرز ۳۰ روز برای فروشگاه آنلاین شاید خوب باشد ولی برای فروش تجهیزات صنعتی که مشتری سالی دو بار خرید میکند منطقی نیست. Threshold باید از Cycle کسبوکار بیاید.
۳۵.۱۴. Frequency Score نمونه
Frequency Score =
SWITCH(
TRUE(),
[Purchase Frequency] >= 20, 5,
[Purchase Frequency] >= 10, 4,
[Purchase Frequency] >= 5, 3,
[Purchase Frequency] >= 2, 2,
1
)
۳۵.۱۵. Monetary Score نمونه
Monetary Score =
SWITCH(
TRUE(),
[Customer Monetary] >= 1000000000, 5,
[Customer Monetary] >= 500000000, 4,
[Customer Monetary] >= 200000000, 3,
[Customer Monetary] >= 50000000, 2,
1
)
۳۵.۱۶. RFM Code
RFM Code =
FORMAT([Recency Score], "0") &
FORMAT([Frequency Score], "0") &
FORMAT([Monetary Score], "0")
مثلاً 555 یعنی مشتری از هر سه زاویه وضعیت بسیار قوی دارد.
۳۵.۱۷. RFM Total Score
RFM Total Score =
[Recency Score] + [Frequency Score] + [Monetary Score]
۳۵.۱۸. Segmentهای قابل فهم
| Segment | برداشت کسبوکاری |
|---|---|
| Champions | تازه، پرتکرار، ارزشمند |
| Loyal | خرید منظم و ارزش خوب |
| New Customers | تازه وارد |
| At Risk | قبلاً خوب، مدتی است خرید نکرده |
| Hibernating | مدت طولانی غیرفعال |
| Low Value | ارزش و تکرار پایین |
۳۵.۱۹. Segment Measure نمونه
Customer Segment =
VAR R = [Recency Score]
VAR F = [Frequency Score]
VAR M = [Monetary Score]
RETURN
SWITCH(
TRUE(),
R >= 4 && F >= 4 && M >= 4, "Champions",
R >= 3 && F >= 4, "Loyal",
R >= 4 && F <= 2, "New Customers",
R <= 2 && F >= 3 && M >= 3, "At Risk",
R = 1 && F <= 2, "Hibernating",
"Regular"
)
۳۵.۲۰. Segment باید Action داشته باشد
اگر Segment ساختیم ولی هیچ تصمیمی به آن وصل نیست، تحلیل نصفه است. Champions شاید Upsell بخواهند؛ At Risk کمپین بازگشت؛ New Customers برنامه Onboarding.
۳۵.۲۱. RFM پویا یا Snapshot؟
RFM پویا با Slicer تاریخ تغییر میکند. اما اگر سازمان میخواهد «Segment رسمی مشتری در پایان هر ماه» را نگه دارد، بهتر است Snapshot تاریخی هم طراحی شود.
۳۵.۲۲. مشکل تاریخ در RFM پویا
اگر کاربر فقط یک ماه را فیلتر کند، Last Purchase Date ممکن است فقط داخل همان ماه دیده شود. باید مشخص کنیم RFM نسبت به کل تاریخچه تا پایان دوره است یا فقط تراکنشهای دوره انتخابی.
۳۵.۲۳. Customer Lifetime Sales
Customer Lifetime Sales =
CALCULATE(
[Total Sales],
REMOVEFILTERS(DimDate)
)
۳۵.۲۴. Context آگاهانه
گاهی Monetary باید در بازه انتخابی باشد و گاهی Lifetime. اسم Measure و تعریف Segment باید این موضوع را روشن کند.
۳۵.۲۵. Dynamic Bands
Band یعنی تبدیل یک Measure عددی به گروههای قابل فهم؛ مثلاً Low، Medium و High Value.
۳۵.۲۶. Sales Band ساده
Customer Value Band =
SWITCH(
TRUE(),
[Total Sales] >= 1000000000, "Very High",
[Total Sales] >= 500000000, "High",
[Total Sales] >= 100000000, "Medium",
"Low"
)
۳۵.۲۷. مشکل Band ثابت
اگر فروش کل شرکت دو برابر شود، Thresholdهای قدیمی ممکن است دیگر معنی نداشته باشند. Dynamic Segmentation میتواند بر اساس توزیع واقعی داده ساخته شود.
۳۵.۲۸. Percentile Concept
به جای مرز ریالی ثابت میتوان مشتریها را نسبت به بقیه مشتریها سنجید؛ مثلاً Top 10%، Next 20% و بقیه.
۳۵.۲۹. Rank-based Band
Customer Rank % =
DIVIDE(
[Customer Rank],
COUNTROWS(ALLSELECTED(DimCustomer[CustomerKey]))
)
۳۵.۳۰. Dynamic Tier
Dynamic Customer Tier =
VAR P = [Customer Rank %]
RETURN
SWITCH(
TRUE(),
P <= 0.10, "Platinum",
P <= 0.30, "Gold",
P <= 0.60, "Silver",
"Bronze"
)
۳۵.۳۱. رتبه درصدی و Tie
وقتی Tie زیاد داریم یا Customerهای Blank وجود دارند، Bandهای Rank-based را Validate کن؛ تعداد اعضای هر Tier ممکن است دقیقاً درصد مورد انتظار نباشد.
۳۵.۳۲. What-if Parameter چیست؟
What-if Parameter به کاربر اجازه میدهد یک عدد فرضی را تغییر دهد و نتیجه سناریو را ببیند؛ بدون اینکه داده اصلی تغییر کند.
۳۵.۳۳. مثال افزایش قیمت
فرض کن مدیر میخواهد ببیند اگر قیمت متوسط ۵ تا ۲۰ درصد افزایش پیدا کند، Revenue فرضی چقدر میشود.
۳۵.۳۴. Parameter نمونه
Price Increase % = GENERATESERIES(0, 0.30, 0.01)
۳۵.۳۵. مقدار انتخابی
Selected Price Increase =
SELECTEDVALUE('Price Increase %'[Value], 0)
۳۵.۳۶. Scenario Sales
Scenario Sales =
[Total Sales] * (1 + [Selected Price Increase])
۳۵.۳۷. Scenario Impact
Scenario Impact =
[Scenario Sales] - [Total Sales]
۳۵.۳۸. مدل ذهنی What-if
۳۵.۳۹. What-if پیشبینی نیست
ضرب فروش در ۱۰٪ افزایش قیمت Forecast واقعی نیست؛ چون ممکن است Quantity کاهش پیدا کند. What-if یک Scenario Model است و فرضهایش باید شفاف باشند.
۳۵.۴۰. Price Elasticity ساده
میتوان سناریوی کمی واقعیتر ساخت که با افزایش قیمت، Quantity فرضی هم کاهش یابد؛ ولی ضریب Elasticity باید از تحلیل یا نظر کسبوکار بیاید.
۳۵.۴۱. Elasticity Parameter
Scenario Quantity Factor =
1 - ([Selected Price Increase] * [Selected Elasticity])
۳۵.۴۲. Scenario Revenue پیشرفته
Scenario Revenue =
[Total Sales] *
(1 + [Selected Price Increase]) *
[Scenario Quantity Factor]
۳۵.۴۳. What-if برای Target
مدیر میتواند Growth Target را انتخاب کند و Required Sales را ببیند.
۳۵.۴۴. Required Sales
Required Sales =
[Total Sales] * (1 + [Selected Growth Target])
۳۵.۴۵. Gap to Scenario Target
Gap to Scenario Target =
[Required Sales] - [Total Sales]
۳۵.۴۶. What-if برای Discount
پارامتر Discount میتواند اثر فرضی تخفیف روی Revenue یا Margin را نشان دهد؛ اما باید رفتار Volume و Cost را هم در مدل فرضیات مشخص کنیم.
۳۵.۴۷. Dynamic Threshold
به جای اینکه مدیر همیشه مشتری بالای یک میلیارد را High Value بداند، میتوان Threshold را با Parameter قابل تنظیم کرد.
۳۵.۴۸. Threshold Parameter
High Value Threshold =
SELECTEDVALUE(Threshold[Amount], 500000000)
۳۵.۴۹. Dynamic High Value Flag
Is High Value Customer =
IF(
[Total Sales] >= [High Value Threshold],
1,
0
)
۳۵.۵۰. شمارش High Value Customer
High Value Customers =
COUNTROWS(
FILTER(
VALUES(DimCustomer[CustomerKey]),
[Is High Value Customer] = 1
)
)
۳۵.۵۱. Segmentation بر اساس Profit
مشتری Revenue بالا الزاماً سودآور نیست. Segment دوم بر اساس Profit یا Margin میتواند تصویر متفاوتی بدهد.
۳۵.۵۲. Value vs Profit Matrix
| Sales | Profit | برداشت |
|---|---|---|
| High | High | Strategic |
| High | Low | Revenue-rich / Margin-poor |
| Low | High | Niche profitable |
| Low | Low | Low priority |
۳۵.۵۳. Customer 2x2 Segmentation
با دو Measure مثل Sales و Margin میتوان Scatter Plot ساخت و مشتریها را در چهار Quadrant قرار داد.
۳۵.۵۴. Dynamic Average Benchmark
Avg Customer Sales =
AVERAGEX(
VALUES(DimCustomer[CustomerKey]),
[Total Sales]
)
۳۵.۵۵. Above Average Flag
Customer Sales Position =
IF(
[Total Sales] >= [Avg Customer Sales],
"Above Average",
"Below Average"
)
۳۵.۵۶. Benchmark Median
Average ممکن است با چند مشتری خیلی بزرگ منحرف شود. در بعضی توزیعها Median Benchmark منطقیتر است.
۳۵.۵۷. Segment و Security
اگر RLS فعال باشد، Dynamic Segment و Rank ممکن است فقط نسبت به دادهای که همان کاربر مجاز به دیدنش است محاسبه شود. این رفتار باید در طراحی KPI لحاظ شود.
۳۵.۵۸. Segment و ALLSELECTED
اگر Tier بر اساس ALLSELECTED ساخته شود، تغییر Selection کاربر میتواند Tier مشتری را تغییر دهد. این Dynamic بودن باید عمدی باشد.
۳۵.۵۹. Static vs Dynamic Segment
| Static | Dynamic |
|---|---|
| در ETL/Source ذخیره میشود | در DAX محاسبه میشود |
| ثابت تا Refresh/Update | با Context تغییر میکند |
| برای Classification رسمی خوب | برای تحلیل سناریویی خوب |
۳۵.۶۰. چه زمانی Segment را در ETL بسازیم؟
اگر Rule رسمی، قابل Audit و مستقل از Slicer است، ETL یا Data Warehouse جای خوبی است. اگر Segment به Selection و Scenario وابسته است، Measure پویا مناسبتر است.
۳۵.۶۱. پروژه شرکت هانا؛ RFM
| Measure | کاربرد |
|---|---|
| Recency Days | فاصله آخرین خرید |
| Purchase Frequency | تعداد سفارش |
| Monetary | ارزش فروش |
| R/F/M Score | امتیاز |
| RFM Segment | گروه مشتری |
| Lifetime Sales | ارزش تاریخی |
۳۵.۶۲. پروژه شرکت هانا؛ Scenario
| Parameter | خروجی |
|---|---|
| Price Increase | Scenario Revenue |
| Growth Target | Required Sales |
| High Value Threshold | Customer Count |
| Elasticity | Quantity/Revenue impact |
۳۵.۶۳. صفحه Dashboard پیشنهادی
بالا Cardهای Champions، At Risk، High Value Customers و Scenario Revenue. وسط Scatter مشتریها بر اساس Frequency و Monetary با Size بر اساس Sales. پایین Table مشتری، RFM Scores، Segment، Rank، Profit و Last Purchase Date.
۳۵.۶۴. Campaign Action
| Segment | اقدام نمونه |
|---|---|
| Champions | VIP/Upsell |
| Loyal | Cross-sell |
| New | Onboarding |
| At Risk | Win-back campaign |
| Hibernating | Reactivation test |
۳۵.۶۵. RFM و B2B
در B2B ممکن است Frequency پایین ولی Contract Value بسیار بالا باشد. RFM را کورکورانه از Retail کپی نکن؛ Cycle خرید، قرارداد و Account Management را لحاظ کن.
۳۵.۶۶. RFM و Seasonality
اگر مشتری فقط در فصل خاصی خرید میکند، Recency خام ممکن است او را اشتباه At Risk نشان دهد. Seasonality کسبوکار باید بررسی شود.
۳۵.۶۷. RFM و Customer Age
مشتری جدید هنوز فرصت نداشته Frequency بالا بسازد. Segment New Customer را جدا تعریف کن تا با مشتری کمارزش اشتباه نشود.
۳۵.۶۸. خطای رایج؛ TODAY به عنوان مرجع
اگر Dataset دو ماه است Refresh نشده، TODAY مشتریها را مصنوعی قدیمیتر نشان میدهد. Last Data Date اغلب مرجع تحلیلی امنتری است.
۳۵.۶۹. خطای رایج؛ COUNTROWS برای Frequency
اگر هر سفارش چند Line دارد، COUNTROWS تعداد دفعات خرید را چند برابر میکند. Grain را فراموش نکن.
۳۵.۷۰. خطای رایج؛ Threshold اینترنتی
مرزهای RFM و ABC را بدون شناخت Business Cycle وارد Production نکن.
۳۵.۷۱. خطای رایج؛ Segment بدون Action
اگر تیم فروش نمیداند با At Risk چه کند، Dashboard فقط برچسب تولید کرده است.
۳۵.۷۲. خطای رایج؛ What-if به عنوان Forecast
Scenario بر اساس فرض است. Forecast باید Methodology و داده مناسب خودش را داشته باشد.
۳۵.۷۳. خطای رایج؛ Dynamic Segment برای گزارش رسمی
اگر Finance نیاز به Classification ثابت پایان ماه دارد، Segmentی که با هر Slicer تغییر میکند شاید مناسب Audit نباشد.
۳۵.۷۴. Best Practiceها
Reference Date را آگاهانه تعریف کن.
Frequency را بر اساس Grain درست بساز.
Monetary Metric را با هدف کسبوکار هماهنگ کن.
Thresholdهای RFM را Validate کن.
Segment را به Action وصل کن.
Static و Dynamic Segmentation را قاطی نکن.
What-if assumptions را روی Dashboard شفاف کن.
RFM را برای B2B و Seasonality سفارشی کن.
نتایج را با تیم Sales/CRM اعتبارسنجی کن.
۳۵.۷۵. تمرین ۱
برای هر Customer، Last Purchase Date، Recency Days، Frequency و Monetary را بساز.
۳۵.۷۶. تمرین ۲
R/F/M Score از 1 تا 5 تعریف کن و حداقل پنج Segment قابل اقدام بساز.
۳۵.۷۷. تمرین ۳
Customer Tier پویا بر اساس Rank Percent بساز: Platinum، Gold، Silver و Bronze.
۳۵.۷۸. تمرین ۴
What-if Parameter برای Growth Target بساز و Required Sales و Gap را نمایش بده.
۳۵.۷۹. تمرین ۵
High Value Threshold پویا بساز و تعداد مشتریان بالاتر از Threshold را محاسبه کن.
۳۵.۸۰. تمرین چالشی
یک Scatter Plot بساز که X=Frequency، Y=Monetary، Size=Profit و Legend=RFM Segment باشد. سپس با Slicer سال رفتار Segmentها را بررسی و توضیح بده.
۳۵.۸۱. پروژه Session؛ Customer Intelligence Pack
| خروجی | شرح |
|---|---|
| RFM Measures | R/F/M |
| RFM Scores | 1-5 |
| Segments | Actionable groups |
| Dynamic Tiers | Rank-based |
| What-if | Growth/Price/Threshold |
| 2x2 Matrix | Sales vs Profit |
| Dashboard | CRM-oriented |
| QA | Context + reference date |
خروجی این Session باید به درد CRM و تیم فروش بخورد؛ یعنی بتوانند لیست مشتریان در خطر، مشتریان VIP و مشتریان مناسب کمپین بعدی را استخراج کنند.
جمعبندی Session 35
Segmentation حرفهای یعنی از «چه کسی بیشتر خرید؟» عبور کنیم و برسیم به «هر مشتری الان در چه وضعیتی است و اقدام بعدی چیست؟». RFM یک شروع قدرتمند است، نه پایان تحلیل مشتری.
Behavior → Score → Segment → Business Action
Session 36 را وارد Advanced DAX Table Functions میکنیم: SUMMARIZE، SUMMARIZECOLUMNS، ADDCOLUMNS، SELECTCOLUMNS، GROUPBY، Virtual Tables و الگوهای تحلیلی پیشرفته.