본문 바로가기
카테고리 없음

SKAN 4.0에서 코호트 리텐션 추정: 포스트백 제한 환경의 리텐션 모델

by essay72110 2026. 2. 25.
반응형

SKAN 4.0에서 코호트 리텐션을 “추정”해야 하는 이유

SKAN 4.0은 설치 후 사용자 행동을 **세 개의 전환 윈도우(conversion windows)**로 나누고, 윈도우별로 최대 3개의 포스트백을 받을 수 있게 설계되어 있다. 문제는 이 포스트백이 유저 레벨이 아니라 집계(aggregate) 레벨이고, 윈도우가 분리되어 있어 **“같은 유저의 D1→D7→D30 리텐션을 직결로 관측할 수 없다”**는 점이다. 즉 SKAN에서 리텐션은 측정(measurement)이 아니라 **추정(inference)**의 영역으로 넘어간다.

이 글의 목표는 “SKAN에서도 코호트 리텐션 커브를 만들 수 있게” 다음을 체계화하는 것이다.

  1. 포스트백 제한을 리텐션 모델의 입력으로 정리하고
  2. 윈도우별 신호를 리텐션 파라미터로 변환하며
  3. 불확실성을 포함해 예산 의사결정에 쓸 수 있는 형태로 만드는 방법

1) SKAN 4.0 포스트백이 주는 리텐션 신호의 형태

SKAN 4.0은 전환 윈도우가 3개이며(실무/툴 관점에서 흔히 1–2일 / 3–7일 / 8–35일로 다룬다), 각 윈도우 종료 후 포스트백이 순차적으로 도착한다. 또한 “세밀한” fine CV는 첫 윈도우에서만(그리고 프라이버시 임계치/데이터 티어 조건을 만족할 때만) 제공되고, 이후 윈도우는 coarse(저/중/고) 중심으로 제한되는 구조가 일반적이다.

따라서 리텐션을 만들 때의 현실은 다음과 같다.

  • 윈도우 1(초기 1–2일): D0~D1에 가까운 매우 초기 행동을 상대적으로 풍부하게 인코딩 가능(특히 fine CV 활용 시)
  • 윈도우 2(3–7일): “D3~D7 사이에 한 번이라도 살아있었는가” 같은 중기 생존 신호를 거칠게 관측
  • 윈도우 3(8–35일): D30 리텐션을 직접 보긴 어렵지만 “D8~D35 구간의 생존”을 coarse하게 관측

그리고 결정적으로, 이 세 포스트백은 유저 레벨로 연결되지 않는다. 즉 우리가 갖는 것은 “각 윈도우에서 관측된 상태의 주변분포(marginal)들”이다. 리텐션 커브를 만들려면 이 주변분포들을 하나의 코호트 생존 과정으로 복원해야 한다.


2) 관측 가능한 것을 리텐션 문제로 재정의하기

SKAN에서 흔히 말하는 “D1 리텐션”을 그대로 목표로 잡으면 모델이 불필요하게 복잡해진다. 대신 윈도우 단위 생존 확률로 문제를 재정의하면 훨씬 안정적으로 운영할 수 있다.

예를 들어, 코호트(설치일 기준)마다 아래 3개의 생존 신호를 정의한다.

  • S1 = P(윈도우1에서 활성): 설치 후 1–2일 내 ‘활성’ 신호
  • S2 = P(윈도우2에서 활성): 3–7일 구간에서 ‘활성’ 신호
  • S3 = P(윈도우3에서 활성): 8–35일 구간에서 ‘활성’ 신호

여기서 “활성”은 앱 오픈/세션/핵심 이벤트 중 하나로 정의할 수 있다. 중요한 건 세그먼트 간 비교가 가능한 하나의 정의로 고정하는 것이다.

이렇게 정의하면, SKAN이 주는 것은 대략적으로

  • 윈도우1 포스트백에서 S1의 근사치(또는 fine CV로 더 세분화한 초기 품질 분포)
  • 윈도우2,3 포스트백에서 S2, S3의 근사치(coarse 기반)
    가 된다.

하지만 여전히 남는 질문이 있다. S1과 S2, S3는 각각 “주변분포”다. 우리가 진짜로 원하는 것은 리텐션 커브(예: D1/D7/D30) 혹은 **구간별 생존/이탈률(해저드)**이다. 이를 위해서는 연결 규칙이 필요하다.


