DHDataHọc
TheoryLesson 7/85 min read+10 XP

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ĩaVí dụ
MCAR — thiếu hoàn toàn ngẫu nhiênViệ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ệnThiế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ênThiế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:

code
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áchDùng khiRủi ro
Giữ nguyên (kèm cờ)Cần phân tích chính xác phần có dữ liệuBáo cáo dễ bỏ qua phần thiếu
Bỏ dòngThiếu rất ít và MCARMấ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:

  1. Giữ nguyên nếu phép phân tích cho phép (hàm tổng hợp bỏ qua NULL).
  2. 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.
  3. 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.
code
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:

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

code
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

  1. Đếm tỷ lệ thiếu của ba cột theo segment.
  2. Phân loại một trường hợp thật vào MCAR/MAR/MNAR.
  3. Điền thu nhập bằng trung vị theo nhóm, kèm cờ.
  4. Lưu phần dòng bị loại vào bảng riêng.
  5. So sánh trung bình trước và sau khi điền.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Kết quả lệch có hệ thốngBỏ 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ạiKhông điền khóa
Không tái lập đượcKhông lưu dòng bị loạiBảng _excluded
Mất tín hiệu quan trọngBỏ cột thiếuDù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