RFM - Customer Level Data

Tuân Bùi

2022-09-08

Introduction

# Khai báo các từ điển sử dụng trong phân tích và xử lý dữ liệu
library(rfm)
library(data.table)
library(knitr)
library(kableExtra)
library(magrittr)
library(ggplot2)
library(highcharter)
library(DT)
library(grDevices)
library(RColorBrewer)
library(DBI)
library(RPostgres)
library(tidyverse)
options(knitr.table.format = "html")

# Kết nối dữ liệu từ SQL server Postgres
con <- dbConnect(Postgres(),
                dbname = 'data_mt',
                host = 'localhost',
                port = 5432,
                user = 'postgres',
                password = '14091986@')
dbListTables(con)
## [1] "dta_rfm"          "dta_profit_score" "dta_mt"
# Lưu dữ liệu bảng vào database
#dbWriteTable(con, "dta_rfm", dta_rfm, overwrite = TRUE)
#dbWriteTable(con, "dta_profit_score", dta_profit_score, overwrite = TRUE)

# Đọc dữ liệu từ database phục vụ phân tích
dta_rfm <- dbReadTable(con, "dta_rfm")

Từ những khách hàng tiêu dùng lớn cho đến những khách hàng rời bỏ doanh nghiệp, tất cả những khách hàng đều có nhu cầu và mong muốn đa dạng. Doanh nghiệp muốn khách hàng chi tiêu nhiều hơn từ những chiến dịch tiếp thị chương trình, sản phẩm mới tới khách hàng theo những cách khác nhau. Tuy nhiên, câu hỏi đặt ra là làm thế nào để đưa ra được các chiến dịch tiếp thị phù hợp với những nhóm khách hàng đang có nhu cầu để từ đó tăng tỷ lệ phản hồi từ khách hàng và từ đó tăng doanh số bán hàng. Bài toán đặt ra là làm thế nào để có thể phân khúc khách hàng một cách tương đối chính xác dựa trên hành vi giao dịch lịch sử của khách hàng, thuật toán RFM sẽ giúp chúng ta giải quyết vấn đề này một cách nhanh chóng và hiệu quả.

Phân tích RFM là một kĩ thuật phân khúc khách hàng dựa trên hành vi giao dịch của khách hàng trong quá khứ, RFM bao gồm 3 chỉ số chính:

Lợi ích của phân tích RFM:

Nó dựa trên tiên đề tiếp thị rằng 80% doanh thu doanh nghiệp của bạn đến từ 20% khách hàng của bạn. RFM giúp xác định những khách hàng có nhiều khả năng phản hồi các chương trình khuyến mãi hơn bằng cách phân khúc họ thành các danh mục khác nhau.

Data connected

Để tính điểm RFM cho mỗi khách hàng, chúng ta cần dữ liệu giao dịch bao gồm những thông tin sau:

rfm bao gồm một tập dữ liệu mẫu rfm_data_orders bao gồm các chi tiết ở trên:

# Chọn các biến cần thiết dùng cho phân tích
dta_rfms <- dta_rfm %>% 
  select(CUS_ID, REPORT_DATE, MAX_NGAY_GIAI_NGAN, SL_GN_HANMUC_36M, SL_GN_HANMUC_12M, SL_GN_MON_36M, SL_GN_MON_12M, 
         DSGN_LOAN_36M, DSGN_LOAN_12M, DSGN_THE_36M, DSGN_THE_12M)

# Format lại các biến thời gian
dta_rfms$REPORT_DATE <- as.Date(dta_rfms$REPORT_DATE, "%Y-%m-%d")
dta_rfms$MAX_NGAY_GIAI_NGAN <- as.Date(dta_rfms$MAX_NGAY_GIAI_NGAN, "%Y-%m-%d")

# Tạo dataframe dành cho đầu vào chấm điểm score của phân tích RFM 
dta_rfms <- dta_rfms %>%
  mutate(revenue = DSGN_LOAN_36M + DSGN_THE_36M,
         count = SL_GN_HANMUC_36M + SL_GN_MON_36M) %>%
  filter(!is.na(MAX_NGAY_GIAI_NGAN)) %>%
  group_by(CUS_ID) %>%
  summarise(most_recent_visit = max(MAX_NGAY_GIAI_NGAN),
            number_of_orders = sum(count),
            revenue = sum(revenue)) %>%
  mutate(recency_days = as.numeric(as.Date("2022-07-31") - most_recent_visit)) %>%
  filter(!is.na(number_of_orders), !is.na(revenue))

