Zettelkasten

Personalized PageRank의 시드에 결제력을 주입해 비결제 유저의 매출 기여도를 점수화한다

·수정 1

요약

  • "High PageRank 유저"는 알고리즘의 결과가 아니라 입력(시드)이다.
  • 일반 PageRank는 모든 노드 동등 시작이라 매출 기여도가 안 나온다. Personalized PageRank의 teleport vector에 결제력을 주입해야 비결제 유저로 점수가 흐른다.
  • 시드 정의는 보통 log(1 + 최근 90일 결제액)을 쓴다.

본문

문제 상황

매칭 기반 양면 시장에서 광고 ROAS를 계산할 때, 단순 결제 금액만 광고 채널에 귀속하면 매출 기여 일부를 놓친다. 예: 매칭 상대로 자주 등장해서 헤비 결제 유저가 떠나지 않게 만드는 비결제 유저. 이 유저가 사라지면 헤비 유저의 결제도 줄지만, 매출 분자에는 잡히지 않는다. 비결제 행동의 매출 기여를 점수화할 수단이 필요하다.

왜 일반 PageRank가 아니라 Personalized PageRank인가

표준 PageRank는 teleport(랜덤 점프) 시 모든 노드를 균등하게 본다. 그러면 "그래프 중심에 가까운 유저"가 높은 점수를 받을 뿐이고, 매출과는 무관하다.

Personalized PageRank는 teleport vector vv가 균등분포가 아니라 임의 분포다. 이 vv에 "결제력"을 주입하면, 결제력 큰 유저에서 출발한 random walk가 도달하는 비결제 유저에게 점수가 흘러간다.

PR(u)=(1d)vu+dwIn(u)PR(w)Out(w)PR(u) = (1-d) \cdot v_u + d \cdot \sum_{w \in In(u)} \frac{PR(w)}{|Out(w)|}

여기서 vuv_u를 어떻게 정의하느냐가 곧 "결제력 큰 유저"의 정의다. 즉 "High PageRank 유저"라는 표현은 결과처럼 들리지만 실제로는 입력 설계다.

시드 vuv_u 정의 옵션

방식 특징 문제
결제액 그대로 정보 손실 없음 고래 1명에 점수가 쏠려 그 사람 친구만 점수 폭등
log(1 + 결제액) 실무 디폴트, 고래 영향 완화 임계가 없어 잔돈 결제자도 시드에 포함
상위 X% 이진 깔끔, 해석 쉬움 X% 임계가 자의적, 경계 유저 정보 손실

시간 윈도우는 보통 최근 30~90일 결제액을 쓴다. 너무 길면 churn된 과거 헤비 유저가 시드에 남고, 너무 짧으면 노이즈가 커진다.

함정 3가지

  1. 결제 유저는 점수가 곧 시드값이다. PageRank의 부가가치는 결제하지 않은 유저의 상대 점수에서만 나온다. 평가도 비결제 유저 집합에서 해야 의미 있다.

  2. Homophily ≠ 인과. 결제력 큰 유저끼리 자주 매칭되는 경향이 있으면, PageRank는 그 사이에 낀 비결제 유저에게 높은 점수를 준다. 하지만 그 비결제 유저가 빠져도 헤비 유저끼리 다른 경로로 매칭될 수 있다. 인과 검증이 빠진 상관 점수다. 이 한계를 보완하려면 Shapley value가 더 정직하다 — "그 사람이 빠졌을 때 한계 손실"을 직접 측정하므로. PageRank는 빠른 근사, Shapley는 비싼 정답에 가깝다.

  3. 검증 방법은 반사실 시뮬레이션이다. PageRank 점수 자체는 검증되지 않은 가설이다. "그 유저를 제거하면 매칭 시장 매출이 얼마나 떨어지는가"의 counterfactual 시뮬레이션 순위와 PageRank 순위의 상관을 봐야 시드 정의가 맞았는지 알 수 있다. 점수 자체로 의사결정하기 전에 반드시 이 검증을 거쳐야 한다.

실무 출발점

시드:     v_u = log(1 + 90일 결제액_u),  L1 정규화
엣지:     w(A,B) = 90일 매칭 시간 합 또는 양방향 만족 신호 평균
damping:  0.85 기본. 시드 영향력을 강하게 보려면 0.5~0.7
평가:     비결제 유저의 PageRank 점수 vs 반사실 매출 감소량 순위 상관

관련 노트

참고