E.T.C

현업에서 바로 쓰는 고객 세그멘테이션 (실전 코드 공유)

⋆。゚☁︎ 돋이 ⋆☾ ゚。 2025. 3. 9. 17:41
728x90
반응형

그로스 마케팅을 위한 초보코더의 러닝 기록일지 2 이다. 오늘도 어김없이  AI로 배움을 채워 나가는 과정을 포스팅한다. 

  • 함수는 혼자서 실행될 수 있지만
  • 메서드는 특정 객체와 함께 사용하며, 객체의 데이터를 사용 or 변경할 수 있다.

 

머신러닝 고객 세그멘테이션 코드 출력 결과

 

실전코드 전체! logisticRegression을 이용해 고객 고객 세그멘테이션을 하는 코드이다. 

데이터 시나리오를 변경해서 새로운 소비 집단에 대한 그로스마케팅 성과지표를 이용해 분류하는식으로 응용할수있다.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 샘플 데이터 (긍정: 1, 중립: 2, 부정: 3) - 데이터 개수 증가 (30개)
emails = [
    # 부정 (3) - 스팸성 광고
    "지금 가입하면 첫 달 무료! 여기를 클릭하세요.",
    "당첨되셨습니다! 상품 수령을 위해 여기를 클릭하세요.",
    "무료 쿠폰이 도착했습니다. 클릭하여 혜택을 받으세요!",
    "축하합니다! 특별 할인 혜택을 드립니다.",
    "당신의 계정이 정지될 예정입니다. 지금 확인하세요.",
    "긴급: 보안 문제로 인해 계정을 업데이트해야 합니다.",
    "최고의 할인 혜택! 지금 구매하세요.",
    "신용카드 혜택이 변경되었습니다. 확인해보세요.",
    "은행 계좌 정보 확인이 필요합니다. 클릭하세요.",
    "이메일 비밀번호를 재설정해야 합니다. 지금 확인하세요.",

    # 중립 (2) - 일반적인 업무 이메일
    "회의 자료를 첨부했습니다. 검토 부탁드립니다.",
    "안녕하세요, 오늘 오후 회의 시간 확인 부탁드립니다.",
    "다음 주 일정 조정이 필요합니다. 회신 부탁드립니다.",
    "회사 정책이 변경되었습니다. 첨부된 내용을 확인해 주세요.",
    "주간 업무 보고서 초안을 공유드립니다.",
    "다음 분기 마케팅 전략 회의가 예정되어 있습니다.",
    "사내 시스템 점검 일정이 업데이트되었습니다.",
    "신규 프로젝트 일정이 확정되었습니다. 확인 부탁드립니다.",
    "급여 명세서가 발송되었습니다. 확인해주세요.",
    "출장 요청이 승인되었습니다. 관련 서류를 제출해주세요.",

    # 긍정 (1) - 긍정적인 마케팅 및 추천 메시지
    "특별 할인 행사 중! 지금 바로 쇼핑하고 30% 할인 받으세요.",
    "신규 프로젝트 투자 기회를 놓치지 마세요.",
    "새로운 패션 트렌드, 지금 쇼핑하세요!",
    "기다리던 신제품이 출시되었습니다. 지금 확인하세요!",
    "최고의 영화 추천! 지금 시청하세요.",
    "건강한 식습관을 위한 맞춤형 식단을 확인하세요.",
    "이 주의 베스트셀러 도서를 추천드립니다.",
    "인공지능이 추천하는 맞춤형 뉴스! 지금 확인하세요.",
    "이번 주 인기 여행지를 확인하세요!",
    "나만을 위한 맞춤형 운동 계획을 받아보세요."
]

labels = [3] * 10 + [2] * 10 + [1] * 10  # 1: 긍정, 2: 중립, 3: 부정 (각 10개씩 균등 분포)

# 데이터 벡터화 (CountVectorizer 사용)
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails)

# 학습 & 테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, labels, 
test_size=0.3, random_state=42, stratify=labels)

# 모델 학습 (Logistic Regression)
model = LogisticRegression(max_iter=300)
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f"정확도: {accuracy * 100:.2f}%")

# 분류 보고서 (zero_division=1로 설정하여 경고 제거)
print("\n분류 보고서:")
print(classification_report(y_test, y_pred, 
target_names=["긍정", "중립", "부정"], labels=[1, 2, 3], zero_division=1))

# 새로운 이메일 예측
new_email = [
    "회의 자료를 검토해 주세요.",
    "이번 주 인기 도서를 추천드립니다."
]
new_email_transformed = vectorizer.transform(new_email)
predicted_labels = model.predict(new_email_transformed)

