Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära RFM-Style Revenue Insights | Revenue Breakdowns
Business Analytics and Decision Making with Python

bookRFM-Style Revenue Insights

Understanding how to segment your customers based on their purchasing behavior is crucial for maximizing revenue and tailoring effective marketing strategies. One of the most widely used frameworks for this purpose is RFM analysis. RFM stands for Recency, Frequency, and Monetary value:

  • Recency: how recently a customer made a purchase;
  • Frequency: how often a customer makes purchases;
  • Monetary: how much money a customer spends.

RFM analysis allows you to rank and group customers based on their transaction history. This segmentation is highly relevant because it helps you identify your most valuable customers, those at risk of churn, and those who might respond best to targeted offers. By focusing on these three dimensions, you can prioritize retention efforts, personalize outreach, and allocate resources more effectively.

1234567891011121314151617181920212223242526272829303132
import pandas as pd from datetime import datetime # Sample transaction data data = { "customer_id": [101, 102, 101, 103, 102, 104, 101, 103, 105, 104, 102, 105], "transaction_date": [ "2024-05-01", "2024-05-03", "2024-05-10", "2024-05-12", "2024-05-15", "2024-05-16", "2024-06-01", "2024-06-03", "2024-06-05", "2024-06-10", "2024-06-12", "2024-06-15" ], "amount": [120, 200, 80, 150, 100, 300, 60, 130, 220, 180, 90, 160] } df = pd.DataFrame(data) df["transaction_date"] = pd.to_datetime(df["transaction_date"]) # Set analysis date analysis_date = datetime(2024, 6, 16) # Compute RFM metrics for each customer rfm = df.groupby("customer_id").agg({ "transaction_date": lambda x: (analysis_date - x.max()).days, "customer_id": "count", "amount": "sum" }).rename(columns={ "transaction_date": "recency", "customer_id": "frequency", "amount": "monetary" }).reset_index() print(rfm)
copy
12345678910111213141516
# Rank-based qcut never fails because ranks are always unique rfm["r_score"] = pd.qcut(rfm["recency"].rank(method="first"), 3, labels=[3, 2, 1]) rfm["f_score"] = pd.qcut(rfm["frequency"].rank(method="first"), 3, labels=[1, 2, 3]) rfm["m_score"] = pd.qcut(rfm["monetary"].rank(method="first"), 3, labels=[1, 2, 3]) # Combine the scores rfm["rfm_segment"] = ( rfm["r_score"].astype(str) + rfm["f_score"].astype(str) + rfm["m_score"].astype(str) ) print(rfm[[ "customer_id", "recency", "frequency", "monetary", "r_score", "f_score", "m_score", "rfm_segment" ]])
copy

By segmenting customers into RFM groups, you gain actionable insight into their value and engagement level. Customers with high RFM scores are your best customers: they buy often, spend more, and purchased recently. You can reward these customers with loyalty offers or exclusive deals. Customers with low recency but high frequency and monetary scores may be at risk of churning—these are prime candidates for win-back campaigns. Those with low frequency or monetary value but recent activity might be nurtured to increase their engagement.

RFM segmentation informs your marketing and retention strategies by allowing you to:

  • Target high-value customers with personalized rewards;
  • Identify and re-engage at-risk customers before they churn;
  • Allocate marketing resources to segments with the highest potential for growth;
  • Develop tailored messaging and offers based on customer behavior.

This approach ensures that your retention and growth efforts are data-driven and focused where they will have the greatest impact.

question mark

Which of the following statements about RFM analysis are correct? Each correct option ends with a dot.

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Suggested prompts:

Can you explain how the RFM scores are calculated in the code?

What do the different RFM segment codes (like 333 or 232) mean?

How can I use these RFM segments to create targeted marketing campaigns?

bookRFM-Style Revenue Insights

Svep för att visa menyn

Understanding how to segment your customers based on their purchasing behavior is crucial for maximizing revenue and tailoring effective marketing strategies. One of the most widely used frameworks for this purpose is RFM analysis. RFM stands for Recency, Frequency, and Monetary value:

  • Recency: how recently a customer made a purchase;
  • Frequency: how often a customer makes purchases;
  • Monetary: how much money a customer spends.

RFM analysis allows you to rank and group customers based on their transaction history. This segmentation is highly relevant because it helps you identify your most valuable customers, those at risk of churn, and those who might respond best to targeted offers. By focusing on these three dimensions, you can prioritize retention efforts, personalize outreach, and allocate resources more effectively.

1234567891011121314151617181920212223242526272829303132
import pandas as pd from datetime import datetime # Sample transaction data data = { "customer_id": [101, 102, 101, 103, 102, 104, 101, 103, 105, 104, 102, 105], "transaction_date": [ "2024-05-01", "2024-05-03", "2024-05-10", "2024-05-12", "2024-05-15", "2024-05-16", "2024-06-01", "2024-06-03", "2024-06-05", "2024-06-10", "2024-06-12", "2024-06-15" ], "amount": [120, 200, 80, 150, 100, 300, 60, 130, 220, 180, 90, 160] } df = pd.DataFrame(data) df["transaction_date"] = pd.to_datetime(df["transaction_date"]) # Set analysis date analysis_date = datetime(2024, 6, 16) # Compute RFM metrics for each customer rfm = df.groupby("customer_id").agg({ "transaction_date": lambda x: (analysis_date - x.max()).days, "customer_id": "count", "amount": "sum" }).rename(columns={ "transaction_date": "recency", "customer_id": "frequency", "amount": "monetary" }).reset_index() print(rfm)
copy
12345678910111213141516
# Rank-based qcut never fails because ranks are always unique rfm["r_score"] = pd.qcut(rfm["recency"].rank(method="first"), 3, labels=[3, 2, 1]) rfm["f_score"] = pd.qcut(rfm["frequency"].rank(method="first"), 3, labels=[1, 2, 3]) rfm["m_score"] = pd.qcut(rfm["monetary"].rank(method="first"), 3, labels=[1, 2, 3]) # Combine the scores rfm["rfm_segment"] = ( rfm["r_score"].astype(str) + rfm["f_score"].astype(str) + rfm["m_score"].astype(str) ) print(rfm[[ "customer_id", "recency", "frequency", "monetary", "r_score", "f_score", "m_score", "rfm_segment" ]])
copy

By segmenting customers into RFM groups, you gain actionable insight into their value and engagement level. Customers with high RFM scores are your best customers: they buy often, spend more, and purchased recently. You can reward these customers with loyalty offers or exclusive deals. Customers with low recency but high frequency and monetary scores may be at risk of churning—these are prime candidates for win-back campaigns. Those with low frequency or monetary value but recent activity might be nurtured to increase their engagement.

RFM segmentation informs your marketing and retention strategies by allowing you to:

  • Target high-value customers with personalized rewards;
  • Identify and re-engage at-risk customers before they churn;
  • Allocate marketing resources to segments with the highest potential for growth;
  • Develop tailored messaging and offers based on customer behavior.

This approach ensures that your retention and growth efforts are data-driven and focused where they will have the greatest impact.

question mark

Which of the following statements about RFM analysis are correct? Each correct option ends with a dot.

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 3
some-alt