, September 29, 2022

0 kết quả được tìm thấy

Data Driven Growth (P.8): Mô hình Uplift

  • Đăng bởi  Pum
  •  Jun 15, 2022

  •   10 min reads
Data Driven Growth (P.8): Mô hình Uplift

Một trong những việc quan trọng nhất của Growth Hacker là phải làm việc hiệu quả càng nhiều càng tốt. Trước tiên, bạn cần phải tiết kiệm thời gian, điều này được hiểu đơn giản là bạn cần nhanh chóng hình thành, thử nghiệm, học hỏi một cách nhanh nhất có thể để tránh thời gian bị lãng phí.

Thứ hai, bạn cần tiết kiệm chi phí, điều này được hiểu là bạn cần mang lại lợi nhuận tối đa cho một ngân sách, thời gian và những nỗ lực nhất định.

Những điều đó sẽ giúp Growth Hacker tăng chuyển đổi, đồng thời tiết kiệm được chi phí. Nhưng hãy tưởng tượng đến trường hợp bạn đang muốn chuẩn bị thực hiện một chương trình khuyến mãi và bạn đã biết phân khúc mà mình muốn nhắm đến là ai.

Câu hỏi lúc này được đặt ra là liệu bạn có cần phải gửi ưu đãi đến cho tất cả mọi người hay không?

Câu trả lời sẽ là không. Vì trong nhóm mục tiêu hiện tại của bạn, chắc chắn sẽ có những khách hàng đến mua hàng. Vì thế, khi bạn tung ra các khuyến mãi trước, bạn sẽ như tự giẫm vào chân mình.

Chúng ta có thể tóm tắt các phân đoạn này dựa trên cách tiếp cận như sau:

  • Người phản hồi với các khuyến mãi: Họ sẽ là tệp khách hàng chỉ mua hàng khi nhận được ưu đãi
  • Người không phản hồi: Họ sẽ là những khách hàng không mua hàng trong bất kỳ trường hợp nào
  • Người kiểm soát phản hồi: Họ sẽ là nhóm khách hàng mua hàng mà không cần phiếu mua hàng
  • Kiểm soát người không trả lời: Tệp khách hàng này không mua hàng nếu họ không nhận được ưu đãi

Bạn cần cân nhắc việc nhắm mục tiêu vào các đối tượng như người chỉ phản hồi với các khuyến mãi (TR) và kiểm soát người không trả lời (CN). Vì họ sẽ là những người không mua hàng trừ khi bạn đưa ra các chương trình có ưu đãi, những nhóm khách hàng này đang muốn thúc đẩy sự gia tăng của bạn trong các chiến dịch khuyến mãi.

Bên cạnh đó, bạn cũng cần tránh nhắm mục tiêu vào nhóm khách hàng không phản hồi điều trị (TN) và người phản hồi có kiểm soát (CR).

Có một cách rất đơn giản để làm việc này, chúng ta cần xác định khách hàng rơi vào nhóm nào, và mô hình nâng cao sẽ giúp bạn làm việc đó.

Với hai bước đơn giản:

  1. Dự đoán xác suất có trong mỗi nhóm đối với tất cả các khách hàng: chúng ta sẽ xây dựng một mô hình đa phân loại cho điều đó.
  2. Chúng ta sẽ tính điểm uplift, công thức là:

Chúng ta sẽ tổng hợp xác suất là TR CN và trừ đi xác suất rơi vào các nhóm khác. Điểm số cao hơn có nghĩa là sự phát triển cao hơn.

Chúng ta sẽ triển khai điều này bằng một ví dụ, chúng ta sẽ sử dụng cùng một tập dữ liệu trong bài viết trước.

Chúng ta bắt đầu với việc nhập các thư viện và chức năng mà chúng ta cần.

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
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
import warnings
warnings.filterwarnings("ignore")

#initiate plotly
pyoff.init_notebook_mode()

#function to order clusters
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

  
#function for calculating the uplift
def calc_uplift(df):
    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)))
    
    if len(df[df.offer == 'Buy One Get One']['conversion']) > 0:
          
        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)))  

Sau đó, chúng ta sẽ nhập dữ liệu của mình

‌                   df_data = pd.read_csv('response_data.csv') df_data.head(10)

Bạn có thể nhớ lại từ bài viết trước, chúng ta có dữ liệu về những khách hàng đã nhận được ưu đãi giảm giá và mua một tặng một. Chúng ta cần xem phản ứng của họ như thế nào, bên cạnh đó cũng có một nhóm khách hàng không nhận được khuyến mãi nào, chúng ta cũng cần nắm thông tin.

Mô tả cột như sau:

  • Lần truy cập gần đây: tháng kể từ lần mua 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 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 cho biết là ngoại thành, thành thị hay là nông thôn
  • is_referral: cho biết khách hàng mua hàng có thông qua các kênh giới thiệu hay không
  • Channel: các ứng dụng mà khách hàng sử dụng như điện thoại, web hay là những ứng dụng khác
  • Ưu đãi: ưu đãi được gửi cho khách hàng như mã giảm giá, mua một tặng một hay thậm chí là không có ưu đãi

