Data LMS

← Tất cả các tuần · Phase 2: Mô tả · khoảng 270 phút

Tuần 5: Data quality, join và bẫy trung bình

Bản nháp, đang chờ duyệt nội dung

Sau tuần này bạn có thể:
Video tóm tắt Tuần 5 · Video · Tiếng Việt

Video sắp có.

Podcast Tuần 5 · Audio · Tiếng Việt

Audio tóm tắt tuần (NotebookLM) sắp có.

Tuần 4 dạy cách tóm tắt dữ liệu. Tuần này dạy cách không bị dữ liệu lừa: dữ liệu bẩn, join sai, và trung bình tính sai cách là ba nguồn gây ra con số sai phổ biến nhất trong báo cáo.

Bài 5.1. Năm chiều chất lượng dữ liệu [7]

Chiều Câu hỏi kiểm tra Ví dụ lỗi Check bằng pandas
Đủ (completeness) Có thiếu dòng, thiếu giá trị không? Cột Region bị trống df.isna().sum()
Đúng (validity/accuracy) Giá trị có hợp lệ không? Sales âm, Quantity = 0, ngày giao trước ngày đặt lọc điều kiện, describe()
Nhất quán (consistency) Cùng một thứ có được ghi giống nhau không? 1 Product ID có 2 tên; “HN” và “Hà Nội” groupby(...).nunique()
Kịp thời (timeliness) Dữ liệu có cập nhật đến kỳ cần không? Báo cáo tháng 6 nhưng dữ liệu chỉ đến 20/6 df["Order Date"].max()
Duy nhất (uniqueness) Có dòng trùng không? Một dòng bị nhập 2 lần df.duplicated().sum()

Thói quen: chạy bộ kiểm tra này mỗi khi nhận dữ liệu mới, trước khi tính bất cứ con số nào. Ghi lại lỗi tìm được và cách xử lý.

Bộ kiểm tra chất lượng cho Superstore

Bộ kiểm tra tìm ra 2 lỗi thật: 1 dòng trùng (Row ID 11) và 1 Product ID có 2 tên. Lỗi thứ hai sẽ gây ra fan-out ở bài tiếp theo.

Bài 5.2. Fan-out: lỗi nhân dòng khi join [7]

Bạn có bảng fact (mỗi dòng là một sản phẩm trong một đơn) và bảng dimension sản phẩm (mỗi mã một dòng). Merge hai bảng để lấy tên sản phẩm là việc làm hằng ngày.

Vấn đề: nếu bảng dimension có khóa bị trùng (một mã xuất hiện 2 dòng), mỗi dòng fact khớp với mã đó sẽ bị nhân đôi. Tổng Sales tăng lên mà không có lỗi nào được báo.

Ý chính bắt buộc: join với bảng có khóa trùng → nhân dòng → tổng bị phóng đại.

Hai cách chặn:

  1. assert len(sau) == len(truoc) ngay sau merge (với left join từ fact sang dimension).
  2. pd.merge(..., validate="many_to_one"): pandas báo lỗi ngay nếu bảng bên phải có khóa trùng.
Tự tạo và chặn fan-out

Trong thực tế, chọn tên nào cho mã bị trùng là quyết định nghiệp vụ (tên mới nhất, tên trong hệ thống gốc). Quan trọng là phát hiện được và ghi lại.

Bài 5.3. Weighted average và average of averages [7]

Hai cửa hàng:

Cửa hàng Doanh thu Lợi nhuận Margin
A 1.000 200 20%
B 100 0 0%

Margin của cả công ty là 18,2%. Con số 10% coi cửa hàng nhỏ B nặng ngang cửa hàng lớn A. Khi các nhóm có quy mô khác nhau, trung bình của các tỷ lệ không bằng tỷ lệ tổng.

Ý chính bắt buộc: trung bình của các tỷ lệ ≠ tỷ lệ tổng, khi các nhóm có quy mô khác nhau. Muốn tỷ lệ tổng: cộng tử số, cộng mẫu số, rồi mới chia.
Profit margin theo Region: 2 cách

Cách 2 là margin thật của mỗi vùng. Cách 1 thấp hơn vì các dòng nhỏ (giá trị thấp, chiết khấu sâu, margin âm) được tính nặng ngang các dòng lớn.

Bài 5.4. Simpson’s paradox [7]

Simpson’s paradox: một xu hướng đúng trong từng nhóm lại đảo ngược khi gộp các nhóm lại.

Ví dụ nổi tiếng là tuyển sinh sau đại học UC Berkeley năm 1973. Tính chung, tỷ lệ đỗ của nam là 44,5%, của nữ là 30,4%. Nhìn vào thì có vẻ trường phân biệt giới tính. Nhưng khi tách theo khoa, ở phần lớn các khoa tỷ lệ đỗ của nữ bằng hoặc cao hơn nam.

