You are on page 1of 34

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT


KHOA CNTT
----------

BÁO CÁO BÀI TẬP LỚN


HỌC PHẦN: 7080626 THƯƠNG MẠI ĐIỆN TỬ

Đề tài 7: P07_DS4Marketing
Giảng viên hướng dẫn: Dương Thị Hiền Thanh
Sinh viên thực hiên: Bùi Quang Huy
Mã sinh viên: 1921050292

HÀ NỘI, 2022

1
MỤC LỤC

1. Giữ chân khách hàng..............................................................................................3

1.1.tỷ lệ rời bỏ và dữ chân khách hàng............................................................3

1.2. mạng nơ-ron nhân tạo..................................................................................

2. Dự đoán tỷ lệ dời bỏ của khách hàng với python...................................................6

2.1. phân tích và chuẩn bị dữ liệu.....................................................................7

2.1.1. Mã hóa mục tiêu...........................................................................7

2.1.2. Xử lý giá trị bị thiếu trong cột TotalChargres..............................8

2.1.3. Chuyển đổi các biến liên tục........................................................8

2.1.4. Các biến phân loại mã hóa một nóng.........................................10

2.2 ANN với keras..........................................................................................14

2.3 Đánh giá mô hình.....................................................................................16

3. Dự đoán sự dời bỏ của khách hàng với R.............................................................19

3.1. Phân tích dữ liệu......................................................................................20

3.2. ANN với keras.........................................................................................28

3.3 Đánh giá mô hình.....................................................................................30

4. Tóm tắt..................................................................................................................32

2
1. Giữ chân khách hàng
Khi khách hàng có nhiều lựa chọn hơn cho nội dung tương tự để tiêu thụ hoặc các
sản phẩm và dịch vụ tương tự để mua sắm, nhiều doanh nghiệp đã trở nên khó khăn
hơn trong việc giữ chân khách hàng của họ và không để mất họ vào tay các đối thủ
cạnh tranh khác. Vì chi phí để có được khách hàng mới thường cao hơn so với việc
giữ chân và giữ chân khách hàng hiện tại, việc rời bỏ khách hàng đang ngày càng trở
thành mối quan tâm hơn bao giờ hết. Để giữ chân khách hàng hiện tại và không để
mất họ vào tay đối thủ cạnh tranh, các doanh nghiệp không chỉ nên cố gắng hiểu
khách hàng của họ cũng như nhu cầu và lợi ích của khách hàng của họ, mà họ còn có
thể xác định khách hàng nào có khả năng rời bỏ cao và làm thế nào để giữ chân
những khách hàng này có nguy cơ rời bỏ.

Trong chương này, chúng ta sẽ đi sâu hơn vào tỷ lệ rời bỏ của khách hàng và
cách nó gây tổn hại cho các doanh nghiệp, cũng như cách giữ chân khách hàng
hiện tại. Chúng tôi sẽ thảo luận về một số lý do phổ biến khiến khách hàng rời bỏ
doanh nghiệp và xem xét cách khoa học dữ liệu có thể giúp giảm nguy cơ mất
khách hàng. Như một cách để dự đoán tỷ lệ rời bỏ của khách hàng, chúng ta sẽ
tìm hiểu về mô hình mạng nơ-ron nhân tạo là gì và các ứng dụng của nó trong
các lĩnh vực khác nhau, cũng như cách chúng ta có thể xây dựng một mô hình
bằng Python và R.

Trong chương này, chúng tôi sẽ đề cập đến các chủ đề sau:
Tỷ lệ rời bỏ và giữ chân khách hàng
 Mạng lưới thần kinh nhân tạo
 Dự đoán khách hàng bỏ cuộc với Python
 Dự đoán khách hàng bỏ cuộc với R

1.1.Tỷ lệ dời bỏ và dữ chân khách hàng


Khách hàng rời bỏ là khi khách hàng quyết định ngừng sử dụng dịch vụ, nội
dung hoặc sản phẩm từ một công ty. Như chúng ta đã thảo luận ngắn gọn trong
Chapter 7, Phân tích khám phá cho hành vi của khách hàng, khi chúng ta thảo
luận về phân tích khách hàng, việc giữ chân khách hàng hiện tại sẽ ít tốn kém
hơn nhiều so với việc có được khách hàng mới và doanh thu từ khách hàng lặp
lại thường cao hơn so với hình thức khách hàng mới. Trong các ngành công
nghiệp cạnh tranh, nơi một doanh nghiệp phải đối mặt với nhiều đối thủ cạnh
3
tranh, chi phí thu hút khách hàng mới thậm chí còn cao hơn và việc giữ chân
khách hàng hiện tại trở nên quan trọng hơn đối với các doanh nghiệp đó.

Có nhiều lý do đằng sau việc khách hàng rời bỏ một doanh nghiệp. Một số lý do
phổ biến khiến khách hàng rời bỏ là dịch vụ khách hàng kém, không tìm thấy đủ
giá trị trong sản phẩm hoặc dịch vụ, thiếu thông tin liên lạc và thiếu lòng trung
thành của khách hàng. Bước đầu tiên để giữ chân những khách hàng này là theo
dõi tỷ lệ tiêu hao của khách hàng theo thời gian. Nếu tỷ lệ tiêu hao thường cao
hoặc đang tăng theo thời gian, thì bạn nên dành một số nguồn lực để cải thiện khả
năng giữ chân khách hàng.

Để cải thiện tỷ lệ giữ chân khách hàng, ưu tiên hàng đầu nên là hiểu khách hàng tốt
hơn. Bạn có thể khảo sát những khách hàng đã khuấy động để hiểu lý do tại sao họ
rời đi. Bạn cũng có thể khảo sát khách hàng hiện tại để hiểu nhu cầu của họ là gì và
điểm khó khăn của họ là gì. Một cách tiếp cận khoa học dữ liệu và phân tích dữ liệu
sẽ là xem xét dữ liệu. Ví dụ: bạn có thể xem dữ liệu hoạt động web của khách hàng
và hiểu nơi họ dành nhiều thời gian nhất, liệu có lỗi nào trên các trang mà họ đang
xem hay kết quả tìm kiếm của họ không trả về nội dung tốt hay không. Bạn cũng có
thể xem nhật ký cuộc gọi dịch vụ khách hàng để hiểu thời gian chờ đợi của họ là bao
lâu, khiếu nại của họ là gì và các vấn đề của họ đã được xử lý như thế nào.
Tiến hành phân tích sâu về các điểm dữ liệu này có thể tiết lộ những vấn đề mà một
doanh nghiệp đang gặp phải trong việc giữ chân khách hàng hiện tại của mình.

