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

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

شکل ۳۵-۱ — سه معیار رفتاری مشتری به Score و سپس Segment تبدیل می‌شوند
شکل ۳۵-۱ — سه معیار رفتاری مشتری به Score و سپس Segment تبدیل می‌شوند

۳۵.۴. 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

شکل ۳۵-۲ — کاربر پارامتر را تغییر می‌دهد و Measure بدون دستکاری داده واقعی سناریو را محاسبه می‌کند
شکل ۳۵-۲ — کاربر پارامتر را تغییر می‌دهد و Measure بدون دستکاری داده واقعی سناریو را محاسبه می‌کند

۳۵.۳۹. 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

SalesProfitبرداشت
HighHighStrategic
HighLowRevenue-rich / Margin-poor
LowHighNiche profitable
LowLowLow 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

StaticDynamic
در 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 IncreaseScenario Revenue
Growth TargetRequired Sales
High Value ThresholdCustomer Count
ElasticityQuantity/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اقدام نمونه
ChampionsVIP/Upsell
LoyalCross-sell
NewOnboarding
At RiskWin-back campaign
HibernatingReactivation 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 MeasuresR/F/M
RFM Scores1-5
SegmentsActionable groups
Dynamic TiersRank-based
What-ifGrowth/Price/Threshold
2x2 MatrixSales vs Profit
DashboardCRM-oriented
QAContext + 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 و الگوهای تحلیلی پیشرفته.