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

Khoa học dữ liệu trong Marketing: Dự báo tỷ lệ rời bỏ khách hàng

Tìm hiểu cách sử dụng các mô hình máy học Python để dự đoán tỷ lệ rời bỏ khách hàng, chuyển đổi dữ liệu marketing thành những insight hữu ích.
Đã cập nhật 31 thg 8, 2026  · 10 phút đọc

Khám phá với AI

ChatGPTClaudePerplexity

 

Giới thiệu 

Trong 10–15 năm gần đây, cùng với sự phát triển của công nghệ số, các chiến lược marketing đã thay đổi đáng kể. Các thương hiệu lớn và cả thị trường ngách đã thu thập một lượng dữ liệu khổng lồ về giao dịch, lượt mua của khách hàng, sở thích, sức mua, hoạt động mua sắm, nhân khẩu học, đánh giá, v.v. Tất cả dữ liệu này có thể giúp marketer hiểu hành vi khách hàng ở các giai đoạn khác nhau, từ ý định mua đến giao dịch thực tế và trở thành khách hàng trung thành. Đây chính là lúc tiềm năng của khoa học dữ liệu phát huy tác dụng.

Khoa học dữ liệu biến dữ liệu lớn trong marketing thành những insight có thể hành động, dù đôi khi ban đầu chúng ít trực quan, chẳng hạn như các mẫu hành vi người tiêu dùng không hiển nhiên và các mối đồng xuất hiện. Nhờ đó, marketer có thể hình dung rõ hơn về đối tượng mục tiêu, thu hút khách hàng mới và giữ chân khách hàng hiện tại, tối ưu hóa chiến lược marketing, tăng mức độ hiện diện của công ty, tạo ra các chiến dịch quảng cáo thành công hơn, mở rộng kênh và qua đó tối đa hóa đáng kể doanh thu của công ty.

Một trong những trường hợp sử dụng khoa học dữ liệu điển hình trong marketing là dự báo tỷ lệ rời bỏ khách hàng. Hãy bàn sâu hơn về chủ đề này.

Trường hợp sử dụng Khoa học dữ liệu trong Marketing: Dự báo tỷ lệ rời bỏ khách hàng

Rời bỏ khách hàng là xu hướng khách hàng hủy đăng ký dịch vụ mà họ đang sử dụng và do đó không còn là khách hàng của dịch vụ đó nữa. Tỷ lệ rời bỏ khách hàng là phần trăm khách hàng rời bỏ trong một khoảng thời gian xác định. Đây là chỉ số đối nghịch với tốc độ tăng trưởng khách hàng theo dõi khách hàng mới.

Tỷ lệ rời bỏ là chỉ báo rất quan trọng về mức độ hài lòng của khách hàng và sức khỏe tổng thể của doanh nghiệp. Ngoài rời bỏ tự nhiên vốn luôn tồn tại trong bất kỳ ngành nào, hoặc rời bỏ theo mùa đặc trưng cho một số dịch vụ, còn có những yếu tố khác có thể cho thấy điều gì đó trong công ty đang trục trặc và cần được khắc phục. Những yếu tố này gồm:

  • thiếu hoặc chất lượng kém của hỗ trợ khách hàng,
  • trải nghiệm tiêu cực của khách hàng,
  • chuyển sang đối thủ có điều kiện hoặc chiến lược giá tốt hơn,
  • ưu tiên của khách hàng thay đổi,
  • khách hàng lâu năm không còn hài lòng,
  • dịch vụ không đáp ứng kỳ vọng của khách hàng,
  • vấn đề tài chính,
  • bảo vệ gian lận đối với thanh toán của khách hàng.

Tỷ lệ rời bỏ cao là vấn đề nghiêm trọng đối với bất kỳ công ty nào vì các lý do sau:

  • Nó tương quan với việc thất thoát doanh thu của công ty.
  • Chi phí để có được khách hàng mới tốn kém hơn rất nhiều so với việc giữ chân khách hàng hiện tại. Điều này đặc biệt đúng trên các thị trường có tính cạnh tranh cao.
  • Trong trường hợp rời bỏ do dịch vụ khách hàng kém, danh tiếng công ty có thể bị ảnh hưởng nặng nề bởi các đánh giá tiêu cực từ những khách hàng cũ không hài lòng trên mạng xã hội hoặc các trang đánh giá.

