본문 바로가기

TIL

[240304] 실전 프로젝트: 파이썬과 태블로를 활용한 데이터 전처리

▼ 프로젝트 기획안 

더보기

1. 프로젝트 명
- 효과적인 미디어 플래닝을 위한 마케팅 성과 대시보드

2. 배경 및 문제정의
1) 배경
- 스파르타코딩클럽은 2025년부터 매출 증대를 위한 중장기적인 목표로 lead(잠재고객) 확보 마케팅 캠페인을 진행중
- 2025년 기준 전년대비 광고비 2.7배 가량 투여하며 공격적으로 마케팅한 결과, 총 리드수 2.3배 개선된 3.3만여 명 확보. lead CVR은 0.8%p 개선된 4.01%, CPL은 2.3만원대 기록
- 2026년은 광고 캠페인을 통해 지속적으로 잠재고객을 확보함과 동시에, 매체별 웹사이트 퍼널 분석으로 매출까지 이어지는 고관여 유저의 비중을 높여가고자 함

2) 문제정의

- 2026년 메인 KPI는 lead CVR 4.34%, CPL 18,434원, 서브 KPI는 구매 완료 수 434,520건
 └ 2026년 11월 1일 기준으로 KPI 미달인 lead CVR 개선을 목표로 11~12월 미디어 플래닝 전략 마련 필요
   
3. 프로젝트 목적
리드 전환율(lead CVR) 증대를 위한 2026년도 11월 - 12월 미디어 플래닝 전략 마련

4. 세부 분석 주제
- 광고타입별(or 소스/미디엄별) 리드수 및 lead CVR 성과 분석
- 캠페인별 리드수 및 lead CVR 성과 분석
- 퍼널 분석을 통한 랜딩페이지 이탈률 및 구매 CVR 성과 분석 

 

1. 데이터 설명 

1) campaign_data.xlsx

- 기간: 2024-01-01~2026-10-31

- 광고 성과와 리드 전환 효율이 담긴 데이터셋

 

2) conversion_data.xlsx

- 랜딩페이지 내 이벤트 수와 시간대, 매체 정보가 담긴 데이터셋

 

2. 데이터 전처리

1) 파이썬을 활용한 카테고리 분류 수정 

- (문제) 카테고리 분류가 미진한 부분이 있어 EDA 시 인사이트 도출에 부정적 영향  

  ① 캠페인 데이터셋에 Digital Source(광고타입)의 other 비중이 높고, 

  ② Medium의 유니크 칼럼 수가 많아 유의미한 형태로 정보 취합이 어려움  

 : ex. Medium의 vendoremail, vendor email, email, email blast 등 > email로 분류 수정 후, 해당 값 상위 카테고리는 Digital Souce의 Direct Media로 변경 가능 

 

- 파이썬 replace() 함수를 원본 RAW 파일 수정  

## 라이브러리/파일 불러오기
import pandas as pd
df = pd.read_excel('D:/project/campaign_data.xlsx')


## Medium 칼럼값 변경
df['Medium'] = df['Medium'].replace(to_replace=['email blast', 'vendoremail', 'vendor email'], value='email')
df['Medium'] = df['Medium'].replace(to_replace=['live web seminar', 'web seminar', 'seminar'], value='webinar')
df['Medium'] = df['Medium'].replace(to_replace=['syndicated bulletin'], value='syndicated content')


## Digital Source 칼럼값 변경
# Other > Direct media 로 변경
cond = (df['Digital Source']=='Other') & ((df['Medium']=='email') | (df['Medium']=='webinar')| (df['Medium']=='syndicated content')| (df['Medium']=='newsletter'))
df.loc[cond, 'Digital Source'] = df.loc[cond, 'Digital Source'].replace(to_replace='Other', value='Direct Media')

# Other > Paid Social 로 변경
cond2 = (df['Digital Source']=='Other') & ((df['Medium']=='social') | (df['Medium']=='paid social'))
df.loc[cond2, 'Digital Source'] = df.loc[cond2, 'Digital Source'].replace(to_replace='Other', value='Paid Social')

# Paid Social > Direct media 로 변경
cond3 = (df['Digital Source']=='Paid Social') & ((df['Medium']=='email') | (df['Medium']=='webinar'))
df.loc[cond3, 'Digital Source'] = df.loc[cond3, 'Digital Source'].replace(to_replace='Paid Social', value='Direct Media')

# Other > paid search로 변경 
cond4 = (df['Digital Source']=='Other') & (df['Medium']=='paid search') 
df.loc[cond4, 'Digital Source'] = df.loc[cond4, 'Digital Source'].replace(to_replace='Other', value='Paid Search')


## 처리내역 조회하기
df['Medium'].unique()
#array(['display', 'paid search', 'email', 'newsletter', 
#       'syndicated content', 'paid social', 'webinar', 'sponsorship', 
#       'social', 'custom article', 'organic social', 'microsite', 
#       'partner', 'video', 'banners', 'telemarketing'], dtype=object)

df[df['Digital Source']=='Other']['Medium'].unique()
# array(['sponsorship', 'custom article', 'display', 'partner', 'telemarketing'], dtype=object)

df[df['Digital Source']=='Direct Media']['Medium'].unique()
# array(['email', 'display', 'newsletter', 'syndicated content', 'webinar', 'sponsorship', 'microsite', 'banners'], dtype=object)

df[df['Digital Source']=='Paid Social']['Medium'].unique()
# array(['paid social', 'social', 'organic social'], dtype=object)

df[df['Digital Source']=='Paid Search']['Medium'].unique()
# array(['paid search'], dtype=object)


## 파일 내보내기
df.to_excel("campain 수정.xlsx", index=False)

 

 

2) 태블로를 활용한 전처리 기준 적용 방법  

- 데이터 전처리 기준

└ impressions 칼럼이 null인 경우 제외

└ clicks > impressions, leads > clicks인 경우 제외  

└ 전환 데이터셋에 날짜가 2025-02-29일인 경우 제외 (실제로 없는 날짜)

 

- 계산식을 활용한 전처리 기준 적용

① 계산식 작성

IF (isnull([Impressions]) 
OR ([Date (conversion)]= DATE('2025-02-29'))
OR ([Clicks]>[Impressions])
OR ([Leads]>[Clicks]))
THEN "False" ELSE "True" END

 

② 필터 적용 

(방법1) 생성된 계산식을 필터로 옮기고 'True' 값만 선택 & 해당 필터 워크시트 전체에 적용 

(방법2) 데이터 원본에 필터 추가 (원본 자체에 적용되므로 필터에는 추가할 필요 없음)