Trước khi xây dựng mô hình, hãy áp dụng hàm calc_uplift để lấy mức tăng hiện tại của chiến dịch này làm điểm chuẩn:

‌                   calc_uplift(df_data)

Mức tăng chuyển đổi là 7,66% khi được chiết khấu và 4,52% khi mua một tặng một (BOGO).

Tiếp theo, chúng ta sẽ bắt đầu xây dựng mô hình của mình.

Mô hình đa phân loại để dự đoán điểm tăng

Chúng ta sẽ gắn nhãn 1 hoặc 0 với quy ước là khách hàng có chuyển đổi và khách hàng không có chuyển đổi. Chúng ta có 4 nhóm khách hàng sau: TR, TN, CRCN, trong 4 nhóm này chúng ta biết rằng đâu là nhóm khách hàng được nhận ưu đãi giảm giá và mua một tặng một.

Bạn hãy tạo một cột Campaign_group để hiển thị thông tin sau:

df_data['campaign_group'] = 'treatment'
df_data.loc[df_data.offer == 'No Offer', 'campaign_group'] = 'control'

Bây giờ chúng ta cần tạo nhãn mới của mình

df_data['target_class'] = 0 #CN
df_data.loc[(df_data.campaign_group == 'control') & (df_data.conversion > 0),'target_class'] = 1 #CR
df_data.loc[(df_data.campaign_group == 'treatment') & (df_data.conversion == 0),'target_class'] = 2 #TN
df_data.loc[(df_data.campaign_group == 'treatment') & (df_data.conversion > 0),'target_class'] = 3 #TR

Trong ví dụ này, chúng ta sẽ quy ước như sau:

  • 0 -> Kiểm soát người không trả lời
  • 1 -> Kiểm soát phản hồi
  • 2 -> Người không phản hồi điều trị
  • 3 -> Người phản hồi điều trị

Trước khi thiết lập mô hình sẽ có một bước kỹ thuật tính năng nhỏ sau, chúng ta sẽ tạo cụm từ cột lịch sử và áp dụng get_dummies để chuyển đổi các cột thành:

#creating the clusters
kmeans = KMeans(n_clusters=5)
kmeans.fit(df_data[['history']])
df_data['history_cluster'] = kmeans.predict(df_data[['history']])
#order the clusters
df_data = order_cluster('history_cluster', 'history',df_data,True)
#creating a new dataframe as model and dropping columns that defines the label
df_model = df_data.drop(['offer','campaign_group','conversion'],axis=1)
#convert categorical columns
df_model = pd.get_dummies(df_model)
#create feature set and labels
X = df_model.drop(['target_class'],axis=1)
y = df_model.target_class
#splitting train and test groups
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=56)
#fitting the model and predicting the probabilities
xgb_model = xgb.XGBClassifier().fit(X_train, y_train)
class_probs = xgb_model.predict_proba(X_test)

Biến class_probs sở hữu xác suất cho mỗi khách hàng, chúng ta cùng xem ví dụ

Đối với mỗi khách hàng cụ thể, chúng ta sẽ có xác suất sau:

  • CN: 32%
  • CR: 2%
  • TN: 58.9%
  • TR: 6.9%

Vì vậy, điểm uplift cho mỗi khách hàng sẽ là:

0.32 + 0.069- 0.02- 0.589 = -0.22

Chúng ta sẽ áp dụng điều này cho tất cả khách hàng và tính điểm uplift

#probabilities for all customers
overall_proba = xgb_model.predict_proba(df_model.drop(['target_class'],axis=1))
#assign probabilities to 4 different columns
df_model['proba_CN'] = overall_proba[:,0] 
df_model['proba_CR'] = overall_proba[:,1] 
df_model['proba_TN'] = overall_proba[:,2] 
df_model['proba_TR'] = overall_proba[:,3]
#calculate uplift score for all customers
df_model['uplift_score'] = df_model.eval('proba_CN + proba_TR - proba_TN - proba_CR')
#assign it back to main dataframe
df_data['uplift_score'] = df_model['uplift_score']

Bằng cách chạy mã ở trên, chúng ta đã thêm một cột Uplift_Score trong DataFrame như bên dưới:

Lúc này sẽ là phần quan trọng nhất, đó là kiểm tra xem mô hình có thực sự hoạt động hay không? Có một chút khó khăn để đánh giá hiệu suất thực sự của mô hình nâng cao.

Chúng ta sẽ kiểm tra xem mức tăng đang thay đổi như thế nào trên các lượng tử, điểm mức tăng để xem liệu chúng ta có thể sử dụng mô hình vào cuộc sống thực hay không.

Đánh giá mô hình

