Áp dụng Deep Learning để dự báo kết quả tiếp cận thành công một campaign quảng cáo

Bài viết này mình thử dùng thuật toán Artificial Neural Network (ANN) để xử lí một tệp dữ liệu marketing đơn giản, mục đích thử phân loại xem hành vi Yes/No của người dùng trong dataset có những yếu tố nào ảnh hưởng, cũng như thử build một mô hình dự báo bằng Deep Learning. Mô hình cho ra kết quả với độ chính xác accuracy (test data) = 90.8% - Final loss (Test data): 0.2293

Quan sát kết quả EDA label tổng quát trong data này:

  • Nhận thấy có tỉ lệ thành công tốt đặc biệt với poutcome = success(yếu tố này cho biết là campaign trước thành công là dấu hiệu cho tỉ lệ thành công lần này cũng cao)
  • Người thất nghiệp và đã nghỉ hưu lại có tỉ lệ tiếp cận thành công cao hơn các job khác
  • Người không vay nợ lại có tỉ lệ tiếp cận thành công tốt hơn người có vay nợ.
  • Người tốt nghiệp đại học có tỉ lệ tiếp cận thành công hơn những người mới có bằng primary hay secondary
  • Người độc thân có tỉ lệ tiếp cận thành công hơn người đã có gia đình
  • Người không có nhà có tỉ lệ tiếp cận thành công hơn người có nhà
  • Tiếp cận bằng thiết bị di động có tỉ lệ tiếp cận thành công hơn người dùng các phương tiện khác

