아직, 개념편을 보지 않으셨다면 https://taksw222.tistory.com/237
데이터 출처는 https://www.kaggle.com/code/kriyeneekutbay/marketing-uplift
간단한 예제를 통해, 업리프트 모델링을 실제로 하는 법을 알아봅시다.
변수 설명입니다.
recency : 가장 마지막 구매일로부터 지난 달 수
history : 현재까지 총 구매액
user_discount : 할인을 받은 적이 있는가? 있으면 1, 없으면 0
user_bogo : 1+1을 받은 적이 있는가? (one get one 이 1+1)
zip_code : 우편 번호 구분(지역 구분)
is_referral : 추천 채널로부터 고객을 유입받은 것인지
channel : 고객이 사용하는 채널
offer : 고객에게 전송된 제안(마케팅/광고)
conversion : 실제 전환 여부
데이터를 보고 uplifting modeling에 맞게 문제를 만들어 봅시다.
Question / 과거에 우리 서비스에서 Buy One Get One 프로모션을 진행한 적이 있습니다. 해당 프로모션을 받은 유저와 그렇지 않은 유저들을 바탕으로 Uplifting Modeling을 진행해주세요.
원래는 Buy One Get One이 정말 통계적으로 유의미한 conversion 변화를 일으켰는지 통계 검정도 해야 합니다만, 오늘은 정말로 Uplifting Modeling을 하는 방법을 간단하게 알아보는데에 치중을 두는 예제이므로 생략합니다.
그래도, EDA는 해야겠죠, 일부 변수만 좀 살펴봅시다.
Buy One Get One, Discount, 아무 Offer도 받지 못한 고객이 거의 비슷한 숫자로 분포되어 있습니다.
오늘의 문제를 해결하는데에 있어서는 Discount 를 받은 유저 데이터는 제외하겠습니다.
실제 모델 제작도, 원래는 각 변수의 의미를 따져야 합니다만, 사용법을 익히는 느낌으로 오늘은 get_dummies로 그냥 범주형 변수만 처리하고 바로 학습시키겠습니다.
실제 학습 과정
X = df_bogo.drop(['offer_Buy One Get One', 'conversion'], axis = 1)
y = df_bogo['conversion']
treatment = df_bogo['offer_Buy One Get One']
Uplifting Modeling에서는 treatment 변수가 들어갑니다. 이를 사용하는 이유는, 개념편에서 확인했던 Two Model 접근법을 사용하기 위함입니다. 이를 사용할 경우 학습 과정에서 실험군과 대조군을 자동으로 분리시켜 줍니다.
즉, train-test split 도 X, y, treatment 3가지 모두에 대해 적용해야 합니다. 그리고 그게 됩니다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test, treat_train, treat_test = train_test_split(X, y, treatment,
test_size = 0.2, random_state = 42,
stratify = df_bogo['offer_Buy One Get One'])
실험군과 대조군 비율을 일정하게 유지하기 위해 stratify 시키는것을 잊지 맙시다.
uplifting modeling을 실제로 돌려보기 위해서는 패키지 설치를 해야 합니다.
#!pip install scikit-uplift
실제 학습 과정은 다음과 같습니다.
from lightgbm import LGBMClassifier
from sklift.models import TwoModels
from sklift.viz import plot_uplift_preds
tm = TwoModels(
estimator_trmnt = LGBMClassifier(objective='binary', metric='binary_logloss', max_depth=6),
estimator_ctrl = LGBMClassifier(objective='binary', metric='binary_logloss', max_depth=6),
)
tm = tm.fit(X_train, y_train, treat_train)
uplift_tm = tm.predict(X_test)
예제편에서 살펴본 것처럼 처리군과 대조군의 모델을 각각 따로 만듭니다. 해당 값에서의 proba값을 빼는 방식으로 최종 예측이 진행될 것입니다. 각각의 모델을 알맞게 학습시킬수도 있겠지만, 여기서는 통일해서 사용하겠습니다.
최종 예측도, scikit-learn 하는 것처럼 뱉어줄 수 있습니다.
예측 과정에 대한 시갃화도 가능합니다.
plot_uplift_preds(trmnt_preds=tm.trmnt_preds_, ctrl_preds=tm.ctrl_preds_)
uplifting 값이 양수인 유저들이 더 많습니다. 캠페인이 긍정적인 변화를 만들었다고 봐도 좋을 듯 합니다.
실제 세그먼트를 부여할 때에는 uplifting 점수를 기준으로 자를 수 있을 것입니다. 이 기준에 대해서 엄밀한 방법론이 있을 듯 하나, 여기서는 임의로 0.1로 지정해보겠습니다.
def get_segment(score):
if score < -0.1: return 'Sleeping Dog' # 부정적으로 돌아설 유저들
elif score < 0 : return 'Lost Causes' # 광고와 상관없이 전환 안 할 유저들
elif score < 0.1 : return 'Sure Things' # 광고와 상관없이 전환할 유저들
else: return 'Persuadables' # 긍정적인 반응으로 돌아설 유저들
user_seg_list = [get_segment(x) for x in uplift_tm]
print(user_seg_list.count('Persuadables') / len(user_seg_list))
계산을 해보면 약 18~19% 정도가 나옵니다. 해당 결과를 믿고 그대로 마케팅을 진행하면 그냥 모두에게 했을 때 대비 5배의 예산 절감이 기대됩니다. 물론 다양한 분석법을 토대로 유의미한 결과인지 확인해야겠지만, 이런 식으로 간단하게 사용법을 알아보았습니다.
'Archive > 데이터 분석 관련' 카테고리의 다른 글
[Data] 결측치 처리 관련 (1) (0) | 2024.04.10 |
---|---|
[Data] A/B 테스트 개념 다지기 (0) | 2024.01.31 |
[Data] 업리프트 모델링이란? - 개념편 (0) | 2024.01.29 |
[Data] 이탈분석 - 생존분석 개괄편 (1) | 2024.01.24 |
[Data] RFM 분석이란? (실전편) (1) | 2024.01.19 |