Khi phân tích sự thay đổi của khách hàng, bạn cũng có thể sử dụng một số chủ
đề mà chúng ta đã thảo luận trong cuốn sách này. Bạn có thể áp dụng những gì
chúng tôi đã học được từ C hapter 5, Phân tích sản phẩm và Chương 6, Đề xuất
các sản phẩm phù hợp, để hiểu sản phẩm nào phục vụ nhu cầu và sở thích của
khách hàng tốt nhất, đồng thời đề xuất các sản phẩm phù hợp để bạn có thể cung
cấp nội dung được cá nhân hóa hơn. Bạn cũng có thể sử dụng những gì chúng tôi
đã học được từ Cha pter 7, Phân tích khám phá cho hành vi của khách hàng và
Chương 10, Phân khúc khách hàng theo hướng dữ liệu, để hiểu rõ hơn về hành vi
của khách hàng và các phân khúc khách hàng khác nhau. Một cách khác là xây
dựng một mô hình máy học có thể dự đoán khách hàng nào có khả năng rời bỏ
và nhắm mục tiêu và giữ chân những khách hàng cụ thể có nguy cơ rời bỏ cao
hơn. Trong các phần sau, chúng ta sẽ thảo luận về cách xây dựng mô hình mạng
nơ-ron để xác định những khách hàng có nguy cơ rời bỏ cao hơn để giữ chân
khách hàng.

1.2.Mạng nơ-ron nhân tạo


4
Mô hình mạng nơ-ron nhân tạo (ANN) là một mô hình học máy được lấy cảm
hứng từ cách bộ não con người hoạt động. Các ứng dụng thành công gần đây của
các mô hình ANN trong nhận dạng hình ảnh, nhận dạng giọng nói và robot đã
chứng minh sức mạnh dự đoán và tính hữu dụng của chúng trong các ngành
công nghiệp khác nhau. Bạn có thể đã nghe thuật ngữ học sâu. Đây là một loại
mô hình ANN trong đó số lượng lớp giữa các lớp đầu vào và đầu ra là lớn. Nó
được giải thích tốt nhất với sơ đồ sau:

Sơ đồ này cho thấy một trường hợp đơn giản của mô hình ANN với một lớp ẩn.
Các vòng tròn trong sơ đồ này đại diện cho các tế bào thần kinh hoặc nút nhân
tạo, mô hình hóa các tế bào thần kinh đó trong não người. Các mũi tên đại diện
cho cách tín hiệu được truyền từ tế bào thần kinh này sang tế bào thần kinh khác.
Như sơ đồ này cho thấy, một mô hình ANN học bằng cách tìm các mẫu hoặc
trọng lượng của tín hiệu từ mỗi tế bào thần kinh đầu vào đến tế bào thần kinh
trong lớp tiếp theo, dự đoán tốt nhất đầu ra

Loại cụ thể của mô hình ANN mà chúng tôi sẽ thử nghiệm trong các bài tập lập
trình sau đây là mô hình perceptron đa lớp (MLP). Nói một cách đơn giản, mô
hình MLP là một mô hình mạng nơ-ron có ít nhất một hoặc nhiều lớp nút ẩn.
5
Bao gồm một lớp cho đầu vào và một lớp khác cho đầu ra, mô hình MLP bao
gồm ít nhất ba hoặc nhiều lớp nút. Sơ đồ chúng ta vừa xem xét là trường hợp
đơn giản nhất của mô hình MLP, nơi chỉ có một lớp ẩn.

Mô hình ANN có thể được sử dụng trong nhiều lĩnh vực tiếp thị. Sử dụng các mô
hình mạng nơ-ron của BrainMaker, Microsoft đã tăng tỷ lệ phản hồi thư trực tiếp từ
4,9% lên 8,2%. Điều này đã giúp Microsoft mang lại cùng một lượng doanh thu với
chi phí thấp hơn 35%. Tương tự, đối với các vấn đề dự đoán tương tác tiếp thị mà
chúng ta đã thảo luận trong Chương 8, Dự đoán khả năng tham gia tiếp thị, chúng ta
có thể đã sử dụng các mô hình mạng nơ-ron, thay vì các mô hình rừng ngẫu nhiên.
Chúng tôi cũng có thể sử dụng các mô hình mạng nơ-ron cho các vấn đề phân khúc
khách hàng mà chúng tôi đã thảo luận trong Chương 10, Phân khúc khách hàng theo
hướng dữ liệu. Trong các bài tập lập trình sau đây, chúng ta sẽ thảo luận về cách
chúng ta có thể sử dụng các mô hình ANN để dự đoán khách hàng nào có khả năng
rời bỏ.

2.Dự đoán tỷ lệ dời bỏ của khách hàng với python


Trong phần này, chúng ta sẽ thảo luận về cách sử dụng mô hình ANN để dự đoán
những khách hàng có nguy cơ rời đi hoặc những khách hàng có khả năng rời đi cao.
Đến cuối phần này, chúng tôi sẽ xây dựng mô hình dự đoán tỷ lệ rời bỏ của khách
hàng bằng cách sử dụng mô hình ANN. Chúng tôi sẽ chủ yếu sử dụng các gói
pandas, matplotlib và keras để phân tích, trực quan hóa và xây dựng các mô hình
học máy. Đối với những độc giả muốn sử dụng R, thay vì Python, cho bài tập này,
bạn có thể chuyển sang phần tiếp theo.

Đối với bài tập này, chúng tôi sẽ sử dụng một trong những bộ dữ liệu có sẵn công
khai từ cộng đồng IBM Watson Analytics, có thể được tìm thấy tại liên kết này:
https://www.ibm.com/communities/analytics/watson-analytics-blog/predictive-insi
ghts-in-the-telco-customer-churn-data-set/. Bạn có thể theo liên kết này và tải xuống
dữ liệu có sẵn ở định dạng XLSX, có tên là WA_Fn-UseC_-Telco-Customer-
Churn.xlsx. Khi bạn đã tải xuống dữ liệu này, bạn có thể tải nó vào Sổ ghi chép
Jupyter của mình bằng cách chạy lệnh sau:
import pandas as pd

df = pd.read_excel('../data/WA_Fn-UseC_-Telco-Customer-Churn.xlsx')

DataFrame, df, được hiển thị trong ảnh chụp màn hình sau:

6
Có 21 biến trong tập dữ liệu này, trong đó mục tiêu của chúng tôi là dự đoán biến
mục tiêu, Churn.

2.1.Phân tích và chuẩn bị dữ liệu


Như bạn có thể nhận thấy bằng cách xem dữ liệu, có một số điều chúng ta cần làm
trước khi có thể bắt đầu xây dựng các mô hình học máy. Trong phần này, chúng ta
sẽ chuyển đổi các biến liên tục có giá trị tiền tệ và mã hóa biến mục tiêu, Churn,
cũng như các biến phân loại khác. Để làm như vậy, hãy thực hiện các bước sau:

1. Mã hóa biến mục tiêu: Như bạn có thể nhận thấy từ dữ liệu, biến đích, Churn, có hai
giá trị: Có và Không. Chúng ta sẽ mã hóa các giá trị này là 1 cho Có và 0 cho Không.
Mã để mã hóa biến đích trông giống như sau:
df['Churn'] = df['Churn'].apply(lambda x: 1 if x == 'Yes' else 0)

Để có được tỷ lệ tiêu hao tổng thể, bạn chỉ cần chạy mã sau:
df['Churn'].mean()

Đầu ra của mã này là khoảng 0,27, điều này cho thấy rằng khoảng 27%
khách hàng đã khuấy động. Tỷ lệ tiêu hao 27% không phải là một con
số nhỏ; thay vào đó, nó đủ cao để một doanh nghiệp lo lắng về việc
khách hàng tổng thể bị tiêu hao và đưa ra giải pháp để giữ chân những
khách hàng này. Trong phần mô hình hóa sau đây, chúng ta sẽ thảo
7
luận về cách dự đoán những khách hàng có khả năng rời bỏ dữ liệu này
và sử dụng các dự đoán này để giữ chân khách hàng.
2. Xử lý các giá trị bị thiếu trong cột TotalCharges: Nếu bạn đã xem qua cột
TotalCharges trong tập dữ liệu, bạn có thể nhận thấy rằng có một số bản ghi không có
giá trị TotalCharges. Vì chỉ có 11 bản ghi bị thiếu giá trị TotalCharges, chúng ta sẽ chỉ
cần bỏ qua và thả những bản ghi có giá trị bị thiếu đó. Hãy xem đoạn mã sau:

df['TotalCharges'] = df['TotalCharges'].replace(' ',


np.nan).astype(float)

df = df.dropna()

Như bạn có thể nhận thấy từ mã này, chúng tôi chỉ đơn giản là thay thế các
giá trị khoảng trống bằng các giá trị nan. Sau đó, chúng tôi sẽ thả tất cả các
bản ghi có giá trị nan bằng cách sử dụng hàm dropna.

3. Chuyển đổi các biến liên tục: Bước tiếp theo là mở rộng các biến liên tục.
Hãy xem các số liệu thống kê tóm tắt sau đây cho các biến liên tục:

Bạn có thể nhận được các số liệu thống kê tóm tắt này bằng cách sử dụng
mã sau:
df[['tenure', 'MonthlyCharges', 'TotalCharges']].describe()

8
Như bạn có thể thấy từ số liệu thống kê tóm tắt, ba nhiệm
kỳ, MonthlyCharges và TotalCharges biến liên tục đều có
các thang đo khác nhau. Biến nhiệm kỳ, nằm trong khoảng
từ 1 đến 72, trong khi biến TotalCharges , nằm trong
khoảng từ 18.8 đến 8684.8. Các mô hình ANN thường hoạt
động tốt hơn với các tính năng được thu nhỏ hoặc chuẩn
hóa. Hãy xem đoạn mã sau để chuẩn hóa ba tính năng này:
df['MonthlyCharges'] = np.log(df['MonthlyCharges'])
df['MonthlyCharges'] = (df['MonthlyCharges'] -
df['MonthlyCharges'].mean())/df['MonthlyCharges'].std()

df['TotalCharges'] =
np.log(df['TotalCharges']) df['TotalCharges']
= (df['TotalCharges'] -
df['TotalCharges'].mean())/df['TotalCharges'].st
d()

df['tenure'] = (df['tenure'] - df['tenure'].mean())/df['tenure'].std()

Như bạn có thể thấy từ code này, chúng ta áp dụng log-transform trước và
sau đó chuẩn hóa các biến liên tục bằng cách trừ đi giá trị trung bình và
chia các giá trị cho độ lệch chuẩn. Kết quả trông như sau:

Như bạn thấy từ đầu ra này, tất cả các biến hiện có giá trị trung bình
là 0 và độ lệch sta là 1. Chúng tôi sẽ sử dụng các biến chuẩn hóa này
cho việc xây dựng mo trong tương lai.

9
4. Các biến phân loại mã hóa một nóng: Như bạn có thể thấy từ dữ liệu, có
nhiều biến phân loại. Trước tiên chúng ta hãy xem xét số lượng giá trị duy
nhất mà mỗi cột có. Hãy xem đoạn mã sau:
for col in list(df.columns):
print(col,
df[col].nunique())

Bạn có thể sử dụng hàm nunique để đếm số lượng giá trị duy nhất trong
mỗi cột. Đầu ra của mã này trông giống như sau:

Như kết quả đầu ra này cho thấy, có 7032 ID khách hàng duy nhất, 2 giới tính
duy nhất, 3 giá trị duy nhất cho MultipleLines và 6530 giá trị duy nhất cho
TotalCharges. Chúng tôi đã xử lý các biến nhiệm kỳ, MonthlyCharges và
TotalCharges, trong bước trước, vì vậy chúng tôi sẽ tập trung vào các biến đó với
2 đến 4 giá trị duy nhất.
Chúng ta hãy xem xét các bản phân phối của một số biến phân loại này. Trước
tiên, để xem phân phối dữ liệu giữa nam và nữ, bạn có thể sử dụng mã sau để
trực quan hóa:

10
df.groupby('gender').count()['customerID'].plot(
kind='bar', color='skyblue', grid=True, figsize=(8,6), title='Gender'
)
plt.show()

Cốt truyện trông giống như sau:

Như bạn có thể thấy từ biểu đồ thanh này, việc phân phối dữ liệu trên các giới tính
khác nhau được phân phối gần như bằng nhau. Bạn có thể sử dụng cùng một mã để
xem phân phối dữ liệu trên các giá trị khác nhau của InternetService và
PaymentMethod. Hãy xem các ô sau:

11
!InternetService
I
3000

2500

2000 -

1500 -

1000 - -

500 ,
_

0
.
_J
VI
0 0
:0z
!ii
.Cl
LL
lrn ternetse rvi c
e

Payment Metti od
I

2000

1500 •-

1000 ,_ -

500 ,_ -

0
:,,I_
u
:Z:: Q)
11:1 .t=
!; u
B
::,
'-'
"i;
.e
;
'E

