DATA MARKETING

도전기!_!

그로스 마케팅

GM4. EDA(데이터 기본 정보 확인 & 그래프 시각화)

dltmfdltmf 2025. 2. 21. 15:07

EDA의 주요 목적

  1. 데이터의 기본 정보 파악: 데이터 크기, 컬럼 수, 데이터 타입 등을 확인.
    • 테이블 보고 파악(그래프 아님)
    • +) info 메서드 활용
  2. 결측치 및 이상치 탐색: 누락된 값과 비정상적인 값을 찾아 적절한 처리 방안을 결정.
    • 결측치⇒ 데이터가 연속적인지 파악
    • 이상치⇒ 평균에서 벗어남 의미: 그래프에서 boxplot 중 중간에서 벗어난 부분
  3. 기술통계를 이용한 데이터 요약
    • 평균, 중앙값, 표준편차 등 주요 통계량을 분석.
  4. 데이터의 분포 확인
    • 데이터가 정규분포를 따르는지 여부 등을 시각적으로 확인.
  5. 변수 간 관계 분석
    • 변수 간 상관관계를 분석하여 데이터의 패턴을 이해.

=> 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들을 함께 활용해서 결과를 볼 것인지가 관건인듯!
각 컬럼별로 연관시켜 많은 경우의 수를 생각해보고 인사이트 도출 시도해볼 필요가 있음