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

Giá trị Vòng đời Khách hàng

Trong hướng dẫn này, học cách tính Giá trị Vòng đời Khách hàng trong Python.
· 11 phút đọc

Khám phá cùng AI

Nhà kinh tế học người Ý Vilfredo Pareto cho rằng 80% kết quả đến từ 20% nguyên nhân, được biết đến là quy tắc 80/20 hay nguyên lý Pareto. Tương tự, 80% doanh thu của các công ty đến từ 20% khách hàng. Doanh nghiệp cần xác định những khách hàng hàng đầu đó và duy trì mối quan hệ với họ để đảm bảo doanh thu liên tục. Để duy trì mối quan hệ dài hạn với khách hàng, doanh nghiệp cần triển khai các chương trình khách hàng thân thiết như giảm giá, ưu đãi, phiếu giảm giá, điểm thưởng và quà tặng.

Nhắm đến khách hàng mới tốn kém hơn nhiều so với giữ chân khách hàng hiện tại vì bạn không cần tiêu tốn thêm nguồn lực, thời gian và công sức để có được khách hàng mới. Bạn chỉ cần giữ cho khách hàng hiện tại hài lòng. Chuyên viên phân tích kinh doanh tính chính xác chi phí thu hút khách hàng bằng cách sử dụng CLTV (Customer Lifetime Value - Giá trị vòng đời khách hàng). CLTV cho biết tổng doanh thu từ một khách hàng trong suốt mối quan hệ. CLTV giúp doanh nghiệp tập trung vào những khách hàng tiềm năng có thể mang lại nhiều doanh thu hơn trong tương lai.

Customer Lifetime Value (CLTV)

"Giá trị vòng đời khách hàng là một giá trị tiền tệ đại diện cho số doanh thu hoặc lợi nhuận mà một khách hàng sẽ mang lại cho công ty trong suốt thời gian quan hệ". CLTV cho thấy hàm ý của việc có được khách hàng dài hạn so với khách hàng ngắn hạn. Customer lifetime value (CLV) có thể giúp bạn trả lời những câu hỏi quan trọng nhất về bán hàng đối với mọi công ty:

  • Làm thế nào để xác định những khách hàng sinh lợi nhất?
  • Công ty có thể cung cấp sản phẩm tốt nhất và kiếm được nhiều tiền nhất như thế nào?
  • Làm thế nào để phân khúc những khách hàng sinh lợi?
  • Cần chi bao nhiêu ngân sách để thu hút khách hàng?

Tính Giá trị Vòng đời Khách hàng

Có rất nhiều cách tiếp cận để tính CLTV. Mỗi người có một quan điểm riêng. Để tính CLTV, chúng ta cần dữ liệu lịch sử của khách hàng nhưng bạn sẽ không thể tính cho khách hàng mới. Để giải quyết vấn đề này, Chuyên viên Phân tích Kinh doanh xây dựng các mô hình máy học để dự đoán CLTV của khách hàng mới. Hãy khám phá một số cách tiếp cận để tính CLTV:

1) Bạn có thể tính bằng cách cộng lợi nhuận/doanh thu từ khách hàng trong một chu kỳ nhất định. Ví dụ, nếu khách hàng gắn bó với bạn trong 3 năm qua, bạn có thể cộng tất cả lợi nhuận trong 3 năm đó. Bạn có thể lấy trung bình lợi nhuận theo năm, nửa năm hoặc theo tháng, nhưng với cách tiếp cận này, bạn không thể xây dựng mô hình dự đoán cho khách hàng mới.

2) Xây dựng mô hình hồi quy cho khách hàng hiện có. Lấy dữ liệu sáu tháng gần đây làm biến độc lập và tổng doanh thu trong ba năm làm biến phụ thuộc, rồi xây dựng mô hình hồi quy trên dữ liệu này.

3) CLTV cũng có thể được triển khai bằng cách sử dụng các giá trị RFM (Recency, Frequency, Monetary). Để biết thêm chi tiết, bạn có thể tham khảo hướng dẫn của tôi.

