데이터

[Dakerton] 어떤 광고가 효과적일까? 데이터로 풀어보는 Attribution Model

Yuniverse. 2025. 3. 2. 16:27

우리 팀은 2025년부터 일주일에  번씩 모여 데커톤(Dakerton)을 진행하고 있다. '데커톤'은 데이터(Data)와 해커톤(Hackathon) 조합해서 만든 우리 팀만의 문화로,  명씩 돌아가며 [분석하고 싶은 주제]를 제안하고,  주제에 대해 1~2시간동안 각자의 방법으로 데이터를 분석하고 공유하며 2, 3주에 걸쳐 결론을 내는 것이다. "우리 프로덕트에 도움이 되는 주제여야 한다"  하나의 룰만 지키면, 참석 여부도 분석 방법론도 모든  자유이다.

미리캔버스 'AI로고 만들기'로 제작한 데커톤 로고👍

 

 

데커톤의 두 번째 주제는 종만님께서 제안주셨는데, 광고 및 마케팅 성과 측정 시 자주 사용되는 '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
  • 고객이 처음으로 접한 광고 또는 채널에 100% 기여도 부여.
  • 브랜드 인지도 향상과 초기 고객 유입을 중시하는 경우 유용.
  • 이후의 광고 접점을 무시하므로, 실제 전환에 중요한 후속 채널의 영향을 반영하지 못함.
Last-Touch Attribution
  • 고객이 전환 직전에 접한 광고 또는 채널에 100% 기여도 부여.
  • 직접적인 전환을 유도하는 광고의 효과를 측정하는 데 유용.
  • 초기 또는 중간 단계에서 고객이 영향을 받은 터치포인트의 영향을 반영하지 못함.

 

 

반면, 다중 터치 모델은 고객 여정에서 여러 터치포인트에 기여도를 배분하는 방식이다. 계산의 복잡도는 상승하지만, 고객 행동을 보다 정교하게 분석할 수 있다는 장점이 있다.

 

모델명 특징
Linear Attribution
  • 전환 과정에서 발생한 모든 터치포인트에 동일한 가중치를 부여.
  • 모든 채널을 균등하게 평가하므로, 각 채널의 상대적 중요도를 반영하기 어려움.
  • 단순하지만, 각 채널이 고르게 기여하는 경우 적절한 모델.
Time Decay Attribution
  • 전환에 가까운 터치포인트일수록 높은 가중치를 부여.
  • 고객이 점점 더 결정을 확정해 나가는 과정을 반영하기 때문에 현실적.
  • 단점: 초기 터치포인트의 영향을 과소평가할 가능성이 있음.
Position-Based Attribution (U-Shaped)
  • 첫 번째 터치포인트와 마지막 터치포인트에 높은 가중치를 부여하고, 중간 터치포인트에는 낮은 가중치를 할당.
  • 일반적으로 첫 터치와 마지막 터치에 각각 40%, 중간 터치에 나머지 20%를 배분하는 방식이 사용됨.
  • 브랜드 인지도 형성과 전환 유도 모두 중요한 경우 적합한 모델.
Data-Driven Attribution (Algorithmic)
  • 머신러닝 및 통계 기법을 활용하여 각 터치포인트의 기여도를 데이터 기반으로 계산.
  • Google Analytics의 Data-Driven Attribution(DDA)처럼 대규모 데이터를 분석하여 최적의 가중치를 자동으로 할당하는 방식이 대표적.
  • 가장 정교한 방식이지만, 데이터 수집과 모델링이 필요하며, 일정량 이상의 데이터가 확보되어야 효과적임.

 

출처: What is Attribution in Digital Marketing? (Pathlabs)

 


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 유저가 가장 최근에 한 행동일수록 기여도를 크게 부여하는 방식으로? 고객을 알아간다는 측면에서 딥다이브할만한 가치가 있는 듯해 데커톤이 끝난 후 나만의 백로그에 담아두었다🔥

 


참고 문서