본문 바로가기
빅데이터분석

[메타코드] 파이썬 입문 데이터분석 프로젝트 만들기 - 마케팅 데이터 전처리 & 자동화 프로젝트 (2) 전처리

by 모닥불🔥 2024. 6. 30.

 

오늘은 마케팅 용어인 CPC와 ROAS라는 간단한 지표를 파이썬 코드로 구하는 부분을 정리한다.

이미지를 클릭하면 강의 사이트로 이동한다.

가입 시 5천원 주는 추천인 코드: EQQW-36EH-JY4P 추가해주시면 감사합니다.


🔥 강의 목차

오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기

🔥 마케팅 데이터 전처리 &자동화 프로젝트(2) 전처리

지난 글에서 광고(ad), 고객 행동 로그(log), 주문(od) 테이블을 살펴보았다.

데이터 전처리는 데이터를 필요한 형태로 변경하거나, 컬럼을 추가하거나, 결측치/이상치를 처리하거나, 기존 값을 집계하는 등 분석 전 필요한 모든 것을 말한다.

 

전처리 최종 목표는 마케팅 지표인 CPC(Cost Per Click)와 ROAS(Return On Advertising Spend)를 주단위로 집계하는 것이다.

  • CPC는 클릭 당 비용으로 단순히 총 비용을 클릭 수로 나누어 구한다.
  • ROAS는 광고로 인한 수익을 광고 지출로 나누어 구하고, 광고의 효과성을 보여주는 지표이다.


🔥 1. 주 단위로 CPC 구하기

일단, 광고(ad) 테이블에 총 지출(spend)과 클릭 수(clicks) 데이터가 있으니, CPC는 쉽게 구할 수 있을 것 같다.

1) 주 단위로 집계

먼저 ad.info()를 통해 date의 데이터타입을 확인한다.

date가 날짜/시간 형태의 데이터가 아니면 datetime 안에 있는 기능들을 사용할 수 없다.

주단위로 집계하기 위해 date 컬럼을 datetime 형태로 바꿔준다.

판다스 라이브러리를 사용하여, pd.to_datetime(컬럼)을 입력하면 된다.

변경한 후에는 다시 ad.info()로 확인

ad['date']= pd.to_datetime(ad['date'])

 

형 변환이 되었다면, 해당 날짜가 어떤 주(week)에 속하는지 알 수 있도록 week 컬럼을 생성한다.

datetime에서 week를 표시하는 컬럼은 dt.to_period('W')이다.

ad['week']= ad['date'].dt.to_period('W')

 

주 단위가 표시는 되었는데, 우리는 굳이 주의 첫날 - 마지막날을 모두 알 필요가 없다.

한 주의 첫째날만 표시하도록 dt.to_timestamp() 를 활용해보자.

ad['week']= ad.date.dt.to_period('W').dt.to_timestamp()

 

이렇게 만든 week 컬럼과 campaign 컬럼을 기준으로 spend와 clicks를 집계해보자. (아래 코드가 안되면 [['spend', 'clicks']]  부분에 대괄호를 두겹으로 해보자) 

ad_agg = ad.groupby( by = ['campaign', 'week'])['spend', 'clicks'].sum().reset_index()

2) CPC 계산

주별, 캠페인별 spend와 clicks 가 나와 있으므로, 둘을 나누어 CPC를 계산하고, 새 컬럼으로 추가한다.

ad_agg['cpc'] = ad_agg.spend/ad_agg.clicks
ad_agg.head()

 

🔥 2. 주 단위로 ROAS 구하기

ROAS도 주문(od)테이블의 order_amount를 광고(ad)테이블의 spend로 나누면 된다.

다만 아래에서 볼 수 있듯이, 공통되는 컬럼이 하나도 없기 때문에 고객행동로그(log)데이터까지 3개의 테이블을 합쳐야 한다.

 

od1['campaign']= od1.campaign.fillna('organic')
od1.groupby(by='campaign').order_amount.sum()

1) 고객행동로그(log) 테이블과 주문(order) 테이블 합치기

