Ca
CareerCraft.kr
Sign In
강사칼럼

Python으로 광고 성과 데이터 분석 자동화하기: 코드 몇 줄로 성과가 보이기 시작한 순간

D
Donghyuk_Park
May 25, 20251y ago
카테고리
Empty
매일 아침, 커피 한 잔과 함께 광고 보고서와의 사투를 시작하시나요? 여러 광고 플랫폼에서 데이터를 다운로드하고, 엑셀 파일을 열어 수많은 숫자와 씨름하며 일일/주간 보고서를 만드는 일. 마케터라면 누구나 공감할 만한 풍경일 겁니다. 저 역시 그랬습니다. 클릭률(CTR), 전환율(CVR), 광고비 대비 수익률(ROAS) 등 중요한 지표들을 정리하다 보면 어느새 점심시간이 훌쩍 다가오곤 했죠.
단순 반복 작업에 시간을 쏟다 보니, 정작 중요한 ‘왜 이런 결과가 나왔을까?’, ‘어떻게 개선해야 할까?’ 같은 고민은 뒷전으로 밀리기 일쑤였습니다. ‘이 비효율을 어떻게 해결할 수 있을까?’ 고민하던 중, 데이터 분석에 강력하다는 Python이라는 도구를 만나게 되었습니다. 처음엔 코딩이라는 장벽에 망설였지만, "코드 몇 줄로 이 모든 게 자동화된다고?"라는 기대감에 용기를 내 첫발을 내디뎠습니다.
그리고 얼마 지나지 않아, 정말로 ‘성과가 보이기 시작한 순간’을 맞이했습니다.

엑셀의 한계를 넘어, Python을 만나다

우리가 흔히 사용하는 엑셀은 훌륭한 도구이지만, 광고 데이터 분석에는 몇 가지 명확한 한계가 있습니다.
1.
데이터 취합의 번거로움: 구글 광고, 페이스북 광고, 네이버 광고 등 여러 매체의 데이터를 매번 다운로드하고, 형식을 맞춰 하나의 파일로 합치는 과정은 생각보다 많은 시간을 소모합니다.
2.
반복 작업의 비효율: 매일, 매주 동일한 형태로 보고서를 작성하는 것은 창의적인 분석을 위한 시간을 앗아갑니다.
3.
대용량 데이터 처리의 어려움: 데이터가 많아질수록 엑셀은 느려지고, 때로는 멈춰버리기도 합니다.
4.
심층 분석의 제약: 다양한 각도에서 데이터를 조합하고 시각화하며 인사이트를 발굴하는 데에는 제약이 따릅니다.
Python은 이러한 문제들을 해결해 줄 수 있는 강력한 대안입니다. 특히 Pandas 라이브러리는 마치 엑셀의 기능을 코드 몇 줄로 구현할 수 있게 해주며, Matplotlib이나 Seaborn 같은 시각화 라이브러리는 복잡한 데이터도 한눈에 이해하기 쉽게 표현해 줍니다.

코드 몇 줄로 경험한 ‘유레카!’: 일일 성과 보고 자동화

제가 처음 Python의 강력함을 체감한 것은 일일 광고 성과 보고서를 자동화했을 때였습니다. 매일 아침 광고 플랫폼에서 CSV 파일을 다운로드 받아 특정 폴더에 넣어두기만 하면, Python 스크립트가 나머지 작업을 처리해 주는 시스템을 만들었죠.
실제 따라 해 볼 수 있는 간단한 예시 (CSV 파일 기반):
광고 플랫폼에서 다음과 같은 형태로 일별 캠페인 데이터를 다운로드했다고 가정해 봅시다. (파일명: ad_performance_daily.csv)
Date
Campaign Name
Impressions
Clicks
Cost
Conversions
2023-10-26
캠페인 A
10000
200
50000
10
2023-10-26
캠페인 B
15000
250
60000
12
2023-10-27
캠페인 A
12000
220
55000
11
2023-10-27
캠페인 B
13000
230
58000
9
...
...
...
...
...
...
이 데이터를 바탕으로 CTR, CPC, CPA를 계산하고, 일별/캠페인별 성과를 요약하는 Python 코드는 다음과 같습니다.
import pandas as pd

# 0. (사전 준비) Python과 Pandas 라이브러리 설치
# pip install pandas

# 1. CSV 파일 불러오기
try:
    df = pd.read_csv('ad_performance_daily.csv')
except FileNotFoundError:
    print("오류: 'ad_performance_daily.csv' 파일을 찾을 수 없습니다. 파일 경로를 확인해주세요.")
    exit()

# 2. 데이터 타입 변환 (날짜는 날짜형으로, 숫자는 숫자형으로)
df['Date'] = pd.to_datetime(df['Date'])
numeric_cols = ['Impressions', 'Clicks', 'Cost', 'Conversions']
for col in numeric_cols:
    df[col] = pd.to_numeric(df[col], errors='coerce') # 숫자로 변환 안되면 NaT/NaN 처리

# NaN 값 처리 (예: 0으로 채우기 또는 해당 행 제거 - 여기서는 0으로 채움)
df.fillna(0, inplace=True)

# 3. 주요 지표 계산
# CTR (Click-Through Rate) = (클릭 수 / 노출 수) * 100
df['CTR (%)'] = (df['Clicks'] / df['Impressions']) * 100
# CPC (Cost Per Click) = 비용 / 클릭 수
df['CPC'] = df['Cost'] / df['Clicks']
# CPA (Cost Per Acquisition/Conversion) = 비용 / 전환 수
df['CPA'] = df['Cost'] / df['Conversions']

