0Pricing
Coding Interview Prep · 강의

첫 행동으로 코호트 정의하기

각 사용자에게 최초 이벤트 날짜를 기준으로 코호트를 할당합니다.

첫 행동으로 코호트 정의하기은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

면접에 코호트가 등장하는 이유

제품 분석 면접관이 "코호트를 구성하세요"라고 말하면, 사용자가 처음 어떤 행동을 했는지를 기준으로 모든 사용자를 그룹에 배정한 다음 그 그룹을 시간에 따라 추적할 수 있는지 확인하는 것입니다.

코호트는 같은 기간에 동일한 시작 이벤트를 공유하는 사용자 집합입니다. 보통 최초 구매, 가입 또는 로그인 시점을 기준으로 합니다. 코호트의 강점은 사용자를 동일한 기준에서 비교할 수 있다는 것입니다. 1월 코호트에 속한 모든 사용자를 각자의 1월 시작 시점부터 측정할 수 있습니다.

첫 번째 세부 역량이자 이 레슨에서 집중적으로 연습할 내용은 각 사용자의 최초 행동 날짜를 안정적으로 계산하는 것입니다.

원본 테이블

거의 모든 코호트 문제는 이벤트 테이블에서 시작합니다. 이벤트 테이블에는 타임스탬프가 있는 사용자 행동이 한 행씩 저장됩니다. 다음과 같은 events 테이블을 생각해 보십시오:

  • user_id — 행동한 사용자
  • event_type — 수행한 작업
  • event_at — 타임스탬프로 기록된 시각

면접에서는 데이터 단위를 소리 내어 확인하십시오. "이 테이블은 이벤트당 한 행이고, 한 사용자가 여러 번 나타날 수 있나요?"라고 물어보는 것입니다. 대답은 거의 항상 그렇다는 것이며, 바로 그렇기 때문에 집계를 사용해 사용자별 최초 행동으로 축약해야 합니다.

CREATE TABLE events (
  user_id    INT,
  event_type VARCHAR(50),
  event_at   TIMESTAMP
);

최초 행동 = 타임스탬프의 MIN

핵심 작업은 간단합니다. user_id로 그룹화하고 MIN(event_at)을 구합니다. 이 최솟값이 사용자의 최초 행동이며, 사용자를 코호트에 배정하는 시점입니다.

윈도 함수 기법을 추가로 설명하기 전에 면접관이 먼저 듣고 싶어 하는 답이 바로 이것입니다. 단순한 GROUP BY가 정확하고 읽기 쉬우며 빠릅니다.

SELECT
  user_id,
  MIN(event_at) AS first_action_at
FROM events
GROUP BY user_id;

기준 이벤트로 필터링하기

코호트는 어떤 이벤트든이 아니라 특정 행동으로 정의되는 경우가 많습니다. "최초 구매를 기준으로 사용자를 코호트에 배정한다"는 것은 최솟값을 구하기 전에 구매 행만 남겨야 한다는 뜻입니다.

필터를 WHERE에 넣어야 MIN이 조건을 만족하는 행만 보게 됩니다. 흔한 면접 함정은 모든 이벤트에 대해 MIN을 구한 다음 나중에 필터링하는 것입니다. 그러면 구매 전에 둘러보기만 했던 사용자의 시작 날짜가 잘못 지정됩니다.

SELECT
  user_id,
  MIN(event_at) AS first_purchase_at
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

코호트 기간으로 구간화하기

코호트는 보통 정확한 타임스탬프가 아니라 기간입니다. 예를 들어 "2024-03 코호트"나 "2024-03-04 주간 코호트"처럼 표현합니다. 최초 행동 날짜를 해당 기간 단위로 내림하여 자릅니다.

Postgres에서는 DATE_TRUNC('month', ...)를 사용합니다. MySQL에서는 DATE_FORMAT(d, '%Y-%m-01')을 사용할 수 있고, SQL Server에서는 DATETRUNC(month, d) 또는 계산한 월초 날짜를 사용합니다. 문법을 선택한 이유가 분명해 보이도록 면접에서 사용 중인 데이터베이스 문법을 밝히십시오.

SELECT
  user_id,
  DATE_TRUNC('month', MIN(event_at)) AS cohort_month
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

CTE로 감싸기

사용자별 코호트 배정은 유지율 쿼리에서 재사용할 구성 요소이므로, 이름을 명확히 지정한 CTE로 묶어 두는 것이 좋습니다. 이렇게 하면 다음 단계가 읽기 쉬워지고, 조합 가능한 구성 요소로 사고한다는 점도 보여 줄 수 있습니다.

이제 이후의 모든 쿼리는 user_cohort와 다시 조인하여 사용자가 어느 그룹에 속하는지 알 수 있습니다.

