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:
Xem sản phẩm → Thêm vào giỏ → Bắt đầu thanh toán → Hoàn tấtMỗ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ước | Số người | Chuyển đổi bước | So với bước 1 |
|---|---|---|---|
| Xem sản phẩm | 10.000 | — | 100% |
| Thêm vào giỏ | 2.500 | 25,0% | 25,0% |
| Bắt đầu thanh toán | 1.200 | 48,0% | 12,0% |
| Hoàn tất | 900 | 75,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:
- Bước nào? Mỗi bước phải là một sự kiện đã định nghĩa rõ.
- 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?
- Đơ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ự.
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(...) FILTERlấ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ỉ đếms2 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:
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:
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 | Đếm | Dù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ùng | Mộ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
- Viết phễu 4 bước theo người dùng trong 30 ngày.
- Thêm ràng buộc 7 ngày kể từ bước đầu.
- Tính tỷ lệ toàn phễu từ bảng kết quả.
- So sánh phễu giữa hai thiết bị.
- 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ứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Tỷ lệ chuyển đổi quá cao | Khô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ước | Tính phễu tuần tự |
| Kết quả đổi theo cửa sổ | Cửa sổ không cố định | Chốt cửa sổ trong định nghĩa |
| Không so sánh được | Trộn phiên và người | Chốt đơn vị |
| Phễu sai do dữ liệu | Sự kiện trùng/thiếu | Kiể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(...) FILTERvà đ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.
Dùng ← → để chuyển bài