You are on page 1of 8

RFM ANALYSIS

OVERVIEW
RFM is a method for analyzing customer value. By looking at 3 variables, we can segment
customers by how loyal they are.
Recency: How recently did the customer purchase?
Frequency: How often do they purchase?
Monetary: How much do they spend?

A. Data Requirements
Transaction Data
o Date(s)
o Amount
o Quantity

Customer data
o Card Number can be replaced with any number that uniquely identifies a
customer
o Gender
o Birthday / Age
o Card Issuance Date/Account Age
o Membership Status

Product data
o Category
o Subcategory
o Style
o Color
o Creation date

Store data
o Store Code
o Name
o Store Type
o Geographical Area
o Province/City

B. Methodology
For each category (recency, frequency and monetary) customers will be scored from
1 to 5 (5 as the score for the best behavior). Score is based on how a customer stand
compared to other loyalty customers.

Recency Score
1. Derive recency value. This is the number of months (days, weeks) since the
customers last purchase.
2. Sort the recency value into ascending order.
3. Compute the percentile rank of each customer based on recency value.
4. Assign recency score per customer as follows:

RFM: Recency
Percentile Cut- of Percentile Range
Score
20% 0% - 20% 5
40% 21% - 40% 4
60% 41%- 60% 3
80% 61% -80% 2
100% 81% -100% 1

Frequency Score
1. Derive frequency value. This is just the number of transactions a customer made
within a defined period, say 1 year.
2. Sort the frequency value into ascending order.
3. Compute the percentile rank of each customer based on frequency value.
4. Assign frequency score per customer as follows:

Percentile Cut- Percentile Range RFM: Frequency


of Score
20% 0% - 20% 1
40% 21% - 40% 2
60% 41%- 60% 3
80% 61% -80% 4
100% 81% -100% 5

Monetary Score
1. Derive monetary value. This is the average amount spent of each customer per
visit/transaction.
2. Sort the monetary value into ascending order.
3. Compute the percentile rank of each customer based on monetary value.
4. Assign monetary score per customer as follows:

Percentile Cut- Percentile Range RFM: Monetary


of Score
20% 0% - 20% 1
40% 21% - 40% 2
60% 41%- 60% 3
80% 61% -80% 4
100% 81% -100% 5

2
RFM Score
To derive the RFM score per customer, we need his/her Recency, Frequency and
Monetary Score.

R = Recency Score X 100

F = Frequency Score X 10
RFM = R + F + M
M = Monetary Score X 1

C. Insights
The RFM analysis is an initial analysis in knowing more about the customers. Other
that just answering
How much does a customer spent per visit?
How many items does a customer buy per transaction?
What products are commonly bought?
What style, color?
RFM allows for deeper analysis about the customers. It can answer questions like
Who are my customer?
Who are the most loyal customers? Who are not?
How do my customers behave?
Are there any customer segments that exist? If yes,
o How each of the customer segment behave?
o What products does each of the segment usually buy?
o How much do they normally spend per visit?
o How many times does each segment visit the store?
o When was their last visit?
o Which segment will bring significant increase in revenue when offered
a discount? Or when targeted with a specific campaign?

D. Metric Descriptions

Recency number of years/months/days/weeks since the last purchase

DATEDIFF("month", [Most Recent Date], DATE("10/1/2016"))

Average Recency
IF FIRST()==0 THEN WINDOW_AVG([Recency]) END

Recency -version 2

3
RANK_PERCENTILE(MIN(DATEDIFF('day',[Period Date],Today())),'asc')

RFM: Recency

