의사결정 나무란?
- 결정 트리(Decision Tree)는 트리(Tree) 구조를 사용하여 데이터를 분류(Classification)하거나 회귀(Regression)하는 지도 학습(Supervised Learning) 알고리즘이다.
- 트리의 각 노드는 특정 특징(feature)을 기준으로 데이터를 나누는 역할을 하며, 최종적으로 예측값(클래스 또는 수치)을 도출한다.
결정 트리의 구조
결정 트리는 아래와 같은 트리 구조(Tree Structure) 로 이루어진다.
- 루트 노드(Root Node):
- 데이터가 처음 입력되는 노드
- 가장 중요한 특징(Feature)을 기준으로 데이터를 나누는 역할
- 내부 노드(Internal Nodes):
- 특정 특징을 기준으로 데이터를 분할(Split) 하는 역할
- 각 노드는 질문(조건문)을 포함하며, 예/아니오(Yes/No) 또는 특정 범위에 따라 데이터를 나눈다.
- 가지(Branches):
- 하나의 노드에서 데이터를 나누는 경로
- 각 조건을 만족하는 데이터는 새로운 노드(자식 노드)로 이동
- 단말 노드(Leaf Nodes):
- 더 이상 데이터를 나누지 않는 최종 노드
- 분류 문제에서는 클래스(0, 1, …) 를 나타내고, 회귀 문제에서는 수치 예측 값을 나타냄
그로스 마케팅(Growth Marketing)에서 의사결정트리를 활용한 예제
1) 데이터 시나리오
한 스타트업이 자사 제품을 광고하는 마케팅 전략을 최적화하려고 합니다. 이를 위해 의사결정트리(Decision Tree)를 활용하여 고객이 제품을 구매할 가능성을 예측하고, 마케팅 캠페인을 효과적으로 설계하려고 합니다.
데이터 설명
고객의 과거 행동 데이터를 수집하여, 특정 마케팅 캠페인에 대한 반응(구매 여부)을 예측하는 모델을 만듭니다.
변수명 설명 예시 데이터
방문 빈도(Frequency) | 최근 한 달 동안 웹사이트 방문 횟수 | 3, 10, 5, ... |
평균 구매 금액(Avg_Purchase_Amount) | 고객이 과거에 평균적으로 지출한 금액 | 30, 120, 80, ... |
이메일 캠페인 반응 여부(Email_Response) | 이메일 마케팅에 반응했는지 여부 (1: 예, 0: 아니오) | 1, 0, 1, ... |
소셜 미디어 활동(Social_Media_Activity) | 소셜 미디어에서 브랜드 콘텐츠와 상호작용한 횟수 | 2, 8, 4, ... |
구매 여부(Purchase) | 제품을 구매했는지 여부 (1: 구매, 0: 구매 안 함) | 1, 0, 1, ... |
2) 모델의 목적
이 의사결정트리 모델의 목적은:
- 고객이 제품을 구매할 가능성이 높은지 예측.
- 마케팅 비용을 효율적으로 사용하여 잠재 고객(Target Audience)을 선별.
- 가장 효과적인 마케팅 채널(예: 이메일, 소셜 미디어)을 파악.
- 마케팅 전략을 자동화하여 개인화된 광고 제공.
3) 파이썬 코드 (의사결정트리 모델 구축 및 시각화)
이제 의사결정트리를 이용하여 고객의 구매 여부를 예측하는 모델을 구현하겠습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score
# 1. 가상의 고객 데이터 생성 (하드코딩된 값 사용)
data = {
"Frequency": [3, 10, 5, 8, 1, 12, 4, 7, 6, 2],
"Avg_Purchase_Amount": [30, 120, 80, 150, 10, 200, 50, 100, 90, 20],
"Email_Response": [1, 0, 1, 1, 0, 1, 0, 1, 1, 0],
"Social_Media_Activity": [2, 8, 4, 7, 0, 10, 3, 6, 5, 1],
"Purchase": [1, 0, 1, 1, 0, 1, 0, 1, 1, 0] # 타겟 변수 (1: 구매, 0: 구매 안 함)
}
# 데이터프레임 생성
df = pd.DataFrame(data)
# 2. 입력(X)과 타겟(y) 분리
X = df.drop(columns=["Purchase"]) # 독립변수
y = df["Purchase"] # 종속변수 (목표 예측값)
# 3. 데이터 분할 (훈련 데이터 80%, 테스트 데이터 20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 4. 의사결정트리 모델 학습
dt_model = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_model.fit(X_train, y_train)
# 5. 모델 예측
y_pred = dt_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
# 6. 결정 트리 시각화
fig, ax = plt.subplots(figsize=(12, 6))
plot_tree(dt_model, feature_names=X.columns, class_names=["No Purchase", "Purchase"], filled=True, ax=ax)
plt.title(f"Decision Tree for Growth Marketing Campaign (Accuracy: {accuracy:.2f})")
plt.show()
# 7. 고객 데이터 입력 후 구매 예측 함수 (Feature Name 문제 해결)
def predict_purchase(Frequency, Avg_Purchase_Amount, Email_Response, Social_Media_Activity):
"""
입력한 고객 데이터를 기반으로 구매 여부를 예측하는 함수
"""
# 입력 데이터를 DataFrame 형태로 변환하여 Feature Names 유지
input_data = pd.DataFrame([[Frequency, Avg_Purchase_Amount, Email_Response, Social_Media_Activity]],
columns=X.columns)
prediction = dt_model.predict(input_data)
return "구매할 가능성이 높음" if prediction[0] == 1 else "구매하지 않을 가능성이 높음"
# 8. 예제 입력 데이터 (사용자가 예측하고 싶은 값)
example_input = {
"Frequency": 5, # 웹사이트 방문 횟수
"Avg_Purchase_Amount": 90, # 평균 구매 금액
"Email_Response": 1, # 이메일 캠페인 반응 여부 (1: 반응, 0: 반응 없음)
"Social_Media_Activity": 4 # 소셜 미디어 활동 횟수
}
# 9. 예측 실행
prediction_result = predict_purchase(**example_input)
print(f"예측 결과: {prediction_result}")
예제2.
다음의 데이터셋을 이용하여 발달상권의 당월 매출금액을 예측하는 예측모델을 개발하세요.
- 결정트리 알고리즘을 사용해서 예측모델을 만드세요.
- 예측정확도를 90% 이상 충족하고
- 위 예측모델을 만들기 위한 독립변수를 제시하세요.
#################### 데이터 로드 및 필터링 ####################
df = pd.read_csv("/content/서울시 상권분석 데이터.csv")
print(df.info(5))
display(df.head(5))
df = df[(df["상권_구분_코드_명"] == "발달상권")]
display(df)
df = df[['당월_매출_건수','남성_매출_금액','여성_매출_금액','당월_매출_금액']]
display(df)
#################### 의사결정 나무 ####################
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score
# 2. 입력(X)과 타겟(y) 분리
X = df.drop(columns=["당월_매출_금액"]) # 독립변수
y = df["당월_매출_금액"] # 종속변수 (목표 예측값)
# 3. 데이터 분할 (훈련 데이터 80%, 테스트 데이터 20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 4. 의사결정트리 모델 학습
dt_model = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_model.fit(X_train, y_train)
# # 5. 모델 예측
# y_pred = dt_model.predict(X_test)
# accuracy = accuracy_score(y_test, y_pred)
# 6. 결정 트리 시각화
fig, ax = plt.subplots(figsize=(12, 6))
plot_tree(dt_model, feature_names=X.columns, filled=True, ax=ax)
plt.title(f"Decision Tree for Growth Marketing Campaign (Accuracy: {accuracy:.2f})")
plt.show()
# 7. 고객 데이터 입력 후 구매 예측 함수 (Feature Name 문제 해결)
def predict_purchase(당월_매출_건수, 남성_매출_금액, 여성_매출_금액):
"""
입력한 고객 데이터를 기반으로 구매 여부를 예측하는 함수
"""
# 입력 데이터를 DataFrame 형태로 변환하여 Feature Names 유지
input_data = pd.DataFrame([[당월_매출_건수, 남성_매출_금액, 여성_매출_금액]],
columns=X.columns)
prediction = dt_model.predict(input_data)
return f"예상 당월 매출 금액: {prediction[0]:,.0f} 원"
# 8. 예제 입력 데이터 (사용자가 예측하고 싶은 값)
example_input = {
"당월_매출_건수": 200, # 웹사이트 방문 횟수
"남성_매출_금액": 11052755.0, # 평균 구매 금액
"여성_매출_금액": 11052755.0
}
# 9. 예측 실행
prediction_result = predict_purchase(**example_input)
print(f"예측 결과: {prediction_result}")
'머신러닝 기반 마케팅 예측' 카테고리의 다른 글
마케팅과 머신러닝 (basic) (1) | 2025.03.19 |
---|---|
k-NN 알고리즘 & 웹 기반 추천/자동화 시스템 구현 (0) | 2025.03.12 |
로지스틱 회귀 분석 (Logistic Regression) & 모델 평가 지표 (0) | 2025.03.11 |
다중 분류 (Multi-Class Classification) (0) | 2025.03.11 |