# Hiển thị 100 quan sát mẫu
dta_rfms %>% head(100)
## # A tibble: 100 × 5
##    CUS_ID most_recent_visit number_of_orders   revenue recency_days
##     <dbl> <date>                       <dbl>     <dbl>        <dbl>
##  1 111517 2019-09-04                       1  20045000         1061
##  2 111518 2019-10-25                       1  21100000         1010
##  3 111528 2022-05-18                       2 104445000           74
##  4 111539 2022-05-27                       1  37980000           65
##  5 111549 2020-03-31                       1  21100000          852
##  6 111552 2020-03-16                       1  34815000          867
##  7 111560 2020-03-30                       1  15825000          853
##  8 111566 2019-09-13                       1  25320000         1052
##  9 111567 2022-01-25                       2  31650000          187
## 10 111575 2022-02-21                       1  10550000          160
## # … with 90 more rows

RFM Score

Vậy điểm RFM được tính như thế nào cho từng khách hàng? Các bước dưới đây giải thích quy trình:

Những khách hàng có điểm RFM cao nhất có nhiều khả năng sẽ phản hồi một đề nghị. Bây giờ chúng ta đã hiểu cách tính điểm RFM, đã đến lúc áp dụng nó vào thực tế. Sử dụng rfm_table_order() để tạo điểm cho từng khách hàng từ tập dữ liệu mẫu rfm_data_orders.

rfm_table_order() có 8 đầu vào:

RFM Table

# Chấm điểm (scoring) cho từng khách hàng dựa trên 3 biến chính
analysis_date <- as.Date('2022-07-31')
rfm_result <- rfm_table_customer(dta_rfms, CUS_ID, number_of_orders,
  recency_days, revenue, analysis_date)

# Hiển thị 10 quan sát đầu tiên
rfm_result %>% head(10)
customer_id recency_days transaction_count amount recency_score frequency_score monetary_score rfm_score
111517 1061 1 20045000 1 1 3 113
111518 1010 1 21100000 1 1 3 113
111528 74 2 104445000 5 5 5 555
111539 65 1 37980000 5 1 4 514
111549 852 1 21100000 1 1 3 113
111552 867 1 34815000 1 1 4 114
111560 853 1 15825000 1 1 3 113
111566 1052 1 25320000 1 1 4 114
111567 187 2 31650000 4 5 4 454
111575 160 1 10550000 4 1 2 412

rfm_table_customer() sẽ trả về các cột sau như được thấy trong bảng trên:

Heat Map

Bản đồ nhiệt hiển thị giá trị tiền tệ trung bình cho các danh mục khác nhau của điểm số lần truy cập gần đây và tần suất. Điểm cao hơn về tần suất và số lần truy cập gần đây được đặc trưng bởi giá trị tiền tệ trung bình cao hơn như được chỉ ra bởi các vùng tối hơn trong bản đồ nhiệt.

rfm_heatmap(rfm_result)

Bar Chart

Sử dụng rfm_bar_chart() để tạo phân phối điểm số tiền tệ cho các kết hợp khác nhau của tần suất và điểm số lần truy cập gần đây.

rfm_bar_chart(rfm_result)

Histogram

Sử dụng rfm_histograms() để kiểm tra phân phối tương đối của

rfm_histograms(rfm_result)

Customers by Orders

Hình dung sự phân bổ của khách hàng trên các hợp đồng của khách hàng.

rfm_order_dist(rfm_result)

Scatter Plots

Những khách hàng tốt nhất là những người:

Bây giờ chúng ta hãy xem xét mối quan hệ giữa những điều trên.

Recency vs Monetary Value

Những khách hàng đã ghé thăm gần đây tạo ra nhiều doanh thu hơn so với những khách hàng đã ghé thăm trong quá khứ. Những khách hàng đã ghé thăm trong quá khứ gần đây có nhiều khả năng quay lại hơn so với những khách đã ghé thăm cách đây lâu vì hầu hết những khách hàng đó sẽ là khách hàng bị mất. Như vậy, doanh thu cao hơn sẽ được liên kết với các lượt truy cập gần đây nhất.

rfm_rm_plot(rfm_result)

Frequency vs Monetary Value

Khi tần suất truy cập tăng lên, doanh thu tạo ra cũng tăng lên. Những khách hàng ghé thăm thường xuyên hơn là những khách hàng Champions, những khách hàng thân thiết hoặc những khách hàng trung thành tiềm năng và họ sẽ thúc đẩy doanh thu cao hơn.

