Bài tập: phỏng vấn thử
Bạn sẽ học được
- Trả lời trọn một buổi phỏng vấn Data Analyst giả lập.
- Áp dụng top-N, retention và funnel trên cùng một bộ dữ liệu.
- Đọc kết quả A/B test có vấn đề phân bổ.
- Chẩn đoán một chỉ số giảm bất thường.
- Trình bày câu trả lời hành vi có cấu trúc.
Tình huống
Bạn phỏng vấn vị trí Data Analyst tại FoodGo, ứng dụng giao đồ ăn. Bộ dữ liệu gồm:
users(user_id, signup_date, city)
orders(order_id, user_id, order_date, amount, status)
events(user_id, event_date, event_name)
deliveries(delivery_id, shipper_id, district, completed_at, fee)Số liệu công ty cung cấp:
- Tháng 1 có 2.000 người dùng mới.
- Trong số đó, tháng 2 có 800 người còn hoạt động, tháng 3 có 600 người.
- Funnel đặt hàng 7 ngày qua: 200.000 phiên xem nhà hàng → 60.000 thêm món vào giỏ → 18.000 mở trang thanh toán → 13.500 đặt hàng thành công.
- Thử nghiệm đổi màu nút "Đặt hàng": tỷ lệ chuyển đổi nền 8%, nhóm A có 12.600 người, nhóm B có 11.800 người, tổng 24.400.
- Tuần này DAU giảm 15% so với tuần trước.
Câu hỏi
Câu 1. Viết truy vấn top 3 shipper theo tổng phí giao hàng trong mỗi quận. Nếu hai shipper bằng điểm ở vị trí thứ ba, bạn xử lý thế nào và dùng hàm nào?
Câu 2. Câu SQL sau sai ở đâu?
select district, shipper_id, total
from (
select district, shipper_id, sum(fee) as total,
row_number() over (order by sum(fee) desc) as rn
from deliveries
group by district, shipper_id
) t
where rn <= 3;Câu 3. Tính retention tháng 1 và tháng 2 của cohort tháng 1.
Câu 4. Khi báo cáo retention tháng 3, những cohort nào phải loại khỏi bảng và vì sao?
Câu 5. Tính tỷ lệ chuyển đổi từng bước và tỷ lệ chuyển đổi tổng của funnel.
Câu 6. Bước nào rơi nhiều nhất? Bạn kiểm tra gì đầu tiên?
Câu 7. Cần bao nhiêu người mỗi nhóm để phát hiện mức tăng từ 8% lên 9%? Vì sao không nên xem kết quả mỗi ngày rồi dừng khi có ý nghĩa?
Câu 8. Kiểm tra phân bổ mẫu cho thử nghiệm trên. Bạn kết luận gì?
Câu 9. DAU giảm 15% trong một tuần. Ba việc đầu tiên bạn kiểm tra là gì?
Câu 10. Kể về một lần phân tích của bạn dẫn tới quyết định sai. Trình bày theo STAR trong 2 phút.
Đáp án
Câu 1 — DENSE_RANK để giữ đồng hạng
with shipper_revenue as (
select
district,
shipper_id,
sum(fee) as total
from deliveries
where completed_at >= current_date - interval '30 days'
group by 1, 2
)
select district, shipper_id, total
from (
select
district,
shipper_id,
total,
dense_rank() over (
partition by district
order by total desc
) as dr
from shipper_revenue
) t
where dr <= 3
order by district, dr;DENSE_RANK giữ mọi shipper đồng hạng ở vị trí thứ ba. Nếu đề yêu cầu đúng 3 dòng mỗi quận, đổi sang ROW_NUMBER và thêm shipper_id vào ORDER BY để kết quả ổn định.
Nêu thêm: "Em giả định 30 ngày gần nhất và chỉ tính chuyến đã hoàn tất. Nếu anh/chị muốn tính cả chuyến huỷ, em bỏ điều kiện completed_at."
Câu 2 — Thiếu PARTITION BY
row_number() over (order by sum(fee) desc) xếp hạng trên toàn bộ kết quả, không theo quận. Kết quả trả về đúng 3 dòng cho toàn bộ dữ liệu, không phải 3 dòng mỗi quận.
Sửa:
row_number() over (partition by district order by sum(fee) desc)Lưu ý thêm: hàm window chạy sau GROUP BY, nên sum(fee) trong over() là tổng đã gộp — đúng ý. Nếu xếp hạng trong cùng câu SELECT với GROUP BY, một số hệ quản trị yêu cầu dùng alias hoặc subquery; subquery như trên là an toàn nhất.
Câu 3 — 40% và 30%
Cohort tháng 1 có 2.000 người.
M1 = 800 / 2.000 = 40%
M2 = 600 / 2.000 = 30%Nếu tính theo tháng trước:
M2 / M1 = 600 / 800 = 75%Cả hai cách đều đúng nhưng phải nói rõ. Câu trả lời đầy đủ: "Retention tháng 1 là 40%, tháng 2 là 30% tính trên cohort ban đầu; so với tháng trước thì tháng 2 giữ được 75% số người còn hoạt động ở tháng 1."
Câu 4 — Loại cohort chưa đủ tuổi
Chỉ tính retention tháng N cho cohort có ít nhất N tháng kể từ khi đăng ký:
where cohort_month <= date_trunc('month', current_date)::date
- interval '3 months'Nếu không loại, cohort tháng 3 sẽ có M1, M2, M3 bằng 0 hoặc NULL — không phải vì người dùng rời đi mà vì chưa đủ thời gian để quay lại. Đưa các dòng đó vào bảng làm đường cong retention trông như đang sụp đổ.
Ngoài ra, mẫu số luôn là toàn bộ cohort ban đầu (2.000), không phải số còn hoạt động tháng trước.
Câu 5 — 30%, 30%, 75%, tổng 6,75%
Bước 1 → 2: 60.000 / 200.000 = 30%
Bước 2 → 3: 18.000 / 60.000 = 30%
Bước 3 → 4: 13.500 / 18.000 = 75%
Tổng: 13.500 / 200.000 = 6,75%Số người mất ở từng bước: 140.000; 42.000; 4.500.
Câu 6 — Bước 1 → 2, kiểm tra tracking trước
Bước rơi lớn nhất là xem nhà hàng → thêm món: mất 140.000 người, tương đương 70%.
Nhưng trước khi kết luận về hành vi, kiểm tra:
- Tracking: sự kiện
add_to_cartcó còn được ghi đúng không, có thiếu tham số, có bị chặn bởi trình chặn quảng cáo không. - Hiệu năng: thời gian tải trang nhà hàng có tăng trong tuần này không.
- Phân khúc: giảm ở tất cả nền tảng hay chỉ Android; tất cả thành phố hay một thành phố.
Nếu tracking và hiệu năng bình thường, mới đưa ra giả thuyết sản phẩm — ví dụ nút "thêm món" khó thấy, hoặc giá hiển thị tăng.
Câu 7 — Khoảng 12.200 mỗi nhóm, không xem giữa chừng
Với p1 = 0,08, p2 = 0,09:
n = (1,96 + 0,84)^2 × [0,08×0,92 + 0,09×0,91] / 0,01^2
= 7,85 × [0,0736 + 0,0819] / 0,0001
= 7,85 × 0,1555 / 0,0001
≈ 12.200 người mỗi nhómTổng khoảng 24.400 người — đúng bằng số người đã tham gia thử nghiệm.
Không nên xem mỗi ngày: mỗi lần kiểm tra là một cơ hội bắt được dao động ngẫu nhiên. Dừng khi p < 0,05 sau nhiều lần xem làm xác suất dương tính giả tăng từ 5% lên 20–30%. Phải chốt thời điểm kết thúc trước khi chạy.
Câu 8 — Có SRM, kết quả không đáng tin
Tổng 24.400, thiết kế 50/50 nên kỳ vọng 12.200 mỗi nhóm.
χ² = (12.600 − 12.200)² / 12.200 + (11.800 − 12.200)² / 12.200
= 160.000/12.200 + 160.000/12.200
≈ 26,2Ngưỡng 3,84 ở mức 0,05. 26,2 vượt xa ngưỡng, nên phân bổ sai có ý nghĩa thống kê.
Kết luận: không đọc kết quả chuyển đổi cho tới khi tìm ra nguyên nhân. Kiểm tra log gán nhóm, sự kiện phơi nhiễm, bot, và việc một số người dùng bị tính hai lần. Sau khi sửa, chạy lại thử nghiệm.
Câu 9 — Dữ liệu, thay đổi nội bộ, phân khúc
- Dữ liệu và tracking: sự kiện mở app có còn ghi đúng, pipeline có trễ, định nghĩa DAU có đổi. Rất nhiều "DAU giảm" là sự kiện bị đổi tên hoặc SDK lỗi.
- Thay đổi nội bộ: bản phát hành mới, thử nghiệm đang chạy, thay đổi giá, chiến dịch marketing kết thúc.
- Phân khúc: theo nền tảng, thành phố, người mới và người cũ. Nếu chỉ một phân khúc giảm, phạm vi điều tra thu hẹp rất nhanh.
Sau ba bước đó mới đưa giả thuyết bên ngoài: mùa vụ, đối thủ, thời tiết, sự cố hạ tầng.
Câu 10 — STAR có số và bài học
Một câu trả lời đạt yêu cầu:
S: "Năm ngoái tôi phân tích hiệu quả một chiến dịch khuyến mãi và kết luận nên mở rộng, nhưng doanh thu tháng sau không tăng."
T: "Tôi chịu trách nhiệm đo hiệu quả và đề xuất ngân sách cho tháng tiếp theo."
A: "Tôi đã so sánh người dùng có và không có mã giảm giá, nhưng không chia ngẫu nhiên — nhóm dùng mã vốn là người mua thường xuyên. Khi phát hiện, tôi tách theo mức chi tiêu trước đó và thấy nhóm chi thấp mới thực sự tăng. Tôi đề xuất gửi mã cho nhóm đó và đo bằng A/B test thay vì so sánh quan sát."
R: "Chi phí khuyến mãi giảm 30% trong khi số đơn từ nhóm mục tiêu tăng 8%. Bài học: so sánh quan sát không chứng minh nhân quả; phải chia nhóm ngẫu nhiên hoặc kiểm soát biến gây nhiễu."
Điểm quan trọng: nói rõ sai ở đâu, sửa thế nào, kết quả bằng số, và bài học áp dụng được lần sau.
Cách chấm điểm
| Số câu đúng | Mức | Gợi ý |
|---|---|---|
| 9–10 | Vững | Luyện thêm case study theo ngành bạn ứng tuyển |
| 7–8 | Khá | Xem lại bài 2 và 5 |
| 5–6 | Trung bình | Đọc lại bài 1, 2, 5 |
| Dưới 5 | Cần ôn | Làm lại từ bài 1, luyện nói thành tiếng |
Bản đồ câu hỏi → bài học
| Câu | Bài |
|---|---|
| 1, 2 | Bài 1: Bài toán top-N |
| 3, 4 | Bài 2: Bài toán retention |
| 5, 6 | Bài 4: Phân tích funnel |
| 7, 8 | Bài 5: Thiết kế A/B test |
| 9 | Bài 3: Case study sản phẩm |
| 10 | Bài 7: Giao tiếp và câu hỏi hành vi |
Bài tập mở rộng
- Viết SQL top 3 shipper mỗi quận, xử lý đồng hạng và ghi rõ giả định thời gian.
- Dựng bảng retention 3 tháng cho cohort tháng 1.
- Viết truy vấn funnel có kiểm tra thứ tự sự kiện.
- Tính lại cỡ mẫu nếu MDE là +2 điểm phần trăm.
- Ghi âm câu trả lời STAR của bạn và nghe lại, đếm số liệu đã nêu.
Tóm tắt
- Top-N cần
PARTITION BYvà quyết định rõ cách xử lý đồng hạng. - Retention cần mẫu số là cohort ban đầu và loại cohort chưa đủ tháng.
- Funnel báo cả tỷ lệ theo bước và tỷ lệ tổng; kiểm tra tracking trước.
- A/B test phải tính cỡ mẫu trước, không dừng sớm, kiểm tra SRM.
- Câu hỏi hành vi dùng STAR, có số, có bài học.
Dùng ← → để chuyển bài