Bằng cách sử dụng các mô hình chúng ta đã xây dựng trong các bài viết trước, chúng ta có thể dễ dàng phân khúc khách hàng và dự đoán giá trị lâu dài (LTV) của họ cho các mục đích nhắm vào mục tiêu.
Ngoài ra, chúng ta cũng biết con số bán hàng của chúng ta sẽ là bao nhiêu. Nhưng làm thế nào chúng ta có thể tăng doanh số bán hàng của mình lên? Nếu hôm nay chúng ta giảm giá, chúng ta nên mong đợi sẽ có bao nhiêu khách hàng mua hàng cho hôm nay?
Phân khúc khách hàng và thực hiện các thử nghiệm A / B cho phép chúng ta thử nhiều ý tưởng khác nhau để tạo ra doanh số bán hàng gia tăng. Đây là một trong những nền tảng của Growth Hacking. Bạn cần phải lý tưởng hóa và thử nghiệm liên tục để tìm ra cơ hội phát triển.
Việc tách khách hàng và chúng ta sẽ gửi phiếu mua hàng thành các nhóm sẽ giúp chúng ta tính toán được lợi nhuận gia tăng.
Hãy xem ví dụ dưới đây:
Trong thiết lập này, nhóm mục tiêu sẽ được chia thành ba nhóm để chúng ta có thể tìm ra câu trả lời cho các câu hỏi dưới đây:
1. Việc đưa ra phiếu mua hàng có làm tăng chuyển đổi không?
2. Nếu có, loại ưu đãi nào là tốt nhất? Giảm giá hay mua một tặng một?
Giả sử các kết quả có ý nghĩa thống kê, thì giảm giá (Nhóm A) có vẻ tốt nhất vì nó đã tăng chuyển đổi lên 3% so với nhóm kiểm soát và lại mang thêm 1% chuyển đổi so với mua một tặng một.
Nhưng áp dụng vào thực tế cuộc sống thì nó phức tạp hơn rất nhiều. Một số ưu đãi hoạt động tốt hơn trên các phân đoạn cụ thể. Vì vậy, bạn cần tạo một danh mục chào hàng cho các phân khúc đã chọn, bạn không thể coi chuyển đổi là tiêu chí duy nhất của thành công.
Luôn có sự đánh đổi chi phí vì tỷ lệ chuyển đổi sẽ tỷ lệ thuận với chi phí, vì thếkhi tỷ lệ chuyển đổi tăng lên thì chi phí cũng sẽ tăng theo. Đó là lý do tại sao đôi khi bạn cần chọn một phiếu mua hàng thân thiện với chi phí nhưng mang lại ít chuyển đổi hơn.
Bây giờ chúng ta sẽ biết ưu đãi nào hoạt động tốt hơn so với những ưu đãi khác nhờ vào cuộc thử nghiệm dưới đây. Nhưng so với việc chúng ta dự đoán thì sao? Nếu chúng ta có thể dự đoán được hiệu quả của việc đưa ra đề nghị, chúng ta có thể dễ dàng tối đa hóa các giao dịch của mình và có một dự báo tốt về chi phí.
Mô hình đáp ứng thị trường sẽ giúp chúng ta xây dựng được khuôn khổ này, nhưng có nhiều cách để làm điều đó vì thế chúng ta có thể nhóm chúng thành hai dạng sau:
- Nếu bạn không có một nhóm kiểm soát (hãy tưởng tượng bạn đã thực hiện một chương trình khuyến mãi mở cho mọi người và thông báo nó trên các phương tiện truyền thông xã hội) nhưng khi làm điều đó thì bạn không thể tính được mức tăng dần.
Vì thế, đối với tình huống này, tốt hơn hết bạn nên xây dựng một mô hình hồi quy dự đoán doanh số bán hàng tổng thể. Giả định trước đó là mô hình sẽ cung cấp doanh số bán hàng cao hơn trong những ngày khuyến mãi.
Để xây dựng loại mô hình này, tập dữ liệu của bạn phải bao gồm số ngày bán hàng khuyến mãi và không khuyến mãi để mô hình machine learning có thể tính toán ra một con số cụ thể.
- Nếu bạn có một nhóm kiểm soát, bạn có thể xây dựng mô hình phản hồi dựa trên phân đoạn hoặc cấp độ cá nhân. Đối với cả hai người trong số họ, giả định là như nhau.
Đưa ra một đề nghị sẽ làm tăng xác suất chuyển đổi. Xác suất chuyển đổi của các cá nhân tăng lên sẽ mang lại cho chúng ta chuyển đổi gia tăng.
Hãy bắt đầu viết mã và xem cách chúng ta có thể xây dựng một mô hình phản hồi cấp độ cá nhân. Trong ví dụ này, chúng ta sẽ sử dụng tập dữ liệu tiếp thị nhưng tôi đã thực hiện một số thay đổi để làm cho nó phù hợp hơn với trường hợp của chúng ta.
from datetime import datetime, timedelta,date
import pandas as pd
%matplotlib inline
from sklearn.metrics import classification_report,confusion_matrix
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from __future__ import division #must if you use python 2
from sklearn.cluster import KMeans
import plotly.plotly as py
import plotly.offline as pyoff
import plotly.graph_objs as go
import sklearn
import xgboost as xgb
from sklearn.model_selection import KFold, cross_val_score, train_test_split
#initate plotly
pyoff.init_notebook_mode()
#function for ordering cluster numbers for given criteria
def order_cluster(cluster_field_name, target_field_name,df,ascending):
new_cluster_field_name = 'new_' + cluster_field_name
df_new = df.groupby(cluster_field_name)[target_field_name].mean().reset_index()
df_new = df_new.sort_values(by=target_field_name,ascending=ascending).reset_index(drop=True)
df_new['index'] = df_new.index
df_final = pd.merge(df,df_new[[cluster_field_name,'index']], on=cluster_field_name)
df_final = df_final.drop([cluster_field_name],axis=1)
df_final = df_final.rename(columns={"index":cluster_field_name})
return df_final
#import the data
df_data = pd.read_csv('response_data.csv')
#print first 10 rows
df_data.head(10)
8 cột đầu tiên, chúng ta đang cung cấp dữ liệu cấp độ cá nhân và cột chuyển đổi là nhãn để chúng ta dự đoán:
- Lần truy cập gần đây: tháng kể từ lần mua hàng cuối cùng
- Lịch sử: $ giá trị của các lần mua trước đây
- used_discount / used_bogo: cho biết liệu khách hàng đã sử dụng giảm giá hay mua một tặng một trước đó
- zip_code: loại mã zip là để phân loại ngoại thành / thành thị / nông thôn
- is_referral: cho biết liệu khách hàng có được mua lại từ kênh giới thiệu hay không
- Kênh (channel): các kênh mà khách hàng sử dụng ( điện thoại / Web / đa kênh)
- Ưu đãi: ưu đãi được gửi cho khách hàng ( giảm giá / mua một tặng một / không ưu đãi)
Chúng ta sẽ xây dựng mô hình phân loại nhị phân để tính xác suất chuyển đổi của tất cả khách hàng. Để làm điều đó, chúng ta cần làm theo các bước dưới đây:
- Xây dựng công thức tăng
- Phân tích dữ liệu khám phá (EDA) và kỹ thuật tính năng
- Tính toán xác suất chuyển đổi
- Quan sát kết quả trên bộ thử nghiệm
Công thức nâng cao
Trước hết, chúng ta cần xây dựng một hàm tính toán mức tăng. Để đơn giản, chúng ta sẽ giả định rằng mỗi chuyển đổi có nghĩa là 1 đơn hàng và giá trị đơn hàng trung bình sẽ là 25 đô la.
Chúng ta sẽ tính ra được ba loại mức tăng:
Mức tăng chuyển đổi: Tỷ lệ chuyển đổi của nhóm thử nghiệm - tỷ lệ chuyển đổi của nhóm kiểm soát
Tăng đơn hàng: Tăng chuyển đổi * # khách hàng đã chuyển đổi trong nhóm thử nghiệm
Tăng doanh thu: Tăng đơn đặt hàng * Giá trị đơn đặt hàng trung bình
Hãy xây dựng hàm calc_uplift của chúng ta:
def calc_uplift(df):
#assigning 25$ to the average order value
avg_order_value = 25
#calculate conversions for each offer type
base_conv = df[df.offer == 'No Offer']['conversion'].mean()
disc_conv = df[df.offer == 'Discount']['conversion'].mean()
bogo_conv = df[df.offer == 'Buy One Get One']['conversion'].mean()
#calculate conversion uplift for discount and bogo
disc_conv_uplift = disc_conv - base_conv
bogo_conv_uplift = bogo_conv - base_conv
#calculate order uplift
disc_order_uplift = disc_conv_uplift * len(df[df.offer == 'Discount']['conversion'])
bogo_order_uplift = bogo_conv_uplift * len(df[df.offer == 'Buy One Get One']['conversion'])
#calculate revenue uplift
disc_rev_uplift = disc_order_uplift * avg_order_value
bogo_rev_uplift = bogo_order_uplift * avg_order_value
print('Discount Conversion Uplift: {0}%'.format(np.round(disc_conv_uplift*100,2)))
print('Discount Order Uplift: {0}'.format(np.round(disc_order_uplift,2)))
print('Discount Revenue Uplift: ${0}\n'.format(np.round(disc_rev_uplift,2)))
print('-------------- \n')
print('BOGO Conversion Uplift: {0}%'.format(np.round(bogo_conv_uplift*100,2)))
print('BOGO Order Uplift: {0}'.format(np.round(bogo_order_uplift,2)))
print('BOGO Revenue Uplift: ${0}'.format(np.round(bogo_rev_uplift,2)))
Nếu chúng ta áp dụng chức năng này vào khung dữ liệu, chúng ta sẽ có kết quả như bên dưới:
Giảm giá có vẻ như là một lựa chọn tốt hơn nếu chúng ta muốn nhận được nhiều chuyển đổi hơn. Nó mang lại mức tăng 7,6% so với những khách hàng không nhận được bất kỳ ưu đãi nào. BOGO (Mua một tặng một) cũng có mức tăng 4,5%.
Chúng ta cùng bắt đầu khám phá những yếu tố tạo ra sự thay đổi này.
Kỹ thuật tính năng và EDA
Chúng ta kiểm tra từng tính năng một để tìm hiểu tác động của chúng đối với chuyển đổi
Lần truy cập gần đây
Lý tưởng nhất là chuyển đổi giảm xuống trong khi lần truy cập gần đây tăng lên vì những khách hàng không hoạt động và ít có khả năng mua lại:
df_plot = df_data.groupby('recency').conversion.mean().reset_index()
plot_data = [
go.Bar(
x=df_plot['recency'],
y=df_plot['conversion'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Recency vs Conversion',
plot_bgcolor = 'rgb(243,243,243)',
paper_bgcolor = 'rgb(243,243,243)',
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Nó diễn ra như dự kiến cho đến 11 tháng gần đây. Sau đó, nó tăng lên, có thể có nhiều lý do như là có ít khách hàng hơn trong những nhóm đó hoặc do ảnh hưởng của các ưu đãi nhất định.
Lịch sử
Chúng ta sẽ tạo ra một cụm lịch sử và quan sát tác động của nó. Hãy áp dụng phân cụm k-means để xác định các nhóm quan trọng trong lịch sử.
kmeans = KMeans(n_clusters=5)
kmeans.fit(df_data[['history']])
df_data['history_cluster'] = kmeans.predict(df_data[['history']])
#order the cluster numbers
df_data = order_cluster('history_cluster', 'history',df_data,True)
#print how the clusters look like
df_data.groupby('history_cluster').agg({'history':['mean','min','max'], 'conversion':['count', 'mean']})
#plot the conversion by each cluster
df_plot = df_data.groupby('history_cluster').conversion.mean().reset_index()
plot_data = [
go.Bar(
x=df_plot['history_cluster'],
y=df_plot['conversion'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='History vs Conversion',
plot_bgcolor = 'rgb(243,243,243)',
paper_bgcolor = 'rgb(243,243,243)',
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Khách hàng có giá trị $ lịch sử cao hơn có nhiều khả năng chuyển đổi
Giảm giá được sử dụng và BOGO
Chúng ta sẽ kiểm tra hai tính năng này cùng với dòng mã sau:
df_data.groupby(['used_discount','used_bogo','offer']).agg({'conversion':'mean'})
Đầu ra:
Những khách hàng đã sử dụng cả 2 đề nghị trước đây sẽ là người có tỷ lệ chuyển đổi cao nhất
Mã ZIP
Ở nông thôn thể hiện sự chuyển đổi tốt hơn so với các nơi khác:
df_plot = df_data.groupby('zip_code').conversion.mean().reset_index()
plot_data = [
go.Bar(
x=df_plot['zip_code'],
y=df_plot['conversion'],
marker=dict(
color=['green', 'blue', 'orange'])
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Zip Code vs Conversion',
plot_bgcolor = 'rgb(243,243,243)',
paper_bgcolor = 'rgb(243,243,243)',
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Giới thiệu
Như chúng ta thấy bên dưới, khách hàng từ kênh giới thiệu có tỷ lệ chuyển đổi ít hơn:
Họ cho thấy sự chuyển đổi ít hơn 5%
Kênh (Channel)
Multichannel hiển thị tỷ lệ chuyển đổi cao hơn chúng ta mong đợi. Khi chúng ta sử dụng nhiều hơn một kênh sẽ làm tăng chỉ số tham gia của khách hàng.
Cung cấp loại
Khách được được giảm giá ~ 18% chuyển đổi và Bogo là ` ~15%. Trong khi đó, khách hàng không nhận được ưu đãi tỷ lệ chuyển đổi của họ giảm xuống ~4%.
Tính năng kỹ thuật của dữ liệu này khá đơn giản, chúng ta sẽ áp dụng .get_dummies () để chuyển đổi các cột phân loại thành chữ số:
df_model = df_data.copy()
df_model = pd.get_dummies(df_model)
Đó là thời gian để xây dựng mô hình machine learning của chúng ta nhằm ghi lại xác suất chuyển đổi.
Ghi lại xác suất chuyển đổi
Để xây dựng mô hình chúng ta cần làm theo các bước đã đề cập trước đó trong các bài viết trước.
Hãy bắt đầu với các tính năng chia tách và nhãn:
#create feature set and labels
X = df_model.drop(['conversion'],axis=1)
y = df_model.conversion
Tập đào tạo và thử nghiệm:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=56)
Chúng ta sẽ tìm ra mô hình phù hợp và có được xác suất chuyển đổi. Hàm Predit_Proba () của mô hình chỉ định xác suất cho mỗi hàng:
xgb_model = xgb.XGBClassifier().fit(X_train, y_train)
X_test['proba'] = xgb_model.predict_proba(X_test)[:,1]
Cột xác suất của chúng ta sẽ trông như thế này:
Như những gì phân tích ở trên, chúng ta có thể thấy rằng mô hình của chúng ta đã gán xác suất chuyển đổi (từ 0 đến 1) cho mỗi khách hàng.
Và điều cuối cùng, chúng ta cần biết liệu mô hình của chúng ta hoạt động có tốt hay không.
Kết quả trên bộ kiểm tra
Bây giờ chúng ta sẽ giả định sự khác biệt về xác suất chiết khấu, bogo và nhóm kiểm soát sẽ tương tự như sự khác biệt về sự chuyển đổi giữa chúng.
Chúng ta cần sử dụng bộ thử nghiệm của chúng ta để tìm thấy nó. Hãy tính toán các Upticks theo thứ tự dự đoán và thực tế để được giảm giá:
real_disc_uptick = len(X_test)*(X_test[X_test['offer_Discount'] == 1].conversion.mean() - X_test[X_test['offer_No Offer'] == 1].conversion.mean())
pred_disc_uptick = len(X_test)*(X_test[X_test['offer_Discount'] == 1].proba.mean() - X_test[X_test['offer_No Offer'] == 1].proba.mean())
Để nh toán uptick thực sự, chúng ta đã sử dụng cột chuyển đổi. Đối với người dự đoán, chúng ta đã thay thế nó bằng proda.
Kết quả khá là tốt. Đơn hàng thực sự Uptick là 966 và mô hình dự đoán là 948 (lỗi 1,8%).
So sánh dự đoán doanh thu Uptick: 24150 so với 23700.
Chúng ta cần kiểm tra xem kết quả có tốt cho BOGO không:
real_bogo_uptick = len(X_test)*(X_test[X_test['offer_Buy One Get One'] == 1].conversion.mean() - X_test[X_test['offer_No Offer'] == 1].conversion.mean())
pred_bogo_uptick = len(X_test)*(X_test[X_test['offer_Buy One Get One'] == 1].proba.mean() - X_test[X_test['offer_No Offer'] == 1].proba.mean())
Kết quả đầy hứa hẹn cho BOGO:
Đặt hàng UpTick - Real vs Dự đoán: 563 vs 595
Doanh thu Uptick - Real vs Dự đoán: 14075 vs 14875
Tỷ lệ lỗi là khoảng 5,6%. Mô hình có thể hưởng lợi từ việc cải thiện điểm dự đoán trên loại ưu đãi BOGO.
Tính toán xác suất chuyển đổi giúp chúng ta rất nhiều ở các lĩnh vực khác nhau. Chúng ta đã dự đoán sự trở lại của các loại ưu đãi khác nhau nhưng bên cạnh đó nó có thể giúp chúng ta tìm ra ai sẽ nhắm mục tiêu tối đa hóa sự nâng cấp là tốt nhất. Trong bài viết tiếp theo, chúng ta sẽ xây dựng mô hình nâng cấp của riêng mình. Hẹn gặp lại các bạn trong bài viết sau nhé.
Bài viết được dịch tại đây.
Pum
Life is short. Smile while you still have teeth :)
Bài viết liên quan
Tìm hiểu SQL: Hướng dẫn Prompt SQL với ChatGPT, Copilot
Dec 07, 2024 • 11 min read
Database (Cơ sở dữ liệu) là gì? Những loại Database phổ biến nhất hiện nay
Sep 01, 2024 • 11 min read
Python là gì? Những đặc điểm nổi bật và Ứng dụng của Python
Aug 28, 2024 • 14 min read
Ứng dụng Hypothesis Testing - Kiểm định giả thuyết trong Y học
Jul 18, 2024 • 8 min read
Google Colab là gì? Hướng dẫn sử dụng Google Colab cho người mới
Jul 02, 2024 • 10 min read
Hướng dẫn cách lấy dữ liệu Facebook Ads Tự động Mỗi ngày Miễn phí - Phần 2
Jun 24, 2024 • 6 min read