먼저, 고객행동로그(log)와 주문(order) 테이블에서도 날짜/시간 데이터를 datetime 형태로 변경한다.

log['timestamp']= pd.to_datetime( log['timestamp'] )
od['order_date']= pd.to_datetime(od['order_date'])

 

order_id는 식별자로 중복값이 없음을 확인하고, 두 테이블 모두 가지고 있는 'order_id' 컬럼을 기준으로 LEFT JOIN한다.

log.groupby('order_id').size().sort_values()
od.groupby('order_id').size().sort_values()  # 중복 x

od1= pd.merge(od, log, how = 'left', left_on = 'order_id', right_on = 'order_id')

 

 

위 테이블을 보면, 캠페인 1, 2, 3 외에 다른 경로로 유입된 방문자가 NaN으로 표시되어 있다. 일반적으로 유료 광고나 마케팅을 통하지 않고 직접 유입되는 방문자를 오가닉(organic)이라고 하므로,  campaign이 NaN인 경우를 오가닉으로 대체한다.

od1['campaign']= od1['campaign'].fillna('organic')

 

2) 주 단위로 집계

주단위로 ROAS를 구해야 하기 때문에, 새로 만든 od1 테이블을 주단위로 집계한다. (CPC 구할 때 ad 테이블에 week

 컬럼을 만든 것과 동일한 과정임)

od1['week'] = od1['order_date'].dt.to_period('W').dt.to_timestamp()

od_agg = od1.groupby( by = ['campaign', 'week'])['order_amount'].sum().reset_index()

 

3) 주단위로 집계된 광고(ad) 테이블과 주문+로그(od1) 테이블을 JOIN

앞서 CPC를 만든 ad 테이블과 금방 만든 od1 테이블을 JOIN해준다. JOIN 기준은 campaign, week로 한다.

df= pd.merge( od_agg, ad_agg, how = 'left', left_on = ['campaign', 'week'], right_on = ['campaign', 'week'] )

4) 주별, 캠페인별 ROAS 계산: 수익(order_amount) / 지출(spend)

주별, 캠페인별로 집계된 테이블을 JOIN 했으니, 바로 order_amount와 spend를 나누어 ROAS를 구한다.

df['roas'] = df['order_amount']/df['spend']

5) 테이블 Pivotting

위에서 만든 테이블은 분석, 시각화 등을 할 때는 유용하지만 테이블을 보면서 값을 비교하기 용이하지 않다.

예를 들어, 2022-12-26로 시작하는 주에, 어떤 캠페인이 더 효과적이었는지 ROAS를 비교하려면 행들이 떨어져 있어서 한 눈에 보기 힘들다. 이럴 때 pivotting을 통해 테이블 모양을 변경할 수 있다.

df.pivot_table(
    index = 'campaign'
    , columns = 'week'
    , values = 'roas'
)

 

이제 한 눈에 캠페인을 비교해서 볼 수 있게 되었다. ROAS를 구한 결과, 캠페인 1은 12월 말에는 좋았다가 ROAS가 점점 안좋아지고 있다. 캠페인 2는 안좋았다가, 좋았다가, 다시 안좋아지는 것을 반복 중.. 캠페인 3은 계속 ROAS가 낮다.

물론 시각화를 해야 하겠지만, 이 정도 데이터만 전달해도 의사결정자에게 충분히 도움을 줄 수 있다.

 

엑셀로 더 간단히 구할 수 있지만, 매번 다시 분석해야 하는 엑셀과 달리, 파이썬은 코드를 한 번 써 놓으면 데이터만 변경하면서 자동화하기 유리하다. 다음 글에서는 시각화를 다룰 예정!🔥🔥

 

* 본 게시글은 '메타코드'의 동의를 받아 작성된 글로, 강의 내용에 대한 모든 저작권은 Ringo 선생님에게 있습니다. 개인용도의 학습 외에 무단사용은 엄격히 금지됩니다. 위반 시 법적 조취가 취해질 수 있습니다.