u
OJ
rg
u [Ij

i
0

12
Biểu đồ đầu tiên cho thấy sự phân phối dữ liệu trên ba loại khác nhau của biến
InternetService và biểu đồ thứ hai cho thấy sự phân phối dữ liệu trên bốn danh
mục khác nhau của biến PaymentMethod. Như bạn có thể thấy từ các ô này,
chúng ta có thể dễ dàng hình dung và hiểu sự phân phối của các biến phân loại
trông như thế nào bằng cách sử dụng các ô thanh. Chúng tôi khuyên bạn nên vẽ
biểu đồ thanh cho các biến phân loại khác để hiểu rõ hơn về phân phối dữ
liệu.Now, we are going to apply one-hot encoding for these categorical
variables. Take a look at the following code:

dummy_cols = []

sample_set = df[['tenure', 'MonthlyCharges', 'TotalCharges',

'Churn']].copy(deep=True) for col in list(df.columns):


if col not in ['tenure', 'MonthlyCharges', 'TotalCharges',
'Churn'] and df[col].nunique() < 5:
dummy_vars = pd.get_dummies(df[col])
dummy_vars.columns = [col+str(x) for x in
dummy_vars.columns] sample_set =
pd.concat([sample_set, dummy_vars], axis=1)

Như bạn có thể thấy từ code này, chúng ta đang sử dụng hàm get_dummies trong gói
pandas để tạo các biến giả cho mỗi biến categorical. Sau đó, chúng tôi nối các biến
giả mới được tạo này trở lại biến sample_set, sẽ được sử dụng cho các mô hình đào
tạo trong phần sau. Kết quả được hiển thị trong kết quả sau:

Khi bạn đã hoàn thành bốn bước này, đã đến lúc bắt đầu xây dựng các mô hình
ANN để dự đoán tỷ lệ rời bỏ của khách hàng. Chuyển sang phần tiếp theo cho mô
hình ANN

13
2.2.ANN với Kera
Để xây dựng các mô hình ANN bằng Python, chúng ta sẽ sử dụng gói keras, là một
thư viện mạng nơ-ron cấp cao. Để biết thêm chi tiết, chúng tôi khuyên bạn nên truy
cập tài liệu chính thức của họ tại liên kết sau: http s://keras.io/. Trước khi chúng ta
có thể sử dụng gói này để xây dựng các mô hình ANN, chúng ta cần cài đặt hai gói:
tensorflow và keras. Gói keras sử dụng tensorflow làm backend để xây dựng các mô
hình mạng nơ-ron, vì vậy chúng ta cần cài đặt tensorflow trước. Bạn có thể cài đặt
hai gói này bằng cách sử dụng các lệnh pip sau trong Terminal của mình:
pip install
tensorflow pip
install keras

Khi bạn đã cài đặt hai gói này, cuối cùng chúng ta cũng có thể bắt đầu xây
dựng các mô hình mạng nơ-ron đầu tiên của mình. Trong bài tập này, chúng
ta sẽ xây dựng một mô hình mạng nơ-ron với một lớp ẩn. Trước tiên, hãy
xem đoạn mã sau:
from keras.models import
Sequential from keras.layers
import Dense

model = Sequential()
model.add(Dense(16, input_dim=len(features), activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

Chúng ta hãy xem xét kỹ hơn về mã này. Đầu tiên, chúng ta đang sử dụng mô hình
Tuần tự ở đây, đây là loại mô hình trong đó các lớp được xếp chồng lên nhau một
cách tuyến tính và trông tương tự như sơ đồ mà chúng ta đã thấy trong phần trước về
mô hình MLP. Lớp đầu tiên là một lớp đầu vào, trong đó input_dim chỉ đơn giản là
số lượng các tính năng hoặc cột trong tập mẫu và số lượng đơn vị đầu ra là 16.
Chúng ta đang sử dụng chức năng kích hoạt relu cho layer đầu vào này. Sau đó,
trong lớp ẩn, số lượng đơn vị đầu ra là 8 và chức năng kích hoạt được sử dụng là
relu. Cuối cùng, lớp đầu ra có một đơn vị đầu ra, đó là xác suất khách hàng rời bỏ và
chúng tôi sử dụng chức năng kích hoạt sigmoid trong lớp này. Bạn có thể thử
nghiệm với số lượng đơn vị đầu ra và chức năng kích hoạt khác nhau cho bài tập của
mình.
14
Bước cuối cùng để xây dựng một mô hình mạng nơ-ron với gói keras là biên dịch
mô hình này. Hãy xem đoạn mã sau:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

Ở đây, chúng tôi đang sử dụng trình tối ưu hóa adam, đây là một trong những
thuật toán tối ưu hóa phổ biến và được sử dụng thường xuyên nhất. Vì biến mục
tiêu của chúng ta là nhị phân, chúng ta đang sử dụng binary_crossentropy làm
hàm thua lỗ. Cuối cùng, mô hình này sẽ sử dụng số liệu chính xác để đánh giá
hiệu suất mô hình trong quá trình đào tạo.
Trước khi bắt đầu đào tạo mô hình mạng nơ-ron này, chúng ta sẽ cần chia bộ
mẫu của mình thành các bộ đào tạo và thử nghiệm. Hãy xem đoạn mã sau:
from sklearn.model_selection import

train_test_split target_var = 'Churn'


features = [x for x in list(sample_set.columns) if x != target_var]

X_train, X_test, y_train, y_test =


train_test_split( sample_set[features],
sample_set[target_var],
test_size=0.3
)

Như các bạn có thể thấy từ code này, chúng ta đang sử dụng hàm train_test_split
của gói scikit-learn. Đối với bài tập của chúng tôi, chúng tôi sẽ sử dụng 70% bộ
mẫu để đào tạo và 30% để thử nghiệm. Bây giờ chúng ta có thể đào tạo mô hình
mạng nơ-ron của mình bằng cách sử dụng mã sau:
model.fit(X_train, y_train, epochs=50, batch_size=100)

Ở đây, chúng tôi đang sử dụng 100 mẫu làm batch_size, từ đó mô hình sẽ học cách
dự đoán mỗi lần và 50 mẫu là số lượng kỷ nguyên, là số lượng hoàn thành đi qua
toàn bộ bộ đào tạo. Khi bạn chạy mã này, bạn sẽ thấy kết quả đầu ra trông giống như
sau:

15
Như bạn có thể thấy từ đầu ra này, tổn thất thường giảm và độ chính xác (acc) được
cải thiện trong mỗi kỷ nguyên. Tuy nhiên, tốc độ cải thiện hiệu suất mô hình giảm
dần theo thời gian. Như bạn có thể thấy từ đầu ra này, có những cải tiến lớn trong
các biện pháp đo lường tổn thất và độ chính xác trong vài kỷ nguyên đầu tiên và
lượng hiệu suất tăng giảm theo thời gian. Bạn có thể theo dõi quá trình này và quyết
định dừng lại khi mức tăng hiệu suất là tối thiểu.

2.3.Đánh giá mô hình


Bây giờ chúng ta đã xây dựng mô hình mạng nơ-ron đầu tiên của mình, hãy đánh
giá hiệu suất của nó. Chúng ta sẽ xem xét độ chính xác, độ chính xác và khả
năng thu hồi tổng thể, cũng như đường cong và diện tích đặc tính vận hành của
máy thu (ROC) dưới đường cong (AUC). Trước tiên, hãy xem mã sau để biết độ
chính xác, độ chính xác và khả năng nhớ lại của máy tính:

16
from sklearn.metrics import accuracy_score, precision_score, recall_score

in_sample_preds = [round(x[0]) for x in


model.predict(X_train)] out_sample_preds = [round(x[0]) for
x in model.predict(X_test)]

# Accuracy
print('In-Sample Accuracy: %0.4f' % accuracy_score(y_train, in_sample_preds))
print('Out-of-Sample Accuracy: %0.4f' % accuracy_score(y_test,
out_sample_preds))

# Precision
print('In-Sample Precision: %0.4f' % precision_score(y_train, in_sample_preds))
print('Out-of-Sample Precision: %0.4f' % precision_score(y_test,
out_sample_preds))

# Recall
print('In-Sample Recall: %0.4f' % recall_score(y_train, in_sample_preds))
print('Out-of-Sample Recall: %0.4f' % recall_score(y_test,
out_sample_preds))

Bạn nên làm quen với mã này, vì chúng tôi đã sử dụng các chỉ số đánh giá tương tự
trong Chương 8, Dự đoán khả năng tương tác tiếp thị. Đầu ra của mã này trong
trường hợp của chúng ta trông giống như sau:

Do một số tính ngẫu nhiên trong mô hình, kết quả của bạn có thể khác với những
con số này. Như bạn có thể thấy từ đầu ra này, độ chính xác của việc dự đoán liệu
khách hàng có rời bỏ hay không trong bộ thử nghiệm là khoảng 0,79, cho thấy mô
hình là chính xác khoảng 80% thời gian. Độ chính xác ngoài mẫu cho thấy rằng mô
hình là chính xác khoảng 66% thời gian mà nó dự đoán rằng khách hàng sẽ rời bỏ,
và việc thu hồi ngoài mẫu cho thấy rằng mô hình nắm bắt khoảng 52% các trường
hợp rời bỏ.

Tiếp theo, chúng ta có thể tính toán các số AUC, sử dụng mã sau:

17
from sklearn.metrics import roc_curve, auc

in_sample_preds = [x[0] for x in


model.predict(X_train)] out_sample_preds = [x[0] for x
in model.predict(X_test)]

in_sample_fpr, in_sample_tpr, in_sample_thresholds =


roc_curve(y_train, in_sample_preds)
out_sample_fpr, out_sample_tpr, out_sample_thresholds =
roc_curve(y_test, out_sample_preds)

in_sample_roc_auc = auc(in_sample_fpr, in_sample_tpr)


out_sample_roc_auc = auc(out_sample_fpr,
out_sample_tpr)

print('In-Sample AUC: %0.4f' % in_sample_roc_auc)


print('Out-Sample AUC: %0.4f' %
out_sample_roc_auc)

Đầu ra của mã này trông như thế này:

Để trực quan hóa dữ liệu này trong đường cong ROC, bạn có thể sử dụng mã sau:
plt.figure(figsize=(10,7))

plt.plot(
out_sample_fpr, out_sample_tpr, color='darkorange', label='Out-Sample ROC
curve (area = %0.4f)' % in_sample_roc_auc
)
plt.plot(
in_sample_fpr, in_sample_tpr, color='navy', label='In-Sample ROC curve (area =
%0.4f)' % out_sample_roc_auc
)
plt.plot([0, 1], [0, 1], color='gray', lw=1,
linestyle='--') plt.grid()
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive
Rate') plt.ylabel('True Positive
Rate') plt.title('ROC Curve')
plt.legend(loc="lower right")

plt.show()

Và đầu ra trông như thế này:

18
Cùng với các biện pháp chính xác, chính xác và thu hồi mà chúng tôi đã xem xét
trước đây, AUC và đường cong ROC cũng gợi ý rằng mô hình nắm bắt và dự đoán
những khách hàng có nguy cơ rời bỏ khá tốt. Như bạn có thể thấy từ các kết quả
đánh giá này, tốt hơn là sử dụng đầu ra của mô hình này để xác định những khách
hàng có khả năng rời bỏ hơn là chỉ đơn giản là đoán xem họ sẽ là ai. Bằng cách tập
trung vào những khách hàng có xác suất rời bỏ cao từ mô hình này trong các chiến
lược tiếp thị của mình, bạn có thể cố gắng giữ chân những khách hàng đó với rủi ro
rời bỏ theo cách hiệu quả hơn về chi phí.

The full code for this exercise can be found in this repository: https://github.com/yoonhwang/hand s-on-data-

science-for-marketing/blob/master/ch.11/python/CustomerRetention.ipynb.

3.Dự đoán sự rời bỏ của khách hàng với R


Trong phần này, chúng ta sẽ thảo luận về cách sử dụng mô hình ANN để dự đoán
những khách hàng có nguy cơ rời đi hoặc những khách hàng có nhiều khả năng
rời đi. Đến cuối phần này, chúng ta sẽ xây dựng mô hình dự đoán rời bỏ khách
19
hàng bằng cách sử dụng mô hình ANN. Chúng tôi sẽ chủ yếu sử dụng các thư
viện dplyr, ggplot2 và keras để phân tích, trực quan hóa và xây dựng các mô hình
học máy. Đối với những độc giả muốn sử dụng Python, thay vì R, cho bài tập
này, hãy xem phần trước.
Đối với bài tập này, chúng tôi sẽ sử dụng một trong những bộ dữ liệu có sẵn công
khai từ cộng đồng IBM Watson Analytics, có thể được tìm thấy tại liên kết này:
https://www.ibm.com/communities/analytics/watson-analytics-blog/predictive-
insi ghts-in-the-telco-customer-churn-data-set/. Bạn có thể theo liên kết này và tải
xuống dữ liệu, có sẵn ở định dạng XLSX, có tên WA_Fn-UseC_- Telco-
Customer-Churn.xlsx. Khi bạn đã tải xuống dữ liệu này, bạn có thể tải nó vào môi
trường RStudio của mình ...:
library(readxl)

#### 1. Load Data


#### df <-
read_excel(
path="~/Documents/data-science-for-marketing/ch.11/data/WA_Fn-UseC_-Telco-
Customer-Churn.xlsx"
)

DataFrame, df, sẽ trông như trong ảnh chụp màn hình sau:

Có 21 biến trong tập dữ liệu này, trong đó mục tiêu của chúng tôi là dự đoán biến
mục tiêu, Churn.

3.1.Phân tích và chuẩn bị dữ liệu

20
Như bạn có thể nhận thấy khi nhìn vào dữ liệu, có một số điều chúng ta cần làm
trước khi bắt đầu xây dựng các mô hình máy học. Trong phần này, chúng ta sẽ
chuyển đổi các biến liên tục có giá trị tiền tệ và mã hóa biến đích, Churn, cũng
như các biến phân loại khác. Để làm như vậy, hãy thực hiện các bước sau:

1. Xử lý các giá trị bị thiếu trong dữ liệu: Nếu bạn đã xem qua cột TotalCharges
trong tập dữ liệu, bạn có thể nhận thấy rằng có một số bản ghi không có giá trị
TotalCharges. Vì chỉ có 11 bản ghi có giá trị TotalCharges bị thiếu, chúng tôi
sẽ đơn giản bỏ qua và bỏ những bản ghi có giá trị bị thiếu. Hãy xem đoạn mã
sau:
i. library(tidyr)

ii. df <- df %>% drop_na()

Như bạn có thể nhận thấy từ mã này, chúng tôi đang sử dụng hàm
drop_na trong gói tidyr, hàm này sẽ loại bỏ tất cả các bản ghi có
giá trị NA.

2. Biến phân loại: Như bạn có thể thấy từ dữ liệu, có nhiều biến phân loại.
Trước tiên, chúng ta hãy xem xét số lượng giá trị duy nhất mà mỗi cột có. Hãy
xem đoạn mã sau:
apply(df, 2, function(x) length(unique(x)))

Bạn có thể sử dụng hàm duy nhất để nhận các giá trị duy nhất trong mỗi
cột. Bằng cách áp dụng hàm này trên tất cả các cột trong df, đầu ra của
mã này trông giống như sau:

21
Như kết quả đầu ra này cho thấy, có 7032 ID khách hàng duy nhất, 2 giá
trị duy nhất về giới tính duy nhất cho MultipleLine và 6530 giá trị duy
nhất cho TotalCharges.
Các biến tenure, MonthlyCharges và TotalCharges, là các biến liên tục,
mỗi biến có thể lấy bất kỳ giá trị nào và phần còn lại là các biến phân loại.
Chúng ta sẽ xem xét các bản phân phối của một số biến phân loại này.
Đầu tiên, để xem sự phân bố dữ liệu giữa nam và nữ có thể sử dụng mã
sau để trực quan hóa:

ggplot(df %>% group_by(gender) %>%


summarise(Count=n()), aes(x=gender, y=Count)) +
geom_bar(width=0.5,
stat="identity") + ggtitle('') +
xlab("Gender")
+
ylab("Count")
+
theme(plot.title = element_text(hjust = 0.5))

Cốt truyện trông như thế này:

22
As you can see from this bar plot, the distribution of the data across the
two genders is roughly equally distributed. You can use the same code to
view th distribution of the data across different values of InternetService
and PaymentMet Take a look at the following plots:

23
3000-

2000-

1000 -

o-
D S' L Fibe r' optic
I

No

Inte rnet Serviice

24
Biểu đồ đầu tiên cho thấy sự phân bố dữ liệu trên ba categor khác nhau biến
InternetService và biểu đồ thứ hai cho thấy sự phân bố của d trên bốn loại
khác nhau của biến PaymentMethod. Như bạn có thể thấy f các ô này, chúng
ta có thể dễ dàng hình dung và hiểu các phân bố của các biến phân loại
trông như thế nào bằng cách sử dụng các ô thanh. Chúng tôi khuyên bạn nên
vẽ biểu đồ cho các biến phân loại khác để hiểu rõ hơn về phân phối dữ liệu.

3. Biến đổi và mã hóa: Bước tiếp theo là biến đổi các biến liên tục và mã hóa
các biến phân loại lớp nhị phân. Hãy xem đoạn mã sau:
# Binary & Continuous
Vars sampleDF <- df %>
%
select(tenure, MonthlyCharges, TotalCharges, gender,
Partner, Dependents, PhoneService, PaperlessBilling,
Churn) %>%
mutate(
# transforming continuous vars
tenure=(tenure -
mean(tenure))/sd(tenure),
MonthlyCharges=(log(MonthlyCharges) -
mean(log(MonthlyCharges)))/sd(log(MonthlyCharges)),
TotalCharges=(log(TotalCharges) -
mean(log(TotalCharges)))/sd(log(TotalCharges)),

# encoding binary categorical vars


gender=gender %>% as.factor() %>% as.numeric()
- 1, Partner=Partner %>% as.factor() %>%
as.numeric() - 1,
Dependents=Dependents %>% as.factor() %>% as.numeric() - 1,
PhoneService=PhoneService %>% as.factor() %>% as.numeric() -
1, PaperlessBilling=PaperlessBilling %>% as.factor() %>%
as.numeric() - 1,
Churn=Churn %>% as.factor() %>% as.numeric() - 1
)

Như bạn có thể thấy từ mã này, chúng tôi chỉ đơn giản là mã hóa các biến đó chỉ với
hai danh mục, giới tính, Đối tác, Người phụ thuộc, PhoneService, PaperlessBilling
và Churn, với 0s và 1s. Sau đó, chúng tôi áp dụng chuyển đổi log cho hai biến liên
tục có giá trị tiền tệ là MonthlyCharges và TotalCharges. Ngoài ra, chúng tôi chuẩn
hóa cả ba biến liên tục, tenure, MonthlyCharges và TotalCharges, sao cho các biến
này tập trung vào khoảng 0 và có độ lệch chuẩn là 1. Điều này là do các mô hình
ANN thường hoạt động tốt hơn với các tính năng được chia tỷ lệ hoặc chuẩn hóa.
Sau khi biến đổi, phân phối của ba biến liên tục này trông như trong ảnh chụp màn
hình sau:
25
Như bạn có thể thấy, phương tiện của ba biến đổi này là 0 và độ lệch
chuẩn là 1. Trong khi đó, trước khi biến đổi này, các bản phân phối trông
giống như sau:

4. Biến phân loại mã hóa một nóng: Có một tập hợp các biến cuối cùng
chúng ta cần chuyển đổi: các biến phân loại nhiều lớp có ba hoặc nhiều
loại. Chúng ta sẽ áp dụng mã hóa một nóng và tạo các biến giả cho các
biến này. Hãy xem đoạn mã sau:
# Dummy vars
#
install.packages('dummies')
library(dummies)

sampleDF <- cbind(sampleDF, dummy(df$MultipleLines, sep="."))


names(sampleDF) = gsub("sampleDF", "MultipleLines",
names(sampleDF))

Như các bạn có thể thấy từ code này, chúng ta đang sử dụng thư viện
dummies để tạo ra các biến giả. Sử dụng chức năng giả của gói này,
26
chúng ta có thể áp dụng mã hóa một nóng và tạo các biến giả cho mỗi
biến phân loại nhiều lớp. Vì hàm giả thêm sampleDF vào tên của các biến
giả mới được tạo, chúng ta có thể thay thế nó bằng tên biến tương ứng
bằng cách sử dụng hàm gsub. Chúng ta sẽ áp dụng cùng một logic cho
phần còn lại của các biến phân loại, như được hiển thị trong code sau:
sampleDF <- cbind(sampleDF, dummy(df$InternetService, sep="."))
names(sampleDF) = gsub("sampleDF", "InternetService",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$OnlineSecurity, sep="."))


names(sampleDF) = gsub("sampleDF", "OnlineSecurity",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$OnlineBackup, sep="."))


