Python으로 광고 성과 데이터 분석 자동화하기: 코드 몇 줄로 성과가 보이기 시작한 순간
D
Donghyuk_Park
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 |
... | ... | ... | ... | ... | ... |
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' 데이터를 찾을 수 없어 시각화를 생략합니다.")