DHDataHọc
TheoryLesson 3/86 min read+10 XP

Phễu chuyển đổi

Bạn sẽ học được

  • Phễu chuyển đổi là gì và đo cái gì.
  • Chọn bước phễu và cửa sổ thời gian.
  • Viết truy vấn phễu đúng thứ tự bằng SQL.
  • Đọc tỷ lệ chuyển đổi từng bước và tỷ lệ toàn phễu.
  • Phân biệt phễu người dùng và phễu sự kiện.

Khái niệm cốt lõi

Phễu là chuỗi bước người dùng phải đi qua để hoàn thành một mục tiêu:

code
Xem sản phẩm → Thêm vào giỏ → Bắt đầu thanh toán → Hoàn tất

Mỗi bước có:

  • Số người đến bước đó.
  • Tỷ lệ chuyển đổi so với bước trước.
  • Tỷ lệ rơi (drop-off) = 100% − tỷ lệ chuyển đổi.

Tỷ lệ toàn phễu = số người hoàn tất / số người bắt đầu. Hai con số này khác nhau: từng bước có thể tốt nhưng tích luỹ vẫn thấp.

Ví dụ:

BướcSố ngườiChuyển đổi bướcSo với bước 1
Xem sản phẩm10.000—100%
Thêm vào giỏ2.50025,0%25,0%
Bắt đầu thanh toán1.20048,0%12,0%
Hoàn tất90075,0%9,0%

Bước rơi lớn nhất là xem → thêm giỏ (75% rơi). Tối ưu bước đó có tác động lớn hơn cải thiện bước thanh toán từ 75% lên 80%.

Chọn bước và cửa sổ

Ba quyết định trước khi tính:

  1. Bước nào? Mỗi bước phải là một sự kiện đã định nghĩa rõ.
  2. Cửa sổ bao lâu? Người dùng phải hoàn tất trong 1 ngày, 7 ngày, hay không giới hạn?
  3. Đơn vị: người dùng hay phiên?

Cửa sổ dài làm tỷ lệ chuyển đổi cao hơn nhưng lỏng lẻo hơn về ý nghĩa. Với mua hàng, 7 ngày hợp lý; với đăng ký, 1 ngày thường đủ. Chốt và ghi vào định nghĩa chỉ số.

Đơn vị quan trọng: phễu theo phiên đo trải nghiệm trong một lần truy cập; phễu theo người dùng đo khả năng hoàn tất của một người trong cửa sổ. Hai con số không so sánh được với nhau.

Truy vấn phễu

Cách tiếp cận: lấy thời điểm đầu tiên của mỗi bước cho từng người, sau đó kiểm tra thứ tự.

code
WITH buoc AS (
  SELECT
    user_id,
    MIN(occurred_at) FILTER (WHERE event_name = 'product_viewed')     AS s1,
    MIN(occurred_at) FILTER (WHERE event_name = 'cart_item_added')    AS s2,
    MIN(occurred_at) FILTER (WHERE event_name = 'checkout_started')   AS s3,
    MIN(occurred_at) FILTER (WHERE event_name = 'checkout_completed') AS s4
  FROM events
  WHERE occurred_at >= now() - INTERVAL '30 days'
  GROUP BY user_id
)
SELECT
  COUNT(*) FILTER (WHERE s1 IS NOT NULL) AS buoc_1,
  COUNT(*) FILTER (WHERE s2 > s1)        AS buoc_2,
  COUNT(*) FILTER (WHERE s3 > s2 AND s2 > s1) AS buoc_3,
  COUNT(*) FILTER (WHERE s4 > s3 AND s3 > s2 AND s2 > s1) AS buoc_4
FROM buoc;

Điểm quan trọng:

  • MIN(...) FILTER lấy lần đầu tiên mỗi bước.
  • Điều kiện s2 > s1 đảm bảo đúng thứ tự; nếu chỉ đếm s2 IS NOT NULL, người thêm giỏ trước khi xem sẽ được tính sai.
  • NULL trong so sánh làm điều kiện không thoả, đúng ý (không có bước trước thì không tính).

Thêm ràng buộc cửa sổ

Giới hạn mỗi bước trong 7 ngày kể từ bước đầu:

code
COUNT(*) FILTER (
  WHERE s2 > s1 AND s2 <= s1 + INTERVAL '7 days'
) AS buoc_2_trong_7_ngay

Áp dụng cho từng bước tiếp theo, luôn tính từ s1 chứ không phải từ bước liền trước — nếu không, chuỗi 10 bước có thể kéo dài vô hạn.

Phễu theo nhóm

Để biết nhóm nào rơi nhiều, thêm chiều phân tích:

code
WITH buoc AS (
  SELECT
    user_id,
    MIN(occurred_at) FILTER (WHERE event_name = 'product_viewed')  AS s1,
    MIN(occurred_at) FILTER (WHERE event_name = 'checkout_completed') AS s4
  FROM events
  WHERE occurred_at >= now() - INTERVAL '30 days'
  GROUP BY user_id
)
SELECT
  COALESCE(u.device, 'không rõ') AS thiet_bi,
  COUNT(*) FILTER (WHERE s1 IS NOT NULL) AS bat_dau,
  COUNT(*) FILTER (WHERE s4 > s1) AS hoan_tat,
  ROUND(100.0 * COUNT(*) FILTER (WHERE s4 > s1)
        / NULLIF(COUNT(*) FILTER (WHERE s1 IS NOT NULL), 0), 1) AS ty_le_pct
FROM buoc b
LEFT JOIN users u ON u.id = b.user_id
GROUP BY 1
ORDER BY 3 DESC;

So sánh nhóm cần cỡ mẫu đủ lớn; nhóm có 50 người bắt đầu không nên được dùng để kết luận. Và nhớ hiệu chỉnh khi so nhiều nhóm.

Phễu sự kiện và phễu người dùng

LoạiĐếmDùng khi
Phễu sự kiện (session)Chuỗi sự kiện trong một phiênĐo trải nghiệm một lần truy cập
Phễu người dùngMột người đạt đủ các bước trong cửa sổĐo khả năng chuyển đổi thực

Phễu sự kiện thường cho tỷ lệ thấp hơn vì người dùng có thể quay lại nhiều phiên. Ghi rõ loại nào trong tiêu đề báo cáo.

Đọc phễu đúng

  • Xem tỷ lệ từng bước và tỷ lệ toàn phễu.
  • Xác định bước rơi lớn nhất, nhưng kiểm tra cỡ mẫu trước khi kết luận.
  • So sánh theo thời gian cùng định nghĩa và cùng cửa sổ.
  • Kiểm tra dữ liệu sự kiện trước: sự kiện trùng hoặc thiếu làm phễu sai.

Một phễu "tốt lên" sau khi đổi định nghĩa bước không phải là cải thiện sản phẩm.

Thực hành

  1. Viết phễu 4 bước theo người dùng trong 30 ngày.
  2. Thêm ràng buộc 7 ngày kể từ bước đầu.
  3. Tính tỷ lệ toàn phễu từ bảng kết quả.
  4. So sánh phễu giữa hai thiết bị.
  5. Giải thích khác biệt giữa phễu phiên và phễu người dùng.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Tỷ lệ chuyển đổi quá caoKhông kiểm tra thứ tựDùng điều kiện s2 > s1
Bước sau đông hơn bước trướcĐếm độc lập từng bướcTính phễu tuần tự
Kết quả đổi theo cửa sổCửa sổ không cố địnhChốt cửa sổ trong định nghĩa
Không so sánh đượcTrộn phiên và ngườiChốt đơn vị
Phễu sai do dữ liệuSự kiện trùng/thiếuKiểm tra chất lượng trước
Kết luận từ nhóm nhỏMẫu không đủYêu cầu cỡ mẫu tối thiểu

Tóm tắt

  • Phễu đo chuỗi bước có thứ tự; cần chốt bước, cửa sổ, đơn vị.
  • Dùng MIN(...) FILTER và điều kiện thứ tự s2 > s1.
  • Cửa sổ tính từ bước đầu, không từ bước liền trước.
  • Xem cả tỷ lệ từng bước và tỷ lệ toàn phễu.
  • Phân tích nhóm cần đủ mẫu và hiệu chỉnh đa so sánh.

Use ← → to move between lessons