names(sampleDF) = gsub("sampleDF", "OnlineBackup",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$DeviceProtection, sep="."))


names(sampleDF) = gsub("sampleDF", "DeviceProtection",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$TechSupport, sep="."))


names(sampleDF) = gsub("sampleDF", "TechSupport",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$StreamingTV, sep="."))


names(sampleDF) = gsub("sampleDF", "StreamingTV",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$StreamingMovies, sep="."))


names(sampleDF) = gsub("sampleDF", "StreamingMovies",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$Contract, sep="."))


names(sampleDF) = gsub("sampleDF", "Contract",
names(sampleDF))

sampleDF <- cbind(sampleDF, dummy(df$PaymentMethod, sep="."))


names(sampleDF) = gsub("sampleDF", "PaymentMethod",
names(sampleDF))

Kết quả được hiển thị trong đầu ra sau:

Khi bạn đã hoàn thành bốn bước này, đã đến lúc bắt đầu xây dựng các mô hình
ANN cho các dự đoán rời bỏ của khách hàng. Chuyển sang phần tiếp theo cho mô
27
hình ANN!

28
3.2.ANN với Keras

Để xây dựng các mô hình ANN trong R, chúng ta sẽ sử dụng gói keras, là một thư
viện mạng nơ-ron cấp cao. Để biết thêm chi tiết, chúng tôi khuyên bạn nên truy cập
tài liệu chính thức của họ tại liên kết sau: https://keras.io/. Trước khi chúng ta có
thể sử dụng gói này để xây dựng các mô hình ANN, chúng ta cần cài đặt hai thư
viện: tensorflow và keras. Gói keras sử dụng tensorflow làm backend để xây dựng
các mô hình mạng nơ-ron, vì vậy chúng ta cần cài đặt tensorflow trước. Bạn có thể
cài đặt hai gói này bằng các lệnh sau trong RStudio của mình:
install.packages("devtools")
devtools::install_github("rstudio/tensorflow")
library(tensorflow)
install_tensorflow()

