Retention và cohort
Bạn sẽ học được
- Retention là gì và vì sao quan trọng hơn tăng trưởng.
- Cohort và bảng retention.
- Phân biệt retention N ngày chính xác và retention không giới hạn.
- Viết truy vấn cohort bằng SQL.
- Đọc đường cong retention và các mẫu thường gặp.
Khái niệm cốt lõi
Retention đo tỷ lệ người dùng quay lại sau lần đầu. Nó trả lời câu hỏi: sản phẩm có giữ được người dùng không, hay chỉ thu hút rồi mất.
Cohort là nhóm người dùng có cùng mốc bắt đầu (tuần hoặc tháng đăng ký). Bảng retention theo dõi từng cohort qua các kỳ:
| Cohort | n | Tuần 1 | Tuần 2 | Tuần 3 | Tuần 4 |
|---|---|---|---|---|---|
| 05/01 | 1.000 | 42% | 31% | 26% | 24% |
| 12/01 | 1.200 | 45% | 33% | 28% | — |
| 19/01 | 900 | 41% | 30% | — | — |
Dấu — là kỳ chưa đủ dữ liệu. So sánh ô trống với ô có dữ liệu là lỗi phổ biến.
Định nghĩa retention
Hai định nghĩa khác nhau:
Retention N ngày chính xác: người dùng hoạt động đúng vào ngày thứ N.
D7 = số người hoạt động đúng ngày thứ 7 sau khi đăng kýRetention không giới hạn (unbounded): người dùng hoạt động vào ngày thứ N hoặc bất kỳ ngày nào sau đó.
D7+ = số người hoạt động từ ngày thứ 7 trở điUnbounded luôn cao hơn. Hai con số không so sánh được với nhau hoặc với số liệu từ công cụ khác nếu không cùng định nghĩa. Ghi rõ trong mọi báo cáo.
Truy vấn cohort theo tuần
WITH lan_dau AS (
SELECT user_id, MIN(date_trunc('week', occurred_at)) AS cohort
FROM events
GROUP BY user_id
),
hoat_dong AS (
SELECT DISTINCT
user_id,
date_trunc('week', occurred_at) AS tuan
FROM events
),
cohort AS (
SELECT
d.cohort,
h.tuan,
COUNT(DISTINCT d.user_id) AS n
FROM lan_dau d
JOIN hoat_dong h USING (user_id)
WHERE h.tuan >= d.cohort
GROUP BY 1, 2
)
SELECT
cohort,
MAX(n) FILTER (WHERE tuan = cohort) AS tuan_0,
MAX(n) FILTER (WHERE tuan = cohort + INTERVAL '1 week') AS tuan_1,
MAX(n) FILTER (WHERE tuan = cohort + INTERVAL '2 weeks') AS tuan_2,
MAX(n) FILTER (WHERE tuan = cohort + INTERVAL '4 weeks') AS tuan_4
FROM cohort
GROUP BY 1
ORDER BY 1;Muốn ra tỷ lệ, chia cho tuan_0:
ROUND(100.0 * MAX(n) FILTER (WHERE tuan = cohort + INTERVAL '1 week')
/ MAX(n) FILTER (WHERE tuan = cohort), 1) AS w1_pctD7 chính xác
WITH lan_dau AS (
SELECT user_id, MIN(occurred_at)::date AS ngay_0
FROM events
GROUP BY user_id
),
hoat_dong AS (
SELECT DISTINCT user_id, occurred_at::date AS ngay
FROM events
)
SELECT
d.ngay_0 AS ngay_dang_ky,
COUNT(DISTINCT d.user_id) AS n,
COUNT(DISTINCT h.user_id) FILTER (WHERE h.ngay = d.ngay_0 + 7) AS d7
FROM lan_dau d
LEFT JOIN hoat_dong h USING (user_id)
GROUP BY 1
ORDER BY 1;Chú ý: MIN(occurred_at)::date lấy ngày đầu tiên, nhưng nếu người dùng đăng ký lúc 23:59 và hoạt động lại lúc 00:01 hôm sau, D1 đã có. Đây là hành vi đúng theo định nghĩa ngày.
Đọc đường cong retention
Hình dạng quan trọng hơn từng con số:
| Hình dạng | Ý nghĩa |
|---|---|
| Giảm về 0 | Sản phẩm chỉ dùng một lần |
| Giảm rồi phẳng | Có nhóm người dùng trung thành |
| Phẳng sớm ở mức cao | Sản phẩm thiết yếu, dùng thường xuyên |
| Giảm chậm nhưng đều | Giữ chân trung bình |
Điểm phẳng (retention floor) cho biết tỷ lệ người dùng cốt lõi. Nếu đường cong chưa phẳng sau 8 tuần, chưa đủ dữ liệu để kết luận về dài hạn.
Mẫu bất thường
- Tuần 1 cao bất thường rồi rơi mạnh: hiệu ứng mới lạ hoặc chiến dịch thu hút người không phù hợp.
- Retention tăng theo cohort: sản phẩm hoặc onboarding đang tốt lên.
- Retention giảm theo cohort: có thể do mở rộng sang tệp người dùng kém phù hợp, không hẳn do sản phẩm xấu đi.
- D1 thấp nhưng D7 cao: người dùng không mở lại ngay nhưng vẫn quay lại — kiểm tra định nghĩa sự kiện.
Cohort và cỡ mẫu
Cohort nhỏ cho tỷ lệ dao động mạnh. Với 100 người, chênh 5 người là 5 điểm phần trăm. Với 1.000 người, con số ổn định hơn nhiều.
Quy tắc: không kết luận từ cohort dưới vài trăm người; hoặc gộp nhiều tuần thành cohort tháng.
Thực hành
- Viết truy vấn cohort theo tuần với W1, W2, W4.
- Chuyển kết quả sang tỷ lệ phần trăm.
- Viết truy vấn D7 chính xác.
- Vẽ đường cong retention từ bảng cohort.
- Đánh dấu các ô chưa đủ dữ liệu.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| So sánh ô trống | Cohort mới chưa đủ kỳ | Đánh dấu —, chỉ so ô đủ |
| Retention khác công cụ khác | Định nghĩa khác | Ghi rõ N ngày hay unbounded |
| Tỷ lệ dao động mạnh | Cohort nhỏ | Gộp cohort, yêu cầu mẫu tối thiểu |
| D1 cao hơn D0 | Lỗi định nghĩa | Kiểm tra mốc bắt đầu |
| Retention giảm dần theo cohort | Mở rộng tệp người dùng | Phân tích theo nguồn |
| Đường cong không phẳng | Chưa đủ thời gian | Chờ đủ kỳ trước kết luận |
Tóm tắt
- Retention đo khả năng giữ người dùng, quan trọng hơn số người mới.
- Cohort nhóm người dùng theo mốc bắt đầu.
- Phân biệt retention N ngày chính xác và unbounded.
- Đọc hình dạng đường cong và điểm phẳng, không chỉ một con số.
- Không so sánh cohort nhỏ hoặc ô chưa đủ dữ liệu.
Dùng ← → để chuyển bài