# 결과 출력
label_map = {1: "긍정", 2: "중립", 3: "부정"}
for email, label in zip(new_email, predicted_labels):
    print(f"이메일: \"{email}\" → 감성 분석 결과: {label_map[label]}")

 

1️⃣ 필요한 라이브러리

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report

 

  • numpy : 파이썬에서 수치 계산을 위한 핵심 라이브러리입니다. 배열, 행렬 연산, 수학 함수 등을 제공합니다. np는 numpy를 짧게 줄여서 사용할 때 쓰는 관례적인 이름.
  • pandas : 파이썬에서 데이터 분석을 위한 강력한 라이브러리입니다. 엑셀처럼 테이블 형태의 데이터를 다루는 데 유용하며, 데이터 정제, 변환, 분석 등을 쉽게 할 수 있도록 도와줍니다. pd는 pandas를 짧게 줄여서 사용할 때 쓰는 관례적인 이름입니다.
  • LogisticRegression : 로지스틱 회귀 모델 생성 (이전 코드와 동일)
  • train_test_split : 학습 데이터와 테스트 데이터 분할 (이전 코드와 동일)
  • StandardScaler : 데이터 표준화(스케일링) (이전 코드와 동일)
  • accuracy_score, classification_report : 모델 성능 평가 (이전 코드와 동일)

2️⃣ 고객 데이터 생성

data = pd.DataFrame([
    [5, 1000, 2, 0.05, 0, 1],   # VIP 고객
    [3, 700, 7, 0.02, 1, 2],    # 일반 고객
    [1, 100, 30, 0.01, 2, 3],   # 이탈 위험 고객
    ...
], columns=["방문 빈도", "구매 금액", "최근 구매일", "CTR", "반품 횟수", "고객 세그먼트"])

 

 

pandas의 DataFrame은 엑셀 시트와 유사한 테이블 형태의 데이터 구조입니다. 여기서는 고객 데이터를 DataFrame으로 만들었습니다.
각 행은 고객 한 명의 정보를 나타내고, 각 열은 고객의 특징(feature)을 나타냅니다.

  • 컬럼: "방문 빈도", "구매 금액", "최근 구매일", "CTR (클릭률)", "반품 횟수", "고객 세그먼트"
  • 고객 세그먼트: 1 (VIP 고객), 2 (일반 고객), 3 (이탈 위험 고객)

 

3️⃣ 입력 데이터(X) & 출력 데이터(y) 분리

X = data.drop(columns=["고객 세그먼트"])  # 특징 데이터 (입력)
y = data["고객 세그먼트"]  # 정답 레이블 (출력)
  • x는 입력 데이터, 즉 모델이 학습할 특징 데이터입니다. 여기서는 "고객 세그먼트" 열을 제외한 나머지 모든 열을 X에 할당합니다. drop() 메서드는 특정 열을 삭제하는 데 사용됩니다.
  • y는 출력 데이터, 즉 모델이 예측해야 할 정답(레이블)입니다. 여기서는 "고객 세그먼트" 열을 y에 할당합니다.

 

4️⃣ 데이터 표준화 (Standardization) 

scaler = StandardScaler()
X_scaled = pd.DataFrame(scaler.fit_transform(X), columns=X.columns)
  • StandardScaler 객체를 생성,  StandardScaler()를 사용하여 평균 0, 분산 1로 변환
  • fit_transform() 메서드는 X의 평균과 표준편차를 계산하고, 각 값을 표준 점수(Z-score)로 변환👉🏻 scaler.fit_transform(X): 입력 데이터 X를 표준화.
  • pd.DataFrame(..., columns=X.columns) 표준화된 데이터를 다시 DataFrame으로 만듭니다. 이렇게 하는 이유는 scikit-learn이 DataFrame을 잘 지원하지 않아서 경고가 발생할 수 있기 때문입니다. 컬럼 이름을 유지하기 위해 columns=X.columns를 지정합니다.

 

 

5️⃣ 학습 데이터 & 테스트 데이터 분할

X_train, X_test, y_train, y_test = 
train_test_split(X_scaled, y, test_size=0.3, random_state=42, stratify=y)
  • 표준화된 입력 데이터 X_scaled와 출력 데이터 y를 학습용과 테스트용으로 나눕니다.
  • test_size=0.3은 테스트 데이터의 비율을 30%로 설정
  • random_state=42는 랜덤성을 고정하여 코드를 실행할 때마다 동일한 결과를 얻을 수 있도록 설정
  • stratify=y는 학습 데이터와 테스트 데이터의 클래스 비율을 동일하게 유지

 