4) Sử dụng phương trình sau: CLTV = ((Giá trị Đơn hàng Trung bình x Tần suất Mua hàng)/Tỷ lệ Rời bỏ) x Biên lợi nhuận.

      Customer Value = Average Order Value * Purchase Frequency
  • Average Order Value (AOV) — Giá trị Đơn hàng Trung bình: AOV là tỷ số giữa tổng doanh thu và tổng số đơn hàng. AOV biểu thị số tiền doanh thu trung bình mà khách hàng chi cho một đơn hàng.

                         Average Order Value = Total Revenue / Total Number of Orders
    
  • Purchase Frequency (PF) — Tần suất Mua hàng: Tần suất Mua hàng là tỷ số giữa tổng số đơn hàng và tổng số khách hàng. Nó biểu thị số đơn hàng trung bình mà mỗi khách hàng đặt.

                        Purchase Frequency =  Total Number of Orders / Total Number of Customers
    
  • Churn Rate — Tỷ lệ Rời bỏ: Là phần trăm khách hàng không đặt hàng lại.

  • Customer Lifetime — Thời gian Vòng đời Khách hàng: Là khoảng thời gian khách hàng liên tục đặt hàng.

                                  Customer Lifetime=1/Churn Rate
    
  • Repeat Rate — Tỷ lệ Mua lại: Được định nghĩa là tỷ số giữa số khách hàng có hơn một đơn hàng và số khách hàng duy nhất. Ví dụ: Nếu bạn có 10 khách hàng trong một tháng và trong đó 4 người quay lại, tỷ lệ mua lại của bạn là 40%.

                                   Churn Rate= 1-Repeat Rate
    

Triển khai CLTV trong Python (Dùng Công thức)

Nhập các 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
import numpy as np

Tải Bộ dữ liệu

Trước tiên, hãy tải bộ dữ liệu Online Retail cần thiết bằng hàm đọc CSV của pandas. Bạn có thể tải dữ liệu từ đây.

data = pd.read_excel("Online_Retail.xlsx")
data.head()
 InvoiceNoStockCodeDescriptionQuantityInvoiceDateUnitPriceCustomerIDCountry
053636585123AWHITE HANGING HEART T-LIGHT HOLDER62010-12-01 08:26:002.5517850.0United Kingdom
153636571053WHITE METAL LANTERN62010-12-01 08:26:003.3917850.0United Kingdom
253636584406BCREAM CUPID HEARTS COAT HANGER82010-12-01 08:26:002.7517850.0United Kingdom
353636584029GKNITTED UNION FLAG HOT WATER BOTTLE62010-12-01 08:26:003.3917850.0United Kingdom
453636584029ERED WOOLLY HOTTIE WHITE HEART.62010-12-01 08:26:003.3917850.0United Kingdom

Loại bỏ Bản ghi Trùng lặp

Đôi khi bạn nhận được 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(), dùng để 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 Khai thác Thông tin từ Dữ liệu

#Top ten country's customer
filtered_data.Country.value_counts()[:10].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x7fe677a887f0>
bar chart

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

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

Hàm describe() trong pandas rất tiện lợi để lấy các thống kê tóm tắt khác nhau. 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 và các phân vị của dữ liệu.

uk_data.describe()
 QuantityUnitPriceCustomerID
count495478.000000495478.000000361878.000000
mean8.6054864.53242215547.871368
std227.58875699.3154381594.402590
min-80995.000000-11062.06000012346.000000
25%1.0000001.25000014194.000000
50%3.0000002.10000015514.000000
75%10.0000004.13000016931.000000
max80995.00000038970.00000018287.000000

Tại đâ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)]
uk_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 486286 entries, 0 to 541893
Data columns (total 8 columns):
InvoiceNo      486286 non-null object
StockCode      486286 non-null object
Description    485694 non-null object
Quantity       486286 non-null int64
InvoiceDate    486286 non-null datetime64[ns]
UnitPrice      486286 non-null float64
CustomerID     354345 non-null float64
Country        486286 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 33.4+ 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 để tính CLTV. 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 số ngày khách hàng gắn bó với sản phẩm.
  • InvoiceNo giúp bạn đếm số lần giao dịch được thực hiện (tần suất).
  • Quantity là số đơn vị mặt hàng mua trong mỗi giao dịch.
  • UnitPrice của mỗi đơn vị được 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']]
#Calulate total purchase
uk_data['TotalPurchase'] = uk_data['Quantity'] * uk_data['UnitPrice']

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

  • Tính số ngày giữa ngày hiện tại và ngày mua gần nhất của mỗi khách hàng.
  • Tính số đơn hàng của mỗi khách hàng.
  • Tính tổng số tiền mua của mỗi khách hàng.
