우리 팀은 2025년부터 일주일에 한 번씩 모여 데커톤(Dakerton)을 진행하고 있다. '데커톤'은 데이터(Data)와 해커톤(Hackathon)을 조합해서 만든 우리 팀만의 문화로, 한 명씩 돌아가며 [분석하고 싶은 주제]를 제안하고, 그 주제에 대해 1~2시간동안 각자의 방법으로 데이터를 분석하고 공유하며 2, 3주에 걸쳐 결론을 내는 것이다. "우리 프로덕트에 도움이 되는 주제여야 한다"는 단 하나의 룰만 지키면, 참석 여부도 분석 방법론도 모든 게 자유이다.
데커톤의 두 번째 주제는 종만님께서 제안주셨는데, 광고 및 마케팅 성과 측정 시 자주 사용되는 'Attribution Model'의 개념을 적용하여, 회사의 여러 캠페인 광고 데이터를 분석하는 것이었다. 종만님은 광고 분야에 대한 이해도가 높고, 최근 프로젝트에서도 광고 데이터를 자주 다루셨기에 이 주제를 제안해 주셨는데, 나로서는 평소 접할 기회가 적었던 데이터라 더욱 흥미롭게 다가왔다.
Attribution Model이란 무엇인가?
'기여도'를 뜻하는 Attribution이 붙은 모델답게, Attribution Model은 사용자가 제품이나 서비스를 구매하거나 특정 행동을 수행하기까지의 경로에서 각 마케팅 캠페인이 얼마나 기여했는지를 분석하는 방법론이다. 고객이 광고를 접하고 전환에 이르기까지 어떤 요소들이 영향을 미쳤는지를 정량적으로 평가하는 데 사용된다. 여기서의 '전환'은 정의하기 나름인데, '가입 전환'을 목표로 둘 수도 있고, '구매 전환'을 목표로 둘 수도 있다. 구독형 비즈니스 모델일 경우에는 '구독 전환' 또한 물론 가능하다.
Search Ads, Display Ads 등 다양한 채널을 운영하는 기업이라면, 어느 채널이 가장 높은 전환율을 이끄는지, 어떤 조합이 시너지 효과를 내는지를 파악하는 것이 필수적이다. 그래야만 마케팅 비용을 보다 효율적으로 배분하고, 성과가 높은 채널에 집중 투자하여 ROI를 극대화할 수 있기 때문이다. 하지만 디지털 광고 환경에서는 사용자의 구매 여정이 복잡해지고 다채널 마케팅이 보편화됨에 따라, 단순히 '마지막 클릭'만을 평가하는 방식으로는 정확한 성과 분석이 어렵다. 따라서 각 회사의 도메인과 비즈니스에 맞는 Attribution(기여도)을 설정해가면서 고객 행동을 보다 정교하게 분석하는 것이 중요하다. 마케팅 및 광고 분야에서 Attribution Model은 효과적인 예산 배분과 전략 최적화의 핵심 도구로 활용된다.
Attribution Model의 종류: 단일 터치 모델 & 다중 터치 모델
Attribution Model은 크게 단일 터치 모델(Single-Touch Attribution)과 다중 터치 모델(Multi-Touch Attribution)로 나뉜다. 단일 터치 모델은 전환 과정에서 오직 하나의 터치포인트만을 성과 기여도로 인정하는 방식이다. 계산이 간단하고 직관적이지만, 고객의 전체 여정을 반영하지 못한다는 한계가 있다.
모델명 | 특징 |
First-Touch Attribution |
|
Last-Touch Attribution |
|
반면, 다중 터치 모델은 고객 여정에서 여러 터치포인트에 기여도를 배분하는 방식이다. 계산의 복잡도는 상승하지만, 고객 행동을 보다 정교하게 분석할 수 있다는 장점이 있다.
모델명 | 특징 |
Linear Attribution |
|
Time Decay Attribution |
|
Position-Based Attribution (U-Shaped) |
|
Data-Driven Attribution (Algorithmic) |
|
Attribution Model을 활용해 광고 데이터 분석하기
그렇다면 Attribution Model을 활용해 회사 서비스의 광고 데이터를 분석하려면 어떻게 해야 할까? 답은 항상 똑같다. 분석을 통해 구하고자 하는 '목표'를 분명히 하고, 이후 해당 목표를 달성할 수 있는 '가설'을 세워야한다. 데이터는 어디까지나 수단이어야 하지, 데이터를 분석하는 행위 자체가 목적이 되면 안 되기 때문이다.
- 구글 광고는 매체에서 7 day click attribution model을 사용하고 있는데, 우리 서비스에도 7 day를 적용하는 게 최적일까? 데이터 상으로 봤을때 구글 유입 후 2주 후 가입하는 비중이 높다면 14 day click attribution model을 사용해야 하지 않을까?
- 최초 유입은 메타 광고로 많이 일어나는데, last click 대부분은 구글 광고로 잡히고 있다면? 두 유입간의 간격이 1일 내외라면? 만약 이 가설이 참이라면 메타로 우리 서비스를 인지하고, 다음날 사이트 진입을 위해 구글에서 검색한 후 브랜드 키워드 광고를 클릭했을 가능성이 높다. 그렇다면 실제 기여는 메타 광고가 하고 있다고 봐야하므로 우리는 last click으로 광고를 off 하지 않게 기여 모델을 적용해야한다.
*나는 아이데이션 과정에서 인사이트가 풍부해진다고 믿는 사람으로써, 가설 단계에서부터 맘껏 공유하고 피드백 나누는 팀을 지향하고 있다😊
이렇게 서로의 아이디어에 대해 이야기를 나누며 가설을 뾰족하게 한 뒤, 각자 데이터 분석을 진행했다. 나는 광고 데이터를 EDA했을 때 중간 터치포인트에는 굳이 큰 기여도를 줄 필요는 없다고 판단했다. 따라서 다음과 같이 캠페인별 기여도를 부여했다.
1. First Touch에는 30%의 기여도 부여.
2. Last Touch에는 50%의 기여도 부여.
3. 그 외의 Touch에는 균등 기여도 부여.
ex. First, Last를 제외한 캠페인이 2개일 경우엔 {100-(30+50)}/2 % 씩 기여도 부여.
말하자면, Position-Based Attribution과 Linear Attribution을 적절히 응용한 방식이라고 볼 수 있다. 요새 pyspark 문법에 익숙해지려고 노력하는 중이라 코드는 pyspark를 활용해서 작성했다. (양심선언: Chat-GPT의 힘을 아주 많이 빌렸다^^)
from pyspark.sql import functions as F
from pyspark.sql.window import Window
def assign_attribution(df):
# 유저별로 이벤트를 날짜순으로 정렬하는 윈도우 함수 정의
user_window = Window.partitionBy("user_id").orderBy("visit_date")
# 첫 번째 및 마지막 캠페인 식별
df_campaigns = df.filter(F.col("event") != "conversion") \
.withColumn("first_campaign", F.first("event").over(user_window)) \
.withColumn("last_campaign", F.last("event").over(user_window))
# 유저별 conversion 여부를 flag로 생성
conversion_users = df.filter(F.col("event") == "conversion").select("user_id").distinct()
# conversion 유저의 캠페인 데이터만 필터링
df_campaigns = df_campaigns.join(conversion_users, "user_id", "inner")
# 중간 캠페인 개수 계산 (총 개수 - 첫 번째 - 마지막)
df_campaigns = df_campaigns.withColumn("total_campaigns", F.count("event").over(user_window))
df_campaigns = df_campaigns.withColumn(
"middle_campaign_count",
F.when(F.col("total_campaigns") > 2, F.col("total_campaigns") - 2).otherwise(0)
)
# 기여도 계산 (첫 캠페인: 30%, 마지막 캠페인: 50%, 중간 캠페인: 20% / n)
df_campaigns = df_campaigns.withColumn(
"contribution",
F.when(F.col("event") == F.col("first_campaign"), 0.3) # 첫 번째 캠페인
.when(F.col("event") == F.col("last_campaign"), 0.5) # 마지막 캠페인
.when(F.col("middle_campaign_count") > 0, 0.2 / F.col("middle_campaign_count")) # 중간 캠페인
.otherwise(0)
).filter(F.col("contribution") > 0)
return df_campaigns.select("user_id", "event", "contribution") \
.withColumnRenamed("user_id", "user_id") \
.withColumnRenamed("event", "campaign")
3주에 걸쳐 본인의 가설을 검증한 뒤, 결론과 인사이트를 공유하는 시간을 가졌다. 우리 회사는 비즈하우스와 미리캔버스 2가지의 서비스를 운영 중인데, 어떤 서비스의 데이터를 대상으로 했는지 & 전처리는 어떻게 수행했는지 등에 따라 가설 및 분석의 방향이 조금씩 다른 것도 신기했다. 평소에는 본인의 프로젝트에만 딥다이브하다보니 다른 프로젝트의 도메인은 얕게 알 때가 많은데, 동료가 분석한 내용을 공유받으며 도메인 지식을 쌓아나가는 것도 데커톤의 큰 장점이다.
또한, Attribution Model이 주로 광고 데이터 분석에 사용되긴 하지만, 프로덕트 데이터 분석에도 충분히 활용될 수 있는 모델이라고 느꼈다. conversion 유저가 가장 최근에 한 행동일수록 기여도를 크게 부여하는 방식으로? 고객을 알아간다는 측면에서 딥다이브할만한 가치가 있는 듯해 데커톤이 끝난 후 나만의 백로그에 담아두었다🔥
참고 문서
'데이터' 카테고리의 다른 글
[Dakerton] 데이터에서 숨은 패턴을 찾다: Apriori 알고리즘을 활용한 연관분석 (1) | 2025.02.02 |
---|---|
CQGR로 우리 서비스의 성장률 측정하기 (1) | 2025.01.26 |
Databricks에서 원하는 조건의 순서에 맞게 배열 정렬하기 (0) | 2025.01.12 |
(스터디) 실무로 통하는 인과추론 with 파이썬 - PART 5 (1) | 2024.12.28 |
(스터디) 실무로 통하는 인과추론 with 파이썬 - PART 4 (0) | 2024.12.04 |