Đây là bộ dữ liệu marketing ngân hàng trong Kho dữ liệu Machine Learning của UCI (https://archive.ics.uci.edu/ml/index.php). Trong dữ liệu có các sub dữ liệu là: nhân khẩu học, thông tin vay nợ và thông tin chăm sóc khách hàng (CRM) theo thời gian. Tổng cộng 17 đặc tính và 45000 kết quả ghi nhận.

Noted: Kiến thức người viết hạn hẹp, cũng như mô hình này mắc một problem là chưa xử lí dữ liệu unbalance tỉ lệ 8:1 nên mình chọn ngưỡng baseline là 88.88%, do đó chỉ mang tính chất tham khảo học thuật là chính. Trong bài mình cũng không reScale lại data trong quá trình tiền xử lí dữ liệu.

kết nối bạn bè và trao đổi học tập:

Quan sát qua bảng dữ liệu

Nguồn data chính xác: http://archive.ics.uci.edu/ml/datasets/bank+marketing

Mục tiêu: phân loại Yes/No (feature 'y' trong dataset) những người có thực hiện ý đồ của campaign marketing (ví dụ mua hàng, vay tiền, sử dụng coupon)

Đây là bộ dữ liệu marketing ngân hàng trong Kho dữ liệu Machine Learning của UCI (https://archive.ics.uci.edu/ml/index.php). Bộ dữ liệu cung cấp thông tin về một chiến dịch tiếp thị của một tổ chức tài chính. Nhiệm vụ phân tích trong vấn đề này là để tìm cách tìm kiếm các chiến lược trong tương lai nhằm cải thiện các chiến dịch tiếp thị trong tương lai cho ngân hàng.

Các yếu tố (Feature) trong dữ liệu bao gồm:

  • age: tuổi của người tiếp cận
  • job: nghề nghiệp bao gồm admin, blue-collar, entrepreneur, housemaid, management, retired, self-employed, services, student, technician, unemployed
  • marital: tình trạng hôn nhân bao gồm: married, single, divorced
  • education: trình độ học vấn hiện tại bao gồm primary,secondary,tertiary (đại học)
  • balance: Số tiền trên tài khoản giao dịch bao gồm tất cả các giao dịch đầy đủ và hoàn chỉnh cũng như các hoạt động phi thương mại như nạp và rút tiền.
  • housing: có nhà hay chưa
  • loan: có vay hay không
  • day: ngày campaign tiếp cận gần nhất (ngày mấy của tháng, số kéo dài từ 1 đến 31 ngày)
  • month: tháng campaign tiếp cận gần nhất của năm (phân loại: 'jan', 'feb', ' mar ', ...,' nov ',' dec ')
  • contact: loại phương tiện liên lạc (phân loại: 'di động', 'điện thoại')
  • duration: thời lượng liên lạc cuối cùng, tính bằng giây.
  • campaign: số thứ tự chiến dịch
  • pday: số ngày trôi qua sau khi khách hàng được liên hệ lần cuối từ chiến dịch trước đó
  • previous: số lượng liên hệ được thực hiện trước chiến dịch này và cho khách hàng này
  • poutcome: kết quả của chiến dịch tiếp thị trước đó (phân loại: 'thất bại', 'không tồn tại', 'thành công')
In [2]:
eda = pd.read_csv(r"https://raw.githubusercontent.com/cafechungkhoan/chu_gia/master/bank%20marketing.csv",delimiter=';')
eda = pd.DataFrame(eda)
eda
Out[2]:
agejobmaritaleducationdefaultbalancehousingloancontactdaymonthdurationcampaignpdayspreviouspoutcomey
058managementmarriedtertiaryno2143yesnounknown5may2611-10unknownno
144techniciansinglesecondaryno29yesnounknown5may1511-10unknownno
233entrepreneurmarriedsecondaryno2yesyesunknown5may761-10unknownno
347blue-collarmarriedunknownno1506yesnounknown5may921-10unknownno
433unknownsingleunknownno1nonounknown5may1981-10unknownno
......................................................
4520651technicianmarriedtertiaryno825nonocellular17nov9773-10unknownyes
4520771retireddivorcedprimaryno1729nonocellular17nov4562-10unknownyes
4520872retiredmarriedsecondaryno5715nonocellular17nov112751843successyes
4520957blue-collarmarriedsecondaryno668nonotelephone17nov5084-10unknownno
4521037entrepreneurmarriedsecondaryno2971nonocellular17nov361218811otherno

45211 rows × 17 columns

Xử lí tiền dữ liệu

Mình xử lí bằng cách Drop các feature thiếu trên 30% dữ liệu, còn lại loại bỏ các hàng chứa dữ liệu thiếu dropna()

Mình trực quan dữ liệu thiếu bằng 'Missing Value Heatmaps'. Nếu chưa biết dạng chart bên dưới có thể đọc thêm về (Missing Value Heatmaps). Nó cho biết dữ liệu thiếu nằm tại vị trí nào của dataset https://dev.to/tomoyukiaota/visualizing-the-patterns-of-missing-value-occurrence-with-python-46dj

In [61]:

In [7]:
target = 'y'

Giai đoạn exploratory data analysis (EDA) đầu vào

Đây là loại dữ liệu không cân bằng. Tuy nhiên, dữ liệu không cân bằng trong marketing là chuyện thường thấy, như số lượng click / không click trong một lượng tiếp cận, số lượng churn / not churn,... Problem về dữ liệu không cân bằng mình tìm hiểu nhiều, nhưng vẫn chưa có một phương pháp thỏa đáng xử lí. Hơn nữa cũng chưa thấy có report nào nói về tỉ lệ không cân bằng là bao nhiêu (trường hợp trong bài viết này là 8:1)

EDA sơ bộ những ý tưởng của mình trả lời những câu hỏi sau:

  • Có sự khác biệt nào giữa người mua / không mua dựa vào tuổi hay không?
  • Có sự khác biệt nào giữa người mua / không mua dựa vào yếu tố nghề nghiệp không?
  • Có sự khác biệt nào giữa người mua / không mua dựa vào yếu tố học vấn không?
  • Có tính chất gì lạ trong dữ liệu không?

Quan sát trước về các ditribution Numeric Feature

In [36]:
import hieu_viet_code_ne
In [5]:
eda = pd.read_csv(r"https://raw.githubusercontent.com/cafechungkhoan/chu_gia/master/bank%20marketing.csv",delimiter=';')
yes = eda[eda.y=='yes']
no = eda[eda.y=='no']
plt.figure(figsize=(12,8))
sns.set_style("darkgrid")
plt.title("Quan sát phân phối xác suất giữa Yes và No của Feature age, không thấy sự khác biệt đáng kể",{'fontsize': 15})
a = sns.kdeplot(data=yes['age'], label="yes", shade=True)
b = sns.kdeplot(data=no['age'],label="no" ,shade=True)
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
In [25]:

<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
In [24]:

<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>
<IPython.core.display.Javascript object>

PCA & EDA tổng quát các label Feature

In [64]:

Target looks like classification
Linear Discriminant Analysis training set score: 0.613