//For Penshoppe
IF [Recency] <= 2 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 5
ELSEIF [Recency] <= 3 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 4
ELSEIF [Recency] <= 5 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 3
ELSEIF [Recency] <= 7 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 2
ELSEIF [Recency] >7 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 1
//For Forme
ELSEIF [Recency] <= 2 AND ATTR([Brand(CLC)]) = "FORME" THEN 5
ELSEIF [Recency] <= 4 AND ATTR([Brand(CLC)]) = "FORME" THEN 4
ELSEIF [Recency] <= 6 AND ATTR([Brand(CLC)]) = "FORME" THEN 3
ELSEIF [Recency] <= 7 AND ATTR([Brand(CLC)]) = "FORME" THEN 2
ELSEIF [Recency] >7 AND ATTR([Brand(CLC)]) = "FORME" THEN 1
//For Memo
ELSEIF [Recency] <= 2 AND ATTR([Brand(CLC)]) = "MEMO" THEN 5
ELSEIF [Recency] <= 4 AND ATTR([Brand(CLC)]) = "MEMO" THEN 4
ELSEIF [Recency] <= 5 AND ATTR([Brand(CLC)]) = "MEMO" THEN 3
ELSEIF [Recency] <= 7 AND ATTR([Brand(CLC)]) = "MEMO" THEN 2
ELSEIF [Recency] >7 AND ATTR([Brand(CLC)]) = "MEMO" THEN 1
//For Oxygen
ELSEIF [Recency] <= 2 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 5
ELSEIF [Recency] <= 4 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 4
ELSEIF [Recency] <= 6 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 3
ELSEIF [Recency] <= 8 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 2
ELSEIF [Recency] >8 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 1
//For Regatta
ELSEIF [Recency] <= 2 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 5
ELSEIF [Recency] <= 4 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 4
ELSEIF [Recency] <= 6 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 3
ELSEIF [Recency] <= 8 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 2
ELSEIF [Recency] >8 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 1
//For Tyler
ELSEIF [Recency] <= 1 AND ATTR([Brand(CLC)]) = "TYLER" THEN 5
ELSEIF [Recency] <= 2 AND ATTR([Brand(CLC)]) = "TYLER" THEN 3
ELSEIF [Recency] <= 3 AND ATTR([Brand(CLC)]) = "TYLER" THEN 2
ELSEIF [Recency] >3 AND ATTR([Brand(CLC)]) = "TYLER" THEN 1

4
END

