오늘도 조용히 공부하는 타닥타닥 모닥불🔥
드디어 목차의 마지막, '마케팅 데이터 분석 및 지표 정의하기' 파트에 들어섰다.
이 부분에서는 attribution과 conversion window를 배우고, 통합 데이터분석을 진행한다.
이미지를 클릭하면 강의 사이트로 이동한다.
* 가입 시 5천원 주는 추천인 코드: EQQW-36EH-JY4P 추가해주시면 감사합니다.
🔥 강의 목차
오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기
🔥 Attribution이란?
이번에는 attribution이라는 것을 배워볼 것이다. attributtion은 어떤 것에 귀속, 귀인시키는 것을 말한다. 마케팅에서 어트리뷰션 모델(marketing attribution model, 기여 모델)은 사용자의 행동전환에 어떤 광고가 영향을 미쳤는지 파악하기 위해 사용하는 모델이다.
관련된 내용을 잘 설명해 놓은 사이트를 첨부한다.
즉, 링고 선생님 강의에서도 소개하듯이 attribution은 고객의 구매나 전환에 기여한 각 마케팅 접점의 영향력을 평가하는 방법이라고 한다. attribution model은 Last Click Attribution, First Click Attribution, Multi-Touch Attribution 이 있다.
Attribution Model | 정의 | 장점 | 단점 |
Last Click Attribution | 마지막 클릭, 즉 구매 직전 접점에 모든 공을 돌림 | - 이해 및 실행이 쉬움 - 데이터 추적 용이 |
- 초기 및 중간 단계의 중요한 접점을 무시할 가능성 |
First Click Attribution | 첫 클릭, 즉 고객 여정의 첫 접점에 모든 공을 돌림 | - 브랜드 인지도 및 초기 고객 유입 촉진 캠페인 평가에 적합 | - 구매 결정에 영향을 미친 후속 접점들을 간과할 가능성 |
Multi-Touch Attribution | 전체 고객 여정에 걸쳐 여러 접점에 공을 분배 | - 고객의 전체 구매 결정 과정을 폭넓게 고려 - 다양한 접점의 복합적인 영향 이해에 도움 |
- 구현이 복잡함 - 적절한 가중치 결정이 어려움 |
한 마디로 어떤 광고가 구매에 제일 기여하냐! 효과적이냐!를 파악하는 것
마케터나 분석가는 어트리뷰션을 통해 마케팅 효과를 평가하고 예산과 리소스를 효과적으로 배분한다.
실무에서는 Last Click 을 가장 많이 사용한다고 한다.
🔥 Last Click Attribution 실습
이번에는 이렇게 생긴 attribution 데이터로 분석 실습을 한다.
- 소스(source)는 사용자가 웹사이트에 도달한 경로(google, meta 등)를 나타낸다.
- 캠페인(campaign)은 해당 사용자가 어떤 마케팅 캠페인의 결과인지를 표시한다.
- 유저 아이디(user_id)는 유저를 구별하는 고유식별자이다.
- 이벤트(event)는 사용자의 특정 행동을 기록한 것으로 방문(visit), 구매(purchase) 등이 이에 해당한다.
- 타임스탬프(timestamp)는 해당 이벤트가 발생한 시각을 의미하고,
- 이벤트 아이디(event_id)는 이벤트를 구별하는 고유 식별자이다.
1번 사용자(user_id == 1)로 어트리뷰션 실습을 할 것이다. 해당 데이터만 선택해준다.
attr[attr.user_id == 1]
Last Click Attribution을 구할 것이기 때문에, 구매 직전 방문(visit) 채널을 attribution 기준으로 삼아야 한다.
groupby, idxmax()를 이용해 Last click을 구해볼 것이다.
먼저, 날짜/시간 데이터를 다루기 때문에 info()로 데이터타입을 확인한다.
attr.info()
timestamp가 object 형인 것을 알 수 있다. 데이터타입을 datetime으로 변경해준다. 잘 바뀌었는지 확인도 할 것!
attr['timestamp'] = pd.to_datetime(attr['timestamp'])
attr.info()
편의상 df로 명명한다.
df = attr
지금부터 하려는 일은, 다음과 같다.
1. 가진 데이터에서 방문(visit) 테이블과 구매(purchase) 테이블을 분리하고,
2. 이들을 CROSS JOIN해서 한 건의 구매에 대한 모든 방문기록을 합쳐준다.
예를 들면
1월 1일 방문 -> 3월 1일 구매
1월 2일 방문 -> 3월 1일 구매
1월 5일 방문 -> 3월 1일 구매
.
.
.
2월 28일 방문 -> 3월 1일 구매
3. 이렇게 전부 합친 다음, 가장 마지막 방문일(timestamp)을 찾아서 Last Click으로 정의해주면 원하는 테이블이 만들어진다.
먼저, 방문 테이블과 구매 테이블을 분리하기 위해 아래 코드로 구매, 방문 테이블을 각각 생성한다.
구매 테이블의 경우, 이벤트(event)가 purchase인 경우를 골라 테이블을 바로 생성해도 되지만, 방문 테이블은 캠페인 없이 방문한 데이터를 제외해주기 위해 캠페인(campaign)이 Null 값이 아닌 데이터만 불러와서 df_visit으로 저장했다.
만약, purchase 테이블처럼 df_visit = df[df.event == 'visit']으로 테이블을 생성하면 14개의 행이 생기는 반면, 캠페인 없이 방문한 사용자 행동을 제외하면 6행이 남는다.
(아래 캡처는 순서대로 구매, 방문 테이블이다.)
df_purc = df[df.event == 'purchase']
df_visit = df[~df.campaign.isna()]
이제, 두 테이블을 cross join 해준다. 아래와 같이 모든 가능한 visit * purchase 조합이 행으로 만들어진다(6행 * 6행 = 36행).
df_cross = pd.merge( df_purc, df_visit, how = 'cross') # 크로스 조인은 on 필요 없음
df_cross
위 테이블을 자세히 보면, 구매 시 유저 아이디(user_id_x)가 1인데 방문 유저 아이디(user_id_y)가 2인 경우가 있다. 유저 개개인이 어떤 경로로 들어와서 구매했는지를 보고 있기 때문에, user_id_x와 user_id_y가 동일한 데이터만 다시 뽑아준다. 아까 36개의 조합이 나왔었는데, 의미 있는 조합은 18개로 확 줄어 들었다.
df_cross = df_cross[df_cross.user_id_x == df_cross.user_id_y]
다시 한 번 데이터를 살펴 보면, 구매 시각보다 방문 시각이 늦은 경우가 있다. 구매 직전 Last Click을 알고 싶은 것이므로 구매보다 방문이 더 늦은 데이터(예를 들면 위 테이블에서 index 23번 데이터)를 제외해준다. 즉, 구매 시각이 방문 시각보다 같거나 더 늦은 데이터만 남긴다. 이제, 데이터는 9개만 남았다.
df_cross = df_cross[df_cross.timestamp_x >= df_cross.timestamp_y]
다음으로, 구매와 방문 간 시간 차이를 계산해서 td(time delta) 컬럼을 새로 만들어준다.
df_cross['td'] = (df_cross.timestamp_x - df_cross.timestamp_y).dt.total_seconds()
구매와 방문 사이에 시간 차이가 가장 작은 데이터만 쏙쏙 뽑으면 Last Click 이 된다. td 컬럼의 idxmin()을 통해,
구매 건 별로(groupby(by event_id_x)), 시간차이(td)가 최소가 되는 값의 인덱스(index)를 idx 변수에 저장해준다.
idx = df_cross.groupby(by = 'event_id_x').td.idxmin()
위에서 구한 인덱스 값들을 리스트로 하여 loc에 적용한 다음, df_attr를 생성한다.
df_attr = df_cross.loc[idx]
이렇게 하면 각 구매에 대해 마지막으로 방문한 시각과, 캠페인이 표시되는 Last Click Attribution 테이블을 만들 수 있다.
필요 없는 컬럼도 있고, 컬럼명이 지저분한 상태이므로 원하는 형태로 변경해준다.
df_attr = df_attr[['source_y',
'campaign_y',
'timestamp_y',
'event_id_x', # join key
'event_id_y',# 몇 번째 로그인지 알기 위해 필요
'td'
]].rename(columns ={
'source_y':'purc_source',
'campaign_y':'purc_campaign',
'timestamp_y':'visit_at',
'event_id_x': 'purc_id',
'event_id_y': 'visit_id'
})
그런데, 구매 테이블을 다시 보면 구매 건수는 총 6건임을 알 수 있다.
이전에 visit 테이블을 구할 때 캠페인 정보가 없는 행을 제거했기 때문에 이러한 일이 벌어진 것이므로, 해당 정보를 가져와서 다시 left_join 해주어야 한다.
구매 테이블에서 필요한 컬럼을 가져오고, 위에서 변경한 것과 같이 컬럼명을 알맞게 변경한다.
df_purc = df_purc[['user_id',
'timestamp',
'event_id'
]].rename(columns = {
'timestamp': 'purchase_at',
'event_id': 'purc_id'
})
아래 attribution 테이블(df_attr)과 구매(df_purc) 테이블을 머지해준다.
pd.merge(df_purc, df_attr, how = 'left', left_on = 'purc_id', right_on = 'purc_id')
이렇게 하면 유입 캠페인 meta 1건, google 3건, 채널 정보 없음 2건으로,
총 6건의 구매 데이터의 Last Click Attribution 테이블이 잘 정리된 것을 볼 수 있다.
블로그에서는 생략했지만, 링고 선생님 강의에서는 idxmax(), idxmin()에 대한 설명이 추가되어 있고, 각 단계를 시행할 때마다 제대로 실행이 되었는지 확인하는 과정도 함께 실습해 주신다.
이렇게, 이번 글에서는 마케팅 어트리뷰션 모델과, Last Click Attribution에 대해 정리하고 데이터로 직접 구하는 방법을 요약해 보았다. !! 마케팅 공부도 좀 해야할 것 같다는 생각이 들었다.
그럼 이만, 화르륵🔥🔥
'빅데이터분석' 카테고리의 다른 글
[메타코드] 파이썬 입문 데이터분석 - 마케팅 데이터분석 및 지표정의 (2) Conversion Window 2 (0) | 2024.07.31 |
---|---|
[메타코드] 파이썬 입문 데이터분석 - 마케팅 데이터분석 및 지표정의 (2) Conversion Window (0) | 2024.07.31 |
[메타코드] 파이썬 입문 데이터분석 - 제품 포트폴리오 분석 (3) 시각화 (0) | 2024.07.27 |
[헷갈리는 파이썬] f-string과 문자열 format 메서드의 차이점은? 문자열 내 변수 삽입 (0) | 2024.07.25 |
[메타코드] 파이썬 입문 데이터분석 - 제품 포트폴리오 분석 (2) 필요한 컬럼 추가하기 (1) | 2024.07.21 |