Chuyển đến nội dung chính

Giới thiệu về Phân khúc Khách hàng trong Python

Trong bài hướng dẫn này, bạn sẽ học cách triển khai phân khúc khách hàng bằng phân tích RFM (Recency, Frequency, Monetary) từ đầu trong Python.
· 8 phút đọc

Khám phá cùng AI

Trong lĩnh vực bán lẻ, các chuỗi đại siêu thị tạo ra một lượng dữ liệu cực kỳ lớn. Dữ liệu này được tạo ra hàng ngày trên khắp các cửa hàng. Cơ sở dữ liệu khổng lồ về giao dịch của khách hàng này cần được phân tích để xây dựng các chiến lược sinh lợi.

Tất cả khách hàng đều có những nhu cầu khác nhau. Khi lượng khách hàng và giao dịch tăng lên, không dễ để hiểu yêu cầu của từng người. Việc xác định khách hàng tiềm năng có thể cải thiện chiến dịch tiếp thị, từ đó tăng doanh số. Phân khúc có thể đóng vai trò tốt hơn trong việc nhóm những khách hàng đó vào các phân khúc khác nhau.

Phân khúc khách hàng là gì?

Phân khúc khách hàng là phương pháp chia khách hàng thành các nhóm hoặc cụm dựa trên những đặc điểm chung. Nhà nghiên cứu thị trường có thể phân khúc khách hàng theo mô hình B2C dựa trên các đặc điểm nhân khẩu học của khách hàng như nghề nghiệp, giới tính, độ tuổi, vị trí và tình trạng hôn nhân. Đặc điểm tâm lý như tầng lớp xã hội, lối sống và tính cách, và đặc điểm hành vi như chi tiêu, thói quen tiêu dùng, mức độ sử dụng sản phẩm/dịch vụ, và sản phẩm đã mua trước đây. Trong mô hình B2B, dựa trên các đặc điểm của công ty như quy mô công ty, loại hình ngành và vị trí.

biểu đồ

Sự cần thiết của phân khúc khách hàng

  • Giúp xác định khách hàng tiềm năng nhất.
  • Hỗ trợ nhà quản lý dễ dàng giao tiếp với nhóm khán giả mục tiêu.
  • Giúp chọn kênh truyền thông phù hợp nhất để giao tiếp với phân khúc mục tiêu.
  • Cải thiện chất lượng dịch vụ, lòng trung thành và khả năng giữ chân.
  • Cải thiện quan hệ khách hàng nhờ hiểu rõ hơn nhu cầu của từng phân khúc.
  • Mang lại cơ hội bán gia tăng (upsell) và bán chéo (cross-sell).
  • Giúp nhà quản lý thiết kế ưu đãi đặc biệt cho khách hàng mục tiêu, khuyến khích họ mua nhiều sản phẩm hơn.
  • Giúp công ty đi trước một bước so với đối thủ.
  • Giúp xác định các sản phẩm mới mà khách hàng có thể quan tâm.

Các loại phân khúc

các loại phân khúc

Phân khúc khách hàng bằng phân tích RFM

RFM (Recency, Frequency, Monetary) là phương pháp dựa trên hành vi để nhóm khách hàng thành các phân khúc. Nó nhóm khách hàng dựa trên các giao dịch mua trước đây: mua gần đây khi nào, mua thường xuyên ra sao và chi bao nhiêu. RFM lọc khách hàng vào những nhóm khác nhau nhằm mục đích phục vụ tốt hơn. Nó giúp nhà quản lý xác định khách hàng tiềm năng để làm ăn sinh lợi hơn. Có một phân khúc khách hàng chi tiêu lớn, nhưng nếu họ chỉ mua một lần hoặc đã mua gần đây chưa? Họ có thường xuyên mua sản phẩm của chúng ta không? Đồng thời, nó giúp nhà quản lý chạy chiến dịch khuyến mãi hiệu quả cho dịch vụ cá nhân hóa.

  • Recency (R): Ai mua gần đây? Số ngày kể từ lần mua cuối (độ mới thấp nhất).
  • Frequency (F): Ai mua thường xuyên? Tức là tổng số lần mua (tần suất cao).
  • Monetary Value (M): Ai có số tiền mua cao? Tức là tổng số tiền khách hàng đã chi (giá trị tiền tệ cao).

Ở đây, mỗi trong ba biến (Recency, Frequency và Monetary) gồm bốn nhóm bằng nhau, tạo ra 64 (4x4x4) phân khúc khách hàng khác nhau.

Các bước RFM (Recency, Frequency, Monetary):

  1. Tính các giá trị Recency, Frequency, Monetary cho từng khách hàng.
  2. Thêm các giá trị nhóm (bin) vào bảng RFM bằng tứ phân vị (quartile).
  3. Sắp xếp điểm RFM của khách hàng theo thứ tự tăng dần.

