Dữ liệu thiếu
Bạn sẽ học được
- Ba cơ chế thiếu dữ liệu: MCAR, MAR, MNAR.
- Ảnh hưởng của mỗi cơ chế lên kết luận.
- Khi nào bỏ dòng, khi nào điền, khi nào giữ nguyên.
- Điền giá trị đúng cách và gắn cờ.
- Dùng chính sự thiếu làm tín hiệu phân tích.
Khái niệm cốt lõi
Dữ liệu thiếu không phải một hiện tượng, mà ba hiện tượng khác nhau:
| Cơ chế | Nghĩa | Ví dụ |
|---|---|---|
| MCAR — thiếu hoàn toàn ngẫu nhiên | Việc thiếu không liên quan đến giá trị | Lỗi hệ thống ngẫu nhiên làm mất 1% dòng |
| MAR — thiếu ngẫu nhiên có điều kiện | Thiếu liên quan đến biến khác, không liên quan chính nó | Người trẻ ít điền thu nhập hơn |
| MNAR — thiếu không ngẫu nhiên | Thiếu liên quan chính giá trị đó | Người thu nhập rất cao không muốn khai |
Chỉ MCAR thì bỏ dòng mới an toàn. Với MAR và MNAR, bỏ dòng có thể làm lệch kết luận có hệ thống.
Đo và nhìn sự thiếu
Đếm theo từng cột và theo nhóm:
SELECT
segment,
COUNT(*) AS tong,
COUNT(phone) AS co_phone,
ROUND(100.0 * COUNT(phone) / COUNT(*), 1) AS ty_le_co_phone
FROM customers
GROUP BY segment
ORDER BY 3;Nếu tỷ lệ thiếu khác nhau rõ giữa các nhóm, đó là dấu hiệu MAR hoặc MNAR, không phải MCAR.
Vẽ "bản đồ thiếu" theo thời gian cũng hữu ích: nếu một cột bắt đầu thiếu từ một ngày, nguyên nhân thường là thay đổi hệ thống chứ không phải hành vi người dùng.
Ba lựa chọn xử lý
| Cách | Dùng khi | Rủi ro |
|---|---|---|
| Giữ nguyên (kèm cờ) | Cần phân tích chính xác phần có dữ liệu | Báo cáo dễ bỏ qua phần thiếu |
| Bỏ dòng | Thiếu rất ít và MCAR | Mất mẫu, lệch nếu không MCAR |
| Điền giá trị | Cần đủ dòng cho mô hình/hiển thị | Tạo giá trị giả, giảm phương sai |
Thứ tự ưu tiên thực dụng:
- Giữ nguyên nếu phép phân tích cho phép (hàm tổng hợp bỏ qua NULL).
- Nếu buộc phải có giá trị, điền kèm cờ để phân biệt giá trị thật và giá trị điền.
- Chỉ bỏ dòng khi thiếu dưới một ngưỡng nhỏ và đã kiểm tra MCAR.
Điền giá trị
Các cách phổ biến, từ đơn giản đến phức tạp:
- Hằng số có nghĩa:
COALESCE(phone, 'chưa có')— chỉ dùng cho hiển thị. - Trung vị theo nhóm: điền thu nhập thiếu bằng trung vị của nhóm tuổi tương ứng.
- Giá trị gần nhất theo thời gian: phù hợp với dữ liệu chuỗi thời gian.
- Mô hình dự đoán: dùng khi cần chính xác cao, phải kiểm chứng.
WITH trung_vi AS (
SELECT segment,
percentile_cont(0.5) WITHIN GROUP (ORDER BY income) AS tv
FROM customers
WHERE income IS NOT NULL
GROUP BY segment
)
SELECT
c.id,
COALESCE(c.income, t.tv) AS income,
(c.income IS NULL) AS income_was_missing
FROM customers c
LEFT JOIN trung_vi t USING (segment);Điểm quan trọng: luôn giữ cờ income_was_missing. Nếu không, mọi phân tích sau đó sẽ coi giá trị điền là thật và làm giảm phương sai một cách giả tạo.
Không điền cột khóa
Không bao giờ điền:
- Khóa chính, khóa ngoại.
- Cột dùng để join.
- Cột quyết định nhóm (giới tính, khu vực) nếu không có căn cứ.
Điền khóa tạo ra liên kết sai, tệ hơn nhiều so với để trống. Nhóm "không rõ" là một nhóm hợp lệ và nên được báo cáo riêng.
Bỏ dòng đúng cách
Nếu quyết định bỏ, ghi lại:
-- Đếm trước
SELECT COUNT(*) FROM customers WHERE email IS NULL;
-- Lưu phần bị loại để có thể kiểm tra lại
CREATE TABLE customers_excluded AS
SELECT *, 'thieu_email' AS ly_do, now() AS loai_luc
FROM customers
WHERE email IS NULL;Sau đó mới xoá hoặc lọc khi truy vấn. Lưu phần bị loại đảm bảo có thể trả lời "những dòng nào đã bị bỏ và vì sao".
Dùng sự thiếu làm tín hiệu
Trong nhiều bài toán, việc thiếu chính nó là thông tin:
- Người không điền số điện thoại ít quay lại hơn.
- Đơn thiếu mã giảm giá thường là đơn tự nhiên, không phải khuyến mãi.
- Khách thiếu địa chỉ có tỷ lệ giao thất bại cao hơn.
Cách dùng: tạo cột boolean is_missing_<col> và đưa vào phân tích như một đặc trưng. Đôi khi nó dự báo tốt hơn giá trị thật.
Kiểm tra ảnh hưởng
Trước và sau khi xử lý, so sánh các chỉ số chính:
SELECT
COUNT(*) AS n,
AVG(income) AS thu_nhap_tb,
percentile_cont(0.5) WITHIN GROUP (ORDER BY income) AS trung_vi
FROM customers;Nếu trung bình đổi mạnh sau khi điền hoặc bỏ, phương pháp xử lý đang bóp méo dữ liệu. Ghi lại con số trước/sau trong tài liệu.
Thực hành
- Đếm tỷ lệ thiếu của ba cột theo
segment. - Phân loại một trường hợp thật vào MCAR/MAR/MNAR.
- Điền thu nhập bằng trung vị theo nhóm, kèm cờ.
- Lưu phần dòng bị loại vào bảng riêng.
- So sánh trung bình trước và sau khi điền.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Kết quả lệch có hệ thống | Bỏ dòng khi MAR | Điền theo nhóm, giữ cờ |
| Phương sai giảm bất thường | Điền mà không cờ | Thêm cột _was_missing |
| Join sai sau khi điền | Điền khóa ngoại | Không điền khóa |
| Không tái lập được | Không lưu dòng bị loại | Bảng _excluded |
| Mất tín hiệu quan trọng | Bỏ cột thiếu | Dùng is_missing làm đặc trưng |
| Báo cáo đổi đột ngột | Đổi cách xử lý giữa kỳ | Ghi rõ phương pháp, thống nhất |
Tóm tắt
- Ba cơ chế: MCAR, MAR, MNAR — chỉ MCAR mới an toàn khi bỏ dòng.
- Ưu tiên giữ nguyên; điền thì phải kèm cờ.
- Không điền khóa hoặc cột join.
- Lưu phần dòng bị loại và lý do.
- Sự thiếu có thể là tín hiệu dự báo hữu ích.
Use ← → to move between lessons