3) 모델링 전략 1: “구간 생존(서바이벌) + 보정”으로 리텐션 커브 만들기

가장 실무 친화적인 방법은 리텐션을 **구간별 해저드(이탈확률)**로 파라미터화하는 것이다.

  • h1: 0–2일 구간 이탈률
  • h2: 3–7일 구간 이탈률
  • h3: 8–35일 구간 이탈률

그럼 생존은 대략

  • S(2) = 1 − h1
  • S(7) = (1 − h1)·(1 − h2)
  • S(35) = (1 − h1)·(1 − h2)·(1 − h3)
    처럼 표현된다(구간 내 균일 해저드 가정).

SKAN 포스트백은 정확히 S(2), S(7), S(35)를 직접 주지 않는다. 대신 “윈도우 내에서 특정 이벤트를 했는가”를 CV로 인코딩한 관측치가 나온다. 따라서 다음 절차로 간다.

  1. CV 스키마를 리텐션에 맞게 설계한다
    • 윈도우1: “D1 오픈/세션/튜토리얼 완료” 같은 초기 리텐션/퀄리티 신호를 fine CV에 우선 배치
    • 윈도우2/3: coarse(저/중/고)를 “중기/장기 생존의 강도”로 매핑(예: low=활성 없음, medium=1회, high=2회 이상 또는 가치 이벤트 포함)
  2. 포스트백에서 관측한 분포를 S1/S2/S3의 관측치로 변환한다
    • 예: window2에서 coarse가 medium/high인 비중을 “윈도우2 활성”로 간주
  3. 그 관측치를 이용해 h1/h2/h3를 역추정한다
    • 단, 관측치가 완전하지 않으므로(프라이버시 임계치, null, coarse 전환 등) 추정은 범위/분포로 해야 한다.

이 접근의 장점은 명확하다. 리텐션을 “D1 하나”로 못 박지 않고, SKAN이 자연스럽게 제공하는 구간 구조에 맞춰 생존을 구성하기 때문에 변동성이 줄고 운영이 쉬워진다.


4) 모델링 전략 2: “주변분포만 있을 때” 조인트(연결) 복원하기

진짜 어려운 부분은 여기다. 윈도우별 활성 비율(S1/S2/S3)은 얻었는데, 이를 통해 “D7 리텐션(=D7에 살아있음)” 같은 지표를 만들려면 **윈도우 간 상관(같은 유저가 연속으로 살아남는 경향)**을 알아야 한다.

이를 해결하는 대표적인 실무 방법은 3가지다.

(1) 외부 기준(ground truth)로 상관 구조를 학습해 가져오기

가장 현실적인 베이스라인은 Android 또는 iOS ATT opt-in 유저에서 관측되는 리텐션 전이(transition)를 priors로 쓰는 것이다.

  • P(윈도우2 활성 | 윈도우1 활성)
  • P(윈도우3 활성 | 윈도우2 활성)
    같은 전이확률을 세그먼트(국가/캠페인/크리에이티브/초기 CV)별로 학습한다.

그다음 SKAN 집계에서는 윈도우별 주변분포가 관측되므로, 이 priors를 이용해 조인트를 복원한다(베이지안 업데이트). 표본이 작은 캠페인도 “전체 계정 레벨의 priors”를 공유해 추정이 안정화된다(계층 베이지안이 특히 강력한 이유).

(2) 최대엔트로피/행렬밸런싱(Iterative Proportional Fitting)으로 조인트 테이블 구성

윈도우별 상태를 이산화하면(예: W1=0/1, W2=0/1, W3=0/1) 가능한 조합은 8개다. 우리는 이 8개 조합의 비중을 모르지만, 각 윈도우의 주변합은 안다. 이럴 때 “가장 덜 가정하는” 방식이 최대엔트로피다.

  • 입력: 관측된 주변분포(S1, S2, S3)
  • 추가 제약: 단조성(대개 W3 활성은 W2 활성보다 희귀), 비정상 조합 제한 등
  • 출력: 가능한 조인트 분포 중 가장 무편향(엔트로피 최대)인 해