1. Tính các giá trị Recency, Frequency, Monetary cho từng khách hàng.

Giá trị Recency, Frequency, Monetary

2. Thêm các giá trị nhóm (bin) vào bảng RFM bằng tứ phân vị.

giá trị bin theo phân khúc trên bảng RFM

3. Ghép tất cả điểm vào một cột (RFM_Score).

tất cả điểm trong một cột

Xác định phân khúc khách hàng tiềm năng bằng RFM trong Python

Nhập thư viện cần thiết

#import modules
import pandas as pd # for dataframes
import matplotlib.pyplot as plt # for plotting graphs
import seaborn as sns # for plotting graphs
import datetime as dt

Tải dữ liệu

Hãy bắt đầu bằng cách tải bộ dữ liệu HR cần thiết bằng hàm đọc CSV của pandas. Bạn có thể tải dữ liệu từ liên kết này.

data = pd.read_excel("Online_Retail.xlsx")
data.head()
dataset 1
data.tail()
dataset 2
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 541909 entries, 0 to 541908
Data columns (total 8 columns):
InvoiceNo      541909 non-null object
StockCode      541909 non-null object
Description    540455 non-null object
Quantity       541909 non-null int64
InvoiceDate    541909 non-null datetime64[ns]
UnitPrice      541909 non-null float64
CustomerID     406829 non-null float64
Country        541909 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 33.1+ MB
data= data[pd.notnull(data['CustomerID'])]

Loại bỏ dữ liệu trùng lặp

Đôi khi bạn nhận được một bộ dữ liệu lộn xộn. Bạn có thể phải xử lý dữ liệu trùng lặp, điều này sẽ làm sai lệch phân tích. Trong python, pandas cung cấp hàm drop_duplicates(), giúp loại bỏ các bản ghi lặp lại hoặc trùng lặp.

filtered_data=data[['Country','CustomerID']].drop_duplicates()

Cùng khám phá một số insight dữ liệu

#Top ten country's customer
filtered_data.Country.value_counts()[:10].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x7fd81725dfd0>
insight dữ liệu

Trong bộ dữ liệu đã cho, bạn có thể thấy phần lớn khách hàng đến từ "United Kingdom". Vậy, bạn có thể lọc dữ liệu cho khách hàng tại United Kingdom.

uk_data=data[data.Country=='United Kingdom']
uk_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 361878 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      361878 non-null object
StockCode      361878 non-null object
Description    361878 non-null object
Quantity       361878 non-null int64
InvoiceDate    361878 non-null datetime64[ns]
UnitPrice      361878 non-null float64
CustomerID     361878 non-null float64
Country        361878 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 24.8+ MB

Hàm describe() trong pandas rất tiện để nhận các thống kê tóm tắt. Hàm này trả về số lượng, giá trị trung bình, độ lệch chuẩn, giá trị nhỏ nhất và lớn nhất, cùng các tứ phân vị của dữ liệu.

uk_data.describe()
 QuantityUnitPriceCustomerID
count361878.000000361878.000000361878.000000
mean11.0770293.25600715547.871368
std263.12926670.6547311594.402590
min-80995.0000000.00000012346.000000
25%2.0000001.25000014194.000000
50%4.0000001.95000015514.000000
75%12.0000003.75000016931.000000
max80995.00000038970.00000018287.000000

Ở đây, bạn có thể thấy một số khách hàng đặt hàng với số lượng âm, điều này là không thể. Vì vậy, bạn cần lọc Quantity lớn hơn 0.

uk_data = uk_data[(uk_data['Quantity']>0)]
In: # Change the name of columns
rfm.columns=['monetary','frequency','recency']
uk_data.info() 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 354345 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      354345 non-null object
StockCode      354345 non-null object
Description    354345 non-null object
Quantity       354345 non-null int64
InvoiceDate    354345 non-null datetime64[ns]
UnitPrice      354345 non-null float64
CustomerID     354345 non-null float64
Country        354345 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 24.3+ MB

Lọc các cột cần thiết

Tại đây, bạn có thể lọc các cột cần thiết cho phân tích RFM. Bạn chỉ cần năm cột CustomerID, InvoiceDate, InvoiceNo, Quantity và UnitPrice. CustomerID sẽ xác định duy nhất khách hàng của bạn, InvoiceDate giúp bạn tính độ mới của lần mua, InvoiceNo giúp bạn đếm số lần thực hiện giao dịch (tần suất). Số lượng mua trong mỗi giao dịch và đơn giá của mỗi đơn vị khách hàng mua sẽ giúp bạn tính tổng số tiền đã mua.

