# 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.
Để 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
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:
Điểm số lần truy cập gần đây được chỉ định cho mỗi khách hàng dựa trên ngày mua hàng gần đây nhất. Điểm số được tạo ra bằng cách gộp các giá trị lần truy cập gần đây vào một số danh mục (mặc định là 5). Ví dụ: nếu bạn sử dụng bốn danh mục, thì những khách hàng có ngày mua hàng gần đây nhất sẽ nhận được xếp hạng lần truy cập gần đây là 4 và những khách hàng có ngày mua hàng trong quá khứ sẽ nhận được xếp hạng lần truy cập gần đây là 1.
Xếp hạng tần suất được chỉ định theo cách tương tự. Những khách hàng có tần suất mua hàng cao được cho điểm cao hơn (4 hoặc 5) và những khách hàng có tần suất mua hàng thấp nhất được cho điểm 1.
Điểm số tiền tệ được ấn định trên cơ sở tổng doanh thu do khách hàng tạo ra trong kỳ được xem xét để phân tích. Những khách hàng có doanh thu / số lượng đơn đặt hàng cao nhất được cho điểm cao hơn trong khi những khách hàng có doanh thu thấp nhất được cho điểm là 1.
Điểm thứ tư, điểm RFM được tạo ra, đơn giản là ba điểm riêng lẻ được nối thành một giá trị duy nhất.
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:
data: một tập dữ liệu với
customer_id: tên của cột id khách hàngorder_date: tên của cột ngày giao dịchrevenue: tên của cột số tiền giao dịchanalysis_date: ngày báo cáorecency_bins: số thứ hạng cho điểm số lần truy cập gần
đây (mặc định là 5)frequency_bins: số thứ hạng cho điểm tần suất (mặc định
là 5)monetary_bins: số thứ hạng cho điểm tiền tệ (mặc định
là 5)# 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:
customer_id: id khách hàng duy nhấtdate_most_recent: ngày của chuyến thăm gần đây
nhấtrecency_days: ngày kể từ lần truy cập gần đây nhấttransaction_count: số lượng giao dịch của khách
hàngamount: tổng doanh thu do khách hàng tạo rarecency_score: điểm số lần truy cập gần đây của khách
hàngfrequency_score: điểm tần suất của khách hàngmonetary_score: điểm số tiền của khách hàngrfm_score: Điểm RFM của khách hàngBả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)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)Sử dụng rfm_histograms() để kiểm tra phân phối tương đối
của
rfm_histograms(rfm_result)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)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.
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)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)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)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 |
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'
) 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à Champions và Loyal Customers chỉ chiểm 8.46% và 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ế.
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.
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).
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.
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:
Ưu tiên thiết kế và triển khai các chương trình dành cho hai phân khúc khách hàng VIP với kỳ vọng mang lại doanh số giải ngân và lợi nhuận tốt nhất cho công ty là Champions và Loyal Customers.
Có chính sách hoặc xây dựng hệ thống sản phẩm hiệu quả, linh hoạt hơn hướng tới nhóm phân khúc khách hàng Potential Loyalist nhằm khai thác lượng lớn khách hàng được coi là khách hàng tiềm năng trở thành khách hàng thân thiết mang lại lợi nhuận lâu dài cho công ty.
Có giải pháp mới hoặc tích cực đẩy mạnh các giải pháp giữ chân khách hàng, tăng tỷ lệ nắm giữ sản phẩm tới các nhóm phân khúc khách hàng About To Sleep và Lost.
Cẩn trọng trong việc điều chỉnh các chính sách cũng như biện pháp tức thời có ảnh hưởng tới phân khúc At Risk vì tuy nhóm khách hàng này có tỷ lệ rủi ro cao nhưng đang mang lại doanh số giải ngân cũng rất cao.
Xây dựng và hoàn thiện các sản phẩm thẻ nhằm nâng cao khả năng bán chéo và tăng tỷ lệ nắm giữ sản phẩm, giữ chân khách hàng và đặc biệt hơn là duy trì thường xuyên các hoạt động giao dịch, tương tác của khách hàng với công ty, tăng lợi nhuận tối đa mang lại với giá trị vòng đời khách hàng (lifetime value).
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 đó:
RFD - Recency, Frequency, Duration (thời gian) là phiên bản đã được modified của phân tích RFM. Nhưng thay vì phân tích giá trị khách hàng, RFD được sử dụng để phân tích hành vi khách hàng theo các nhóm người xem/người đọc/người lướt web.
RFE - Recency, Frequency, Engagement(mức độ cam kết) là phiên bản mở rộng của phân tích RFD nhằm xác định mức độ gắn bó của khách hàng đối với một nền tảng web, app. Trường Engagement (mức độ cam kết) được xác định thông qua thời lượng truy cập, số trang trên mỗi lượt truy cập và các chiều dữ liệu khác tương tự. Mô hình RFE có thể được sử dụng để phân tích hành vi khách hàng theo các nhóm người xem/người đọc/người lướt web.
RFM-I - Recency, Frequency, Monetary Value – Interactions (Giá trị tiền tệ - Tương tác) là một phiên bản khác của RFM để đánh giá chi phí tương tác marketing trong tiếp cận khách hàng.
RFMTC - Recency, Frequency, Monetary Value, Time (Thời gian), Churn rate (Tỷ lệ rời bỏ) là một mô hình RFM mở rộng được đề xuất bởi I-Cheng và cộng sự(2009). Mô hình sử dụng chuỗi Bernoulli trong lý thuyết xác suất nhằm dự báo xác suất mua hàng tại những chiến dịch marketing tiếp theo.