여기에 (1)에서 얻은 priors를 초기값으로 주면 훨씬 그럴듯한 조인트가 나온다.

(3) ‘초기 신호 기반’ 예측 모델을 만든 뒤, SKAN 총량에 맞춰 캘리브레이션

윈도우1에서 얻는 신호(특히 fine CV)는 상대적으로 풍부하다. 이를 이용해 “이 코호트가 D7/D30에 얼마나 남을지”를 예측하는 모델을 만든 뒤, 예측값의 합이 SKAN에서 관측되는 윈도우2/3 총량과 일치하도록 스케일링한다(제약 최적화).

  • 1단계: opt-in/Android에서 (초기 행동 → D7/D30) 예측 모델 학습
  • 2단계: SKAN 집계에 대해 예측을 실행(캠페인/국가/크리에이티브 단위)
  • 3단계: 예측 총량이 SKAN의 window2/3 관측 총량과 맞도록 교정(캘리브레이션)

이 방식은 “세그먼트별 분해”에 강하고, 운영팀이 이해하기 쉽다는 장점이 있다.


5) 프라이버시 임계치/Coarse/Null을 ‘0’으로 두지 말 것

SKAN에서 가장 흔한 실수는 “값이 없으면 0”으로 처리하는 것이다. coarse로 내려가거나 null이 되는 건 종종 프라이버시 조건/티어/볼륨의 문제이지, 유저가 0이라는 의미가 아니다. 실무에서는 다음처럼 다루는 편이 안전하다.

  • 관측 불가 = missing으로 취급하고, 모델에서 결측으로 흡수
  • 캠페인 규모가 작아 데이터 티어가 낮아지는 구간은 네트워크/캠페인 풀링으로 안정화
  • 리텐션 결과도 단일값이 아니라 **신뢰구간(범위)**로 리포팅

이렇게 해야 “작은 캠페인이 항상 저가치로 보이는” 왜곡을 줄일 수 있다.


6) 리텐션 추정치를 운영 지표로 바꾸는 방법

리텐션 모델의 결과는 결국 두 가지 형태로 쓰이게 된다.

(1) 코호트 리텐션 커브(또는 D7/D30 추정)

  • 네트워크/캠페인/크리에이티브별로 “예상 리텐션”을 비교
  • 단, 동일한 불확실성 기준(예: P50과 P10을 같이)으로 의사결정

(2) LTV 모델의 입력(특히 Payback/예산 상한)

리텐션은 LTV의 구조적 결정요인이다. SKAN에서 D7/D30 리텐션을 직접 못 보더라도, 윈도우 생존(S1/S2/S3)과 전이확률로 장기 잔존을 추정할 수 있으면, 채널별 LTV-to-CAC 운영(예산 상한, 증액 속도 제한)에 연결된다.


7) 최소 구현 로드맵: “완벽한 모델”보다 “작동하는 루프”

  1. CV 스키마를 리텐션 중심으로 재정렬
    • W1: D1 활성/초기 품질 신호 우선
    • W2/W3: coarse를 “중기/장기 생존 강도”로 일관되게 매핑
  2. 코호트 집계 파이프라인 정비
    • 설치일 코호트 기준으로 window1/2/3 포스트백을 붙일 수 있게 정렬
    • null/coarse를 결측으로 관리
  3. opt-in/Android로 전이확률 priors 구축
    • P(W2|W1), P(W3|W2)를 세그먼트별로 학습
  4. 조인트 복원(최대엔트로피 또는 베이지안)으로 리텐션 커브 산출
    • 결과를 단일값 + 범위로 리포팅
  5. 주간 단위로 캘리브레이션/백테스트
    • 예측이 일관되게 과대/과소면 스키마/priors/가정 업데이트

SKAN 4.0 환경에서 코호트 리텐션은 “정답을 찍는 기술”이 아니라, 제한된 포스트백을 윈도우 생존 신호로 재정의하고, 조인트를 합리적으로 복원해, 불확실성을 포함한 의사결정 지표로 만드는 과정이다. 이 루프가 잡히면 SKAN에서도 캠페인 운영은 CTR/CPA 같은 단기 지표에서 벗어나, 리텐션 기반의 장기 효율로 점점 정렬되기 시작한다.

반응형