WITH user_cohort AS (
  SELECT
    user_id,
    DATE_TRUNC('month', MIN(event_at)) AS cohort_month
  FROM events
  WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT * FROM user_cohort;

코호트 크기: 구성원 수 세기

면접관이 기대하는 첫 번째 기본 검사는 코호트 크기입니다. 각 코호트에 속한 사용자가 몇 명인지 확인하는 것입니다. 배정 CTE를 cohort_month로 그룹화하고 고유 사용자의 수를 셉니다.

CTE에 이미 사용자당 한 행만 있어도 방어적으로 COUNT(DISTINCT user_id)를 사용하십시오. 이는 데이터 단위를 고려하고 있다는 신호가 됩니다. 이 수가 이후 모든 유지율 백분율의 분모가 됩니다.

WITH user_cohort AS (
  SELECT user_id, DATE_TRUNC('month', MIN(event_at)) AS cohort_month
  FROM events WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT
  cohort_month,
  COUNT(DISTINCT user_id) AS cohort_size
FROM user_cohort
GROUP BY cohort_month
ORDER BY cohort_month;

윈도 함수 대안

면접관은 때때로 축약된 테이블이 아니라 모든 이벤트 행에 코호트 레이블이 붙은 결과를 요구합니다. 이때 윈도 함수가 유용합니다. MIN(event_at) OVER (PARTITION BY user_id)는 행을 제거하지 않고 최초 행동을 계산합니다.

세부 이벤트와 코호트 태그를 한 번에 모두 얻어야 할 때 편리하며, 이는 유지율을 계산하기 위한 준비 단계입니다.

SELECT
  user_id,
  event_at,
  DATE_TRUNC('month',
    MIN(event_at) OVER (PARTITION BY user_id)
  ) AS cohort_month
FROM events
WHERE event_type = 'purchase';

동률과 중복이라는 함정

사용자에게 정확히 같은 가장 이른 시각의 이벤트가 두 개 있다면 어떻게 될까요? MIN은 행이 몇 개나 동률을 이루든 하나의 최솟값만 반환하므로 이 상황을 깔끔하게 처리하며, 코호트 배정도 사용자당 하나로 유지됩니다.

이 방식은 ROW_NUMBER() ... ORDER BY event_at를 사용하는 방식과 대조됩니다. 후자의 경우 동률이 임의로 결정되므로 안정적인 결과를 얻으려면 event_id 같은 결정적인 동률 해소 기준을 추가해야 합니다. 이런 차이를 질문받기 전에 언급하면 숙련된 사람처럼 보입니다.

SELECT user_id, event_at,
  ROW_NUMBER() OVER (
    PARTITION BY user_id
    ORDER BY event_at, event_id
  ) AS rn
FROM events
WHERE event_type = 'purchase';

시간대와 날짜 경계

미묘한 면접 질문이 있습니다. 뉴욕에서 오후 11시 30분에 발생한 구매가 UTC에서는 다음 날로 기록되는 경우입니다. 코호트를 달력 날짜별로 구간화한다면, 사용자가 어느 코호트에 들어가는지는 시간대가 결정합니다.

안전한 답변은 UTC로 타임스탬프를 저장한 다음, 날짜 단위로 자르기 전에 업무 시간대로 변환하는 것입니다. 지표에서 "날짜"를 정의하는 시간대를 명시적으로 말해야 합니다. 이 하나의 결정만으로도 수천 명의 사용자가 코호트 사이에서 이동할 수 있기 때문입니다.

SELECT
  user_id,
  DATE_TRUNC('day',
    MIN(event_at AT TIME ZONE 'America/New_York')
  ) AS cohort_day
FROM events
WHERE event_type = 'purchase'
GROUP BY user_id;

분석 기간 이전 사용자의 제외

실제 분석에서는 코호트를 날짜 범위로 제한합니다. 예를 들어 "1분기에 시작한 코호트"와 같은 경우입니다. 집계된 최초 행동 날짜를 기준으로 필터링해야 하므로, 원시 이벤트에 WHERE를 적용하는 것이 아니라 HAVING 절이나 CTE 외부의 필터를 사용해야 합니다.

원시 이벤트를 날짜로 필터링하면 12월에 처음 구매했지만 1분기에도 행동한 사용자가 1분기 코호트에 잘못 들어가게 됩니다. 항상 계산된 최초 행동을 기준으로 범위를 제한하십시오.

WITH user_cohort AS (
  SELECT user_id, MIN(event_at) AS first_at
  FROM events WHERE event_type = 'purchase'
  GROUP BY user_id
)
SELECT user_id, DATE_TRUNC('month', first_at) AS cohort_month
FROM user_cohort
WHERE first_at >= DATE '2024-01-01'
  AND first_at <  DATE '2024-04-01';

빠른 확인

면접관이 묻습니다. "각 사용자를 최초 구매 월을 기준으로 코호트에 배정하세요. 사용자는 구매 전에 둘러볼 수 있습니다." 어떤 접근이 올바를까요?

복습: 코호트 정의하기

코호트 정의 면접 질문에서 기억해야 할 핵심 내용은 다음과 같습니다:

  • 코호트는 사용자를 최초의 조건 충족 행동을 기준으로 그룹화합니다.
  • 기준 이벤트로 WHERE에서 필터링한 후 MIN(event_at)으로 계산합니다.
  • DATE_TRUNC(또는 해당 데이터베이스 문법에 맞는 방식)으로 기간 단위로 구간화합니다.
  • 재사용할 수 있도록 배정을 CTE로 묶고, COUNT(DISTINCT user_id)로 코호트 크기를 구합니다.
  • 시간대에 따른 날짜 경계를 주의하고, 날짜 범위는 원시 이벤트가 아니라 계산된 최초 행동을 기준으로 제한합니다.

이 내용을 확실히 익히면 다음 레슨의 유지율 매트릭스는 조인 하나로 해결할 수 있습니다.

자주 묻는 질문

“첫 행동으로 코호트 정의하기” 강의는 무료인가요?

네 — “첫 행동으로 코호트 정의하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“첫 행동으로 코호트 정의하기”에서 뭘 배우나요?

각 사용자에게 최초 이벤트 날짜를 기준으로 코호트를 할당합니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“첫 행동으로 코호트 정의하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 첫 행동으로 코호트 정의하기
  2. 리텐션 매트릭스 만들기
  3. N일차 및 롤링 리텐션
  4. 이탈 및 복귀 쿼리
← Coding Interview Prep(으)로 돌아가기