uk_data_group=uk_data.groupby('CustomerID').agg({'InvoiceDate': lambda date: (date.max() - date.min()).days,
                                        'InvoiceNo': lambda num: len(num),
                                        'Quantity': lambda quant: quant.sum(),
                                        'TotalPurchase': lambda price: price.sum()})
uk_data_group.head()
 InvoiceDateInvoiceNoQuantityTotalPurchase
CustomerID    
12346.0017421577183.60
12747.036610312754196.01
12748.037245962574833719.73
12749.020919914714090.88
12820.032359722942.34

Đổi tên cột

# Change the name of columns
uk_data_group.columns=['num_days','num_transactions','num_units','spent_money']
uk_data_group.head()
 num_daysnum_transactionsnum_unitsspent_money
CustomerID    
12346.0017421577183.60
12747.036610312754196.01
12748.037245962574833719.73
12749.020919914714090.88
12820.032359722942.34

Tính CLTV bằng công thức sau:

 CLTV = ((Average Order Value x Purchase Frequency)/Churn Rate) x Profit margin.

 Customer Value = Average Order Value * Purchase Frequency

1. Tính Giá trị Đơn hàng Trung bình

# Average Order Value
uk_data_group['avg_order_value']=uk_data_group['spent_money']/uk_data_group['num_transactions']
uk_data_group.head()
 num_daysnum_transactionsnum_unitsspent_moneyavg_order_value
CustomerID     
12346.0017421577183.6077183.600000
12747.036610312754196.0140.737961
12748.037245962574833719.737.336756
12749.020919914714090.8820.557186
12820.032359722942.3415.971864

2. Tính Tần suất Mua hàng

purchase_frequency=sum(uk_data_group['num_transactions'])/uk_data_group.shape[0]

3. Tính Tỷ lệ Mua lại và Tỷ lệ Rời bỏ

# Repeat Rate
repeat_rate=uk_data_group[uk_data_group.num_transactions > 1].shape[0]/uk_data_group.shape[0]
#Churn Rate
churn_rate=1-repeat_rate
purchase_frequency,repeat_rate,churn_rate
(90.37107880642694, 0.9818923743942872, 0.018107625605712774)

4. Tính Biên lợi nhuận

Biên lợi nhuận là tỷ số lợi nhuận thường được sử dụng. Nó biểu thị tỷ lệ phần trăm doanh thu thuần được chuyển thành lợi nhuận. Giả sử doanh nghiệp của chúng ta có khoảng 5% lợi nhuận trên tổng doanh số.

# Profit Margin
uk_data_group['profit_margin']=uk_data_group['spent_money']*0.05
uk_data_group.head()
 num_daysnum_transactionsnum_unitsspent_moneyavg_order_valueprofit_margin
CustomerID      
12346.0017421577183.6077183.6000003859.1800
12747.036610312754196.0140.737961209.8005
12748.037245962574833719.737.3367561685.9865
12749.020919914714090.8820.557186204.5440
12820.032359722942.3415.97186447.1170

5. Tính Giá trị Vòng đời Khách hàng

# Customer Value
uk_data_group['CLV']=(uk_data_group['avg_order_value']*purchase_frequency)/churn_rate
#Customer Lifetime Value
uk_data_group['cust_lifetime_value']=uk_data_group['CLV']*uk_data_group['profit_margin']
uk_data_group.head()
 num_daysnum_transactionsnum_unitsspent_moneyavg_order_valueprofit_marginCLVcust_lifetime_value
CustomerID        
12346.0017421577183.6077183.6000003859.18003.852060e+081.486579e+12
12747.036610312754196.0140.737961209.80052.033140e+054.265538e+07
12748.037245962574833719.737.3367561685.98653.661610e+046.173424e+07
12749.020919914714090.8820.557186204.54401.025963e+052.098545e+07
12820.032359722942.3415.97186447.11707.971198e+043.755789e+06

Mô hình Dự đoán cho CLTV

Hãy xây dựng mô hình dự đoán CLTV.

Tại đây, bạn sẽ dự đoán CLTV bằng Mô hình Hồi quy Tuyến tính.

Trước tiên, hãy sử dụng dữ liệu đã tải và lọc ở trên.