Frequency - number of transactions made during the last X month (this will
depend on the defined period under analysis
Average Frequency
IF FIRST()==0 THEN WINDOW_AVG(COUNTD([Transaction Code])) END

Frequency - version 2

RANK_PERCENTILE([Transaction Count],'asc')

RFM: Frequency

//For Penshoppe
IF [Transaction Count] < 1 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 1
ELSEIF [Transaction Count] = 1 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 2
ELSEIF [Transaction Count] = 2 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 3
ELSEIF [Transaction Count] = 3 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 4
ELSEIF [Transaction Count] >= 4 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 5
//For Forme
ELSEIF [Transaction Count] < 1 AND ATTR([Brand(CLC)]) = "FORME" THEN 2
ELSEIF [Transaction Count] = 1 AND ATTR([Brand(CLC)]) = "FORME" THEN 3
ELSEIF [Transaction Count] = 2 AND ATTR([Brand(CLC)]) = "FORME" THEN 4
ELSEIF [Transaction Count] >= 3 AND ATTR([Brand(CLC)]) = "FORME" THEN 5
//For Memo
ELSEIF [Transaction Count] < 1 AND ATTR([Brand(CLC)]) = "MEMO" THEN 2
ELSEIF [Transaction Count] = 1 AND ATTR([Brand(CLC)]) = "MEMO" THEN 3
ELSEIF [Transaction Count] = 2 AND ATTR([Brand(CLC)]) = "MEMO" THEN 4
ELSEIF [Transaction Count] >= 3 AND ATTR([Brand(CLC)]) = "MEMO" THEN 5
//For Oxygen
ELSEIF [Transaction Count] < 1 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 2
ELSEIF [Transaction Count] = 1 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 3
ELSEIF [Transaction Count] = 2 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 4
ELSEIF [Transaction Count] >= 3 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 5
//For Regatta
ELSEIF [Transaction Count] < 1 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 2
ELSEIF [Transaction Count] = 1 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 3
ELSEIF [Transaction Count] = 2 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 4
ELSEIF [Transaction Count] >= 3 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 5
//For Tyler

5
ELSEIF [Transaction Count] < 1 AND ATTR([Brand(CLC)]) = "TYLER" THEN 3
ELSEIF [Transaction Count] = 1 AND ATTR([Brand(CLC)]) = "TYLER" THEN 4
ELSEIF [Transaction Count] >= 2 AND ATTR([Brand(CLC)]) = "TYLER" THEN 5
END

Average Check
SUM([Sales])/[Transaction Count]

Average Check per Segment


IF FIRST()== 0 THEN WINDOW_AVG((SUM([Sales])/[Transaction Count])) END

Monetary version 2
RANK_PERCENTILE([Average Check])

RFM : Monetary
//For Penshoppe

6
IF [Average Check] <= 398.93 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 1
ELSEIF [Average Check] <= 591.93 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 2
ELSEIF [Average Check] <= 799.57 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 3
ELSEIF [Average Check] <= 1197.8 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 4
ELSEIF [Average Check] > 1197.8 AND ATTR([Brand(CLC)]) = "PENSHOPPE" THEN 5
//For Forme
ELSEIF [Average Check] <= 1073.4 AND ATTR([Brand(CLC)]) = "FORME" THEN 1
ELSEIF [Average Check] <= 1645.5 AND ATTR([Brand(CLC)]) = "FORME" THEN 2
ELSEIF [Average Check] <= 2193.8 AND ATTR([Brand(CLC)]) = "FORME" THEN 3
ELSEIF [Average Check] <= 2741.2 AND ATTR([Brand(CLC)]) = "FORME" THEN 4
ELSEIF [Average Check] > 2741.2 AND ATTR([Brand(CLC)]) = "FORME" THEN 5
//For Memo
ELSEIF [Average Check] <= 769.15 AND ATTR([Brand(CLC)]) = "MEMO" THEN 1
ELSEIF [Average Check] <= 1049 AND ATTR([Brand(CLC)]) = "MEMO" THEN 2
ELSEIF [Average Check] <= 1483.2 AND ATTR([Brand(CLC)]) = "MEMO" THEN 3
ELSEIF [Average Check] <= 2278.2 AND ATTR([Brand(CLC)]) = "MEMO" THEN 4
ELSEIF [Average Check] > 2278.2 AND ATTR([Brand(CLC)]) = "MEMO" THEN 5
//For Oxygen
ELSEIF [Average Check] <= 698.05 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 1
ELSEIF [Average Check] <= 1397.67 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 2
ELSEIF [Average Check] <= 3045 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 3
ELSEIF [Average Check] <= 3498 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 4
ELSEIF [Average Check] > 3498 AND ATTR([Brand(CLC)]) = "OXYGEN" THEN 5
//For Regatta
ELSEIF [Average Check] <= 820.38 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 1
ELSEIF [Average Check] <= 1195.5 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 2
ELSEIF [Average Check] <= 1825 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 3
ELSEIF [Average Check] <= 2787.5 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 4
ELSEIF [Average Check] > 2787.5 AND ATTR([Brand(CLC)]) = "REGATTA" THEN 5
//For Tyler
ELSEIF [Average Check] <= 540 AND ATTR([Brand(CLC)]) = "TYLER" THEN 2
ELSEIF [Average Check] <= 694.38 AND ATTR([Brand(CLC)]) = "TYLER" THEN 4
ELSEIF [Average Check] > 694.38 AND ATTR([Brand(CLC)]) = "TYLER" THEN 5
END
RFM Total Score
([RFM: Recency] * 100) + ([RFM: Frequency] * 10) + ([RFM: Monetary])

Customer Segments

7
IF [RFM Total Score] = 555 THEN "Best Customers"
ELSEIF [RFM Total Score] = 355 OR [RFM Total Score] = 255 THEN "Almost lost"
ELSEIF [RFM Total Score] = 155 THEN "Lost customers"
ELSEIF MID(STR([RFM Total Score]),2,1) = "5" THEN "Avid Customers"
ELSEIF ENDSWITH(STR([RFM Total Score]),"5") THEN "Big Spenders"
ELSEIF ([RFM Total Score] = 111 OR [RFM Total Score] = 121) AND
ATTR([Brand(CLC)]) = "PENSHOPPE" THEN "Lost but not valuable customers"
ELSEIF ([RFM Total Score] = 111 OR [RFM Total Score] = 121 OR [RFM Total
Score] = 131) AND ATTR([Brand(CLC)]) != "PENSHOPPE" THEN "Lost but not
valuable customers"
ELSE "Others"
END

You might also like