Giữ chân khách hàng là thành tố then chốt trong chiến lược kinh doanh của mọi dịch vụ dựa trên đăng ký. Để dự đoán tỷ lệ rời bỏ và triển khai các biện pháp phòng ngừa tương ứng, cần thu thập và phân tích thông tin về hành vi khách hàng (khoảng cách giữa các lần mua, tổng thời gian là khách hàng, hủy dịch vụ, cuộc gọi và tin nhắn chăm sóc, hoạt động trực tuyến) và xác định thuộc tính nào cùng các tổ hợp của chúng đặc trưng cho nhóm khách hàng có nguy cơ rời bỏ. Biết trước ai có thể sắp rời bỏ, đặc biệt là khách hàng mang lại doanh thu cao hoặc gắn bó lâu năm, sẽ giúp công ty tập trung chính xác vào họ và xây dựng chiến lược hiệu quả để thuyết phục họ ở lại. Cách tiếp cận có thể gồm gọi điện cho nhóm khách hàng này kèm ưu đãi quà tặng, giảm giá, nâng cấp gói với cùng mức phí hoặc bất kỳ trải nghiệm cá nhân hóa nào khác.

Về mặt kỹ thuật, dự báo rời bỏ khách hàng là một bài toán phân loại điển hình trong máy học, khi khách hàng được gán nhãn "yes" hoặc "no" theo nguy cơ rời bỏ hay không. Hãy khảo sát trường hợp này trong Python trên dữ liệu thực tế.

Chúng ta sẽ mô hình hóa rời bỏ trong mô hình kinh doanh viễn thông, nơi khách hàng có thể sử dụng nhiều dịch vụ với một công ty viễn thông theo một hợp đồng tổng. Bộ dữ liệu chứa các đặc trưng về hoạt động của khách hàng đã được làm sạch và một nhãn rời bỏ cho biết khách hàng có rời bỏ hay không.

Hãy xem dữ liệu và khảo sát phân bố tỷ lệ rời bỏ:

import pandas as pd

telcom = pd.read_csv('telco.csv')
print(f'Number of customers: {telcom.shape[0]:,}\n'
      f'Churn values: {set(telcom['Churn'])}\n\n'
      f'Churn distribution, %:\n{round(telcom.groupby(['Churn']).size()/telcom.shape[0]*100).convert_dtypes()}')
Number of customers: 7,032
Churn values: {0, 1}

Churn distribution, %:
Churn
0    73
1    27
dtype: float64

27% khách hàng đã rời bỏ, đây là tỷ lệ khá cao. So với trường hợp sử dụng khoa học dữ liệu trước đó, bộ dữ liệu này dường như không gặp vấn đề mất cân bằng lớp nghiêm trọng.

Tiếp theo, chúng ta sẽ tiền xử lý dữ liệu để áp dụng các kỹ thuật máy học cho bài toán dự báo rời bỏ. Việc này bao gồm chia dữ liệu thành tập huấn luyện và kiểm tra, và tách biến đặc trưng và biến đích:

from sklearn.model_selection import train_test_split

target = ['Churn']
custid = ['customerID']

cols = [col for col in telcom.columns if col not in custid + target]

X = telcom[cols]
y = telcom[target]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

Thuật toán mô hình hóa đầu tiên chúng ta dùng để dự đoán nhãn rời bỏ và ước lượng độ chính xác là mô hình phân loại hồi quy logistic đơn giản:

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

lr = LogisticRegression()
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.8009

Tiếp đó, hãy bổ sung thêm một chức năng cho mô hình hồi quy logistic của chúng ta, cụ thể là chạy trên dữ liệu đã chuẩn hóa với quy tắc hóa L1 để vừa lựa chọn đặc trưng song song với việc xây dựng mô hình. Các giá trị khác nhau của tham số C (nghịch đảo của cường độ quy tắc hóa) sẽ ảnh hưởng đến độ chính xác của mô hình. Trước mắt, hãy đặt C = 0.025:

lr = LogisticRegression(penalty='l1', C=0.025, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7969

Bây giờ, chúng ta sẽ tinh chỉnh tham số C cho quy tắc hóa L1 để tìm giá trị tối ưu giúp giảm độ phức tạp mô hình, đồng thời vẫn duy trì các chỉ số hiệu năng tốt. Để làm vậy, ta sẽ lặp qua các giá trị C khác nhau, xây dựng các mô hình hồi quy logistic tương ứng và tính toán các chỉ số.

Danh sách C đã được tạo sẵn với các giá trị khả dĩ của tham số. Mảng l1_metrics được tạo với 3 cột, cột đầu là các giá trị C, hai cột tiếp theo là chỗ trống để điền số lượng hệ số khác 0 và điểm độ chính xác của mô hình. Hãy thử cách tiếp cận này:

 C  Non-Zero Coeffs  Accuracy
0  1.0000             23.0  0.801479
1  0.5000             22.0  0.799204
2  0.2500             21.0  0.802048
3  0.1000             20.0  0.802617
4  0.0500             18.0  0.802048
5  0.0250             13.0  0.796928
6  0.0100              5.0  0.790102
7  0.0050              3.0  0.783276
8  0.0025              2.0  0.745734

Ta thấy rằng các giá trị C nhỏ hơn làm giảm số lượng hệ số khác 0 (tức là số đặc trưng dùng để mô hình hóa), từ đó giảm độ phức tạp mô hình, nhưng đồng thời cũng làm giảm độ chính xác. Có vẻ giá trị C = 0.05 là tối ưu: nó giảm số đặc trưng xuống còn 18 đồng thời cho độ chính xác nhỉnh hơn mô hình không quy tắc hóa.

Giờ hãy thử một thuật toán mô hình hóa khác – cây quyết định:

from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)
print(f'Test accuracy: {round(accuracy_score(y_test, predictions), 4)}')
Test accuracy: 0.7275

Để chọn mô hình chính xác hơn nhưng tránh quá khớp, ta có thể thử tinh chỉnh độ sâu cây (tham số max_depth) và xác định giá trị tối ưu. Về mặt kỹ thuật, quy trình rất giống với việc chọn tham số C tối ưu của mô hình hồi quy logistic ở trên: tại đây, chúng ta sẽ lặp qua nhiều giá trị max_depth, huấn luyện một cây cho mỗi giá trị rồi tính toán các chỉ số.

Danh sách depth_list đã được tạo sẵn với các giá trị khả dĩ của tham số. Mảng depth_tuning được tạo với 2 cột, trong đó cột đầu điền các ứng viên độ sâu, cột còn lại là chỗ trống cho điểm độ chính xác. Hãy áp dụng cách này để tìm độ sâu tối ưu:

depth_list = list(range(2, 15))
depth_tuning = np.zeros((len(depth_list), 2))
depth_tuning[:, 0] = depth_list

for index in range(len(depth_list)):
    clf = DecisionTreeClassifier(max_depth=depth_list[index])
    clf.fit(X_train, y_train)
    predictions = clf.predict(X_test)
    depth_tuning[index, 1] = accuracy_score(y_test, predictions)
   
col_names = ['Max_Depth', 'Accuracy']
print(pd.DataFrame(depth_tuning, columns=col_names))
 Max_Depth  Accuracy
0         2.0  0.756542
1         3.0  0.783276
2         4.0  0.782708
3         5.0  0.791809
4         6.0  0.778157
5         7.0  0.780432
6         8.0  0.757110
7         9.0  0.762230
8        10.0  0.763936
9        11.0  0.752560
10       12.0  0.745165
11       13.0  0.732651
12       14.0  0.727531

