Retention

여지은·2025년 2월 8일

sql

목록 보기
1/1

Retention이란?

AARRR : 그로스 해킹의 대표적인 분석 프레임 워크

A: Acquisition (사용자 획득)
A: Activation (사용자 활성화)
R: Retention (사용자 유지)
R: Revenue (매출)
R: Referral (전파)

Retention은 사용자 유지에 관련된 지표이며, 다섯가지 지표 중 가장 먼저 개선을 해야하는 단계로 알려져 있다.
A단계에서 사용자들이 유입되어도 유지가 되지 않는다면 일회성 매출에 그치기 마련인데, Retention 단계가 잘 되어있다면, 이탈이 발생하지 않고 꾸준한 매출 상승에 기여될 것으로 생각한다.
따라서 새로운 사용자를 받는 것보다 선결되어야 하는 것은 기존 사용자들이 서비스를 만족스럽게 사용하고 있는지, 지속적으로 사용하는지 보는 것이고 이것이 바로 Retention이다.

지속적 사용 측정 방법?

도메인에 따라 기준점이 다 다르겠지만, 일반적으로는 '방문'을 기준으로 측정하며
사용자가 서비스를 지속적으로 사용하는지를 보려고 한다'라는 목표 아래 다양한 로그가 리텐션을 정의하는데 사용될 수 있다.

  • 특정 페이지 방문
  • 특정 페이지 N번 방문
  • 결제 버튼 클릭 또는 결제 완료
  • 특정 기능 사용
  • 등등...

예를들어 어떤 어플에 꾸준히 방문만 하는 사용자보다, 그 어플에서 제공하는 서비스를 꾸준히 이용하는 사용자만 Retention 계산에 포함시킬 수 있다.
예를들어, 뱅크샐러드 어플의 경우 어플 방문만 사용자 보다는 계속해서 가계부를 작성하는 사용자를 대상으로 Retention 계산을 하는 것이 효과적일 수 있다.

꼭 서비스 전체 레벨의 지표가 아니더라도, 특정 기능을 개발했을 때 또는 우리의 핵심 기능을 유저들이 잘 쓰고 있는지 살펴보기 위해 '기능의 반복 사용'을 보는 기능 리텐션(Feature Retention)을 측정하기도 한다.

Classic Retention

가장 널리 사용되고 가장 간단한 Retention 계산 방법이다.
출처 : https://datarian.io/blog/classic-retention

WITH records_preprocessed AS (
    SELECT r.customer_id,
           DATE_FORMAT(c.first_order_date, '%Y-%m-01') AS first_order_month,
           DATE_FORMAT(r.order_date, '%Y-%m-01') AS order_month
    FROM records r
    INNER JOIN customer_stats c ON r.customer_id = c.customer_id
)

SELECT first_order_month,
       COUNT(DISTINCT customer_id) AS month0,
       COUNT(DISTINCT CASE WHEN order_month BETWEEN first_order_month AND DATE_ADD(first_order_month, INTERVAL 11 MONTH) 
                           THEN customer_id END) 
       - COUNT(DISTINCT customer_id) AS retained_customers
FROM records_preprocessed
GROUP BY first_order_month
ORDER BY first_order_month;

사용자 B의 경우에 Day 0, Day 1, Day 3에 방문했으니까 사실 Day 2에도 관점에 따라 서비스 사용자로 볼 수 있다. 서비스 사용을 '유지(Retain)'하고 있느냐 물어봤을 때에 사용자 B는 Day 2 리텐션 계산에 포함되어도 괜찮은 것으로 보인다. 하지만 이렇게 매일매일 사용하는 게 아니라, 사용 주기가 길 경우 클래식 리텐션으로 사용자 유지 여부를 판단했을 때 실제보다 훨씬 과소 계산하게 된다.

이러한 클래식 리텐션의 한계가 있기 때문에 사용자가 매일 접속해서 사용할 것으로 기대되는 서비스에 활용하기 적절한 지표이며, 카카오톡 같은 메신저 앱이나, 트위터 같은 SNS 서비스가 여기에 해당한다.

Classic Retention의 한계

  1. 장기적 고객 유지율 반영 부족
    일정 기간 내 유지율을 측정하므로, 고객의 장기적인 잔존 여부를 정확히 반영하기 어려움
  2. 코호트 간 비교 어려움
    특정 시점에서의 잔존율을 기반으로 하므로, 서로 다른 기간의 코호트를 비교하기 어려움
  3. 재활성화 고객 고려 부족
    한 번 이탈했다가 다시 돌아온 고객을 고려하지 않아 실제 고객 가치를 과소평가할 가능성이 있음
  4. 비즈니스 모델별 적합성 문제
    구독형 모델에는 적합하지만, 비정기적 구매가 많은 업종(예: 리테일)에서는 활용이 제한적임
  5. 고객 행동 패턴 반영 부족
    단순 생존 여부만 측정하기 때문에 고객의 참여도나 구매 빈도 같은 요소를 반영하기 어려움

Rolling Retention

사용 주기가 긴 서비스에서 많이 사용된다.
이탈에 초점을 맞추기 때문에 언바운드 리텐션(Unbounded Retention)이라고 부르기도 한다.
출처 : https://datarian.io/blog/rolling-retention