# 0으로 나누는 경우를 대비해 무한대(inf) 값을 NaN으로 바꾸고 0으로 채움
df.replace([float('inf'), -float('inf')], pd.NA, inplace=True)
df.fillna(0, inplace=True) # 계산 후 발생한 NaN도 0으로 처리

# 4. 결과 확인 (일부)
print("----- 기본 데이터 및 계산된 지표 -----")
print(df.head())
print("\n")

# 5. 일별 전체 성과 요약
daily_summary = df.groupby('Date').agg(
    total_impressions=('Impressions', 'sum'),
    total_clicks=('Clicks', 'sum'),
    total_cost=('Cost', 'sum'),
    total_conversions=('Conversions', 'sum')
).reset_index()

# 일별 요약 데이터에도 CTR, CPC, CPA 계산
daily_summary['CTR (%)'] = (daily_summary['total_clicks'] / daily_summary['total_impressions']) * 100
daily_summary['CPC'] = daily_summary['total_cost'] / daily_summary['total_clicks']
daily_summary['CPA'] = daily_summary['total_cost'] / daily_summary['total_conversions']
daily_summary.replace([float('inf'), -float('inf')], pd.NA, inplace=True)
daily_summary.fillna(0, inplace=True)

print("----- 일별 전체 성과 요약 -----")
print(daily_summary)
print("\n")

# 6. 캠페인별 전체 기간 성과 요약
campaign_summary = df.groupby('Campaign Name').agg(
    total_impressions=('Impressions', 'sum'),
    total_clicks=('Clicks', 'sum'),
    total_cost=('Cost', 'sum'),
    total_conversions=('Conversions', 'sum')
).reset_index()

# 캠페인별 요약 데이터에도 CTR, CPC, CPA 계산
campaign_summary['CTR (%)'] = (campaign_summary['total_clicks'] / campaign_summary['total_impressions']) * 100
campaign_summary['CPC'] = campaign_summary['total_cost'] / campaign_summary['total_clicks']
campaign_summary['CPA'] = campaign_summary['total_cost'] / campaign_summary['total_conversions']
campaign_summary.replace([float('inf'), -float('inf')], pd.NA, inplace=True)
campaign_summary.fillna(0, inplace=True)

print("----- 캠페인별 전체 기간 성과 요약 -----")
print(campaign_summary.sort_values(by='total_conversions', ascending=False)) # 전환수 높은 순 정렬

# 7. (선택) 특정 캠페인의 일별 성과 추이 시각화 (matplotlib, seaborn 필요)
# pip install matplotlib seaborn
import matplotlib.pyplot as plt
import seaborn as sns

# 한글 폰트 설정 (Windows: Malgun Gothic, macOS: AppleGothic)
# plt.rcParams['font.family'] = 'Malgun Gothic' # Windows
# plt.rcParams['font.family'] = 'AppleGothic' # macOS
# plt.rcParams['axes.unicode_minus'] = False # 마이너스 부호 깨짐 방지

campaign_a_performance = df[df['Campaign Name'] == '캠페인 A']
if not campaign_a_performance.empty:
    plt.figure(figsize=(12, 6))
    sns.lineplot(x='Date', y='Conversions', data=campaign_a_performance, marker='o')
    plt.title('캠페인 A 일별 전환 수 추이')
    plt.xlabel('날짜')
    plt.ylabel('전환 수')
    plt.grid(True)
    plt.show()
else:
    print("\n'캠페인 A' 데이터를 찾을 수 없어 시각화를 생략합니다.")
이 코드를 실행하면, CSV 파일만 있다면 즉시 주요 지표가 계산되고, 일별/캠페인별 성과가 깔끔하게 정리되어 나옵니다. 그래프까지 그려지니 성과 변화를 직관적으로 파악할 수 있었죠. 이전에 30분에서 1시간 걸리던 작업이 단 몇 초 만에 끝나는 순간, "이거다!" 싶었습니다.

성과가 ‘보이기’ 시작하다: 단순 자동화를 넘어선 가치

Python을 활용한 자동화는 단순히 시간을 절약해 주는 것을 넘어, 다음과 같은 가치를 가져다주었습니다.
1.
데이터 기반 의사결정의 시작: 매일 아침 정확하고 일관된 기준으로 정리된 보고서를 받아보니, 이전에는 놓쳤던 미세한 성과 변화나 이상 징후를 빠르게 감지할 수 있게 되었습니다. "어떤 캠페인의 CPA가 급등했네? 소재 문제인가, 타겟팅 문제인가?" 와 같이 구체적인 질문을 던지며 문제 해결에 집중할 수 있게 된 것입니다.
2.
심층 분석 시간 확보: 반복 업무에서 해방되니, 데이터를 더 깊이 있게 탐색할 시간이 생겼습니다. 특정 기간의 ROAS 변화 추이, 요일별/시간대별 성과 패턴, 소재별 성과 비교 등 이전에는 엄두도 내지 못했던 분석들을 시도하며 새로운 인사이트를 얻을 수 있었습니다.
3.
실수 감소 및 데이터 신뢰도 향상: 수동 작업에서 발생할 수 있는 계산 오류나 누락이 사라지면서 데이터의 신뢰도가 높아졌습니다. 이는 팀 전체의 의사결정 품질 향상으로 이어졌습니다.
4.
성장의 발판 마련: CSV 파일을 넘어 광고 플랫폼 API(Application Programming Interface)에 직접 연동하면 데이터 수집
Ca
Subscribe to 'CareerCraft.kr'
Subscribe to my site to be the first to receive notifications and emails about the latest updates, including new posts.
Join Slashpage and subscribe to 'CareerCraft.kr'!
Subscribe
👍