5️⃣ 로지스틱 회귀 모델 학습

model = LogisticRegression(solver='lbfgs', max_iter=500)
model.fit(X_train, y_train)
  • LogisticRegression 모델 객체를 생성.
  • solver='lbfgs': 로지스틱 회귀 모델의 최적화 알고리즘을 지정합니다. lbfgs는 다중 클래스 분류 문제에 적합하며, 비교적 빠르고 안정적인 알고리즘입니다.
  • max_iter=500: 모델 학습 시 최대 반복 횟수를 500으로 설정
  • 학습 데이터 X_train과 y_train을 사용하여 모델을 학습

 

6️⃣ 모델 예측 & 정확도 평가

y_pred = model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print(f"정확도: {accuracy * 100:.2f}%")
  • model.predict(X_test) : 테스트 데이터 X_test를 사용하여 모델이 예측한 고객 세그먼트를 y_pred에 저장( 테스트 데이터에 대한 예측 수행하기 위해)
  • accuracy_score(y_test, y_pred) : 실제 정답(y_test)과 예측값(y_pred)을 비교하여 정확도 계산

 

7️⃣ 분류 보고서 출력

print("\n 고객 세그먼테이션 성능 평가:")
print(classification_report(y_test, y_pred, 
target_names=["VIP 고객", "일반 고객", "이탈 위험 고객"]))
  • classification_report() : 모델의 성능을 더 자세하게 보여주는 분류 보고서( 정밀도, 재현율, F1-score  등)를 출력.
  • target_names=["VIP 고객", "일반 고객", "이탈 위험 고객"] : 클래스 레이블을 숫자(1,2,3) 대신 target_names를 사용하여 각 클래스(VIP 고객, 일반 고객, 이탈 위험 고객)의 이름을 지정.

 

8️⃣ 신규 고객 데이터 예측

new_customers = pd.DataFrame([
    [4, 950, 3, 0.05, 0],   # 예상: VIP 고객
    [2, 250, 25, 0.02, 1],  # 예상: 일반 고객
    [1, 80, 35, 0.008, 3]   # 예상: 이탈 위험 고객
], columns=["방문 빈도", "구매 금액", "최근 구매일", "CTR", "반품 횟수"])

new_customers_scaled = pd.DataFrame(scaler.transform(new_customers), 
columns=new_customers.columns)

predicted_segments = model.predict(new_customers_scaled)
  • 새로운 고객 3명의 데이터를 DataFrame으로 생성.
  • scaler.transform(new_customers) : 새로운 고객 데이터를 학습 데이터와 동일한 기준으로 표준화합니다.
  • pd.DataFrame(..., columns=new_customers.columns) : 표준화된 데이터를 다시 DataFrame으로 만듭니다.
  • predicted_segments = model.predict(new_customers_scaled) : 표준화된 새로운 고객 데이터를 모델에 입력하여 고객 세그먼트를 예측

 

9️⃣ 예측 결과 출력

segment_labels = {1: "VIP 고객", 2: "일반 고객", 3: "이탈 위험 고객"}

print("\n 신규 고객 세그먼테이션 예측:")
for i, segment in enumerate(predicted_segments):
    print(f"신규 고객 {i+1}: {segment_labels[segment]}")
  • segment_labels = {1: "VIP 고객", 2: "일반 고객", 3: "이탈 위험 고객"} : 예측된 숫자 레이블(1,2,3)을 실제 고객 유형 텍스트 레이블로 바꿔주는 딕셔너리를 만듭니다.
  • print("\n 신규 고객 세그먼테이션 예측:") : 예측 결과를 출력합니다.

 

위 코드를 웹코드 적용할수있다고? 포스팅 보러가기👇🏻

 

머신러닝 기본 개념부터 웹서비스 실습

역대급으로 집중안돼는 일주일이었던것같다...ㅎ 드디어 끝났어 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 머신러닝의 기본 개념 : 전통적인 프로그래밍 방식과는 달리 명시적인 규칙을 프로그래머가 지

myview0110.tistory.com

 

아래는 이모든 설명을 하게 해준 AI 프롬포트까지 공개합니다. 👇

너는 그로스 마케터중에서도 파이썬,통계 ,머신러닝을 잘 다루는 강사야. 나에게 아래 코드를 설명해줘. 나는 파이썬과 통계의 기본지식은 있지만 머신러닝은 완전 초보야. 하나하나 주석도 달아주고 쉽게 설명해줘
반응형