devtools::install_github("rstudio/keras")
library(keras)
install_keras()

Khi bạn đã cài đặt hai thư viện này, cuối cùng chúng ta có thể bắt đầu xây dựng
các mô hình mạng nơ-ron đầu tiên của mình. Trong bài tập này, chúng ta sẽ xây
dựng một mô hình mạng nơ-ron với một lớp ẩn. Trước tiên, hãy xem đoạn mã
sau:
model <-
keras_model_sequential() model
%>%
layer_dense(units = 16, kernel_initializer = "uniform", activation =
'relu', input_shape=ncol(train)-1) %>%
layer_dense(units = 8, kernel_initializer = "uniform", activation = 'relu') %>
% layer_dense(units = 1, kernel_initializer = "uniform", activation =
'sigmoid')
%>%
compile(
optimizer = 'adam',
loss =
'binary_crossentropy',
metrics = c('accuracy')
)

Chúng ta hãy xem xét kỹ hơn về mã này. Đầu tiên, chúng ta đang xây dựng một
mô hình Tuần tự ở đây, keras_model_sequential, đây là loại mô hình trong đó
các lớp được xếp chồng lên nhau một cách tuyến tính và trông tương tự như sơ
đồ mà chúng ta đã thấy trong phần trước về mô hình MLP. Lớp đầu tiên,
layer_dense, là một lớp đầu vào, trong đó input_shape chỉ đơn giản là số lượng
29
tính năng hoặc cột trong bộ mẫu và số lượng đơn vị đầu ra là 16.

