데이터 전처리 & 분석
데이터 : 2025.08.01 ~ 2025.08.29 (임의 생성 데이터)
random.randint
,random.choice
활용지표 계산 : CTR, CPC, 전환율, CPA, ROAS, CPM
전처리 : INF → NaN → 0 대체, 반올림 처리, 정수형 변환
sample
1
df.head(5)
date | 노출수 | click | 전환수 | cost | revenue | CTR | CPC | 전환율 | CPA | ROAS | CPM |
---|---|---|---|---|---|---|---|---|---|---|---|
2025-08-01 | 76422 | 438 | 19 | 86557 | 51000 | 0.57 | 198 | 4.34 | 4556 | 59 | 1133 |
2025-08-02 | 35795 | 398 | 27 | 93763 | 0 | 1.11 | 236 | 6.78 | 3473 | 0 | 2619 |
2025-08-03 | 20860 | 408 | 14 | 92606 | 89000 | 1.96 | 227 | 3.43 | 6615 | 96 | 4439 |
2025-08-04 | 58158 | 519 | 27 | 71534 | 68000 | 0.89 | 138 | 5.20 | 2649 | 95 | 1230 |
2025-08-05 | 74343 | 537 | 6 | 89127 | 172000 | 0.72 | 166 | 1.12 | 14854 | 193 | 1199 |
1
df.info()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 29 non-null datetime64[ns]
1 노출수 29 non-null int64
2 click 29 non-null int64
3 전환수 29 non-null int64
4 cost 29 non-null int64
5 revenue 29 non-null int64
6 CTR 29 non-null float64
7 CPC 29 non-null int64
8 전환율 29 non-null float64
9 CPA 29 non-null int64
10 ROAS 29 non-null int64
11 CPM 29 non-null int64
1
df.describe()
. | 노출수 | click | 전환수 | cost | revenue | CTR | CPC | 전환율 | CPA | ROAS | CPM |
---|---|---|---|---|---|---|---|---|---|---|---|
count | 29 | 29.000000 | 29.000000 | 29.00000 | 29.000000 | 29.000000 | 29.000000 | 29.000000 | 29.000000 | 29.000000 | 29.000000 |
mean | 48840.000000 | 444.379310 | 13.586207 | 80454.37931 | 105241.379310 | 1.107931 | 184.827586 | 3.156897 | 15024.241379 | 137.344828 | 2034.448276 |
min | 20769.000000 | 358.000000 | 1.000000 | 61016.00000 | 0.000000 | 0.490000 | 113.000000 | 0.210000 | 2179.000000 | 0.000000 | 860.000000 |
25% | 31284.000000 | 400.000000 | 6.000000 | 69268.00000 | 51000.000000 | 0.680000 | 154.000000 | 1.180000 | 3839.000000 | 68.000000 | 1150.000000 |
50% | 48693.000000 | 438.000000 | 13.000000 | 82002.00000 | 99000.000000 | 0.890000 | 169.000000 | 3.020000 | 6615.000000 | 131.000000 | 1633.000000 |
75% | 64732.000000 | 484.000000 | 21.000000 | 89127.00000 | 155000.000000 | 1.640000 | 227.000000 | 4.680000 | 13714.000000 | 225.000000 | 2502.000000 |
max | 79735.000000 | 539.000000 | 29.000000 | 99976.00000 | 278000.000000 | 2.230000 | 268.000000 | 7.840000 | 93159.000000 | 304.000000 | 4771.000000 |
std | 20123.509439 | 60.875994 | 9.206043 | 12358.18273 | 66029.027801 | 0.543345 | 41.004415 | 2.237111 | 21905.027738 | 88.517261 | 1127.575578 |
전반적으로 평균과 중앙값이 유사하지만 CPA, CPM의 분산이 매우 크다.
시각화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 추세 분석 (광고비 vs 매출액)
fig1 = go.Figure()
fig1.add_trace(go.Scatter(x=df["date"], y=df["cost"], mode="lines+markers", name="광고비"))
fig1.add_trace(go.Scatter(x=df["date"], y=df["revenue"], mode="lines+markers", name="매출액"))
fig1.update_layout(title="일자별 광고비 vs 매출액", template="plotly_white")
fig1.update_yaxes(tickformat=',')
# 퍼널 분석 (노출 → 클릭 → 전환)
fig2 = go.Figure(go.Funnel(
y=["노출수", "클릭수", "전환수"],
x=[df["노출수"].sum(), df["click"].sum(), df["전환수"].sum()],
textinfo="value+percent initial"
))
fig2.update_layout(title="퍼널 분석 (노출 → 클릭 → 전환)")
fig2.update_yaxes(tickformat=',')
# 비용 효율성 비교 (CPC, CPM, CPA)
fig3 = go.Figure()
fig3.add_trace(go.Bar(x=df["date"], y=df["CPC"], name="CPC"))
fig3.add_trace(go.Bar(x=df["date"], y=df["CPM"], name="CPM"))
fig3.add_trace(go.Bar(x=df["date"], y=df["CPA"], name="CPA"))
fig3.update_layout(barmode="group", title="주차별 비용 효율 비교", template="plotly_white")
fig3.update_yaxes(tickformat=',')
# 상관관계 분석 (클릭수 vs 전환수, 광고비 vs 매출액)
fig4 = make_subplots(rows=1, cols=2, subplot_titles=("클릭수 vs 전환수", "광고비 vs 매출액"))
fig4.add_trace(go.Scatter(
x=df["click"], y=df["전환수"],
mode="markers",
text=df["date"].dt.strftime("%m-%d"),
hoverinfo="text+x+y",
name="클릭→전환"), row=1, col=1
)
fig4.add_trace(go.Scatter(
x=df["cost"], y=df["revenue"],
mode="markers",
text=df["date"].dt.strftime("%m-%d"),
hoverinfo="text+x+y",
name="광고비→매출"), row=1, col=2
)
fig4.update_layout(title="상관관계 분석", template="plotly_white")
fig4.update_yaxes(tickformat=',')
# 성과 비율 시각화 (CTR, 전환율)
conversion_rate = df["전환수"].sum() / df["click"].sum()
fig5 = go.Figure(data=[
go.Pie(labels=["CTR 평균", "전환율 평균"],
values=[df["CTR"].mean(), conversion_rate])
])
fig5.update_layout(title="CTR & 전환율 비율 비교")
# 효율지표 종합 대시보드 (ROAS, CPC, CPA)
fig6 = make_subplots(rows=1, cols=3, subplot_titles=("ROAS", "CPC", "CPA"))
fig6.add_trace(go.Bar(x=df["date"], y=df["ROAS"], name="ROAS", marker_color="skyblue"), row=1, col=1)
fig6.add_trace(go.Bar(x=df["date"], y=df["CPC"], name="CPC", marker_color="orange"), row=1, col=2)
fig6.add_trace(go.Bar(x=df["date"], y=df["CPA"], name="CPA", marker_color="green"), row=1, col=3)
fig6.update_layout(title="효율지표 종합 대시보드", template="plotly_white")
fig6.update_yaxes(tickformat=',')
fig1.show()
fig2.show()
fig3.show()
fig4.show()
fig5.show()
fig6.show()
(1) 일자별 광고비 vs 매출액
광고비는 일정하지만 매출은 들쭉날쭉
광고비가 매출을 직접적으로 설명하지 못함(영향x)
매출이 갑자기 튀는 구간은 특정 이벤트/프로모션, 채널별 차이일 가능성이 높다.
“광고비 증가 = 매출 증가”라는 단순 구조가 아님
(2) 퍼널 분석 (노출 → 클릭 → 전환)
노출 대비 클릭률, 클릭 대비 전환률 모두 낮음
광고는 보이지만 흥미를 못 끎 → 타겟팅 문제 가능성
클릭 후 전환 장벽이 큼 → 랜딩 페이지 UX, 구매 과정 문제 가능성
개선 포인트: 타겟 세분화, 랜딩 페이지 개선
(3) 비용 효율성 (CPC, CPM, CPA)
CPC 낮음 → 클릭 자체는 잘 유도됨
CPM 중간 → 노출 대비 비용은 보통
CPA 높음 → 전환수가 적어 단위 비용이 급등
구조적 문제 : 클릭은 잘 되는데, 전환이 안 되는 병목 존재
(4) 상관관계 분석
클릭수 ↔ 전환수 : 강한 선형 패턴 없음 → 상관성 낮음
광고비 ↔ 매출액 : 상관성 약함 → 광고비 증액이 매출 증가를 보장하지 않음(다른 외부 요인 영향 큼)
광고비 자체보다 소재·채널·타겟팅 요인·이벤트 등 외부요인이 더 중요한 변수일 수 있다.
(5) CTR & 전환율 비교
CTR 평균 > 전환율 평균
광고 자체는 주목을 잘 받지만(CTR 높음), 클릭 후 기대 행동으로 이어지지 않음(전환율 낮음).
(6) 효율지표 종합 대시보드 (ROAS, CPC, CPA)
ROAS: 일정치 않음 → 광고 효율 불안정(투자 대비 효율 일정x)
CPC: 안정적 → 클릭 단가는 유지
CPA: 급등락 반복 → 전환 효율이 가장 큰 문제
클릭은 충분히 발생하나 전환 최적화 부족 → CPA 비정상적으로 높음(전환 효율이 개선 포인트)
정리
광고 클릭은 잘 발생하지만 전환으로 이어지지 않아 CPA가 상승
광고비 대비 매출의 변동성이 크고 불안정해 효율성이 낮음
CTR은 양호하지만 전환율이 낮아 타겟팅 정교화와 랜딩 경험 등 개선 필요
광고비와 성과 간 상관관계가 약해 비용 증가만으로 성과를 보장하지 않음
→ 따라서 광고 성과 개선의 핵심은 전환 최적화(CRO) 와 세분화된 타겟팅 전략이다.
CTR이 높은 점을 보면 광고 자체의 매력도는 충분하다. → 광고는 소비자에게 잘 전달되고 있다.
그러나 실제 구매 전환 성과는 부족한 상황이다.