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

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ómCâu hỏiVí dụ chỉ số
Tần suấtBao 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âuMỗ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ộngDù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

code
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

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

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

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

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

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

code
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ẳngCó nhóm người dùng cốt lõi rõ ràng
Dồn hết ở ngày 1Sản phẩm dùng một lần, không có thói quen
Đuôi dày bên phảiTỷ lệ người dùng nặng cao — sản phẩm giữ chân tốt
Hai đỉnhCó 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_viewed tự 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

  1. Dựng phiên với ngưỡng 30 phút cho 30 ngày gần nhất.
  2. Tính phân bố số phiên/người.
  3. Tính trung bình và trung vị sự kiện/phiên.
  4. Vẽ đường cong người dùng quyền lực.
  5. 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ứngNguyên nhânCách sửa
Phiên quá nhiềuNgưỡng đóng phiên quá ngắnChốt 30 phút, ghi tài liệu
Phiên chỉ có 1 sự kiệnThiếu sự kiện hoặc định nghĩa saiKiểm tra tracking
Trung bình cao bất thườngNgoại laiBáo cáo thêm trung vị
Số phiên tăng, retention giảmThô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 1Tậ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