rfm_fm_plot(rfm_result)

Recency vs Frequency

Những khách hàng có tần suất truy cập thấp trong quá khứ xa trong khi những khách hàng có tần suất cao đã ghé thăm trong quá khứ gần đây. Một lần nữa, những khách hàng đã ghé thăm trong quá khứ gần đây có nhiều khả năng quay lại hơn so với những khách hàng đã ghé thăm cách đây lâu. Do đó, tần suất cao hơn sẽ được liên kết với những lần truy cập gần đây nhất.

rfm_rf_plot(rfm_result)

Segments

Hãy để chúng ta phân loại khách hàng của mình dựa trên số lần truy cập gần đây, tần suất và điểm số tiền tệ.

Segment Description R F M
Champions Bought recently, buy often and spend the most 4 - 5 4 - 5 4 - 5
Loyal Customers Spend good money. Responsive to promotions 2 - 5 3 - 5 3 - 5
Potential Loyalist Recent customers, spent good amount, bought more than once 3 - 5 1 - 3 1 - 3
New Customers Bought more recently, but not often 4 - 5 <= 1 <= 1
Promising Recent shoppers, but haven’t spent much 3 - 4 <= 1 <= 1
Need Attention Above average recency, frequency & monetary values 2 - 3 2 - 3 2 - 3
About To Sleep Below average recency, frequency & monetary values 2 - 3 <= 2 <= 2
At Risk Spent big money, purchased often but long time ago <= 2 2 - 5 2 - 5
Can’t Lose Them Made big purchases and often, but long time ago <= 1 4 - 5 4 - 5
Hibernating Low spenders, low frequency, purchased long time ago 1 - 2 1 - 2 1 - 2
Lost Lowest recency, frequency & monetary scores <= 2 <= 2 <= 2

Segmented Customer Data

Chúng ta có thể sử dụng dữ liệu được phân đoạn để xác định

Khi chúng ta đã phân loại khách hàng vào một phân khúc cụ thể, chúng ta có thể thực hiện hành động thích hợp để tăng giá trị lâu dài của họ.

# Đặt tên 11 phân khúc khách hàng
segment_names <- c("Champions", "Loyal Customers", "Potential Loyalist",
  "New Customers", "Promising", "Need Attention", "About To Sleep",
  "At Risk", "Can't Lose Them", "Lost")

# Tạo list điều kiện để chạy phân khúc khách hàng
recency_lower <- c(4, 2, 3, 4, 3, 2, 2, 1, 1, 1)
recency_upper <- c(5, 5, 5, 5, 4, 3, 3, 2, 1, 2)
frequency_lower <- c(4, 3, 1, 1, 1, 2, 1, 2, 4, 1)
frequency_upper <- c(5, 5, 3, 1, 1, 3, 2, 5, 5, 2)
monetary_lower <- c(4, 3, 1, 1, 1, 2, 1, 2, 4, 1)
monetary_upper <- c(5, 5, 3, 1, 1, 3, 2, 5, 5, 2)

# Sử dụng hàm phân khúc để gán biến segment
segments <- rfm_segment(rfm_result, segment_names, recency_lower, recency_upper, frequency_lower, frequency_upper, monetary_lower, monetary_upper)

# Sử dụng hàm datatable để hiện thị kết quả dạng bảng với 100 mẫu
segments %>% 
  head(100) %>%
  datatable(
    filter = "top",
    extensions = 'Responsive'
  ) 

Segment Size

Bây giờ chúng ta đã xác định và phân đoạn khách hàng của mình, chúng ta hãy kiểm tra sự phân bổ của khách hàng trên các phân đoạn. Tốt nhất, chúng ta nên có rất ít hoặc không có khách hàng trong các phân khúc như At Risk hoặc Needs Attention.

Nhìn vào biểu đồ phân tích kết quả phân khúc khách hàng thì nhóm Potential Loyalist chiểm số lượng và tỷ lệ cao nhất với 37%, trong khi hai phân khúc chúng ta quan tâm nhất được dự báo là mang lại doanh thu và lợi nhuận lớn nhất là ChampionsLoyal Customers chỉ chiểm 8.46%6.61%. Điều này phù hợp với tiên đề đặt ra ban đầu của phân tích “80% doanh thu doanh nghiệp của bạn đến từ 20% khách hàng”.

Điều này sẽ được khẳng định đầy đủ hơn từ việc phân tích chi tiết các tiêu chí về doanh thu giải ngân, tần suất và thời gian giao dịch gần nhất theo từng phân khúc dưới đây.