Chúng tôi đang sử dụng chức năng kích hoạt relu cho lớp đầu vào này. Sau đó,
trong lớp ẩn, số lượng đơn vị đầu ra là 8 và chức năng kích hoạt được sử dụng là
relu. Cuối cùng, lớp đầu ra có một đơn vị đầu ra, đó là xác suất rời bỏ của khách
hàng và chúng tôi sử dụng chức năng kích hoạt sigmoid trong lớp này. Bạn có
thể thử nghiệm với số lượng đơn vị đầu ra và chức năng kích hoạt khác nhau cho
bài tập của mình. Cuối cùng, chúng ta cần biên dịch mô hình này, sử dụng hàm
compile. Ở đây, chúng tôi đang sử dụng trình tối ưu hóa adam, đây là một trong
những opti được sử dụng thường xuyên nhất ...

Trước khi bắt đầu đào tạo mô hình mạng nơ-ron này, chúng ta sẽ cần chia bộ
mẫu của mình thành các bộ huấn luyện và thử nghiệm. Hãy xem đoạn mã sau:
library(caTools)

sample <- sample.split(sampleDF$Churn, SplitRatio = .7)

train <- as.data.frame(subset(sampleDF, sample ==


TRUE)) test <- as.data.frame(subset(sampleDF, sample ==
FALSE))

trainX <- as.matrix(train[,names(train) !=


"Churn"]) trainY <- train$Churn
testX <- as.matrix(test[,names(test) !=
"Churn"]) testY <- test$Churn

Như các bạn có thể thấy từ code này, chúng ta đang sử dụng hàm sample.split
của package caTools. Đối với bài tập của chúng tôi, chúng tôi sẽ sử dụng 70%
bộ mẫu để đào tạo và 30% cho thử nghiệm. Bây giờ chúng ta có thể đào tạo mô
hình mạng nơ-ron của mình bằng cách sử dụng code sau:
history <- model %>%
fit( trainX,
trainY,
epochs =
50,
batch_size = 100,
validation_split = 0.2
)

:Ở đây, chúng tôi đang sử dụng 100 mẫu làm batch_size, từ đó mô hình sẽ học cách
dự đoán mọi lúc và 50 mẫu là số lượng kỷ nguyên, là số lần hoàn thành đi qua toàn
bộ bộ đào tạo. Khi bạn chạy mã này, bạn sẽ thấy kết quả sau