uk_data.head()
 CustomerIDInvoiceDateInvoiceNoQuantityUnitPriceTotalPurchasemonth_yr
017850.02010-12-01 08:26:0053636562.5515.30Dec-2010
117850.02010-12-01 08:26:0053636563.3920.34Dec-2010
217850.02010-12-01 08:26:0053636582.7522.00Dec-2010
317850.02010-12-01 08:26:0053636563.3920.34Dec-2010
417850.02010-12-01 08:26:0053636563.3920.34Dec-2010

Trích xuất tháng và năm từ InvoiceDate.

uk_data['month_yr'] = uk_data['InvoiceDate'].apply(lambda x: x.strftime('%b-%Y'))
uk_data.head()
 CustomerIDInvoiceDateInvoiceNoQuantityUnitPriceTotalPurchasemonth_yr
017850.02010-12-01 08:26:0053636562.5515.30Dec-2010
117850.02010-12-01 08:26:0053636563.3920.34Dec-2010
217850.02010-12-01 08:26:0053636582.7522.00Dec-2010
317850.02010-12-01 08:26:0053636563.3920.34Dec-2010
417850.02010-12-01 08:26:0053636563.3920.34Dec-2010

Bảng tổng hợp (pivot table) nhận các cột làm đầu vào, và nhóm các bản ghi thành bảng hai chiều theo cách cung cấp sự tóm tắt đa chiều của dữ liệu.

sale=uk_data.pivot_table(index=['CustomerID'],columns=['month_yr'],values='TotalPurchase',aggfunc='sum',fill_value=0).reset_index()
sale.head()
month_yrCustomerIDApr-2011Aug-2011Dec-2010Dec-2011Feb-2011Jan-2011Jul-2011Jun-2011Mar-2011May-2011Nov-2011Oct-2011Sep-2011
012346.00.000.000.000.000.0077183.600.000.000.000.000.000.000.00
112747.00.00301.70706.27438.500.00303.040.00376.30310.78771.31312.73675.380.00
212748.01100.37898.244228.131070.27389.64418.771113.272006.261179.372234.5010639.232292.846148.84
312749.00.001896.130.00763.060.000.000.000.000.00859.10572.590.000.00
412820.00.000.000.00210.350.00170.460.000.000.000.000.00343.76217.77

Hãy cộng tổng doanh số của tất cả các tháng.

sale['CLV']=sale.iloc[:,2:].sum(axis=1)
sale.head()
month_yrCustomerIDApr-2011Aug-2011Dec-2010Dec-2011Feb-2011Jan-2011Jul-2011Jun-2011Mar-2011May-2011Nov-2011Oct-2011Sep-2011CLV
012346.00.000.000.000.000.0077183.600.000.000.000.000.000.000.0077183.60
112747.00.00301.70706.27438.500.00303.040.00376.30310.78771.31312.73675.380.004196.01
212748.01100.37898.244228.131070.27389.64418.771113.272006.261179.372234.5010639.232292.846148.8432619.36
312749.00.001896.130.00763.060.000.000.000.000.00859.10572.590.000.004090.88
412820.00.000.000.00210.350.00170.460.000.000.000.000.00343.76217.77942.34

Chọn Đặc trưng

Tại đây, bạn cần chia các cột đã cho thành hai loại biến: biến phụ thuộc (hoặc biến mục tiêu) và biến độc lập (hoặc biến đặc trưng). Chọn 6 tháng gần nhất làm biến độc lập.

X=sale[['Dec-2011','Nov-2011', 'Oct-2011','Sep-2011','Aug-2011','Jul-2011']]
y=sale[['CLV']]

Chia Tập Dữ liệu

Để hiểu hiệu suất mô hình, chia bộ dữ liệu thành tập huấn luyện và tập kiểm tra là một chiến lược tốt.

Hãy chia bộ dữ liệu bằng cách sử dụng hàm train_test_split(). Bạn cần truyền 3 tham số: đặc trưng, mục tiêu và kích thước tập kiểm tra. Ngoài ra, bạn có thể dùng random_state làm giá trị seed để đảm bảo khả năng tái lập, nghĩa là việc bạn chia dữ liệu sẽ không ảnh hưởng đến kết quả. Nếu random_state là None, bộ tạo số ngẫu nhiên sẽ dùng np.random để chọn bản ghi ngẫu nhiên. Tức là nếu bạn không đặt seed, mỗi lần sẽ khác nhau.