Lý do là mix: nữ nộp đơn nhiều hơn vào các khoa khó đỗ (tỷ lệ đỗ chung thấp), còn nam nộp nhiều vào các khoa dễ đỗ. Tỷ lệ chung của nữ bị kéo xuống bởi chỗ họ nộp đơn, không phải bởi việc họ bị chấm khắt hơn.

Ý chính bắt buộc: xu hướng trong từng nhóm đảo ngược khi gộp, do tỷ trọng (mix) giữa các nhóm khác nhau.

Trong business: “giá trung bình mỗi đơn giảm” có thể chỉ vì tỷ trọng khách mua hàng rẻ tăng, trong khi giá ở mọi phân khúc đều tăng. Trước khi kết luận từ một con số gộp, hãy tách theo nhóm chính.

Câu hỏi nhanh
1. Merge bảng đơn hàng (5.000 dòng) với bảng khách hàng, kết quả có 5.240 dòng. Khả năng cao nhất là gì?
2. 3 chi nhánh có tỷ lệ chuyển đổi 10%, 20%, 30%. Tỷ lệ chuyển đổi toàn công ty là bao nhiêu?
3. Giá trị trung bình mỗi đơn giảm 5%, nhưng ở cả 3 phân khúc khách hàng đều tăng. Điều gì đã xảy ra?
Tái hiện UC Berkeley 1973

Thêm một bước: tính tỷ lệ đỗ chung của từng khoa và tỷ trọng đơn của nữ vào từng khoa. Bạn sẽ thấy hơn 90% đơn của nữ nộp vào C, D, E, F, nơi tỷ lệ đỗ chung chỉ 6–35%, trong khi một nửa đơn của nam nộp vào A, B (tỷ lệ đỗ trên 60%).

Bài 5.5. Missing values: hỏi “vì sao thiếu?” trước [6]

Có ba kiểu thiếu, và cách xử lý phụ thuộc vào kiểu:

Kiểu thiếu Ý nghĩa Ví dụ Xoá (dropna) có sao không?
Ngẫu nhiên hoàn toàn Thiếu không liên quan đến gì cả Lỗi đường truyền mất vài dòng Ít ảnh hưởng, chỉ mất cỡ mẫu
Ngẫu nhiên theo biến khác Thiếu liên quan đến một biến đã quan sát Khách online hay bỏ trống số điện thoại Lệch nếu không tách theo biến đó
Không ngẫu nhiên Thiếu liên quan đến chính giá trị bị thiếu Người thu nhập cao không khai thu nhập Lệch nặng: mẫu còn lại không đại diện

Hai câu hỏi bắt buộc trước khi xử lý: vì sao thiếu? Xoá đi thì mẫu còn đại diện không? Ghi câu trả lời ra trước, rồi mới viết code.

Các cách xử lý thường gặp: xoá dòng (dropna), điền giá trị (fillna bằng median, bằng giá trị theo nhóm, hoặc bằng 0 khi thiếu nghĩa là “không có”), hoặc giữ nguyên và báo cáo riêng nhóm thiếu.

Mô phỏng: khi thiếu không ngẫu nhiên

Thực hành: pipeline có đối soát [7]

Mỗi bước biến đổi (lọc, xoá trùng, merge, groupby, pivot) đều có thể làm mất hoặc nhân dòng. Đối soát tổng sau từng bước là cách rẻ nhất để bắt lỗi. Nếu tổng thay đổi, bạn phải giải thích được vì sao.

Đọc → làm sạch → tổng hợp → pivot

Luyện tập tình huống

Tình huống: UC Berkeley 1973

Bối cảnh. Năm 1973, tỷ lệ đỗ sau đại học của UC Berkeley: nam 44,5% (1.198/2.691), nữ 30,4% (557/1.835). Một tờ báo viết: 'Berkeley phân biệt đối xử với nữ'. Bạn đã có số liệu theo 6 khoa ở ô code phía trên.

Câu hỏi. Tổng thể cho thấy gì? Theo từng khoa cho thấy gì? Vì sao hai cách nhìn lại ngược nhau, và kết luận của tờ báo có đúng không?

Câu trả lời đã nộp sẽ được khoá lại, không sửa được.

Tình huống: dropna trong khảo sát thu nhập

Bối cảnh. Khảo sát 2.000 nhân viên về thu nhập. 30% người bỏ trống câu hỏi thu nhập. Analyst dùng dropna rồi tính thu nhập trung bình của 1.400 người còn lại, báo cáo đây là thu nhập trung bình của toàn công ty.

Câu hỏi. Cách làm này có vấn đề gì? Bạn sẽ làm gì khác?

Câu trả lời đã nộp sẽ được khoá lại, không sửa được.

Tóm tắt tuần