Để đánh giá mô hình, chúng ta sẽ tạo hai nhóm khác nhau và so sánh chúng với điểm chuẩn ban đầu của chúng ta. Với các nhóm là:

  1. Điểm tăng cao: Khách hàng có điểm tăng > lượng thứ 3
  2. Điểm gia tăng thấp: Khách hàng có điểm tăng < lần phân tích thứ 2

Chúng ta sẽ so sánh:

  • Chuyển đổi tăng
  • Chúng ta sẽ xem mô hình của mình hoạt động có hiệu quả hay không, bằng cách dựa vào mức tăng doanh thu trên mỗi khách hàng mục tiêu.

Đây sẽ là điểm chuẩn mà chúng ta áp dụng vào chiến dịch giảm giá.

Total Targeted Customer Count: 21307
Discount Conversion Uplift: 7.66%
Discount Order Uplift: 1631.89
Discount Revenue Uplift: $40797.35
Revenue Uplift Per Targeted Customer: $1.91

Hãy tạo nhóm đầu tiên và xem các số

df_data_lift = df_data.copy()
uplift_q_75 = df_data_lift.uplift_score.quantile(0.75)
df_data_lift = df_data_lift[(df_data_lift.offer != 'Buy One Get One') & (df_data_lift.uplift_score > uplift_q_75)].reset_index(drop=True)
#calculate the uplift
calc_uplift(df_data_lift)
results:
User Count: 5282
Discount Conversion Uplift: 12.18%
Discount Order Uplift: 643.57
Discount Revenue Uplift: $16089.36
Revenue Uplift Per Targeted Customer: $3.04


Kết quả thật là tuyệt. Mức tăng doanh thu trên mỗi khách hàng mục tiêu tốt hơn 57% và chúng ta có thể dễ dàng nhận thấy rằng 25% nhóm mục tiêu đang đóng góp vào 40% mức tăng doanh thu.

Chúng ta sẽ kiểm tra các số tương tự cho nhóm có điểm số tăng thấp hơn:

df_data_lift = df_data.copy()
uplift_q_5 = df_data_lift.uplift_score.quantile(0.5)
df_data_lift = df_data_lift[(df_data_lift.offer != 'Buy One Get One') & (df_data_lift.uplift_score < uplift_q_5)].reset_index(drop=True)
#calculate the uplift
calc_uplift(df_data_lift)
results:
User Count: 10745
Discount Conversion Uplift: 5.63%
Discount Order Uplift: 604.62
Discount Revenue Uplift: $15115.52
Revenue Uplift Per Targeted Customer: $1.4

Như dự kiến, mức tăng doanh thu trên mỗi khách hàng mục tiêu giảm xuống 1,4 đô la, nhóm này là 50% khách hàng mục tiêu đóng góp vào 37% mức tăng doanh thu.

Bằng cách sử dụng mô hình này, chúng ta có thể dễ dàng làm cho chiến dịch của mình hiệu quả hơn bằng cách:

  • Nhắm vào mục tiêu cụ thể dựa trên điểm số tăng
  • Thử các ưu đãi khác nhau dựa trên điểm số tăng của khách hàng

Trong bài viết tiếp theo, chúng ta sẽ giải thích một trong những yếu tố cốt lõi của Growth Hacking: A / B Testing. Và đó sẽ là bài cuối cùng trong loạt bài viết này. 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ừ đây.

Bài viết cùng seri

Bài viết liên quan

Master data là gì? Sự khác nhau giữa Master data và Transaction data

Master data là tập hợp các định danh thống nhất và các thuộc tính mở rộng. Nó mô tả các thực thể cốt lõi của doanh nghiệp bao gồm khách hàng,.......

Master data là gì? Sự khác nhau giữa Master data và Transaction data
Danh mục các loại biểu đồ trong Data Visualization

Bạn có thể tìm thấy danh sách các loại biểu đồ, nó sẽ hoạt động như một hướng dẫn đầy hữu ích giúp bạn lựa chọn được biểu đồ phù hợp với nhu cầu của bản thân....

Danh mục các loại biểu đồ trong Data Visualization
Data Analysis with Excel: Analysis ToolPak

Bộ công cụ Analysis ToolPak trên Excel sẽ giúp bạn tiết kiệm thời gian và đơn giản hóa các bước phân tích dữ liệu tài chính, thống kê ....

Data Analysis with Excel: Analysis ToolPak
Data Analysis with Excel: Solver

Excel có một công cụ được gọi là solver cung cấp các lệnh và các tính năng tùy chỉnh để giải quyết các vấn đề quyết định....

Data Analysis with Excel: Solver
Data Analysis with Excel: What-If Analysis

What-If Analysis trong Excel cho phép bạn thử các giá trị (scenarios) khác nhau cho các công thức....

Data Analysis with Excel: What-If Analysis
You've successfully subscribed to 200Lab Blog
Great! Next, complete checkout for full access to 200Lab Blog
Xin chào mừng bạn đã quay trở lại
OK! Tài khoản của bạn đã kích hoạt thành công.
Success! Your billing info is updated.
Billing info update failed.
Your link has expired.