WITH records_preprocessed AS (
    SELECT r.customer_id,
           DATE_FORMAT(c.first_order_date, '%Y-%m-01') AS first_order_month,
           DATE_FORMAT(r.order_date, '%Y-%m-01') AS order_month
    FROM records r
    INNER JOIN customer_stats c ON r.customer_id = c.customer_id
)

SELECT first_order_month,
       COUNT(DISTINCT customer_id) AS month0,
       COUNT(DISTINCT CASE 
           WHEN order_month >= DATE_ADD(first_order_month, INTERVAL 1 MONTH) 
           THEN customer_id END) AS rolling_retention
FROM records_preprocessed
GROUP BY first_order_month
ORDER BY first_order_month;

Rolling Retention의 한계
1. 고객의 지속적인 활동을 반영하지 못함
최소 한 번이라도 재구매하면 유지된 것으로 간주되므로, 실제로 얼마나 자주 이용하는지는 파악하기 어려움.
1. 장기적인 고객 충성도를 평가하기 어려움
고객이 특정 기간 이후에도 계속 활동하는지보다는, 한 번이라도 재방문했는지만 확인하기 때문에 충성도를 측정하는 데 한계가 있음.
2. 일시적인 방문 고객과 충성 고객을 구별하기 어려움
우연히 한 번 더 방문한 고객도 유지된 것으로 계산되어, 실제 충성 고객과의 차이를 구별하기 어려움.
3. 비즈니스 모델별 적합성 차이
반복 구매 주기가 긴 업종(예: 가전제품, 자동차)에서는 고객이 자연스럽게 장기간 미구매하는 경우가 많아, 리텐션이 과소평가될 수 있음.
4. 새로운 고객 확보와의 균형을 고려하기 어려움
신규 고객이 증가하면 Rolling Retention이 상승할 가능성이 있지만, 실제 고객 유지율이 개선되었는지는 알기 어려움.

Range Retention

Classic Retention을 확장한 개념으로, 범위를 지정하는 것이 특징이다.
출처 : https://datarian.io/blog/range-retention
Day 1~3 구간 동안에는 사용자 A, B, C가 방문했고 Day 4~6 기간에는 사용자 A, D, E가 방문했다. Day 4~6 구간보다 Day 1~3 동안에 훨씬 많은 방문이 발생했지만 이러한 특성은 데이터를 요약하면서 사라지고 두 구간 모두 범위 리텐션은 60%로 계산된다.

이렇게 기간을 묶어서 계산하기 때문에 범위 리텐션 계산 방식은 노이즈에 강하지만, 우연히 하루정도 접속을 안 했다고 하더라도 리텐션에 영향을 주지 않기 때문이다. 주로 서비스 사용주기가 길거나 주기적인 서비스에서 많이 사용한다.

Range Retention의 한계
1. 정확한 이탈 시점을 알기 어려움
특정 기간(예: 7일, 30일) 내 활동 여부만 확인하므로, 고객이 실제로 언제 이탈했는지 명확하게 파악하기 어려움.
2. 세부적인 고객 유지 패턴을 반영하지 못함
기간 내 한 번이라도 활동하면 유지된 것으로 간주되므로, 지속적인 활동 여부를 구별하기 어려움.
3. 설정한 기간에 따라 결과가 크게 달라짐
7일 기준과 30일 기준의 리텐션 결과가 다를 수 있으며, 적절한 기준을 선택하는 것이 중요함.
4. 장기적인 고객 충성도를 측정하기 어려움
단기 유지율은 파악할 수 있지만, 고객이 장기적으로 서비스를 계속 사용할지 여부는 알기 어려움.
5. 다양한 비즈니스 모델에 일괄 적용하기 어려움
정기적 이용 패턴이 없는 서비스(예: 여행, 자동차 구매)에서는 유효하지 않을 수 있음.

WITH records_preprocessed AS (
    SELECT r.customer_id,
           DATE_FORMAT(c.first_order_date, '%Y-%m-01') AS first_order_month,
           r.order_date
    FROM records r
    INNER JOIN customer_stats c ON r.customer_id = c.customer_id
)

SELECT first_order_month,
       COUNT(DISTINCT customer_id) AS month0,
       COUNT(DISTINCT CASE 
           WHEN order_date BETWEEN first_order_month AND DATE_ADD(first_order_month, INTERVAL 7 DAY) 
           THEN customer_id END) AS range_7d,
       COUNT(DISTINCT CASE 
           WHEN order_date BETWEEN first_order_month AND DATE_ADD(first_order_month, INTERVAL 30 DAY) 
           THEN customer_id END) AS range_30d
FROM records_preprocessed
GROUP BY first_order_month
ORDER BY first_order_month;

Point !
어떤 것이 최선일까 고민하는데 너무 많은 시간을 쏟지 말아라. 일단 가장 쉬운 방법으로 계산하고 현상을 파악하는게 중요하지만 그렇다고 너무 많이 보지도 말아라. 숫자가 너무 많으면 그것을 다 이해하기보다는 압도되어 버린다.

같이 읽어보면 좋은 자료 (출처 : 데이터리안)
https://datarian.io/blog/stickiness
https://datarian.io/blog/retention-analysis

profile
항상 why?를 고민하는 사람

0개의 댓글