[Tech Blog #29 | Data Analytics] Phân Tích Phễu Chuyển Đổi (Funnel Analysis): Bóc Tách "Điểm Gãy" & Đo Lường Bằng SQL
![[Tech Blog #29 | Data Analytics] Phân Tích Phễu Chuyển Đổi (Funnel Analysis): Bóc Tách "Điểm Gãy" & Đo Lường Bằng SQL](/uploads/ai-images/cover-phan-tich-pheu-chuyen-doi.png)
1. Đặt vấn đề: "Tại sao tỷ lệ chốt đơn tháng này lại tụt dốc?"
Hãy tưởng tượng bạn đang tham gia cuộc họp vận hành định kỳ cùng Ban Giám đốc:
Trưởng phòng Marketing thông báo: "Tháng này tỷ lệ chuyển đổi tổng thể (Overall Conversion Rate) giảm từ 3.0% xuống còn 1.8%. Chúng ta đang mất rất nhiều tiền!"
Nếu một Data Analyst chỉ dừng lại ở việc xác nhận: "Vâng, đúng là giảm 1.2% thật", thì bạn chưa mang lại giá trị thực sự cho doanh nghiệp.
Câu hỏi tiếp theo của Ban Giám đốc luôn là:
"Người dùng đang bỏ cuộc ở bước nào trong quy trình mua sắm? Do web lag, do form thanh toán lỗi, hay do phí ship hiển thị quá đắt?"
Để trả lời câu hỏi triệu đô này, bạn cần đến Phân tích phễu chuyển đổi (Funnel Analysis) – công cụ đóng vai trò như một chiếc máy quét MRI chụp lại toàn bộ hành trình của khách hàng từ lúc đặt chân vào trang web cho đến khi giao dịch thành công.
2. Giải mã cấu trúc Phễu & Khái niệm "Điểm gãy" (Bottleneck)
Một phễu mua hàng tiêu chuẩn trên website thương mại điện tử (E-commerce) thường gồm 5 bước tuần tự:
[BƯỚC 1: Xem trang chủ / Danh mục] (10.000 người) ── 100%
│
▼ (Chuyển tiếp: 60%) ─── [Rơi rụng: 40%]
[BƯỚC 2: Xem chi tiết sản phẩm] ( 6.000 người) ── 60%
│
▼ (Chuyển tiếp: 25%) ─── [Rơi rụng: 75%] <=== ĐIỂM GÃY NGUY HIỂM!
[BƯỚC 3: Bấm thêm vào giỏ hàng] ( 1.500 người) ── 15%
│
▼ (Chuyển tiếp: 60%) ─── [Rơi rụng: 40%]
[BƯỚC 4: Vào trang thanh toán] ( 900 người) ── 9%
│
▼ (Chuyển tiếp: 20%) ─── [Rơi rụng: 80%] <=== ĐIỂM GÃY THỨ HAI!
[BƯỚC 5: Thanh toán thành công] ( 180 người) ── 1.8%
Hai chỉ số sống còn tại mỗi tầng phễu:
- Tỷ lệ chuyển tiếp từng bước (Step-to-Step Conversion Rate):
- Tỷ lệ rơi rụng (Drop-off Rate):
Khái niệm "Điểm gãy" (Bottleneck / Drop-off Point):
Là bước chuyển tiếp có tỷ lệ rơi rụng cao bất thường. Thay vì dàn trải nguồn lực sửa toàn bộ website, Data Analyst sẽ chỉ điểm chính xác cho đội ngũ lập trình và thiết kế: "Hãy tập trung 80% nguồn lực để tối ưu bước Từ Xem sản phẩm sang Thêm giỏ hàng và trang Thanh toán!".
3. Bảng so sánh: Phễu Đóng (Closed Funnel) vs. Phễu Mở (Open Funnel)
| Tiêu chí | Closed Funnel (Phễu đóng) | Open Funnel (Phễu mở) |
|---|---|---|
| Quy tắc tính toán | Người dùng bắt buộc phải đi qua đúng thứ tự từ Bước 1 Bước 2 Bước 3. | Người dùng có thể nhảy thẳng vào bất kỳ bước nào (ví dụ: bấm link quảng cáo vào thẳng Giỏ hàng). |
| Độ chặt chẽ | Rất cao, phản ánh chính xác hành trình tuyến tính có chủ đích. | Linh hoạt hơn, phản ánh đúng hành vi tự do ngoài đời thực. |
| Độ phức tạp khi viết SQL | Phức tạp hơn (Cần kiểm tra thứ tự mốc thời gian timestamp). | Đơn giản hơn (Chỉ cần kiểm tra người dùng có làm hành động đó hay không). |
| Ứng dụng tiêu biểu | Quy trình Onboarding người dùng mới, quy trình thanh toán thẻ tín dụng. | Hành trình đọc báo, duyệt danh mục sản phẩm, xem video gợi ý. |
4. Thực hành thực chiến: Xây dựng báo cáo Phễu chuyển đổi bằng SQL
Giả sử bạn có bảng nhật ký sự kiện user_event_logs (user_id INT, event_name VARCHAR, event_time TIMESTAMP) ghi nhận hành vi của người dùng trong tháng 09/2026.
Dưới đây là truy vấn SQL chuẩn mực sử dụng CTE ([Tech Blog #17]) và kỹ thuật Conditional Aggregation ([Tech Blog #05]) để tính toán toàn bộ các tầng phễu:
-- Bước 1: Tổng hợp danh sách người dùng và các bước họ đã hoàn thành
WITH user_funnel_flags AS (
SELECT
user_id,
-- Kiểm tra xem người dùng có thực hiện từng bước hay không (Trả về 1 hoặc 0)
MAX(CASE WHEN event_name = 'view_homepage' THEN 1 ELSE 0 END) AS step_1_home,
MAX(CASE WHEN event_name = 'view_product_detail' THEN 1 ELSE 0 END) AS step_2_pdp,
MAX(CASE WHEN event_name = 'add_to_cart' THEN 1 ELSE 0 END) AS step_3_cart,
MAX(CASE WHEN event_name = 'initiate_checkout' THEN 1 ELSE 0 END) AS step_4_checkout,
MAX(CASE WHEN event_name = 'purchase_success' THEN 1 ELSE 0 END) AS step_5_purchase
FROM
user_event_logs
WHERE
event_time >= '2026-09-01' AND event_time < '2026-10-01'
GROUP BY
user_id
),
-- Bước 2: Đếm tổng số người dùng duy nhất ở từng bước (Tuân thủ logic Phễu Đóng)
funnel_counts AS (
SELECT
COUNT(CASE WHEN step_1_home = 1 THEN user_id END) AS users_step_1,
COUNT(CASE WHEN step_1_home = 1 AND step_2_pdp = 1 THEN user_id END) AS users_step_2,
COUNT(CASE WHEN step_1_home = 1 AND step_2_pdp = 1 AND step_3_cart = 1 THEN user_id END) AS users_step_3,
COUNT(CASE WHEN step_1_home = 1 AND step_2_pdp = 1 AND step_3_cart = 1 AND step_4_checkout = 1 THEN user_id END) AS users_step_4,
COUNT(CASE WHEN step_1_home = 1 AND step_2_pdp = 1 AND step_3_cart = 1 AND step_4_checkout = 1 AND step_5_purchase = 1 THEN user_id END) AS users_step_5
FROM
user_funnel_flags
)
-- Bước 3: Tính toán tỷ lệ chuyển đổi tổng thể và tỷ lệ rơi rụng từng bước
SELECT
'1. Xem Trang Chủ' AS funnel_step,
users_step_1 AS users_count,
100.0 AS overall_conversion_pct,
0.0 AS drop_off_pct
FROM funnel_counts
UNION ALL
SELECT
'2. Xem Sản Phẩm',
users_step_2,
ROUND((users_step_2::NUMERIC / users_step_1) * 100, 2),
ROUND((1 - (users_step_2::NUMERIC / users_step_1)) * 100, 2)
FROM funnel_counts
UNION ALL
SELECT
'3. Thêm Vào Giỏ Hàng',
users_step_3,
ROUND((users_step_3::NUMERIC / users_step_1) * 100, 2),
ROUND((1 - (users_step_3::NUMERIC / users_step_2)) * 100, 2)
FROM funnel_counts
UNION ALL
SELECT
'4. Bắt Đầu Thanh Toán',
users_step_4,
ROUND((users_step_4::NUMERIC / users_step_1) * 100, 2),
ROUND((1 - (users_step_4::NUMERIC / users_step_3)) * 100, 2)
FROM funnel_counts
UNION ALL
SELECT
'5. Thanh Toán Thành Công',
users_step_5,
ROUND((users_step_5::NUMERIC / users_step_1) * 100, 2),
ROUND((1 - (users_step_5::NUMERIC / users_step_4)) * 100, 2)
FROM funnel_counts;
5. Câu hỏi phỏng vấn thực tế (Interview Q&A)
Câu 1 (Mức độ: Entry / Junior)
Câu hỏi: "Phân biệt sự khác nhau cơ bản giữa Closed Funnel (Phễu đóng) và Open Funnel (Phễu mở)?"
Gợi ý trả lời:
*"Sự khác biệt cốt lõi nằm ở tính ràng buộc của chuỗi hành động:
- Closed Funnel (Phễu đóng) yêu cầu người dùng phải thực hiện đầy đủ các bước theo đúng trình tự nghiêm ngặt (A B C). Nếu người dùng nhảy cóc từ A thẳng đến C mà không qua B, họ sẽ không được tính vào kết quả của bước C. Loại phễu này phù hợp nhất cho các quy trình có tính bắt buộc cao như quy trình thanh toán hoặc đăng ký mở tài khoản ngân hàng (eKYC).
- Open Funnel (Phễu mở) cho phép người dùng có thể tham gia vào phễu ở bất kỳ giai đoạn nào (ví dụ: người dùng nhận được link khuyến mãi gửi qua Zalo bấm vào thẳng trang sản phẩm B mà không qua trang chủ A). Open Funnel phản ánh trung thực hơn hành vi duyệt web tự do của người dùng hiện đại."*
Câu 2 (Mức độ: Junior / Mid-level)
Câu hỏi: "Nếu báo cáo phễu chỉ ra rằng có tới 75% khách hàng bị rơi rụng ở bước 'Từ Giỏ hàng sang Thanh toán' (Add-to-Cart to Checkout), bạn sẽ đưa ra những giả thuyết nguyên nhân nào và làm sao để kiểm chứng bằng dữ liệu?"
Gợi ý trả lời:
*"Đây là điểm gãy kinh điển trong thương mại điện tử. Em sẽ thiết lập 3 giả thuyết chính và dùng dữ liệu để đào sâu (Drill-down):
- Giả thuyết về chi phí ẩn (Hidden Costs): Khách hàng vào trang thanh toán mới phát hiện phí vận chuyển quá cao hoặc không áp được mã giảm giá. Em sẽ kiểm tra xem nhóm người dùng bấm 'Áp mã thất bại' có tỷ lệ thoát cao hơn nhóm áp mã thành công hay không.
- Giả thuyết về lỗi kỹ thuật / Trải nghiệm (Technical/UX Friction): Trang thanh toán bị chậm, bắt đăng nhập tài khoản phức tạp, hoặc thiếu phương thức thanh toán quen thuộc (MoMo, Apple Pay). Em sẽ phân cắt dữ liệu (Slicing) theo Thiết bị (iOS vs Android) và Trình duyệt; nếu tỷ lệ rơi rụng chỉ xảy ra trên một dòng máy cụ thể thì chắc chắn do lỗi giao diện.
- Hành vi dùng giỏ hàng làm 'Wishlist': Khách thêm vào giỏ để lưu tạm so sánh giá chứ chưa có ý định mua ngay. Em sẽ kiểm tra thời gian lưu sản phẩm trong giỏ và số lần quay lại xem giỏ trước khi mua thực tế."*
6. Key Takeaways (Ghi nhớ nhanh)
- Phễu chuyển đổi biến con số chung thành hành động cụ thể: Đừng chỉ nhìn vào Conversion Rate tổng, hãy xem người dùng rơi rụng nhiều nhất ở tầng nào.
- Tập trung vào Điểm gãy (Bottleneck): Tối ưu hóa bước có tỷ lệ rơi rụng cao nhất luôn đem lại tỷ suất lợi nhuận (ROI) lớn nhất cho doanh nghiệp.
- Phân rã đa chiều (Funnel Slicing): Luôn chẻ nhỏ phễu theo Thiết bị (Mobile vs Desktop), Kênh tiếp thị (Ads vs Organic), và Nhóm người dùng (Mới vs Cũ) để không bị số liệu bình quân che mắt.
- Logic Phễu Đóng trong SQL: Dùng
CASE WHENkết hợp điều kiệnANDtuần tự giữa các bước để đảm bảo người dùng tuân thủ đúng hành trình trải nghiệm.