DHDataHọc
Lý thuyếtBài 4/85 phút đọc+10 XP

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ỳ:

CohortnTuần 1Tuần 2Tuần 3Tuần 4
05/011.00042%31%26%24%
12/011.20045%33%28%—
19/0190041%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.

code
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 đó.

code
D7+ = số người hoạt động từ ngày thứ 7 trở đi

Unbounded 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

code
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:

code
ROUND(100.0 * MAX(n) FILTER (WHERE tuan = cohort + INTERVAL '1 week')
      / MAX(n) FILTER (WHERE tuan = cohort), 1) AS w1_pct

D7 chính xác

code
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ề 0Sản phẩm chỉ dùng một lần
Giảm rồi phẳngCó nhóm người dùng trung thành
Phẳng sớm ở mức caoSản phẩm thiết yếu, dùng thường xuyên
Giảm chậm nhưng đềuGiữ 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

  1. Viết truy vấn cohort theo tuần với W1, W2, W4.
  2. Chuyển kết quả sang tỷ lệ phần trăm.
  3. Viết truy vấn D7 chính xác.
  4. Vẽ đường cong retention từ bảng cohort.
  5. Đánh dấu các ô chưa đủ dữ liệu.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
So sánh ô trốngCohort mới chưa đủ kỳĐánh dấu —, chỉ so ô đủ
Retention khác công cụ khácĐịnh nghĩa khácGhi rõ N ngày hay unbounded
Tỷ lệ dao động mạnhCohort nhỏGộp cohort, yêu cầu mẫu tối thiểu
D1 cao hơn D0Lỗi định nghĩaKiểm tra mốc bắt đầu
Retention giảm dần theo cohortMở rộng tệp người dùngPhân tích theo nguồn
Đường cong không phẳngChưa đủ thời gianChờ đủ 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