uk_data=uk_data[['CustomerID','InvoiceDate','InvoiceNo','Quantity','UnitPrice']]
uk_data['TotalPrice'] = uk_data['Quantity'] * uk_data['UnitPrice']
uk_data['InvoiceDate'].min(),uk_data['InvoiceDate'].max()
(Timestamp('2010-12-01 08:26:00'), Timestamp('2011-12-09 12:49:00'))
PRESENT = dt.datetime(2011,12,10)
uk_data['InvoiceDate'] = pd.to_datetime(uk_data['InvoiceDate'])
uk_data.head()
 CustomerIDInvoiceDateInvoiceNoQuantityUnitPriceTotalPrice
017850.02010-12-01 08:26:0053636562.5515.30
117850.02010-12-01 08:26:0053636563.3920.34
217850.02010-12-01 08:26:0053636582.7522.00
317850.02010-12-01 08:26:0053636563.3920.34
417850.02010-12-01 08:26:0053636563.3920.34

Phân tích RFM

Tại đây, bạn sẽ thực hiện các thao tác sau:

  • Với Recency, tính số ngày giữa ngày hiện tại và ngày mua cuối cùng của mỗi khách hàng.
  • Với Frequency, tính số đơn hàng của mỗi khách hàng.
  • Với Monetary, tính tổng số tiền mua của mỗi khách hàng.
rfm= uk_data.groupby('CustomerID').agg({'InvoiceDate': lambda date: (PRESENT - date.max()).days,
                                        'InvoiceNo': lambda num: len(num),
                                        'TotalPrice': lambda price: price.sum()})
rfm.columns
Index(['InvoiceDate', 'TotalPrice', 'InvoiceNo'], dtype='object')
# Change the name of columns rfm.columns=['recency', 'monetary', 'frequency'] 
rfm['recency'] = rfm['recency'].astype(int)
rfm.head()
 monetaryfrequencyrecency
CustomerID   
12346.032577183.601
12747.024196.01103
12748.0033719.734596
12749.034090.88199
12820.03942.3459

Tính các tứ phân vị của giá trị RFM

Khách hàng có recency thấp nhất, frequency và monetary cao nhất được xem là khách hàng hàng đầu.

qcut() là hàm rời rạc hóa dựa trên tứ phân vị. qcut chia dữ liệu dựa trên các tứ phân vị mẫu. Ví dụ, 1000 giá trị cho 4 tứ phân vị sẽ tạo ra đối tượng phân loại cho biết mỗi khách hàng thuộc tứ phân vị nào.

rfm['r_quartile'] = pd.qcut(rfm['recency'], 4, ['1','2','3','4'])
rfm['f_quartile'] = pd.qcut(rfm['frequency'], 4, ['4','3','2','1'])
rfm['m_quartile'] = pd.qcut(rfm['monetary'], 4, ['4','3','2','1'])
rfm.head()
 monetaryfrequencyrecencyr_quartilef_quartilem_quartile
CustomerID      
12346.032577183.601111
12747.024196.01103414
12748.0033719.734596414
12749.034090.88199414
12820.03942.3459324

Diễn giải kết quả RFM

Kết hợp cả ba tứ phân vị (r_quartile, f_quartile, m_quartile) trong một cột, thứ hạng này sẽ giúp bạn phân khúc khách hàng hiệu quả.

rfm['RFM_Score'] = rfm.r_quartile.astype(str)+ rfm.f_quartile.astype(str) + rfm.m_quartile.astype(str)
rfm.head()
 monetaryfrequencyrecencyr_quartilef_quartilem_quartileRFM_Score
CustomerID       
12346.032577183.601111111
12747.024196.01103414414
12748.0033719.734596414414
12749.034090.88199414414
12820.03942.3459324324
# Filter out Top/Best cusotmers
rfm[rfm['RFM_Score']=='111'].sort_values('monetary', ascending=False).head()
 monetaryfrequencyrecencyr_quartilef_quartilem_quartileRFM_Score
CustomerID       
16754.03722002.42111111
12346.032577183.61111111
15749.023544534.310111111
16698.02261998.05111111
13135.01963096.01111111

Kết luận

Chúc mừng bạn đã hoàn thành bài hướng dẫn!

Trong bài hướng dẫn này, bạn đã tìm hiểu rất nhiều về phân khúc khách hàng. Bạn đã học phân khúc khách hàng là gì, sự cần thiết của phân khúc, các loại phân khúc, phân tích RFM, và cách triển khai RFM từ đầu trong python. Ngoài ra, bạn đã điểm qua một số khái niệm cơ bản của pandas như xử lý dữ liệu trùng lặp, groupby và qcut() để chia nhóm theo tứ phân vị mẫu.

Hy vọng giờ đây bạn có thể tận dụng mô hình chủ đề để phân tích các bộ dữ liệu của riêng mình. Cảm ơn bạn đã đọc bài hướng dẫn!

Nếu bạn muốn học thêm về Python, hãy tham gia khóa miễn phí Giới thiệu Python cho Khoa học Dữ liệu của DataCamp.

Chủ đề

Liên quan