30
Như bạn có thể thấy từ đầu ra này, tổn thất thường giảm và độ chính xác (acc) được
cải thiện trong mỗi kỷ nguyên. Tuy nhiên, tỷ lệ cải thiện hiệu suất mô hình giảm dần
theo thời gian. Như bạn có thể thấy từ đầu ra này, có những cải tiến lớn trong các
biện pháp đo lường tổn thất và độ chính xác trong một vài kỷ nguyên đầu tiên và
mức tăng hiệu suất giảm dần theo thời gian. Bạn có thể theo dõi quá trình này và
quyết định dừng lại khi mức tăng hiệu suất là tối thiểu.

3.3.Đánh giá mô hình

Bây giờ chúng ta đã xây dựng mô hình mạng nơ-ron đầu tiên của mình, hãy
đánh giá hiệu suất của nó. Chúng ta sẽ xem xét độ chính xác, độ chính xác và
khả năng thu hồi tổng thể, cũng như đường cong ROC và AUC. Trước tiên,
hãy xem mã sau để biết độ chính xác, độ chính xác và khả năng nhớ lại của
máy tính:
# Evaluating ANN model
inSamplePreds <- as.double(model %>% predict_classes(trainX))
outSamplePreds <- as.double(model %>% predict_classes(testX))

# - Accuracy, Precision, and Recall


inSampleAccuracy <- mean(trainY == inSamplePreds)
outSampleAccuracy <- mean(testY == outSamplePreds)
print(sprintf('In-Sample Accuracy: %0.4f', inSampleAccuracy))
print(sprintf('Out-Sample Accuracy: %0.4f', outSampleAccuracy))

inSamplePrecision <- sum(inSamplePreds & trainY) / sum(inSamplePreds)


outSamplePrecision <- sum(outSamplePreds & testY) / sum(outSamplePreds)
print(sprintf('In-Sample Precision: %0.4f', inSamplePrecision))
print(sprintf('Out-Sample Precision: %0.4f', outSamplePrecision))

inSampleRecall <- sum(inSamplePreds & trainY) / sum(trainY)

31
outSampleRecall <- sum(outSamplePreds & testY) / sum(testY)
print(sprintf('In-Sample Recall: %0.4f', inSampleRecall))
print(sprintf('Out-Sample Recall: %0.4f', outSampleRecall))

Bạn nên làm quen với mã này, vì chúng tôi đã sử dụng các chỉ số đánh giá
tương tự trong Chương 8, Dự đoán khả năng tương tác tiếp thị. Đầu ra của
mã này trong trường hợp của chúng ta trông giống như sau:

Do một số tính ngẫu nhiên trong mô hình, kết quả của bạn có thể khác với những
con số này. Như bạn có thể thấy từ đầu ra này, độ chính xác của việc dự đoán liệu
khách hàng có rời bỏ hay không trong bộ thử nghiệm là khoảng 0.83, cho thấy mô
hình là chính xác khoảng 83% thời gian. Độ chính xác ngoài mẫu cho thấy rằng mô
hình là chính xác khoảng 72% thời gian nó dự đoán rằng khách hàng sẽ rời bỏ, và
việc thu hồi ngoài mẫu cho thấy rằng mô hình nắm bắt khoảng 58% các trường hợp
rời bỏ.

Tiếp theo, chúng ta có thể tính toán AUC và vẽ đường cong ROC, sử dụng mã sau:
# - ROC & AUC
library(ROCR)

outSamplePredProbs <- as.double(predict(model, testX))

pred <- prediction(outSamplePredProbs, testY)


perf <- performance(pred, measure = "tpr", x.measure = "fpr")
auc <- performance(pred, measure='auc')@y.values[[1]]

plot(
perf,
main=sprintf('Model ROC Curve (AUC: %0.2f)', auc),
col='darkorange',
lwd=2
) + grid()
abline(a = 0, b = 1, col='darkgray', lty=3, lwd=2)

Và đầu ra trông giống như sau:

32
Cùng với các biện pháp chính xác, chính xác và thu hồi mà chúng tôi đã xem xét
trước đây, AUC và đường cong ROC cũng gợi ý rằng mô hình nắm bắt và dự đoán
những khách hàng có nguy cơ rời bỏ khá tốt. Như bạn có thể thấy từ các kết quả
đánh giá này, tốt hơn là sử dụng đầu ra của mô hình này để xác định những khách
hàng có khả năng rời bỏ hơn là chỉ đơn giản là đoán xem họ sẽ là ai. Bằng cách tập
trung vào những khách hàng có xác suất rời bỏ cao từ mô hình này trong các chiến
lược tiếp thị của mình, bạn có thể cố gắng giữ chân những khách hàng đó trước rủi
ro rời bỏ theo cách hiệu quả hơn về chi phí.

4.Tóm tắt
Trong chương này, chúng ta đã tìm hiểu về tỷ lệ rời bỏ và giữ chân khách hàng.
Chúng tôi đã thảo luận về lý do tại sao khách hàng rời bỏ làm tổn thương các doanh
nghiệp. Cụ thể hơn, chúng tôi đã học được cách giữ chân khách hàng hiện tại ít tốn
kém hơn nhiều so với việc có được khách hàng mới. Chúng tôi đã chỉ ra một số lý
do phổ biến khiến khách hàng rời khỏi công ty, chẳng hạn như dịch vụ khách hàng
kém, không tìm thấy đủ giá trị trong sản phẩm hoặc dịch vụ, thiếu thông tin liên lạc
và thiếu lòng trung thành của khách hàng. Để hiểu lý do tại sao khách hàng rời đi,
chúng tôi có thể tiến hành khảo sát hoặc phân tích dữ liệu khách hàng để hiểu rõ hơn
về nhu cầu và điểm khó khăn của họ. Chúng tôi cũng đã thảo luận về cách chúng tôi
33
có thể đào tạo các mô hình ANN để xác định những khách hàng có nguy cơ khuấy
động. Thông qua các bài tập lập trình, chúng tôi đã học được cách sử dụng thư viện
keras để xây dựng và đào tạo các mô hình ANN bằng Python và R.

Trong chương tiếp theo, chúng ta sẽ tìm hiểu về thử nghiệm A / B và cách nó có thể
được sử dụng để xác định chiến lược tiếp thị tốt nhất trong số các tùy chọn khác
nhau. Chúng ta sẽ thảo luận về cách tính toán ý nghĩa thống kê trong python và R để
giúp các nhà tiếp thị quyết định nên chọn chiến lược tiếp thị nào trong số các ý
tưởng khác nhau.

34

You might also like