1. 마케터에게 머신러닝이 필요한 이유
오늘날 마케터가 다루는 데이터는 10년 전과 비교할 수 없을 만큼 늘었습니다. 검색 한 번, 광고 클릭 한 번, 장바구니 담기 한 번… 이 모든 행동이 실시간으로 기록됩니다. 채널도 수십 개로 늘어났고, 보고서도 월 단위가 아닌 분·초 단위 대시보드로 바뀌었습니다.
매달 광고비 1,000만 원을 Facebook·Google·Instagram 세 채널에 나눠 씁니다. 어디에 얼마를 써야 할지 매번 "지난달에 잘 됐으니까..." 식으로 결정해왔습니다.
Facebook 클릭이 많아도 구매 전환율이 낮다면? Google은 클릭은 적지만 전환율이 2배라면? 이 사실을 데이터로 보지 않으면 절대 알 수 없습니다.
1-1. 마케터 + 머신러닝 = 그로스 마케터
머신러닝을 배운다는 건 개발자가 되는 게 아닙니다. 데이터로 의사결정하는 능력을 키우는 것입니다. 마케터의 직관 + 데이터 분석 능력 + 머신러닝 모델이 합쳐질 때, 가설을 빠르게 검증하고 최적의 전략을 실행하는 그로스 마케터가 됩니다.
2. 광고·캠페인 최적화란 무엇인가
광고·캠페인 최적화란, 정해진 예산 안에서 원하는 결과(전환·매출·앱 설치 등)를 최대화하거나, 같은 결과를 더 적은 비용으로 달성하는 모든 활동입니다.
최적화를 이해하려면 먼저 마케팅 퍼널을 알아야 합니다. 광고를 보고 → 클릭하고 → 구매까지 이어지는 각 단계에서 이탈이 발생하고, 머신러닝은 어디서, 왜 이탈이 발생하는지 패턴을 찾아줍니다.
2-1. 데이터 기반 의사결정 사이클
성공적인 그로스 마케터는 아래 4단계 사이클을 빠르게, 반복적으로 돌립니다.
| # | 단계 | 내용 |
|---|---|---|
| ① | 가설 수립 | "Google이 Instagram보다 전환율이 높을 것이다" |
| ② | 데이터 수집 & 분석 | 채널별 CTR, CVR, CPA 계산 |
| ③ | 모델링 & 예측 | 회귀분석으로 광고비 → 전환수 예측 |
| ④ | 실행 & 검증 | 예산 재배분, A/B 테스트 실행 → 다시 ①로 |
3. 핵심 마케팅 지표 4가지
마케팅 데이터를 다루기 전에 반드시 알아야 할 4가지 지표입니다. 지표 하나만 보지 마세요. CTR이 높아도 CVR이 낮으면 결국 손해입니다. 항상 퍼널 전체를 함께 봐야 합니다.
| 지표 | 공식 | 무엇을 보는가 | 낮으면 의심되는 문제 |
|---|---|---|---|
| CTR | 클릭수 ÷ 노출수 × 100 | 광고 소재 매력도 | 이미지·카피가 타겟과 안 맞음 |
| CVR | 전환수 ÷ 클릭수 × 100 | 랜딩페이지·상품 설득력 | 가격, UX, 신뢰도 문제 |
| CPA | 광고비 ÷ 전환수 | 획득 비용 효율 | 타겟팅·채널 선택 문제 |
| ROAS | 매출 ÷ 광고비 × 100 | 전체 광고 투자 효율 | 상품 마진·전략 문제 |
4. 머신러닝 × 마케팅
4-1. 머신러닝이란? (마케터 버전)
복잡한 수식 대신 마케팅 문제로 이해합시다. 크게 세 가지 유형의 문제를 풀 수 있습니다.
| 유형 | 마케팅에서 묻는 질문 | 예시 |
|---|---|---|
| 예측 (회귀) | 광고비 X 쓰면 전환이 얼마나 날까? | 광고비→전환수 예측 |
| 분류 | 이 고객이 이탈할 가능성이 높은가? | 이탈 예측 모델 |
| 군집 분석 | 우리 고객을 어떤 그룹으로 나눌 수 있을까? | 고객 세그먼트 |
4-2. 머신러닝 분석의 기본 흐름 (7단계)
| 단계 | 내용 |
|---|---|
| ① 문제 정의 | "어떤 채널이 ROAS가 가장 높을까?" |
| ② 데이터 수집 | 채널, 광고비, 클릭수, 전환수, 매출 수집 |
| ③ 데이터 전처리 | 결측값 처리, 이상치 제거, 스케일링 |
| ④ 특징 엔지니어링 | CTR, CVR, CPA, ROAS 등 새 변수 생성 |
| ⑤ 모델 학습 | 선형 회귀, K-Means 등 알고리즘 적용 |
| ⑥ 모델 평가 | R², MAE 등으로 성능 확인 |
| ⑦ 의사결정 & 실행 | 예산 재배분, 캠페인 전략 수정 |
5. 실습 전에 꼭 알아야 할 머신러닝 기본 개념
5-1. X와 y : 입력과 정답
머신러닝 코드에서 가장 먼저 등장하는 두 글자가 바로 X와 y입니다.
y (종속변수, Label) = 모델이 맞춰야 할 정답 → "이것을 예측해"
| 문제 | X (입력 정보) | y (예측 대상) |
|---|---|---|
| 전환수 예측 | 광고비, CTR | 전환수 |
| 이탈 예측 | 최근 방문일, 구매횟수 | 이탈 여부 (0 또는 1) |
| 매출 예측 | 광고비, 채널, 요일 | 매출 금액 |
5-2. 학습(fit)과 예측(predict)
머신러닝 모델은 크게 두 단계로 작동합니다.
- fit() = 공부 단계. 과거 데이터에서 X와 y 사이의 패턴(기울기·절편)을 찾아냄
- predict() = 시험 단계. 학습이 끝난 모델에 새로운 X를 주면 y를 예측
- 비유: 학생(모델)이 시험 족보(과거 데이터)를 공부한 뒤, 새 문제를 풀어 답을 내는 것
5-3. sklearn이란?
scikit-learn(줄여서 sklearn)은 파이썬에서 가장 많이 쓰이는 머신러닝 라이브러리입니다.
선형 회귀, 군집 분석, 분류 등 수십 가지 모델이 들어 있어서, 복잡한 수식을 직접 구현하지 않고도 몇 줄 코드로 모델을 만들 수 있습니다.
# sklearn 없이 선형 회귀를 구현하려면? # → 행렬 연산, 편미분, 경사하강법 수십 줄 코드 필요 # sklearn을 쓰면? from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X, y) # 끝!
5-4. 모델 성능 지표 : R²와 MAE
모델을 만들었으면 "얼마나 잘 예측하는가?"를 숫자로 확인해야 합니다.
- R² (결정계수) = 0~1 사이 값. 1에 가까울수록 좋음. "이 모델이 데이터를 몇 %나 설명하는가"
- MAE (평균 절대 오차) = 예측값과 실제값의 평균 차이. 낮을수록 예측이 정확함
- R² = 0.85라면 → "이 모델은 전환수 변동의 85%를 설명한다"
- MAE = 8.6이라면 → "예측이 실제와 평균 8.6건 차이난다"
6. 실습 — 광고 성과 데이터로 전환수 예측하기
실습은 스토리 순서로 이어집니다. 01 → 02 → 03 → 04 순서대로 실행하세요.
실습 01 : 데이터 준비 & 마케팅 지표 계산
목표: 30일치 광고 캠페인 데이터를 만들고, CTR·전환수 등 머신러닝 모델에 넣을 지표를 계산합니다.
머신러닝 모델은 숫자 데이터를 먹습니다. 지표 계산은 재료를 손질하는 과정입니다.
실제 업무에서는 GA4나 광고 플랫폼에서 받은 CSV를 pd.read_csv()로 불러옵니다.
import pandas as pd # ── 30일치 광고 캠페인 고정 데이터 ───────────────────────────── data = { '날짜': [f'2026-03-{str(i).zfill(2)}' for i in range(1, 31)], '광고비': [ 120, 340, 780, 210, 560, 430, 890, 150, 670, 310, 490, 820, 260, 740, 380, 610, 170, 930, 450, 290, 710, 530, 860, 190, 640, 370, 950, 240, 580, 420 ], '노출수': [15000, 42000, 91000, 28000, 67000, 53000, 88000, 19000, 74000, 39000, 58000, 85000, 33000, 79000, 47000, 63000, 22000, 96000, 55000, 36000, 76000, 61000, 89000, 25000, 71000, 45000, 98000, 31000, 68000, 51000], '클릭수': [320, 980, 2850, 590, 1760, 1340, 2100, 410, 1980, 870, 1450, 2430, 720, 2260, 1120, 1680, 480, 2790, 1390, 800, 2080, 1570, 2540, 530, 1870, 1060, 2910, 660, 1740, 1230] } df = pd.DataFrame(data) # 이상치 제거: 클릭수가 노출수를 초과하는 행 제거 df = df[df['클릭수'] <= df['노출수']].reset_index(drop=True) # ── 마케팅 지표 계산 (특징 엔지니어링) ──────────────────────── df['CTR'] = (df['클릭수'] / df['노출수'] * 100).round(2) # 클릭율 % # 전환수: 수업 고정 데이터 (실제라면 GA4 등에서 가져옴) df['전환수'] = [ 41, 42, 74, 5, 51, 40, 80, 14, 63, 29, 33, 86, 41, 90, 41, 54, 17, 66, 58, 20, 53, 50, 97, 28, 49, 31, 94, 27, 47, 41 ] print(df[['날짜', '광고비', '노출수', '클릭수', 'CTR', '전환수']].head())
- pd.DataFrame(data) — 딕셔너리를 엑셀 시트 같은 표 형태(DataFrame)로 변환
- df[df['클릭수'] <= df['노출수']] — 조건을 만족하는 행만 필터링 (이상치 제거)
- df['CTR'] = (클릭수 / 노출수 * 100).round(2) — 새 열 추가 + 소수점 2자리 반올림. 이게 바로 특징 엔지니어링
실습 02 : 시각화로 패턴 확인하기
목표: 머신러닝 모델을 만들기 전에, 광고비와 전환수 사이에 관계가 있는지 눈으로 먼저 확인합니다.
데이터를 분석할 때는 항상 "관계가 있어 보이는가?"를 먼저 시각화로 확인하는 습관이 중요합니다. 산점도에서 점들이 우상향하면 양의 관계 → 머신러닝이 학습할 패턴이 있다는 신호입니다.
import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(13, 5)) # ① 광고비 vs 전환수 산점도 axes[0].scatter(df['광고비'], df['전환수'], color='#4f9cf9', alpha=0.7) axes[0].set_title('광고비 vs 전환수') # ② CTR vs 전환수 산점도 axes[1].scatter(df['CTR'], df['전환수'], color='#a78bfa', alpha=0.7) axes[1].set_title('CTR vs 전환수') plt.tight_layout() plt.show() # 상관계수 확인: 수치로도 관계 강도를 확인 corr = df[['광고비', 'CTR', '전환수']].corr() print(corr['전환수'].drop('전환수').round(3))
- scatter(x, y) — 두 변수의 관계를 점으로 그려주는 산점도. 점이 우상향하면 양의 관계
- .corr() — 상관계수 계산. 1에 가까울수록 강한 양의 관계. 0.5 이상이면 꽤 강한 관계
- 시각화 → 상관계수 확인의 순서로 진행하면 모델 학습 전 데이터를 충분히 이해할 수 있음
실습 03 : 첫 번째 머신러닝 모델 만들기
목표: sklearn으로 선형 회귀 모델을 학습시키고, 모델이 얼마나 잘 배웠는지 확인합니다.
| 그냥 평균 계산 | 머신러닝 (선형 회귀) | |
|---|---|---|
| 할 수 있는 것 | 이미 본 데이터의 평균 확인 | 아직 안 써본 광고비도 예측 가능 |
| 결과 | "500만원 구간 평균은 XX건이었다" | "내일 500만원 쓰면 XX건 예상된다" |
| 변수 여러 개 | 하나씩 따로 봐야 함 | 광고비 + CTR + 요일 동시에 고려 |
| 불확실성 | 없음 (그냥 숫자) | R², MAE로 예측 신뢰도를 숫자로 표현 |
핵심 차이 : 과거 요약 vs 미래 예측
from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score, mean_absolute_error # STEP 1. 입력(X)과 정답(y) 분리 X = df[['광고비']] # 이중 대괄호 → 2D (sklearn 요구사항) y = df['전환수'] # 단일 대괄호 → 1D # STEP 2. 모델 생성 & 학습 model = LinearRegression() model.fit(X, y) # 데이터에서 패턴을 찾는 과정 print(f"기울기(slope): {model.coef_[0]:.4f}") print(f"절편(intercept): {model.intercept_:.2f}") print(f"→ 공식: 전환수 = {model.coef_[0]:.4f} × 광고비 + {model.intercept_:.2f}") # STEP 3. 모델 성능 평가 y_pred = model.predict(X) r2 = r2_score(y, y_pred) mae = mean_absolute_error(y, y_pred) print(f"R² (설명력): {r2:.3f}") print(f"MAE (평균오차): {mae:.1f}건")
- LinearRegression() — 선형 회귀 모델 객체 생성. 데이터를 직선 하나로 요약하는 가장 기본적인 모델
- model.coef_ — 기울기 (slope). 광고비 1 증가 시 전환수가 몇 건 늘어나는지. 클수록 광고 효율이 좋은 캠페인
- model.intercept_ — 절편. 광고비가 0일 때 예상되는 기본 전환 수
- X에 이중 대괄호 [[]]를 쓰는 이유 — sklearn은 X가 2차원(표) 형태여야 함. 단일 []는 1차원이 되어 오류 발생
실습 04 : 모델로 미래 예측하기 (머신러닝의 진짜 목적!)
목표: 학습된 모델로 "아직 해보지 않은 광고비"의 전환수를 예측합니다.
이게 머신러닝의 핵심입니다. 과거 데이터로 미래를 예측하는 것. "다음 달 광고비를 500만원 쓰면 전환이 몇 건이나 날까?" 이 질문에 답할 수 있게 됩니다.
# STEP 1. 새로운 광고비 시나리오로 예측 시나리오 = pd.DataFrame({'광고비': [200, 350, 500, 700, 900]}) 예측결과 = model.predict(시나리오) for i in range(len(시나리오)): print(f"광고비 {시나리오.loc[i,'광고비']}만원 → 예상 전환수: {round(max(0, 예측결과[i]))}건") # STEP 2. 실제 데이터 + 회귀선 시각화 fig, ax = plt.subplots(figsize=(10, 6)) ax.scatter(df['광고비'], df['전환수'], color='#4f9cf9', label='실제 데이터') x_line = pd.DataFrame({'광고비': range(50, 1050, 10)}) ax.plot(x_line, model.predict(x_line), color='#f87171', label='머신러닝 예측선') ax.scatter(시나리오['광고비'], 예측결과.clip(0), color='#34d399', s=150, marker='*', label='새로운 예측') ax.legend(); plt.show()
- model.predict(시나리오) — 학습된 모델에 새 데이터를 넣어 전환수를 예측. 한 번도 써보지 않은 광고비도 예측 가능
- ax.plot(x_line, y_line) — 회귀선 그리기. 점들 사이를 지나는 직선이 모델이 찾은 패턴
- .clip(0) — 예측값이 음수가 나올 경우 0으로 치환. 전환수는 음수가 될 수 없으니 안전장치
+ 도전 : 변수 추가로 R² 개선하기
실습 03에서 X = df[['광고비']] 하나로만 예측했을 때의 R²를 기억하시나요?
CTR 변수를 추가하면 성능이 어떻게 달라지는지 직접 확인해봤습니다.
# 변수 2개로 다중 회귀 모델 구성 X2 = df[['광고비', 'CTR']] # 광고비 + CTR 동시에 고려 y = df['전환수'] model2 = LinearRegression() model2.fit(X2, y) y_pred2 = model2.predict(X2) r2_2 = r2_score(y, y_pred2) mae2 = mean_absolute_error(y, y_pred2) print(f"R² : {r2_2:.3f}") # → 0.796 print(f"MAE : {mae2:.1f}건") # → 8.6건 if r2_2 >= 0.8: print("좋은 모델입니다!") elif r2_2 >= 0.5: print("나쁘지 않지만 다른 변수 추가 요망") else: print("설명력 낮음 — 다른 요인 탐색 필요")
광고비 1개만 사용 시: R² ≈ 0.7xx, MAE ≈ ?건
광고비 + CTR 2개 사용 시: R² = 0.796, MAE = 8.6건
→ CTR을 추가하자 설명력이 올랐습니다. 변수를 더 추가할수록 모델이 정밀해지지만, 지금은 선형 회귀의 기본 개념을 익히는 단계입니다. 다음 시간엔 더 정밀한 모델로 나아갑니다.
오늘 배운 것 정리
도전 과제
시나리오의 광고비 숫자를 바꿔서 예측값이 어떻게 달라지는지 확인해보세요.X = df[['광고비', 'CTR']]로 바꾸면 R²가 올라가나요? (직접 해봤다면 결과를 메모해두세요)- 실습 03의 MAE 값을 다시 읽어보고, "이 오차가 실제 마케팅에서 괜찮은 수준인가?" 생각해보세요.