Do đó, điểm độ chính xác ban đầu tăng khi tăng độ sâu rồi bắt đầu giảm. Ở max_depth = 5, cây cho điểm chính xác cao nhất, nên có thể xem đây là độ sâu tối ưu.

Sau khi xác định các giá trị tham số tốt nhất cho cả hai mô hình hồi quy logistic và cây quyết định, hãy dựng lại các mô hình đó rồi xác định và diễn giải các yếu tố chính khiến rời bỏ tăng hoặc giảm.

Với mô hình hồi quy logistic, chúng ta sẽ trích xuất và phân tích số mũ của các hệ số thu được:

# Reconstructing the best model
lr = LogisticRegression(penalty='l1', C=0.05, solver='liblinear')
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)

# Combining feature names and coefficients into one dataframe
feature_names = pd.DataFrame(X_train.columns, columns=['Feature'])
log_coef = pd.DataFrame(np.transpose(lr.coef_), columns=['Coefficient'])
coefficients = pd.concat([feature_names, log_coef], axis=1)

# Calculating exponents of the coefficients
coefficients['Exp_Coefficient'] = np.exp(coefficients['Coefficient'])

# Removing coefficients that are equal to zero
coefficients = coefficients[coefficients['Coefficient']!=0]
print(coefficients.sort_values(by=['Exp_Coefficient']))
                          Feature  Coefficient  Exp_Coefficient
21                          tenure    -0.907750         0.403431
4                 PhoneService_Yes    -0.820517         0.440204
17               Contract_Two year    -0.595271         0.551413
8                  TechSupport_Yes    -0.418254         0.658195
16               Contract_One year    -0.414158         0.660896
5               OnlineSecurity_Yes    -0.412228         0.662173
6                 OnlineBackup_Yes    -0.143100         0.866667
3                   Dependents_Yes    -0.039299         0.961463
7             DeviceProtection_Yes    -0.017465         0.982687
11            PaperlessBilling_Yes     0.071389         1.073999
1                SeniorCitizen_Yes     0.097904         1.102857
19  PaymentMethod_Electronic check     0.188533         1.207477
22                  MonthlyCharges     0.901454         2.463182

Ta thấy đặc trưng có ảnh hưởng lớn nhất đến tỷ lệ chốt rời bỏ là thâm niên (tenure). Nhìn chung, các số mũ hệ số nhỏ hơn 1 làm giảm tỷ lệ, trong khi các giá trị lớn hơn 1 làm tăng tỷ lệ.

Với mô hình cây quyết định, chúng ta sẽ trích xuất và vẽ các quy tắc if-else:

# Reconstructing the best model
clf = DecisionTreeClassifier(max_depth=5)
clf.fit(X_train, y_train)
predictions = clf.predict(X_test)

from sklearn import tree
import graphviz

# Exporting a graphviz object from the trained decision tree
exported = tree.export_graphviz(decision_tree=clf,
                                out_file=None,
                                feature_names=cols,
                                precision=1,
                                class_names=['Not churn', 'Churn'],
                                filled=True)
graph = graphviz.Source(exported)
display(graph)

Cây Quyết định Máy học

Chúng ta thu được một trực quan hóa cây quyết định rõ ràng có thể diễn giải như một tập quy tắc if-else từ trên xuống. Một lần nữa, ta thấy thâm niên khách hàng là biến quan trọng nhất chi phối rời bỏ. Cây quyết định có thể được xây dựng với nhiều lớp hơn để cung cấp thêm insight về các biến khác.

Trong các hướng đi tiếp theo, ta có thể tiếp tục điều chỉnh tham số mô hình, dùng các cách chia train/test khác nhau, áp dụng và so sánh các thuật toán máy học khác, và phân tích nhiều loại điểm số để đánh giá hiệu năng mô hình.

Nếu bạn muốn đào sâu hơn vào dự báo tỷ lệ rời bỏ khách hàng và các ứng dụng khác của khoa học dữ liệu trong marketing, khóa học Machine Learning for Marketing in Python có thể là điểm khởi đầu tốt.

Chủ đề
Khoa học Dữ liệu
Machine Learning