코호트
고친 사람 github-actions[bot]
코호트는 같은 때 같은 일을 겪은 사람들을 한 무리로 묶어 줍니다. 1월에 가입한 사용자들이 한 코호트입니다. 무리마다 시간이 지나며 몇 명이 남는지를 따라가 견줍니다. 전체 합계에 묻힌 변화가 그렇게 드러납니다.
쉽고 빠른 이해
코호트는 출발이 같은 사용자 무리입니다. 예를 들어 1월에 가입한 사람 전부가 한 무리입니다.
이게 없으면 서비스가 나아지는지 나빠지는지 가리기 어렵습니다. 새 가입자가 많이 들어오면 전체 사용자 수는 늡니다. 그 사이 새로 온 무리가 앞 무리보다 점점 빨리 떠나도 합계에는 안 보입니다.
- 사용자를 가입한 달처럼 출발 시점으로 나눕니다
- 무리마다 가입 뒤 한 달, 두 달이 지났을 때 몇 명이 남았는지 셉니다
- 처음 인원으로 나눠 비율로 만든 뒤 무리끼리 견줍니다
시간이 지나며 사용자가 어떻게 바뀌는지 물을 때 씁니다. 한 시점의 수만 궁금하면 코호트가 필요 없습니다.
대가는 무리가 잘게 쪼개진다는 것입니다. 무리가 작으면 비율이 크게 흔들립니다. 최근에 묶은 무리는 따라간 기간이 짧아 견줄 거리도 적습니다.
상세
같은 해에 입학한 학생들을 한 학번으로 부릅니다. 학교는 학번마다 몇 명이 2학년에 올라갔고 몇 명이 졸업했는지 셉니다. 학교 전체 학생 수만 보면 그 흐름이 안 보입니다.
통계와 데이터 분석에서 학번에 해당하는 것이 코호트입니다. 코호트는 같은 기간에 같은 출발 사건을 겪은 사람들의 무리입니다. 1월 한 달 동안 가입한 사용자 전부가 「1월 가입 코호트」입니다.
이 절은 코호트를 무엇으로 묶고 무엇을 따라 세는지부터 봅니다. 예로는 가입한 달로 묶은 사용자 무리와, 그 무리가 몇 달에 걸쳐 남는 비율을 씁니다.
출발 사건과 묶는 기간
이벤트는 사용자가 서비스에서 한 일을 시각과 함께 남긴 기록입니다. 가입, 로그인, 결제가 모두 이벤트입니다. 코호트를 정하려면 이 가운데 하나를 출발 사건으로 고릅니다.
가장 흔한 출발 사건은 가입입니다. 처음 결제한 날이나 앱을 처음 설치한 날을 고르기도 합니다. 무엇을 고르느냐에 따라 「출발이 같다」의 뜻이 달라집니다.
다음은 묶는 기간입니다. 하루, 한 주, 한 달 가운데 하나를 고릅니다. 기간이 짧으면 무리 수가 늘어납니다. 대신 무리마다 인원이 줄어듭니다.
한 사용자는 한 코호트에만 듭니다. 가입은 한 번뿐이라서 가입한 달도 하나입니다. 코호트들을 다 합치면 가입한 사용자 전부가 됩니다.
경과 기간으로 따라가기
코호트를 묶은 뒤에는 시간을 따라갑니다. 이때 시간은 달력 날짜가 아니라 출발한 뒤 지난 기간입니다. 이 기간을 경과 기간이라고 부릅니다.
가입한 그달을 0개월째로 셉니다. 1월에 가입한 무리에게 2개월째는 3월입니다. 4월에 가입한 무리에게 2개월째는 6월입니다. 달력으로는 다른 때입니다. 경과 기간으로 줄을 세우면 출발이 다른 무리를 같은 눈금에서 견줄 수 있습니다.
남은 사용자는 그 기간에 한 번이라도 활동한 사용자로 셉니다. 활동의 기준은 분석하는 쪽이 정합니다. 로그인이나 주문처럼 서비스를 썼다고 볼 이벤트를 하나 고릅니다. 이렇게 그 기간에 활동한 사용자를 활성 사용자라고 부릅니다.
잔존율은 남은 사용자 수를 코호트의 처음 인원으로 나눈 비율입니다. 영어 그대로 리텐션이라고도 부릅니다. 처음 인원이 1,000명인 코호트를 봅니다. 2개월째 활동한 사람이 300명이면 2개월째 잔존율은 0.3입니다. 흔히 백분율로 바꿔 적습니다.
코호트 표
코호트들을 한데 모은 것이 코호트 표입니다. 줄 하나는 코호트 하나입니다. 칸은 경과 기간을 하나씩 맡습니다. 칸마다 그 기간에 남은 사람 수를 적습니다. 사람 수 대신 잔존율을 적은 표도 같은 이름으로 부릅니다.
아래는 5월 말에 만들었다고 치고 꾸며 본 표입니다. 수는 읽는 법을 보이려고 지어낸 것입니다.
| 코호트 | 0개월 | 1개월 | 2개월 | 3개월 |
|---|---|---|---|---|
| 2월 가입 | 1,000 | 400 | 300 | 260 |
| 3월 가입 | 1,500 | 540 | 405 | |
| 4월 가입 | 2,200 | 726 | ||
| 5월 가입 | 3,000 |
0개월 칸이 곧 처음 인원입니다. 가입한 그달에는 모두가 남아 있다고 칩니다. 다른 칸을 이 수로 나누면 잔존율이 나옵니다.
표를 읽는 방향은 둘입니다. 한 줄을 오른쪽으로 읽으면 한 무리가 시간이 지나며 줄어드는 모습이 보입니다. 한 칸을 위아래로 읽으면 같은 경과 기간에서 무리끼리 견주게 됩니다.
1개월 칸을 잔존율로 바꿔 위에서 아래로 읽어 봅니다. 2월 무리는 0.40, 3월 무리는 0.36, 4월 무리는 0.33 입니다. 늦게 온 무리일수록 첫 달을 넘겨 남는 비율이 낮습니다.
인원 수만 견주면 이 흐름이 거꾸로 보입니다. 1개월 칸의 사람 수는 400, 540, 726 으로 늘어납니다. 무리마다 처음 인원이 달라서입니다. 그래서 무리끼리 견줄 때는 잔존율을 씁니다.
오른쪽 아래가 빈 것은 아직 그때가 오지 않아서입니다. 5월 가입 무리는 5월 말 현재 1개월째를 맞지 않았습니다. 최근 무리일수록 채울 칸이 적어서 코호트 표는 대개 계단 모양이 됩니다.
전체 합계가 가리는 변화
같은 표에서 달마다 활성 사용자를 더해 봅니다. 4월에 해당하는 칸은 2월 무리의 2개월, 3월 무리의 1개월, 4월 무리의 0개월입니다. 더하면 300 + 540 + 2,200 으로 3,040명입니다.
5월도 같은 식으로 대각선을 따라 더합니다. 260 + 405 + 726 + 3,000 으로 4,391명입니다. 합계만 보면 서비스가 잘 크고 있습니다.
그런데 앞에서 본 1개월 잔존율은 무리마다 내려갔습니다. 새로 온 사람이 점점 빨리 떠나는 중입니다. 합계가 느는 것은 새 가입자가 그보다 더 빨리 늘었기 때문입니다.
늘 새 사람이 섞여 들어오는 합계는 이런 변화를 덮습니다. 코호트는 무리마다 분모를 처음 인원으로 고정합니다. 새 사람이 섞이지 않습니다.
분모를 잘못 잡는 경우가 하나 더 있습니다. 2월 무리에서 3개월째에도 활동한 260명만 모아 평균 이용 기간을 내 봅니다. 모두 석 달 넘게 쓴 사람이라 평균이 길게 나옵니다. 1개월째에 이미 안 보인 600명이 계산에서 빠졌기 때문입니다.
이렇게 남은 사람만 보고 판단해서 생기는 왜곡을 생존 편향이라고 합니다. 코호트는 떠난 사람도 처음 인원에 남겨 두므로 이 왜곡을 피합니다.
이벤트에서 코호트 표까지
코호트 표는 이벤트 기록에서 만듭니다. 사용자마다 필요한 값은 둘입니다. 어느 코호트에 드는지와, 활동한 때가 출발에서 얼마나 지났는지입니다.
flowchart TD
E["이벤트 기록"] --> J["가입 이벤트"]
E --> A["활동 이벤트"]
J --> C["사용자마다 코호트 정하기 · 가입한 달"]
A --> M["활동마다 경과 기간 계산"]
C --> M
M --> T["코호트와 경과 기간마다 사용자 수 세기 · 사람 수 코호트 표"]
T --> R["처음 인원으로 나누기 · 잔존율 코호트 표"]
가입 이벤트는 사용자마다 한 번 쓰여 코호트를 정합니다. 활동 이벤트는 그 코호트의 칸을 채웁니다. 같은 사람이 한 달에 여러 번 활동해도 그 칸에서는 한 명으로 셉니다.
두 값을 구하는 계산은 짧습니다. 파이썬으로 가입일과 활동일 하나씩을 놓고 봅니다.
from datetime import date
s = date(2026, 1, 14) # 가입일
a = date(2026, 3, 2) # 활동일
s.strftime("%Y-%m") # '2026-01'
y = a.year - s.year # 0
y * 12 + a.month - s.month # 2
'2026-01' 이 이 사용자의 코호트 이름입니다. 끝 줄의 2는 활동한 3월이 가입한 1월에서 두 달 지났다는 뜻입니다.
경과 기간을 날짜 수가 아니라 달 번호의 차이로 셌습니다. 이렇게 세면 1월 31일 가입자가 2월 1일에 활동해도 1개월째로 잡힙니다. 하루만 지났는데 한 달이 지난 것으로 치는 셈입니다.
이 어긋남이 싫으면 가입일부터 지난 날짜 수로 끊어 세기도 합니다. 어느 쪽으로 세든 한 표 안에서는 한 가지로 맞춰야 칸끼리 견줄 수 있습니다.
코호트와 세그먼트
세그먼트는 사용자를 나라, 기기, 요금제 같은 속성으로 나눈 무리입니다. 한 시점의 단면을 자르는 데 씁니다. 예를 들어 안드로이드 사용자와 아이폰 사용자의 결제 비율을 견줍니다.
코호트는 출발 시점으로 묶습니다. 그리고 그 무리를 시간을 따라 지켜봅니다. 두 방식을 겹쳐 쓰기도 합니다. 예를 들어 1월 가입 코호트를 다시 기기별로 나눕니다.
분석 도구에 따라서는 특정 행동을 한 사용자 묶음을 통틀어 코호트라고 부릅니다. 「지난주에 장바구니를 쓴 사용자」 같은 묶음입니다. 출발 시점이 같다는 조건이 없어서 세그먼트에 가깝습니다. 이런 묶음은 행동 코호트라고 따로 부르기도 합니다.
연구 방법 이름의 코호트
의학과 통계에서는 코호트를 연구 방법 이름에도 씁니다. 코호트 연구는 어떤 조건을 겪은 무리와 안 겪은 무리를 먼저 정해 둡니다. 그다음 시간을 따라가며 두 무리의 결과를 견줍니다. 대표적인 예로 담배를 피우는 사람과 안 피우는 사람을 오래 지켜봅니다. 그리고 병이 생기는 비율을 견줍니다.
한 무리를 정해 두고 시간을 따라간다는 뼈대는 앞의 정의와 같습니다. 다만 무리를 묶는 기준이 출발 시점보다 겪은 조건 쪽에 있습니다.
이 방법은 사람에게 조건을 정해 주지 않습니다. 이미 그 조건을 겪은 사람을 지켜볼 뿐입니다. 그래서 두 무리의 차이가 그 조건 때문인지는 따로 따져야 합니다.
무리를 무작위로 나누는 A-B 테스트와 갈리는 대목이 이것입니다. 무작위로 나누면 두 무리가 처음부터 닮아 있어서 차이를 바꾼 조건 탓으로 볼 수 있습니다.
쓸 때와 대가
코호트는 시간이 지나며 사용자가 어떻게 바뀌는지 물을 때 씁니다. 「가입 직후 보여 주는 안내 화면을 바꾼 뒤 가입한 사람이 더 오래 남나」 같은 물음입니다. 바꾸기 전 코호트와 바꾼 뒤 코호트의 같은 칸을 견주면 됩니다.
한 시점의 수만 궁금하면 코호트가 필요 없습니다. 오늘 결제한 사용자가 몇 명인지는 합계로 충분합니다.
코호트를 쓰면 무리가 잘게 쪼개집니다. 인원이 수십 명인 코호트는 몇 명만 오가도 잔존율이 크게 흔들립니다. 뽑은 일부로 잰 수가 흔들리는 표본 오차와 같은 성질입니다.
코호트끼리 차이가 나도 원인까지 알려 주지는 않습니다. 3월에 온 사람들이 덜 남은 것은 화면 탓일 수 있습니다. 그달 광고로 들어온 사람들의 성향 탓일 수도 있습니다.
관련 항목
코호트로 묶어 따라가는 분석 기법
코호트 분석 · 잔존율 · 이탈률 · 퍼널 분석 · 생존 분석 · 카플란-마이어 추정
코호트 표를 만드는 데이터와 단위
이벤트 · 사용자 · 세션 · 활성 사용자 · 타임스탬프 · 이벤트 로그
코호트와 나란히 쓰는 사용자 묶음 방식
세그먼트 · 행동 코호트 · 퍼널 · A-B 테스트
코호트끼리의 비교를 흐리는 편향과 오차
생존 편향 · 선택 편향 · 표본 오차 · 중도 절단 · 교란 변수 · 상관관계 · 인과 관계
코호트를 쓰는 연구 설계
코호트 연구 · 관찰 연구 · 무작위 대조 시험 · 전향적 연구 · 후향적 연구
코호트 개념이 속하는 상위 분야
데이터 분석 · 통계학 · 모집단 · 제품 분석 · 비즈니스 인텔리전스
다른 이름: cohort · 동기 집단