Chúng ta cũng có thể kiểm tra lần giao dịch gần đây, tần suất và giá trị tiền tệ trung bình giữa các phân đoạn để đảm bảo rằng logic được sử dụng để phân loại khách hàng là đúng đắn và thực tế.

Median Recency

Trong biểu đồ này cho thấy càng những nhóm phân khúc khách hàng được chấm điểm cao và có mức độ rủi ro thấp thì thời gian từ lần giải ngân gần nhất càng nhỏ, ngược lại, các nhóm khách hàng có điểm số thấp hơn thì số ngày càng dài và nguy cơ rủi ro cũng tỷ lệ thuận cho những phân khúc này.

Phân khúc khách hàng Champions có số ngày tới thời gian giao dịch gần nhất là ngắn nhất với trung vị của nhóm là 82 ngày. Trong khi nhóm Lost có mức trung vị lên tới 929 ngày. Điều này khẳng định cho việc tập trung chăm sóc nhóm khách hàng VIP (Champions và Loyal Customers) luôn là mục tiêu ưu tiên với nhiều ưu điểm như mức độ rủi ro thấp, thời gian giao dịch gần nhất, có khả năng mang lại doanh thu cao, với số lượng không lớn ~ 15% giúp tiết kiệm được chi phí hơn các phân khúc khách hàng khác.

Median Frequency

Xét theo chiều tần suất giao dịch thì do chỉ xét theo số lần giải ngân nên nhóm phân khúc Champions vẫn là điểm nổi bật với trung vị đạt 4 lần, những phân khúc khách hàng khác chỉ có từ 1 - 2 lần giải ngân. Điều này cho thấy một thực trạng là tỷ lệ nắm giữ sản phẩm của khách hàng là rất thấp nên chỉ có một lần giải ngân cho một khoản vay, bên cạnh đó sản phẩm thẻ và tỷ lệ nắm giữ thẻ của khách hàng cũng còn rất thấp, dẫn tới tần suất giải ngân đang rất hạn chế.

Ở một phương diện khác thì số liệu đang chỉ ra những nhược điểm của hệ thống sản phẩm và khách hàng đang chưa đủ linh hoạt và hấp dẫn để giữ chân khách hàng và tăng giá trị vòng đời của khách hàng (lifetime value), nếu giải quyết được vấn đề này thì việc tăng tỷ lệ giữ chân khách hàng, tỷ lệ nắm giữ sản phẩm và doanh số giải ngân sẽ khả thi hơn.

Trong phần này cần lưu ý đặt biết tới hai phân khúc khách hàng cần có chính sách chăm sóc là Potential Loyalist (Khách hàng thân thiết tiềm năng) và About to Sleep (Khách hàng chuẩn bị ngủ đông).

Median Monetary Value

Trung vị giá trị giải ngân của khách hàng một lần nữa khẳng định hai nhóm khách hàng VIP nên được ưu tiên với số tiền giải ngân cao nhất, với phân khúc Champions đạt tới hơn 86 triệu đồng, phân khúc Loyal Customers đạt xấp xỉ 57 triệu.

Một đặc thù là phân khúc At Risk lại đặt mức giải ngân khá cao với hơn 39 triệu đồng, trong khi phân khúc khách hàng được cho là tiềm năng trở thành khách hàng thân thiết Potential Loyalist lại có mức giá trị giải ngân tương đối khiêm tốn xấp xỉ 15 triệu đồng.

Điều này có thể là ảnh hưởng từ chính sách cho vay hoặc sản phẩm dành cho nhóm khách hàng có nguy cơ rủi ro cao từ quá khứ vẫn còn, kết hợp với việc chưa có giải pháp hiệu quả hơn khai thác nhóm khách hàng tiềm năng để biến họ thành những khách hàng thân thiết. Hoặc cũng có thể nói các giải pháp và chính sách giữ chân khách hàng, chương trình khách hàng thân thiết còn đang trong giai đoạn xây dựng, triển khai chưa đạt được hiệu quả mong muốn.

Summary

Từ những kết quả phân tích cơ bản bên trên, chúng ta có thể đưa ra một số kết luận sau:

Các biến thể khác của mô hình RFM

Ngoài ra RFM còn có các biến thể khác dựa trên sự thay đổi thêm bớt các biến trong 3 biến Recency, Frequency và Monetary. Bên dưới là một trong những phương pháp đó:

Phân tích một số chân dung khách hàng của phân khúc

Phân khúc Champions

References