Engagement
Bạn sẽ học được
- Engagement đo cường độ sử dụng, khác với DAU/MAU ở chỗ nào.
- Ba nhóm chỉ số: tần suất, độ sâu, độ rộng.
- Định nghĩa phiên và dựng phiên từ bảng sự kiện bằng SQL.
- Đọc đường cong người dùng quyền lực thay vì chỉ nhìn trung bình.
- Những cái bẫy khi báo cáo engagement.
Khái niệm cốt lõi
DAU/MAU đo bao nhiêu người quay lại. Engagement đo họ quay lại nhiều đến mức nào và làm được bao nhiêu việc.
Ba nhóm chỉ số:
| Nhóm | Câu hỏi | Ví dụ chỉ số |
|---|---|---|
| Tần suất | Bao lâu quay lại một lần? | Số phiên/người/tuần, số ngày hoạt động/tháng |
| Độ sâu | Mỗi lần dùng làm được bao nhiêu? | Sự kiện/phiên, thời lượng phiên, số bước trong phễu |
| Độ rộng | Dùng bao nhiêu tính năng khác nhau? | Số tính năng khác nhau/người/tháng |
Một sản phẩm có thể đông người dùng nhưng engagement nông: DAU ổn định, mỗi người mở ra xem 5 giây rồi thoát. Ngược lại, sản phẩm ít người nhưng sâu thường có retention tốt hơn. Đọc cả hai nhóm cùng lúc.
Định nghĩa phiên
Phiên là một chuỗi hoạt động liên tục, kết thúc khi người dùng im lặng đủ lâu. Quy ước phổ biến: 30 phút không hoạt động thì đóng phiên.
Định nghĩa này phải chốt trước khi tính, vì 15 phút và 60 phút cho ra số phiên rất khác nhau. Ghi vào tài liệu chỉ số giống như mọi định nghĩa khác.
Nếu công cụ phân tích đã có cột session_id, dùng luôn. Nếu chỉ có bảng sự kiện thô, phải tự dựng.
Dựng phiên từ sự kiện
WITH danh_dau AS (
SELECT
user_id,
occurred_at,
CASE
WHEN LAG(occurred_at) OVER (PARTITION BY user_id ORDER BY occurred_at) IS NULL
OR occurred_at - LAG(occurred_at) OVER (PARTITION BY user_id ORDER BY occurred_at)
> INTERVAL '30 minutes'
THEN 1 ELSE 0
END AS mo_phien_moi
FROM events
WHERE occurred_at >= now() - INTERVAL '30 days'
),
phien AS (
SELECT
user_id,
occurred_at,
SUM(mo_phien_moi) OVER (PARTITION BY user_id ORDER BY occurred_at) AS so_phien
FROM danh_dau
)
SELECT
user_id,
so_phien,
COUNT(*) AS so_su_kien,
MIN(occurred_at) AS bat_dau,
MAX(occurred_at) AS ket_thuc,
MAX(occurred_at) - MIN(occurred_at) AS do_dai
FROM phien
GROUP BY 1, 2;Cách hoạt động: mỗi khi khoảng cách với sự kiện trước vượt 30 phút, đánh dấu mở phiên mới; cộng dồn dấu đó để ra số thứ tự phiên cho từng người. Đây là kỹ thuật "gaps and islands" quen thuộc trong SQL phân tích.
Lưu ý: phiên chỉ có một sự kiện có độ dài 0. Đừng dùng độ dài phiên làm thước đo chất lượng nếu phần lớn phiên là một sự kiện — con số sẽ gần 0 và vô nghĩa.
Tần suất
SELECT
user_id,
COUNT(DISTINCT so_phien) AS so_phien,
COUNT(DISTINCT date_trunc('day', bat_dau)::date) AS so_ngay_hoat_dong
FROM phien
GROUP BY 1;Từ bảng này tính phân bố:
WITH nguoi AS (
SELECT user_id, COUNT(DISTINCT so_phien) AS so_phien
FROM phien
GROUP BY 1
)
SELECT
so_phien,
COUNT(*) AS so_nguoi,
ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS ty_le_pct
FROM nguoi
GROUP BY 1
ORDER BY 1;Đọc phân bố, không chỉ đọc trung bình. Ví dụ trung bình 3,8 phiên/người có thể là: 70% người dùng 1 phiên và 5% người dùng 30 phiên. Hai nhóm này cần hai chiến lược sản phẩm khác nhau.
Độ sâu
Hai chỉ số hay dùng:
-- Sự kiện trung bình mỗi phiên
SELECT ROUND(AVG(so_su_kien), 2) AS su_kien_moi_phien
FROM (
SELECT user_id, so_phien, COUNT(*) AS so_su_kien
FROM phien
GROUP BY 1, 2
) t;
-- Trung vị, ít bị kéo bởi ngoại lai
SELECT
percentile_cont(0.5) WITHIN GROUP (ORDER BY so_su_kien) AS trung_vi
FROM (
SELECT user_id, so_phien, COUNT(*) AS so_su_kien
FROM phien
GROUP BY 1, 2
) t;Luôn báo cáo trung vị cùng trung bình. Một vài người dùng cực nặng kéo trung bình lên, còn phần lớn người dùng thật sự rất nông.
Độ rộng
SELECT
COUNT(DISTINCT event_name) AS so_tinh_nang,
COUNT(DISTINCT user_id) AS so_nguoi
FROM events
WHERE occurred_at >= CURRENT_DATE - INTERVAL '30 days';Hoặc phân bố số tính năng mỗi người dùng:
WITH nguoi AS (
SELECT user_id, COUNT(DISTINCT event_name) AS so_tinh_nang
FROM events
WHERE occurred_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
)
SELECT so_tinh_nang, COUNT(*) AS so_nguoi
FROM nguoi
GROUP BY 1
ORDER BY 1;Độ rộng thấp có nghĩa người dùng chỉ dùng một hai tính năng — sản phẩm chưa tạo được thói quen khám phá, hoặc tính năng mới không ai biết.
Đường cong người dùng quyền lực
Đây là biểu đồ quan trọng nhất của engagement. Trục hoành là số ngày hoạt động trong 30 ngày (1 đến 30), trục tung là số người.
WITH nguoi AS (
SELECT
user_id,
COUNT(DISTINCT occurred_at::date) AS so_ngay
FROM events
WHERE occurred_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
)
SELECT so_ngay, COUNT(*) AS so_nguoi
FROM nguoi
GROUP BY 1
ORDER BY 1;Cách đọc:
| Hình dạng | Ý nghĩa |
|---|---|
| Dốc xuống rồi đuôi phẳng | Có nhóm người dùng cốt lõi rõ ràng |
| Dồn hết ở ngày 1 | Sản phẩm dùng một lần, không có thói quen |
| Đuôi dày bên phải | Tỷ lệ người dùng nặng cao — sản phẩm giữ chân tốt |
| Hai đỉnh | Có hai nhóm hành vi khác nhau, cần phân khúc |
Người dùng hoạt động 15/30 ngày trở lên thường được gọi là người dùng quyền lực. Tỷ lệ này là chỉ số sức khoẻ sản phẩm tốt hơn DAU đơn thuần, vì nó đo thói quen chứ không đo lượt ghé.
Cái bẫy khi báo cáo
- Trung bình che mất phân bố: luôn kèm trung vị hoặc biểu đồ phân bố.
- Đổi định nghĩa phiên giữa chừng: chuỗi thời gian gãy khúc giả tạo.
- Đếm sự kiện hệ thống:
app_opened,screen_viewedtự bắn làm phồng mọi chỉ số. - So sánh tháng đủ với tháng chưa đủ: luôn so cùng số ngày.
- Bỏ qua sự kiện trùng: phiên bị tách hoặc gộp sai.
- Engagement tăng do bắt buộc: thông báo đẩy nhiều làm người dùng mở app rồi thoát ngay — số phiên tăng nhưng chất lượng giảm. Đọc kèm retention.
Thực hành
- Dựng phiên với ngưỡng 30 phút cho 30 ngày gần nhất.
- Tính phân bố số phiên/người.
- Tính trung bình và trung vị sự kiện/phiên.
- Vẽ đường cong người dùng quyền lực.
- So sánh tỷ lệ người dùng hoạt động từ 15 ngày trở lên giữa hai tháng.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Phiên quá nhiều | Ngưỡng đóng phiên quá ngắn | Chốt 30 phút, ghi tài liệu |
| Phiên chỉ có 1 sự kiện | Thiếu sự kiện hoặc định nghĩa sai | Kiểm tra tracking |
| Trung bình cao bất thường | Ngoại lai | Báo cáo thêm trung vị |
| Số phiên tăng, retention giảm | Thông báo đẩy quá mức | Đọc kèm retention và chất lượng phiên |
| Số liệu nhảy giữa hai kỳ | Đổi định nghĩa hoặc đổi công cụ | So lại cùng định nghĩa |
| Không thấy nhóm cốt lõi | Đường cong dồn ở ngày 1 | Tập trung cải thiện giá trị lần đầu |
Tóm tắt
- Engagement đo tần suất, độ sâu, độ rộng — không chỉ số người.
- Phiên cần định nghĩa rõ; dựng bằng khoảng cách sự kiện và
SUM(...) OVER. - Báo cáo phân bố và trung vị, không chỉ trung bình.
- Đường cong người dùng quyền lực cho thấy sức khoẻ thật của sản phẩm.
- Engagement tăng mà retention giảm là dấu hiệu xấu, không phải tốt.
Dùng ← → để chuyển bài