[DAY19] 멋쟁이사자처럼부트캠프 그로스마케팅_Today I Learned
오늘의 학습 내용
- 고객 세분화를 위한 통계 분석
- 확률 분포, 포아송 분포
- 통계적 분석을 통한 마케팅 성과 예측
- 통계 분석 종합 실습 및 결과 해석
고객 세분화를 위한 통계 분석
고객 세분화(Customer Segmentation)는 고객의 특성과 행동 패턴을 분석하여 비슷한 그룹으로 나누는 과정
이를 통해 맞춤형 마케팅 전략을 수립하고, 고객 만족도를 높이며, 기업의 수익을 극대화
고객 세분화를 수행하기 위한 통계 분석 기법 : 기술 통계 분석, K-평균 군집 분석, RFM 분석, 계층적 군집 분석 등
1. 기술 통계 분석
기술 통계 분석은 데이터의 분포와 기본적인 특징을 파악하는 데 사용
고객 데이터를 분석할 때 자주 사용
- 평균 (Mean): 고객 1인당 평균 구매 금액, 평균 방문 횟수 등을 분석하는 데 사용
- 중앙값 (Median): 데이터의 중앙값을 계산하여 이상치의 영향 최소화
- 표준편차 (Standard Deviation): 고객 간 소비 패턴의 차이를 파악하는 데 도움
- 최댓값 및 최솟값 (Max & Min): 가장 높은 구매 금액과 가장 낮은 구매 금액 확인 가능
▶ 예제 코드
import pandas as pd
data = {
"고객ID": range(1, 11),
"총구매금액": [50000, 150000, 30000, 400000, 120000, 80000, 60000, 200000, 90000, 250000],
"방문횟수": [5, 20, 3, 40, 12, 8, 6, 25, 10, 35]
}
df = pd.DataFrame(data)
# 기술 통계 분석 수행
summary_stats = df.describe()
print(summary_stats)
2. K-평균 군집 분석
K-평균 군집 분석(K-Means Clustering)은 고객을 여러 개의 그룹으로 나누는 방법
유사한 특성을 가진 고객끼리 묶어 그룹을 생성, 그룹의 개수(K)는 사전에 지정해야 함
이 방법을 사용하면 고객을 고가 제품 선호 그룹, 할인 제품 선호 그룹 등으로 구분 가능
가장 많이 사용
▶ 예제 코드
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
data = {
"고객ID": range(1, 11),
"총구매금액": [50000, 150000, 30000, 400000, 120000, 80000, 60000, 200000, 90000, 250000],
"방문횟수": [5, 20, 3, 40, 12, 8, 6, 25, 10, 35]
}
df = pd.DataFrame(data)
X = df[["총구매금액", "방문횟수"]]
# K-Means 클러스터링 수행
# 군집수 는 3으로 설정
kmeans = KMeans(n_clusters=3, random_state=42)
# 총구매금액과 방문횟수를 기준으로 k-means 수행
df["군집"] = kmeans.fit_predict(X)
# 시각화
plt.scatter(X["총구매금액"], X["방문횟수"], c=df["군집"], cmap="viridis", alpha=0.7)
plt.xlabel("총 구매 금액")
plt.ylabel("방문 횟수")
plt.title("K-Means 군집 분석 결과")
plt.colorbar()
plt.show()
▶ 코드 결과
3. RFM 분석
RFM 분석(Recency, Frequency, Monetary Analysis)은 고객을 최근성(Recency), 빈도(Frequency), 금액(Monetary) 기준으로 평가하여 고객의 가치를 측정하는 방법
- 최근성 (Recency): 고객이 마지막으로 구매한 날짜를 기준으로 측정
- 빈도 (Frequency): 일정 기간 동안 고객이 구매한 횟수를 측정
- 금액 (Monetary): 고객이 사용한 총 금액을 기준으로 평가
이 분석을 통해 VIP 고객, 일반 고객, 이탈 가능 고객 구분 가능
▶ 예제 코드
import numpy as np
data = {
"고객ID": range(1, 11),
"구매일": pd.date_range(start="2024-01-01", periods=10, freq="30D"),
"총구매금액": [50000, 150000, 30000, 400000, 120000, 80000, 60000, 200000, 90000, 250000]
}
df = pd.DataFrame(data)
# 현재 날짜 기준 최근성 계산
df["Recency"] = (pd.to_datetime("today") - df["구매일"]).dt.days
# 빈도와 금액 계산
df["Frequency"] = np.random.randint(1, 20, len(df))
df["Monetary"] = df["총구매금액"]
# RFM 점수 부여
df["R_Score"] = pd.qcut(df["Recency"], 5, labels=[5, 4, 3, 2, 1])
df["F_Score"] = pd.qcut(df["Frequency"], 5, labels=[1, 2, 3, 4, 5])
df["M_Score"] = pd.qcut(df["Monetary"], 5, labels=[1, 2, 3, 4, 5])
df["RFM_Score"] = df["R_Score"].astype(int) + df["F_Score"].astype(int) + df["M_Score"].astype(int)
print(df[["고객ID", "Recency", "Frequency", "Monetary", "RFM_Score"]])
▶ 코드 결과
4. 계층적 군집 분석
계층적 군집 분석(Hierarchical Clustering)은 고객을 계층 구조로 그룹화하여 유사도에 따라 점진적으로 병합하는 방법
잘 사용하지는 않음
▶ 예제 코드
from scipy.cluster.hierarchy import linkage, dendrogram
data = {
"고객ID": range(1, 11),
"총구매금액": [50000, 150000, 30000, 400000, 120000, 80000, 60000, 200000, 90000, 250000],
"방문횟수": [5, 20, 3, 40, 12, 8, 6, 25, 10, 35]
}
df = pd.DataFrame(data)
X = df[["총구매금액", "방문횟수"]]
# 계층적 군집 분석 수행
linkage_matrix = linkage(X, method="ward")
# 덴드로그램 시각화
plt.figure(figsize=(10, 5))
dendrogram(linkage_matrix)
plt.title("계층적 군집 분석 (Dendrogram)")
plt.xlabel("고객 인덱스")
plt.ylabel("거리")
plt.show()
▶ 코드 결과
고객 세분화를 위한 분석 예제
시나리오
한 쇼핑몰에서 다음과 같은 유형의 고객이 존재한다.
- 일반 고객
- 비교적 저렴한 제품을 구매하며, 구매 빈도가 낮다.
- 방문 횟수도 적으며, SNS 상에서 브랜드와의 상호작용이 적다.
- 프로모션이 있을 때만 관심을 가지는 경향이 있다.
- 프리미엄 고객
- 중고가 제품을 주기적으로 구매하는 고객층이다.
- 방문 횟수가 일반 고객보다 많고, SNS에서 브랜드를 팔로우하는 경우가 많다.
- 충성도가 비교적 높지만, 경쟁 브랜드로 이탈할 가능성이 있다.
- VIP 고객
- 높은 가격의 제품을 반복적으로 구매하며, 구매 빈도와 방문 횟수가 많다.
- SNS에서 브랜드와 적극적으로 소통하고, 신제품에 대한 관심이 높다.
- VIP 혜택과 개인 맞춤형 서비스를 중요하게 여긴다.
▶ 데이터
1. 기술 통계 분석
기본적인 고객 분포를 확인하여 데이터의 전반적인 특징을 파악
이 분석을 통해 평균 방문 횟수, 평균 구매 금액 등을 확인하고 고객의 소비 패턴을 개략적으로 파악
import pandas as pd
# 데이터 로드
csv_filename = "customer_segmentation.csv"
df = pd.read_csv(csv_filename)
# 기본 통계 정보 출력
summary_stats = df.describe()
print(summary_stats)
▶ 결과
2. K-평균 군집 분석
K-평균 군집 분석을 이용하여 고객을 3개의 그룹으로 나누고 시각화
군집 분석을 통해 고객을 유사한 구매 패턴을 가진 그룹으로 분류하고, 각 그룹에 맞는 마케팅 전략을 수립
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 필요 변수 선택
X = df[["총 구매 금액", "방문 횟수"]]
# K-Means 클러스터링 수행
kmeans = KMeans(n_clusters=4, random_state=42)
df["군집"] = kmeans.fit_predict(X)
# 군집 시각화
plt.scatter(X["총 구매 금액"], X["방문 횟수"], c=df["군집"], cmap="viridis", alpha=0.7)
plt.xlabel("총 구매 금액")
plt.ylabel("방문 횟수")
plt.title("K-Means 군집 분석 결과")
plt.colorbar()
plt.show()
▶ 결과
3. RFM 분석
RFM 분석을 통해 고객 가치를 평가하고, VIP 고객과 일반 고객을 구분
import numpy as np
# 최근 구매일 변환
df["최근 구매일"] = pd.to_datetime(df["최근 구매일"])
# 현재 날짜 기준 최근성 계산
df["Recency"] = (pd.to_datetime("today") - df["최근 구매일"]).dt.days
# 빈도와 금액 계산
df["Frequency"] = df["구매 빈도"]
df["Monetary"] = df["총 구매 금액"]
# RFM 점수 부여
df["R_Score"] = pd.qcut(df["Recency"], 5, labels=[5, 4, 3, 2, 1])
df["F_Score"] = pd.qcut(df["Frequency"], 5, labels=[1, 2, 3, 4, 5])
df["M_Score"] = pd.qcut(df["Monetary"], 5, labels=[1, 2, 3, 4, 5])
df["RFM_Score"] = df["R_Score"].astype(int) + df["F_Score"].astype(int) + df["M_Score"].astype(int)
print(df[["고객ID", "Recency", "Frequency", "Monetary", "RFM_Score"]])
▶ 결과
4. 계층적 군집 분석
계층적 군집 분석을 통해 고객을 유사도 기반으로 그룹화하고, 계층적 관계를 시각화
이 분석을 통해 고객 그룹을 보다 세밀하게 구분하고, 고객별 맞춤형 마케팅을 적용
from scipy.cluster.hierarchy import linkage, dendrogram
X = df[["총 구매 금액", "방문 횟수"]]
# 계층적 군집 분석 수행
linkage_matrix = linkage(X, method="ward")
# 덴드로그램 시각화
plt.figure(figsize=(10, 5))
dendrogram(linkage_matrix)
plt.title("계층적 군집 분석 (Dendrogram)")
plt.xlabel("고객 인덱스")
plt.ylabel("거리")
plt.show()
▶ 결과
확률변수(Probability Variable)
확률변수는 불확실한 사건의 결과를 수치화하는 변수를 의미
확률변수는 크게 이산형(Discrete) 확률변수와 연속형(Continuous) 확률변수로 나뉨
1. 이산형 확률변수
특정한 개별 값만 가질 수 있는 확률변수
대표적인 이산 확률분포:
- 베르누이 분포 (Bernoulli Distribution) → 성공(1) 또는 실패(0) 중 하나의 값을 가지는 확률 모델
- 이항 분포 (Binomial Distribution) → n번 시행 중 성공이 나오는 횟수 분포
- 포아송 분포 (Poisson Distribution) → 일정 시간 내에 발생하는 이벤트 횟수 분포
2. 연속형 확률변수
특정 구간 내의 모든 실수 값을 가질 수 있는 확률변수
대표적인 연속 확률분포:
- 정규 분포 (Normal Distribution) → 자연에서 가장 많이 나타나는 분포, 평균을 중심으로 대칭적
- 지수 분포 (Exponential Distribution) → 사건이 발생하는 시간 간격의 확률 모델
- 감마 분포 (Gamma Distribution) → 여러 개의 지수 분포를 합친 형태
3. 확률분포그래프
▶ 데이터
▶ 예제 코드
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# CSV 파일 로드
csv_filename = "/content/ecommerce_customer_behavior.csv"
df_loaded = pd.read_csv(csv_filename)
# 데이터 정보 확인
print(df_loaded.info())
# 1. 광고 클릭률 분석 (베르누이 분포)
plt.figure(figsize=(8, 5))
sns.histplot(df_loaded["광고 클릭 여부"], discrete=True, kde=False, bins=2)
plt.xlabel("광고 클릭 여부 (0: 미클릭, 1: 클릭)")
plt.ylabel("빈도")
plt.title("광고 클릭 여부 분석 (베르누이 분포)")
plt.xticks([0, 1])
plt.grid()
plt.show()
# 2. 방문자 전환율 분석 (이항 분포)
plt.figure(figsize=(8, 5))
sns.histplot(df_loaded["구매 여부"], discrete=True, kde=False, bins=2)
plt.xlabel("구매 여부 (0: 미구매, 1: 구매)")
plt.ylabel("빈도")
plt.title("방문자의 구매 전환율 분석 (이항 분포)")
plt.xticks([0, 1])
plt.grid()
plt.show()
# 3. 고객 체류 시간 분석 (지수 분포)
plt.figure(figsize=(8, 5))
sns.histplot(df_loaded["체류 시간 (분)"], kde=True, bins=30)
plt.xlabel("고객 체류 시간 (분)")
plt.ylabel("빈도")
plt.title("고객 체류 시간 분석 (지수 분포)")
plt.grid()
plt.show()
# 4. 고객 생애 구매 횟수 분석 (감마 분포)
plt.figure(figsize=(8, 5))
sns.histplot(df_loaded["생애 구매 횟수"], kde=True, bins=30)
plt.xlabel("고객 생애 구매 횟수")
plt.ylabel("빈도")
plt.title("고객 생애 구매 횟수 분석 (감마 분포)")
plt.grid()
plt.show()
▶ 결과 및 그래프 설명
포아송 분포 (Poisson Distribution)
포아송 분포는 단위 시간당 또는 단위 공간당 발생하는 사건의 개수를 확률적으로 모델링할 때 사용
예를 들어, 1시간 동안 들어오는 고객 수, 웹사이트 방문 횟수, 콜센터의 전화 수 등과 같은 이산적인 이벤트 발생 수를 예측하는 데 적합
1. 정의
포아송 분포는 평균 발생 횟수(λ, 람다)가 주어졌을 때 특정 개수의 사건이 발생할 확률을 나타내는 분포
확률 질량 함수
2. 포아송 분포의 특징
2.1 이산 확률 분포
포아송 분포는 이산형(discrete) 확률 분포로, 사건 발생 횟수가 0, 1, 2, 3과 같은 정수값을 가짐
2.2 평균과 분산이 동일
포아송 분포의 평균과 분산은 동일하며, 둘 다 λ
- 평균(기대값) : E(X) = λ
- 분산 : Var(X) = λ
따라서 λ 값이 클수록 데이터의 퍼짐도(변동성)가 증가
2.3 사건 발생이 독립적
서로 다른 시간대 또는 공간에서 발생한 사건들은 독립적
2.4 회귀 이벤트 모델링에 적합
이벤트가 드물게(rare) 발생하는 경우를 모델링하는 데 유용
2.5 단위 시간 또는 공간이 증가하면 정규 분포에 수렴
λ 값이 커지면 포아송 분포는 정규 분포에 근사
- 중심극한정리(CLT, Central Limit Theorem)에 의해 큰 λ에서는 정규 분포와 유사한 형태를 가짐
2.6 포아송 과정
- 포아송 분포는 보통 시간(또는 공간)에 따라 랜덤하게 발생하는 이벤트를 모델링할 때 사용되며, 이 과정은 포아송 과정(Poisson Process)이라 부름
- 포아송 과정은 특정 단위 시간 내에서 사건이 발생할 확률이 일정하고, 각 사건이 독립적으로 발생하는 경우 적용
3. 포아송 분포 적용 사례
3.1 웹 사이트 방문 분석
시간당 방문자 수를 모델링하여 트래픽 변화를 분석
3.2 고객 유입 예측
매장에서 1시간 동안 도착하는 고객 수 예측 (그로스 마케팅 활용)
- 시간당 평균 고객 방문수
import numpy as np
# 설정: 매장 시간당 평균 고객 유입 수 (λ)
lambda_value = 7 # 시간당 평균 7명의 고객 방문
# 1시간 동안 도착하는 고객 수 예측 (포아송 분포 샘플링)
predicted_customers = np.random.poisson(lambda_value)
# 결과 출력
print(f"예측된 1시간 동안 도착하는 고객 수: {predicted_customers}")
- 여러 시간대(예: 10시간 동안의 고객 유입)를 예측
# 여러 시간대 예측 (예: 10시간 동안의 고객 유입 수)
hours = 10
predicted_customers_per_hour = np.random.poisson(lambda_value, hours)
# 예측 결과 출력
print(f"각 시간대별 예측된 고객 수: {predicted_customers_per_hour}")
print(f"최소 고객 수: {predicted_customers_per_hour.min()}, 최대 고객 수: {predicted_customers_per_hour.max()}")
print(f"평균 고객 수: {predicted_customers_per_hour.mean():.2f}")
3.3 콜센터 전화량 분석
시간당 들어오는 콜센터 전화 수 예측
3.4 결함 검출
공장에서 시간당 발생하는 결함 제품 수 분석
3.5 교통사고 발생 분석
특정 도로에서 하루 동안 발생하는 사고 횟수 분석
4. 포아송과 다른 분포 비교
▼ 주요 내용 코드
- 포아송 분포를 사용하여 고객 유입 수 데이터 생성
- 하루 동안의 고객 유입 수를 시뮬레이션 (시간 단위)
- 데이터 시각화 (히스토그램 및 시간별 추이)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 포아송 분포를 따르는 하루 동안의 고객 유입 데이터 생성 (λ = 평균 유입 고객 수)
# lambda_value = 5 시간당 평균 유입 수
lambda_value = 5 # 시간당 평균 5명의 고객이 유입됨
hours = 24 # 하루 24시간
# 각 시간대의 고객 유입 수를 포아송 분포에서 샘플링
# np.random.poisson(lambda_value, hours)를 사용하여 특정 시간대의 고객 유입량을 생성
customer_arrivals = np.random.poisson(lambda_value, hours)
# 데이터프레임 생성
df = pd.DataFrame({
'Hour': np.arange(hours),
'Customers': customer_arrivals
})
# 결과 출력
print(df)
# 시각화: 시간별 고객 유입 수
plt.figure(figsize=(10, 5))
plt.bar(df['Hour'], df['Customers'], color='royalblue', alpha=0.7)
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Customers')
plt.title('Hourly Customer Arrivals (Poisson Distribution)')
plt.xticks(np.arange(0, 24, 2))
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
▶ 코드 결과
통계적 분석을 통한 마케팅 성과 예측
마케팅 성과 예측은 통계적 분석 기법을 활용하여 고객 반응과 매출 성과를 예측하는 과정
이를 통해 기업은 마케팅 전략을 최적화하고 예산을 효과적으로 배분할 수 있음
1. 분석 방법
1.1 회귀 분석 (Regression Analysis)
회귀 분석은 마케팅 요소(광고비, 고객 참여도 등)와 성과(매출, 구매 전환율 등) 간의 관계를 분석하는 대표적인 방법
단순 회귀 분석
하나의 독립 변수(X)가 종속 변수(Y)에 미치는 영향을 분석하는 방법
예 : 광고비(X)와 매출(Y)의 관계 분석
다중 회귀 분석
여러 개의 독립 변수(X1, X2, X3...)가 종속 변수(Y)에 미치는 영향을 분석하는 방법
예 : 광고비, 방문자 수, 소셜 미디어 반응이 매출에 미치는 영향
1.2 시계열 분석 (Time Series Analysis)
일정 기간 동안의 데이터를 기반으로 미래 성과를 예측하는 방법
이동 평균법
과거 일정 기간 동안의 데이터를 평균 내어 미래 값을 예측하는 방식
ARIMA
과거의 패턴과 추세를 분석하여 미래 값을 예측하는 대표적인 시계열 모델
1.3 로지스틱 회귀 분석 (Logistic Regression Analysis)
특정 마케팅 캠페인이 성공할 확률을 예측하는 데 활용
1.4 군집 분석 (Clustering Analysis)
군집 분석은 유사한 고객 그룹을 묶어 마케팅 전략을 차별화하는 방법
K-평균 군집화
고객을 비슷한 성향(소비 패턴, 관심사 등)으로 그룹화하여 타겟 마케팅을 실행하는 방식
계층적 군집 분석
고객 데이터를 계층적으로 묶어 고객을 세분화하는 방식
1.5 감성 분석 (Sentiment Analysis)
감성 분석은 고객 리뷰나 SNS 데이터를 분석하여 제품이나 브랜드에 대한 감정을 파악하는 기법
1.6 생존 분석 (Survival Analysis)
생존 분석은 고객 이탈률(Churn Rate)을 분석하여 고객 유지 전략을 수립하는 기법
1.7 의사결정나무 및 랜덤 포레스트 (Decision Tree & Random Forest)
의사결정나무 (Decision Tree)
고객이 구매할 가능성이 높은 조건을 시각적으로 분석하는 방법
랜덤 포레스트 (Random Forest)
여러 개의 의사결정나무를 결합하여 더 정확한 예측을 수행하는 방법
2. 마케팅 성과 예측을 위한 데이터 분석
2.1 시나리오 : 다중 회귀 분석 활용
▶ 배경
B 기업은 최근 온라인 마케팅 캠페인을 진행했으며, 광고비, 이메일 마케팅 반응률, 고객 리뷰 점수를 기반으로 캠페인의 성과를 예측하고자 합니다. 마케팅팀은 이 데이터를 활용하여 향후 어떤 요소가 가장 중요한 영향을 미치는지 분석하고, 마케팅 전략을 최적화하는 것이 목표입니다.
▶ 문제 정의
마케팅 캠페인의 효과를 극대화하기 위해, 광고비, 이메일 마케팅 반응률, 고객 리뷰 점수와 매출 간의 관계를 분석하여 예측 모델을 구축해야 합니다. 이를 통해 미래 성과를 예측하고, 마케팅 전략을 데이터 기반으로 개선할 수 있습니다.
▶ 예제 코드
import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
# Step 1: 데이터 생성 (광고비, 이메일 마케팅 반응률, 고객 리뷰 점수 -> 매출)
data = {
"광고비": [500, 700, 800, 1000, 1200, 1500, 1800, 2000, 2300, 2500],
"이메일반응률": [3.1, 3.8, 4.2, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5],
"고객리뷰점수": [4.0, 4.2, 4.5, 4.6, 4.8, 5.0, 5.1, 5.3, 5.5, 5.7],
"매출": [50, 65, 80, 90, 110, 130, 150, 170, 190, 210]
}
df = pd.DataFrame(data)
# Step 2: 독립 변수 (X)와 종속 변수 (y) 설정
X = df[["광고비", "이메일반응률", "고객리뷰점수"]]
y = df["매출"]
# Step 3: 상수 추가 (회귀 모델에 필요)
X = sm.add_constant(X)
# Step 4: 회귀 모델 생성 및 학습
model = sm.OLS(y, X).fit()
# Step 5: 모델 요약 출력
print(model.summary())
# Step 6: 예측값 생성
df["예측매출"] = model.predict(X)
# Step 7: 실제 매출 vs 예측 매출 비교 그래프
plt.figure(figsize=(8, 5))
plt.plot(df["매출"], label="실제 매출", marker='o')
plt.plot(df["예측매출"], label="예측 매출", linestyle='--', marker='s')
plt.xlabel("데이터 인덱스")
plt.ylabel("매출")
plt.legend()
plt.title("실제 매출 vs 예측 매출")
plt.show()
▶결과
2.2 시나리오 : 시계열 분석 활용
▶ 배경
C 기업은 지난 3년간의 월별 매출 데이터를 보유하고 있으며, 이를 활용하여 향후 매출을 예측하고자 한다. 특히, 연말 프로모션과 같은 특정 시점에서 매출이 급증하는 패턴을 분석하여 효과적인 마케팅 전략을 수립하는 것이 목표이다.
▶ 문제 정의
C 기업은 성수기와 비수기의 패턴을 분석하여 광고 예산을 최적화하고, 향후 매출을 예측하여 프로모션 전략을 수립하고자 한다. 이를 위해 시계열 분석 기법인 이동 평균법과 ARIMA 모델을 활용하여 다음 달의 매출을 예측한다.
▶ 예제 코드
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima.model import ARIMA
# Step 1: 데이터 생성 (월별 매출 데이터 - 지난 36개월치)
np.random.seed(42)
months = pd.date_range(start="2021-01", periods=36, freq="M")
sales = [200 + 10 * i + np.random.randint(-30, 30) for i in range(36)] # 기본 증가 패턴 + 랜덤 변동
sales[11] += 100 # 연말 프로모션 효과 (12월)
sales[23] += 80 # 연말 프로모션 효과 (12월)
sales[35] += 90 # 연말 프로모션 효과 (12월)
df = pd.DataFrame({"월": months, "매출": sales})
df.set_index("월", inplace=True)
# Step 2: 이동 평균법 (Moving Average) 적용
df["이동평균_6개월"] = df["매출"].rolling(window=6).mean()
# Step 3: ARIMA 모델 학습 및 예측
model = ARIMA(df["매출"], order=(2, 1, 2)) # ARIMA(2,1,2) 모델 설정
model_fit = model.fit()
forecast = model_fit.forecast(steps=3) # 향후 3개월 예측
# Step 4: 시각화
plt.figure(figsize=(10, 5))
plt.plot(df.index, df["매출"], label="실제 매출", marker="o")
plt.plot(df.index, df["이동평균_6개월"], label="이동 평균 (6개월)", linestyle="--")
plt.axvline(x=df.index[-1], color='r', linestyle="dotted", label="예측 시작점")
plt.plot(pd.date_range(start=df.index[-1], periods=4, freq="M")[1:], forecast, label="ARIMA 예측값", linestyle="dashed", marker="s")
plt.xlabel("월")
plt.ylabel("매출")
plt.legend()
plt.title("마케팅 성과 예측: 이동 평균 & ARIMA 모델")
plt.show()
# Step 5: 예측 결과 출력
print("향후 3개월 매출 예측 (ARIMA 모델):")
print(forecast)
▶결과
2.3 시나리오: 로지스틱 회귀 분석을 활용
▶ 배경
D 기업은 최근 이메일 마케팅 캠페인을 진행하며, 고객의 이메일 반응이 실제 구매로 이어지는지 분석하고자 한다.
이메일 제목, 할인율, 클릭 여부 등의 데이터를 활용하여 고객이 제품을 구매할 확률을 예측하는 것이 목표이다.
▶ 문제 정의
D 기업은 이메일 마케팅 캠페인의 성공 가능성을 예측하여, 향후 마케팅 전략을 최적화하고 전환율을 극대화하려 한다. 이를 위해 로지스틱 회귀 분석을 활용하여 고객의 구매 여부(0 또는 1)를 예측하는 모델을 구축한다.
▶ 예제 코드
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# Step 1: 데이터 생성 (이메일 캠페인 관련 변수 -> 구매 여부 예측)
np.random.seed(42)
data = {
"이메일제목길이": np.random.randint(20, 80, 200), # 이메일 제목의 글자 수
"할인율": np.random.uniform(0, 50, 200), # 할인율(%)
"이메일클릭여부": np.random.choice([0, 1], size=200, p=[0.6, 0.4]), # 이메일 클릭 여부 (0: 클릭 안함, 1: 클릭)
"구매여부": np.random.choice([0, 1], size=200, p=[0.7, 0.3]) # 구매 여부 (0: 미구매, 1: 구매)
}
df = pd.DataFrame(data)
# Step 2: 독립 변수(X)와 종속 변수(y) 설정
X = df[["이메일제목길이", "할인율", "이메일클릭여부"]]
y = df["구매여부"]
# Step 3: 데이터 분할 (훈련 데이터 80%, 테스트 데이터 20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Step 4: 로지스틱 회귀 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)
# Step 5: 예측 수행
y_pred = model.predict(X_test)
# Step 6: 모델 평가
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
report = classification_report(y_test, y_pred)
print(f"모델 정확도: {accuracy:.2f}")
print("\n혼동 행렬:")
print(conf_matrix)
print("\n분류 보고서:")
print(report)
# Step 7: 시각화 (혼동 행렬)
plt.figure(figsize=(5, 4))
sns.heatmap(conf_matrix, annot=True, fmt="d", cmap="Blues", xticklabels=["미구매", "구매"], yticklabels=["미구매", "구매"])
plt.xlabel("예측값")
plt.ylabel("실제값")
plt.title("로지스틱 회귀 분석 - 혼동 행렬")
plt.show()
▶결과
2.4 시나리오 : BERT 임베딩을 활용한 감성 분석 활용
▶ 배경
E 기업은 고객의 제품 리뷰와 SNS 댓글을 분석하여 브랜드에 대한 감정을 파악하고자 한다. 특히, 긍정적인 피드백이 많은 제품의 마케팅을 강화하고, 부정적인 피드백이 많은 제품에 대한 개선 방향을 수립하는 것이 목표이다.
▶ 문제 정의
E 기업은 고객 리뷰를 분석하여 긍정적/부정적 감정을 자동으로 분류하고, 이를 바탕으로 마케팅 전략을 최적화하려 한다.이를 위해 BERT 임베딩을 활용하여 감성 분석을 수행하고, 제품과 브랜드에 대한 감정을 데이터 기반으로 평가한다.
▶ 예제 코드
import torch
from transformers import BertTokenizer, BertForSequenceClassification
from scipy.special import softmax
import pandas as pd
# Step 1: BERT 모델 및 토크나이저 로드
MODEL_NAME = "nlptown/bert-base-multilingual-uncased-sentiment" # 다국어 감성 분석 모델
tokenizer = BertTokenizer.from_pretrained(MODEL_NAME)
model = BertForSequenceClassification.from_pretrained(MODEL_NAME)
# Step 2: 샘플 댓글 데이터 생성
data = {
"댓글": [
"이 제품 정말 좋아요! 완전 만족합니다.",
"배송이 너무 느려요. 다시는 안 살 거예요.",
"가격 대비 성능이 훌륭합니다. 추천해요!",
"포장이 엉망이었어요. 기분이 나빴습니다.",
"고객 서비스가 훌륭했어요! 빠르게 해결해 줬어요."
]
}
df = pd.DataFrame(data)
# Step 3: 감성 분석 함수 정의
def predict_sentiment(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512)
with torch.no_grad():
outputs = model(**inputs)
scores = softmax(outputs.logits.numpy())[0] # 확률값 변환
sentiment_score = scores.argmax() # 가장 높은 점수의 인덱스 선택 (0~4)
# BERT 감성 분석 모델 기준 (0: 매우 부정, 1: 부정, 2: 중립, 3: 긍정, 4: 매우 긍정)
sentiment_labels = ["매우 부정", "부정", "중립", "긍정", "매우 긍정"]
return sentiment_labels[sentiment_score], scores[sentiment_score] # 감정 라벨 및 확률값 반환
# Step 4: 댓글 감성 분석 수행
df["감정"], df["확률"] = zip(*df["댓글"].apply(predict_sentiment))
# Step 5: 감성 분석 결과 출력
print("감정분석결과")
display(df)
▶ 결과
▶ 예측 결과 해석 방법
- ㅂ긍정적인 리뷰가 많으면 해당 제품의 광고를 강화하고, 고객 후기를 적극 활용할 수 있다
- 부정적인 리뷰가 많으면 고객 불만 사항을 분석하고, 제품 및 서비스 개선 전략을 수립해야 한다.
- 부정적인 리뷰가 많으면 고객 불만 사항을 분석하고, 제품 및 서비스 개선 전략을 수립해야 한다.
" 오늘의 회고"
오늘은 지난 시간에 다 나가지 못한 진도인 고객 세분화 분석, 확률 분포, 포아송 분포 를 학습하고
오늘 진도인 통계적 분석을 통한 마케팅 성과 예측을 학습했다. 다양한 개념도 배우고 플랏들도 그려보고 신기하기도 하고 재밌기도 한 수업이었다. 끝에 감성분석 코드를 돌리고 아쉽게 사정상 조퇴를 하는 바람에 직접 데이터를 가져와 분석해보는 단계까진 하지 못했다. 주말동안은 조퇴로 해보지 못한 감성분석 보고서 부분을 하는 것이 목표이다.
다른분들 보고서 올리시는거 구경하면서 감탄하고 있었는데 혼자서 할 수 있을지 잘 모르겠지만..
이번주는 하루 휴강이 있어 빨리 지나간 기분이네요
다들 고생하셨고 잘 쉬구 담주도 화이팅 입니다..!! ㅎㅎ
충전 잘 하고 만나요!