EDA의 주요 목적
- 데이터의 기본 정보 파악: 데이터 크기, 컬럼 수, 데이터 타입 등을 확인.
- 테이블 보고 파악(그래프 아님)
- +) info 메서드 활용
- 결측치 및 이상치 탐색: 누락된 값과 비정상적인 값을 찾아 적절한 처리 방안을 결정.
- 결측치⇒ 데이터가 연속적인지 파악
- 이상치⇒ 평균에서 벗어남 의미: 그래프에서 boxplot 중 중간에서 벗어난 부분
- 기술통계를 이용한 데이터 요약
- 평균, 중앙값, 표준편차 등 주요 통계량을 분석.
- 데이터의 분포 확인
- 데이터가 정규분포를 따르는지 여부 등을 시각적으로 확인.
- 변수 간 관계 분석
- 변수 간 상관관계를 분석하여 데이터의 패턴을 이해.
=> 3,4,5번을 포함한 것이 보고서
데이터 시각화에 활용할 그래프 종류
그래프 종류
|
활용 사례
|
주요 목적
|
히스토그램
|
광고 클릭 수 분포 분석
|
데이터의 분포 파악
|
선형 그래프
|
시간에 따른 매출 변화
|
시간별 트렌드 분석
|
막대 그래프
|
채널별 전환율 비교
|
범주형 데이터 비교
|
산점도
|
광고비 vs 전환율 관계 분석
|
상관관계 분석
|
파이 차트
|
고객 세그먼트 비율 분석
|
비율 비교
|
박스 플롯
|
이상치가 포함된 수익 분석
|
이상치 감지 및 데이터 분포 확인
|
히트맵
|
시간대별 광고 성과 분석
|
다차원 데이터의 패턴 분석
|
1. 파이 차트
- 특정 카테고리 비율 볼 때
- e.g. 신규 고객이 차지하는 비율, 고객 세그먼트, 유입 채널, 상품별 매출 기여도 등
📊 해석 GuideLine
- 특정 그룹(고객 유형, 유입 채널 등)이 전체에서 차지하는 비중 파악
- 특정 그룹의 비율이 너무 낮다면=> 해당 그룹을 성장시킬 방법 고민
- 특정 카테고리가 너무 지배적일 경우=> 리스크 분산이 필요할 수도 있음
💡 마케팅 전략 예시
✔ 신규 고객 비율이 낮다면?→ 신규 고객 유입을 늘리기 위한 프로모션 및 퍼포먼스 마케팅 강화
✔ 특정 유입 채널(예: SNS)이 압도적으로 높다면?→ 해당 채널에 더 집중 투자 + 타 채널에서도 성과를 높일 방법 고려
✔ VIP 고객이 전체 매출에서 차지하는 비율이 높다면?→ VIP 고객 대상 리텐션 마케팅(멤버십, 리워드 프로그램) 강화
2. 히스토그램
- 빈도수를 보기 위한 그래프
- e.g. LTV 분포, 객단가 분포, 고객 연령 분포 등
📊 해석 GuideLine
- 중앙값(가장 많이 몰린 구간, 빈도수가 가장 많은 부분 의미)이 어디인지 확인
- 특정 구간에 데이터 몰려 있는 경우=> 핵심 타겟층 파악
- 이상하게 한쪽으로 치우쳐 있다면 => 데이터 불균형 원인 분석 필요
💡 마케팅 전략 예시
✔ LTV가 10만 원 이하인 고객이 많다면?→ 리텐션 마케팅(쿠폰, 추가 할인)으로 객단가를 높이는 전략 필요
✔ 구매 빈도가 1~2회인 고객이 많다면?→ 재구매 유도 마케팅 (포인트 적립, 리뷰 이벤트) 도입
✔ 고객 연령이 특정 구간에 집중되어 있다면?→ 주요 타겟층을 더 세분화하여 맞춤형 광고 집행
3. 박스 플롯
- 데이터 분포와 이상치 감지할 때
- 데이터의 중앙값, 사분위수(Q1,Q3), 이상치를 시각적으로 표현
- 박스(Box): Q1(25%) ~ Q3(75%) 사이의 값을 표시 (데이터의 50% 포함)
- 중앙값(Median, Q2): 박스 내부의 가로선
- 이상치: 사분위 범위 벗어난 값, 별도의 분석 대상으로 고려
- e.g. 고객 구매 금액, 방문 시간, 광고비 ROAS, 평균 결제액 등 변동성이 있는 데이터
📊 해석 GuideLine
- 이상치 존재하는지 확인 : 정상범위(보통의 데이터 평균 범주 의미)에서 벗어난 경우 → VIP 고객, 고액 결제 고객 파악하는데 유용
- 사분위 범위(IQR, 박스 크기)가 큰 경우: 고객 행동의 편차가 큼 의미
- 중앙값 위치를 보고 데이터가 한쪽으로 치우쳐 있는지 확인
💡 마케팅 전략 예시
✔ 일부 고객이 비정상적으로 높은 구매 금액을 기록했다면?→ 해당 고객을 VIP 타겟으로 설정하여 프리미엄 멤버십 제안
✔ 광고 ROAS가 이상적으로 높은 경우, 특정 채널에서만 효과적인가?→ 해당 채널에 더 많은 광고비를 투자하고, 다른 채널의 성과도 개선
✔ 비회원의 구매 금액 편차가 크다면?→ 비회원 중 높은 구매 금액을 기록한 고객에게 회원 가입 유도
=> 사분위 범위(박스)에서 벗어난 데이터(=이상치)에 집중
4. 바 차트 (막대 그래프)
- 범주형 데이터 비교 할 때
- e.g. 유입 채널별 성과, 상품별 판매량, 광고 캠페인 성과 비교 등
📊 해석 GuideLine
- 가장 성과 좋은 요소(e.g. 채널, 상품, 캠페인) 확인
- 트렌드 변화(시간대별, 월별, 연도별 비교)를 분석 => 선 그래프로 봐도 좋음
💡 마케팅 전략 예시
✔ 특정 상품군(예: 스포츠 의류) 매출이 낮다면?→ 시즌별 프로모션, 번들 할인 패키지 제안
✔ 특정 광고 채널(예: 페이스북)이 ROAS가 낮다면?→ 해당 채널의 타겟팅을 조정하거나 예산을 다른 채널로 이동
✔ 특정 지역의 구매율이 낮다면?→ 지역 맞춤 광고 및 배송 정책 최적화
5. 산점도
- 상관관계 및 패턴 분석
- 변량이 많을 때 (=> 벡터로 표시): 두 가지가 동시에 변화하는 상황
- e.g. 두 변수 간 관계(예: 고객 방문 빈도 vs. 객단가, 광고비 vs. 매출, 소득이 높은 고객이 vs 실제로 더 많이 구매? 등)
📊 해석 GuideLine
- 양의 상관관계 ↗️ : 한 변수가 증가하면 다른 변수도 증가
- 음의 상관관계 ↘️ : 한 변수가 증가하면 다른 변수는 감소
- 특정 구간에서 데이터 몰려 있다면 => 해당 구간의 패턴 분석
💡 마케팅 전략 예시
✔ 방문 빈도가 높은 고객일수록 객단가(고객 1명이 평균적으로 구매하는 금액, AOV(Average Order Value))가 높다면?→ 푸시 알림, 개인화 추천 등을 통해 방문 빈도를 증가시키는 전략 활용
✔ 할인율이 높아질수록 재구매율이 낮아진다면?→ 할인율 조정 및 고객 충성도 프로그램 개발
✔ 특정 가격대의 상품이 높은 리뷰 점수를 받는다면?→ 해당 가격대 제품을 더 적극적으로 마케팅
EDA (code)
1. 데이터 기본 정보 파악/ 결측치 및 이상치 탐색/ 기술통계 이용한 데이터 요약
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import LabelEncoder, MinMaxScaler, StandardScaler
# 데이터 로드
df = pd.read_csv("customer_behavior.csv")
# ===== 실습과제 1: 데이터 전처리 및 기본 탐색 =====
print("데이터 크기:", df.shape)
print("\n데이터 타입:")
print(df.info())
print("\n결측치 개수:")
print(df.isnull().sum())
# 결측치 처리
df["평균구매주기"] = df["평균구매주기"].fillna(df["평균구매주기"].mean())
df["총구매금액"] = df["총구매금액"].fillna(df["총구매금액"].median())
print("\n결측치 처리 후:")
print(df.isnull().sum())
- df.shape
- df.info : 인덱스, 컬럼명, Non-Null 개수, 데이터타입 출력
- df.describe() : 기술통곙 요약(평균, 표준편차, 최솟값, 중앙값, 최댓값, 사분위값 등 출력)
- df.head(5) :5개 레코드만 추출
- df.isnull().sum() : 결측치 개수
2. 데이터 분포 확인/ 변수 간 관계 분석 (그래프 활용)
* 참고
- categories: X축 레이블
- values: Y축 값
+) Python에서 시각화 시, 한글 깨지는 경우
!pip install koreanize-matplotlib
import koreanize_matplotlib
+) 그래프 색상 추가
sns.barplot(x=df["~"], y=df["~"], estimator=np.mean, palette = ['pink', 'coral'])
plt.bar(categories, values, color=['red', 'blue', 'green', 'purple'])
** sns 라이브러리 => palette = []
** plt 라이브러리 => color = []
파이 차트
import matplotlib.pyplot as plt
sizes = [30, 20, 50]
labels = ["A", "B", "C"]
colors = ['red', 'blue', 'green']
plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors, startangle=90)
plt.title("Pie Chart Example")
plt.show()
########## 신규 고객 vs 기존 고객 비율 분석 (파이 차트) ##########
plt.figure(figsize=(6, 6))
df["신규고객여부"].value_counts().plot.pie(autopct="%.1f%%", labels=["기존 고객", "신규 고객"], colors=["skyblue", "lightcoral"])
plt.title("신규 고객 vs 기존 고객 비율")
plt.ylabel("")
plt.show()
히스토그램
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(1000) # 평균 0, 표준편차 1인 정규분포 데이터 생성
plt.hist(data, bins=30, color='skyblue', edgecolor='black')
plt.title("Histogram Example")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()
########### 고객별 LTV 분포 (히스토그램) ###########
plt.figure(figsize=(8, 5))
sns.histplot(df["LTV"], bins=30, kde=True)
plt.title("고객 생애 가치(LTV) 분포")
plt.xlabel("LTV")
plt.ylabel("고객 수")
plt.show()
박스 플롯
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
data = [np.random.randn(100), np.random.randn(100) + 1, np.random.randn(100) + 2]
plt.boxplot(data, patch_artist=True, vert=True)
plt.title("Box Plot Example")
plt.xlabel("Categories")
plt.ylabel("Values")
plt.show()
######### 고객 이탈률 분석 (박스플롯) #########
plt.figure(figsize=(6, 5))
sns.boxplot(x=df["이탈여부"], y=df["총구매금액"], palette=["skyblue", "lightgreen"])
plt.xticks([0, 1], ["유지 고객", "이탈 고객"])
plt.title("이탈 고객 vs 유지 고객의 구매 금액 차이")
plt.xlabel("이탈 여부")
plt.ylabel("총 구매 금액")
plt.show()
바 차트
import matplotlib.pyplot as plt
categories = ["A", "B", "C", "D"]
values = [10, 25, 15, 30]
plt.bar(categories, values, color=['red', 'blue', 'green', 'purple'])
plt.title("Bar Chart Example")
plt.xlabel("Categories")
plt.ylabel("Values")
plt.show()
########## 광고 채널별 전환율 비교 (바 차트) ##########
plt.figure(figsize=(8, 5))
sns.barplot(x=df["광고채널"], y=df["총구매금액"], estimator=np.mean)
plt.title("광고 채널별 평균 구매 금액")
plt.xlabel("광고 채널")
plt.ylabel("평균 구매 금액")
plt.show()
산점도
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50)
y = np.random.rand(50)
plt.scatter(x, y, color='red', marker='o')
plt.title("Scatter Plot Example")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.show()
########## 소득 vs 구매 금액 관계 분석 (산점도) ##########
plt.figure(figsize=(6, 5))
sns.scatterplot(x=df["소득"], y=df["총구매금액"], alpha=0.5)
plt.title("소득 vs 총 구매 금액 관계")
plt.xlabel("소득")
plt.ylabel("총 구매 금액")
plt.show()
# ===== 구매횟수와 총구매금액이 재구매에 영향을 미치는지 '다변량' 분석 =====
plt.figure(figsize=(6, 4))
sns.scatterplot(x=df["구매횟수"], y=df["총구매금액"], hue=df["재구매여부"], alpha=0.6)
plt.title("구매횟수 vs 총 구매금액 (재구매여부 포함)")
plt.xlabel("구매횟수")
plt.ylabel("총 구매금액")
plt.legend(title="재구매여부")
plt.show()
선 그래프
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 50]
plt.plot(x, y, marker='o', linestyle='-', color='b', label="Line Data")
plt.title("Line Graph Example")
plt.xlabel("X Axis")
plt.ylabel("Y Axis")
plt.legend() # 범례 추가
plt.grid(True) # 격자 추가
plt.show()
히트맵: 상관계수/상관행렬
######## 수치형 변수 간의 상관계수 확인 ########
correlation_matrix = df.select_dtypes(include=[float, int]).corr()
print(correlation_matrix)
######## 상관 행렬 히트맵 시각화 ########
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("상관관계 히트맵")
plt.show()
############ 예시) 성별을 포함한 상관관계 ############
from sklearn.preprocessing import LabelEncoder
# 성별을 숫자로 변환 (남성: 0, 여성: 1)
df["성별"] = LabelEncoder().fit_transform(df["성별"])
# 상관 행렬 히트맵
plt.figure(figsize=(8, 6))
sns.heatmap(df.corr(), annot=True, cmap="coolwarm", fmt=".2f")
plt.title("변수 간 상관관계 히트맵 (성별 포함)")
plt.show()
plt.subplot() : 여러 그래프 표시
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1) # 1행 2열 중 첫 번째
plt.plot(x, y1, color='blue')
plt.title("Sine Wave")
plt.subplot(1, 2, 2) # 1행 2열 중 두 번째
plt.plot(x, y2, color='red')
plt.title("Cosine Wave")
plt.tight_layout() # 간격 자동 조정
plt.show()
고객 데이터 관련 feature engineering
** 피처 엔지니어링**
성능을 향상하기 위해 데이터를 변환하고 개선하는 프로세스. 즉 원하는 결과 분석하고자 필터링을 비롯하여 데이터 다루는 방법
1. 특정 행동 기반 고객 세그먼트화
- 전환율 기반
######### 고객 전환율 기반 그룹화 #########
df["Conversion Status"] = df.apply(lambda x: "Converted" if x["Purchase"] > 0 else "Not Converted", axis=1)
- 재방문 횟수 기반
########### 고객 재방문 횟수 기반으로 그룹화 ###########
df["Engagement Level"] = df["Visit Count"].apply(lambda x: "High" if x > 10 else ("Medium" if x > 5 else "Low"))
- LTV(lifetime value) 기반
######## 총 구매 금액 기준으로 VIP 고객 구분 ########
df["Customer Tier"] = df["Total Spend"].apply(lambda x: "VIP" if x > 1000 else ("Regular" if x > 500 else "New"))
- 시점을 기준으로 분류: 평균 구매 주기 (recency) 기반 세분화
######### 최근 구매 시점을 기준으로 구매 이력 세분화 #########
import pandas as pd
df["Last Purchase Days"] = (pd.to_datetime("today") - df["Last Purchase Date"]).dt.days
df["Recency Segment"] = df["Last Purchase Days"].apply(lambda x: "Recent" if x < 30 else ("Dormant" if x < 90 else "Churned"))
2. 특정 고객 그룹 필터링
- 최근 30일 이내에 구매한 고객만 필터링
import pandas as pd
df["Last Purchase Days"] = (pd.to_datetime("today") - df["Last Purchase Date"]).dt.days
recent_buyers = df[df["Last Purchase Days"] <= 30]
- 장바구니에 담았지만 구매하지 않은 고객 필터링
cart_abandoners = df[(df["Cart Items"] > 0) & (df["Purchase"] == 0)]
3. 그룹화 활용한 분석
- 고객 등급별 평균 구매액 계산
avg_spend_by_tier = df.groupby("Customer Tier")["Total Spend"].mean().reset_index()
- 마케팅 채널별 전환율 계산
conversion_rate_by_channel = df.groupby("Marketing Channel")["Conversion Rate"].mean().reset_index()
4. 누적 값 계산(cumsum)
- 고객별 누적 구매 금액 계산
df["Cumulative Spend"] = df.groupby("Customer ID")["Total Spend"].cumsum()
5. 특정 조건 만족하는 고객 수 카운드(count)
- 채널별 전환 고객 수 계산
conversion_count_by_channel = df[df["Converted"] == 1].groupby("Marketing Channel")["Customer ID"].count().reset_index()
- 최근 3개월 동안 2번 이상 구매한 고객 수 카운트
active_customers = df[(df["Last Purchase Days"] <= 90)].groupby("Customer ID")["Purchase"].count()
repeat_customers = active_customers[active_customers >= 2].count()
주제에 따른 분석 항목 & 활용 그래프
- 이커머스 웹사이트의 고객 행동 분석
분석 항목
|
설명
|
활용 그래프
|
장바구니 이탈률 분석
|
장바구니에 상품을 담았지만 결제하지 않은 고객 비율 분석
|
파이 차트(Pie Chart)
|
구매 빈도 분석
|
고객의 구매 횟수 분포를 분석
|
히스토그램(Histogram)
|
회원 vs 비회원 구매 패턴 비교
|
회원과 비회원의 평균 구매 금액 비교
|
박스플롯(Box Plot)
|
마케팅 캠페인별 전환율 분석
|
캠페인별 고객 반응을 비교
|
바 차트(Bar Chart)
|
사이트 방문 시간대별 구매율 분석
|
특정 시간대에 구매가 많이 이루어지는지 확인
|
선 그래프(Line Chart)
|
- EDA를 이용한 데이터 분석 절차
단계 | 설명 | 활용 기법 |
데이터 로드 및 정보 확인
|
데이터셋 불러오기 및 기본 정보 확인
|
pandas, .info(), .describe()
|
결측치 및 이상치 탐색
|
결측치 및 이상치 탐색 및 처리
|
.isnull(), fillna(), 박스플롯
|
기술통계를 활용한 데이터 요약
|
데이터 분포 및 특성 분석
|
히스토그램, 평균/표준편차
|
변수 간 관계 분석
|
변수 간 상관관계 분석
|
상관 행렬, 산점도, 바 차트
|
결론 도출 및 마케팅 전략 수립
|
분석 결과를 바탕으로 마케팅 최적화
|
맞춤형 프로모션, 광고 최적화
|
회고
분석 목적을 위해 어떤 KPI들을 함께 활용해서 결과를 볼 것인지가 관건인듯!
각 컬럼별로 연관시켜 많은 경우의 수를 생각해보고 인사이트 도출 시도해볼 필요가 있음
'그로스 마케팅' 카테고리의 다른 글
GM6. 고객 세분화 (K-means, RFM, 계층적 군집 분석 등) (0) | 2025.02.27 |
---|---|
GM5. 구매 데이터 기반 주요 지표(이탈률, 전환율, ROAS, CAC ···) 분석&보고서 (5) | 2025.02.26 |
GM3. [데이터 시나리오화] 사용자 행동 분석, 사용자 행동 흐름 분석, 트래픽 소스 분석, 전환 분석, 장치 및 지역 분석 (2) | 2025.02.17 |
GM2. 그로스 마케팅 KPI에 대한 데이터 분석(2) (2) | 2025.02.07 |
GM1. 그로스 마케팅 KPI에 대한 데이터 분석(1) (0) | 2025.02.06 |