#split training set and test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,random_state=0)

Phát triển Mô hình

Trước tiên, nhập mô-đun Hồi quy Tuyến tính và tạo một đối tượng Linear Regression. Sau đó, fit mô hình trên tập huấn luyện bằng hàm fit() và dự đoán trên tập kiểm tra bằng hàm predict().

# import model
from sklearn.linear_model import LinearRegression

# instantiate
linreg = LinearRegression()

# fit the model to the training data (learn the coefficients)
linreg.fit(X_train, y_train)

# make predictions on the testing set
y_pred = linreg.predict(X_test)
# print the intercept and coefficients
print(linreg.intercept_)
print(linreg.coef_)
[208.50969617]
[[0.99880551 0.80381254 1.60226829 1.67433228 1.52860813 2.87959449]]

Mô hình Phù hợp dữ liệu Tốt đến mức nào?

Để đánh giá mức độ phù hợp tổng thể của mô hình tuyến tính, chúng ta sử dụng giá trị R-squared. R-squared là tỷ lệ phương sai được mô hình giải thích. Giá trị R-squared nằm trong khoảng từ 0 đến 1. Giá trị R-squared cao hơn được xem là tốt hơn vì nó cho thấy mô hình giải thích được phần lớn phương sai.

from sklearn import metrics

# compute the R Square for model
print("R-Square:",metrics.r2_score(y_test, y_pred))
R-Square: 0.9666074402817512

Mô hình này có R-squared cao (0,96). Mô hình này phù hợp với dữ liệu tốt hơn.

Đánh giá Mô hình

Với các bài toán hồi quy, các thước đo đánh giá sau được dùng (Ritchie Ng):

  • Mean Absolute Error (MAE) là giá trị trung bình của độ lệch tuyệt đối.
  • Mean Squared Error (MSE) là giá trị trung bình của bình phương sai số.
  • Root Mean Squared Error (RMSE) là căn bậc hai của giá trị trung bình bình phương sai số.
# calculate MAE using scikit-learn
print("MAE:",metrics.mean_absolute_error(y_test,y_pred))

#calculate mean squared error
print("MSE",metrics.mean_squared_error(y_test, y_pred))
# compute the RMSE of our predictions
print("RMSE:",np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
MAE: 595.0282284701234
MSE 2114139.8898678957
RMSE: 1454.0082151995896

RMSE phổ biến hơn MSE và MAE vì RMSE có thể diễn giải cùng đơn vị với y.

Ưu và Nhược điểm của CLTV

CLTV giúp bạn thiết kế một kế hoạch kinh doanh hiệu quả và cũng tạo cơ hội để mở rộng hoạt động kinh doanh. CLTV vẽ ra các phân khúc khách hàng có ý nghĩa, các phân khúc này có thể giúp bạn xác định nhu cầu của các nhóm khác nhau.

Giá trị Vòng đời Khách hàng là một công cụ, không phải là chiến lược. CLTV có thể tìm ra những khách hàng sinh lợi nhất, nhưng cách bạn thu lợi từ họ phụ thuộc vào chiến lược của bạn. Nói chung, các mô hình CLTV thường gây nhầm lẫn và bị lạm dụng. Ám ảnh với CLTV có thể tạo ra thành kiến. Doanh nghiệp chỉ tập trung vào việc tìm nhóm khách hàng tốt nhất, tập trung vào họ và lặp lại giao dịch, nhưng cũng quan trọng không kém là phải chú ý đến các khách hàng khác.

Kết luận

Chúc mừng bạn đã đi đến cuối hướng dẫn này!

Trong hướng dẫn này, bạn đã tìm hiểu rất nhiều chi tiết về Giá trị Vòng đời Khách hàng. Bạn đã học CLTV là gì, các cách tiếp cận để tính CLTV, triển khai CLTV từ đầu trong Python, một mô hình dự đoán cho CLTV, và Ưu & Nhược điểm của CLTV. Ngoài ra, bạn cũng đã ôn lại một số khái niệm cơ bản của pandas như groupby và pivot table để tóm tắt các cột và hàng dữ liệu đã chọn.

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

Nếu bạn muốn học thêm về phân tích dữ liệu khách hàng trong Python, hãy tham gia khóa Customer Analytics & A/B Testing in Python của DataCamp.

Chủ đề

Liên quan