🎯 MỤC TIÊU
Về kiến thức (Knowledge):
- Định nghĩa được "data quality" và 4 nhóm lỗi phổ biến (missing, outliers, duplicates, inconsistencies)
- Phân biệt được 3 loại missing data: MCAR, MAR, MNAR và ý nghĩa lâm sàng của mỗi loại
- Mô tả được quy trình data cleaning chuẩn 5 bước
- Hiểu được nguyên tắc "Never modify raw data" và tại sao audit trail quan trọng
Về kỹ năng (Skills): 5. Sử dụng được AI (ChatGPT/Claude) để sinh code Python kiểm tra chất lượng dữ liệu 6. Phát hiện được outliers và quyết định: giữ, sửa, hay loại bỏ 7. Áp dụng được các phương pháp imputation phù hợp với từng tình huống 8. Tạo được cleaning log đầy đủ để bảo vệ tính minh bạch của nghiên cứu
Về thái độ (Attitude): 9. Cẩn trọng với mọi thay đổi dữ liệu — coi data như "bằng chứng pháp y" 10. Trung thực ghi lại mọi quyết định cleaning (không che giấu để "kết quả đẹp")
📚 PHẦN 1: TẠI SAO DATA CLEANING QUAN TRỌNG ĐẾN VẬY?
1.1. Một câu chuyện cảnh tỉnh
Tình huống có thật: Một nhóm nghiên cứu tại một BV tuyến tỉnh tại Việt Nam thu thập dữ liệu 500 bệnh nhân đái tháo đường, làm phân tích thống kê và viết bài báo. Khi gửi đi tạp chí quốc tế, reviewer phát hiện trong dataset có 12 bệnh nhân tuổi >120, 3 bệnh nhân BMI = 5, và HbA1c = 250% ở 5 trường hợp. Kết quả: bài báo bị reject thẳng với comment: "Data quality is unacceptable for publication."
Sai lầm ở đâu? Nhóm nghiên cứu đã không làm data cleaning trước khi phân tích. Dữ liệu nhập sai từ giấy → Excel mà không kiểm tra. Khi phần mềm thống kê chạy, nó "không phàn nàn gì" — nhưng kết quả thì hoàn toàn sai.
Đây là bài học đắt giá: Phần mềm thống kê không phân biệt được dữ liệu đúng và dữ liệu sai. Chỉ con người (và AI có hướng dẫn) mới làm được.
1.2. Nguyên tắc vàng "Garbage In, Garbage Out"
┌─────────────────────────────────────────────────────────┐
│ │
│ DỮ LIỆU XẤU → PHÂN TÍCH ĐÚNG → KẾT QUẢ SAI │
│ │
│ DỮ LIỆU TỐT → PHÂN TÍCH SAI → KẾT QUẢ SAI │
│ │
│ DỮ LIỆU TỐT → PHÂN TÍCH ĐÚNG → KẾT QUẢ ĐÚNG ✅ │
│ │
└─────────────────────────────────────────────────────────┘
Tỷ lệ thời gian thực tế trong một nghiên cứu:
| Hoạt động | % thời gian (truyền thống) | % thời gian (có AI hỗ trợ) |
|---|---|---|
| Thiết kế nghiên cứu | 15% | 15% |
| Thu thập dữ liệu | 25% | 25% |
| Data cleaning | 40-50% ⚠️ | 15-25% ✅ |
| Phân tích | 10-15% | 15-20% |
| Viết bài | 10-15% | 15-25% |
💡 Đây là lý do AI rất giá trị ở khâu này — tiết kiệm 50-70% thời gian mà vẫn đảm bảo chất lượng.
1.3. 4 nhóm lỗi phổ biến nhất
┌──────────────────────────────────────────────────────────┐
│ 1. MISSING DATA (Dữ liệu thiếu) │
│ Ô trống, "NA", "999", "." │
│ │
│ 2. OUTLIERS (Giá trị bất thường) │
│ Tuổi=150, BMI=85, HbA1c=18% │
│ │
│ 3. DUPLICATES (Trùng lặp) │
│ Cùng 1 bệnh nhân nhập 2 lần với ID khác nhau │
│ │
│ 4. INCONSISTENCIES (Mâu thuẫn nội tại) │
│ Giới = "Nữ" nhưng có chẩn đoán "Ung thư tuyến tiền │
│ liệt"; Cân nặng tháng 1 = 70kg, tháng 2 = 700kg │
└──────────────────────────────────────────────────────────┘
✅ CHECKPOINT 1: Tự kiểm tra kiến thức
Đọc dòng dữ liệu sau và xác định bao nhiêu lỗi bạn nhìn thấy:
| ID | Tuổi | Giới | Chiều cao (cm) | Cân nặng (kg) | BMI | Chẩn đoán |
|---|---|---|---|---|---|---|
| 042 | 145 | Nam | 170 | NA | 999 | Mang thai |
Bạn tìm được mấy lỗi? Loại lỗi gì?
Đáp án ở cuối bài.
🔬 PHẦN 2: HIỂU SÂU VỀ MISSING DATA — KHÔNG ĐƠN GIẢN NHƯ BẠN NGHĨ
2.1. Tại sao phải phân loại missing data?
Nhiều người nghĩ: "Thiếu dữ liệu thì xóa hàng đó đi, hoặc điền giá trị trung bình."
Đây là sai lầm nghiêm trọng.
Cách xử lý missing phụ thuộc hoàn toàn vào NGUYÊN NHÂN thiếu. Có 3 loại missing data, mỗi loại có cách xử lý khác nhau:
2.2. Ba loại missing data
1️⃣ MCAR — Missing Completely At Random (Thiếu hoàn toàn ngẫu nhiên)
Việc thiếu dữ liệu không liên quan đến bất kỳ biến nào trong nghiên cứu — kể cả biến bị thiếu lẫn các biến khác.
Ví dụ thực tế:
- Máy đo HbA1c bị hỏng 1 ngày → tất cả bệnh nhân đến hôm đó không có kết quả → việc thiếu là ngẫu nhiên
- Nhân viên y tế làm rơi 5 phiếu điều tra trên đường về văn phòng
Đặc điểm: ✅ Tốt nhất — ít gây bias
Cách xử lý: Hầu như cách nào cũng được (case deletion, mean imputation, multiple imputation). Nhưng nếu mất nhiều, vẫn nên dùng multiple imputation.
2️⃣ MAR — Missing At Random (Thiếu ngẫu nhiên có điều kiện)
Việc thiếu liên quan đến các biến KHÁC đã quan sát được, nhưng không liên quan đến chính giá trị bị thiếu.
Ví dụ thực tế:
- Phụ nữ trong nghiên cứu thường ngại trả lời câu hỏi về cân nặng → việc thiếu cân nặng liên quan đến giới tính (biến đã biết), không liên quan đến giá trị cân nặng thực
- Bệnh nhân lớn tuổi thường thiếu kết quả MRI hơn (do khó nằm yên) → liên quan đến tuổi (đã biết)
Đặc điểm: ⚠️ Trung bình — có thể xử lý được nếu dùng phương pháp phù hợp
Cách xử lý: Multiple Imputation là vàng tiêu chuẩn. KHÔNG nên dùng case deletion vì sẽ bias.
3️⃣ MNAR — Missing Not At Random (Thiếu không ngẫu nhiên)
Việc thiếu liên quan đến CHÍNH giá trị bị thiếu — đây là dạng nguy hiểm nhất.
Ví dụ thực tế (rất phổ biến!):
- Bệnh nhân trầm cảm nặng không đến tái khám → thiếu PHQ-9 ở những người trầm cảm nhất
- Bệnh nhân uống nhiều rượu không khai báo lượng rượu thực sự (ghi 0 thay vì 50ml/ngày)
- Bệnh nhân không tuân thủ thuốc không đến tái khám → mất dữ liệu HbA1c của những người HbA1c cao
Đặc điểm: ❌ Tệ nhất — gây bias hệ thống, khó sửa
Cách xử lý: Phức tạp — cần sensitivity analysis với nhiều giả định khác nhau. Phải báo cáo rõ ràng trong bài báo.
2.3. Bảng so sánh nhanh
| Loại | Nguyên nhân | Mức độ bias | Phương pháp xử lý |
|---|---|---|---|
| MCAR | Hoàn toàn ngẫu nhiên | Thấp | Case deletion OK; tốt hơn: multiple imputation |
| MAR | Phụ thuộc biến khác đã biết | Trung bình | Multiple imputation (bắt buộc) |
| MNAR | Phụ thuộc chính giá trị thiếu | Cao | Sensitivity analysis + báo cáo |
💡 Mẹo nhận biết: Hầu hết missing data trong y khoa là MAR hoặc MNAR, không phải MCAR. Đừng giả định là MCAR chỉ vì "trông có vẻ ngẫu nhiên".
2.4. Ngưỡng missing data nào là "chấp nhận được"?
Đây là câu hỏi rất nhiều học viên hỏi. Quy tắc ngón tay cái:
┌────────────────────────────────────────────────────┐
│ < 5% missing → Hầu hết phương pháp đều OK │
│ 5-15% missing → Cần multiple imputation │
│ 15-30% missing → Phải báo cáo và phân tích nhạy │
│ > 30% missing → Cân nhắc loại biến khỏi NC │
└────────────────────────────────────────────────────┘
⚠️ Lưu ý: Đây là quy tắc tham khảo, không phải luật cứng. Nếu biến đó là outcome chính thì phải xử lý cẩn thận hơn nhiều.
✅ CHECKPOINT 2: Phân loại Missing Data
Trong nghiên cứu của bạn về stress ở điều dưỡng ICU, bạn phát hiện:
Tình huống A: 5% phiếu thiếu thông tin do nhân viên thu thập làm hỏng máy quét
Tình huống B: Điều dưỡng nam thường bỏ trống câu hỏi "Bạn có khóc trong tuần qua không?"
Tình huống C: Những điều dưỡng có điểm stress cao nhất thường không quay lại tham gia đo lần 2
Loại missing nào (MCAR/MAR/MNAR) cho mỗi tình huống?
Đáp án ở cuối bài.
🎯 PHẦN 3: OUTLIERS — KẺ "ĐẶC BIỆT" HAY KẺ "SAI"?
3.1. Outlier là gì?
Outlier (giá trị ngoại lai): là giá trị khác xa so với phần còn lại của dữ liệu.
Nhưng "khác xa bao nhiêu là outlier"? Có 3 cách định nghĩa phổ biến:
Cách 1: Quy tắc 3-Sigma (3 độ lệch chuẩn)
- Outlier = giá trị nằm ngoài khoảng [Mean - 3SD, Mean + 3SD]
- Phù hợp: dữ liệu phân phối chuẩn
Cách 2: Quy tắc IQR (Interquartile Range)
- Outlier = giá trị < Q1 - 1.5×IQR hoặc > Q3 + 1.5×IQR
- Phù hợp: dữ liệu không phân phối chuẩn (mạnh mẽ hơn 3-sigma)
Cách 3: Quy tắc Y học (Clinical knowledge)
- Outlier = giá trị không khả thi về mặt sinh học
- Ví dụ: Tuổi >120, HbA1c >20%, Nhiệt độ cơ thể <30°C
💡 Quan trọng: Trong y học, Cách 3 (kiến thức lâm sàng) là quan trọng nhất. Một giá trị đúng về thống kê (không phải outlier) vẫn có thể sai về lâm sàng, và ngược lại.
3.2. Bảng giá trị "khả thi sinh học" cho các biến phổ biến
Đây là bảng tham khảo bạn nên có sẵn:
| Biến | Giá trị khả thi tối thiểu | Giá trị khả thi tối đa | Lưu ý |
|---|---|---|---|
| Tuổi | 0 | 122 | Người sống lâu nhất ghi nhận = 122 |
| Cân nặng người lớn (kg) | 25 | 300 | Ngoài khoảng → sai |
| Chiều cao người lớn (cm) | 100 | 230 | |
| BMI | 10 | 90 | BMI<10 hoặc >90 → sai hoặc cực kỳ hiếm |
| Nhịp tim (bpm) | 30 | 250 | Nhịp xoang bình thường 60-100 |
| HA tâm thu (mmHg) | 50 | 280 | |
| HA tâm trương (mmHg) | 30 | 180 | |
| Nhiệt độ cơ thể (°C) | 32 | 43 | Ngoài khoảng → sống không nổi |
| Glucose máu (mg/dL) | 20 | 800 | |
| HbA1c (%) | 3 | 18 | >18% cực kỳ hiếm |
| Hemoglobin (g/dL) | 3 | 22 |
3.3. Quy trình xử lý outlier — không phải "thấy là xóa"
Đây là sai lầm phổ biến: thấy outlier là xóa ngay. Đúng quy trình phải như sau:
┌─────────────────────────────────────────┐
│ BƯỚC 1: Phát hiện outlier │
│ (Bằng AI/code hoặc visualization) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ BƯỚC 2: Hỏi: "CÓ KHẢ THI sinh học?" │
└─────────────────────────────────────────┘
↓ ↓
KHÔNG khả thi CÓ khả thi
↓ ↓
┌──────────────┐ ┌──────────────────┐
│ Đây là LỖI │ │ Đây có thể là │
│ Quay lại file │ │ giá trị THỰC │
│ gốc kiểm tra │ │ │
└──────────────┘ └──────────────────┘
↓ ↓
┌──────────────┐ ┌──────────────────┐
│ Sửa được? │ │ Chạy phân tích │
│ → Sửa │ │ với và không có │
│ Không sửa? │ │ giá trị này │
│ → Loại │ │ (sensitivity) │
└──────────────┘ └──────────────────┘
3.4. Ví dụ ra quyết định thực tế
Trong dataset 200 bệnh nhân ĐTĐ, AI phát hiện 4 outliers:
| Bệnh nhân | Biến | Giá trị | Quyết định | Lý do |
|---|---|---|---|---|
| BN #042 | Tuổi | 150 | ❌ Loại (hoặc sửa nếu có file gốc) | Không khả thi sinh học. Có thể là 15 hoặc 50 nhập sai. |
| BN #087 | BMI | 85 | ✅ Giữ (kèm chú thích) | Khả thi với béo phì độ III rất nặng. Cần verify lại. |
| BN #112 | HbA1c | 18% | ✅ Giữ (kèm sensitivity analysis) | Khả thi nhưng cực hiếm. Phân tích có và không có. |
| BN #156 | Cân nặng | 700 kg | ❌ Loại | Không khả thi. Có thể là 70.0 nhập sai thành 700. |
💡 Quy tắc vàng: Mọi quyết định outlier phải được ghi vào cleaning log với lý do cụ thể.
✅ CHECKPOINT 3
Trong dataset của bạn về tăng huyết áp, AI báo các giá trị sau là outliers:
- HA tâm thu = 220 mmHg ở bệnh nhân 75 tuổi
- HA tâm thu = 80 mmHg ở bệnh nhân 60 tuổi
- HA tâm thu = 320 mmHg ở bệnh nhân 50 tuổi
- Tuổi = 0 ở bệnh nhân điều trị ngoại trú
Bạn quyết định gì với mỗi giá trị: Giữ / Sửa / Loại?
Đáp án ở cuối bài.
🤖 PHẦN 4: SỬ DỤNG AI ĐỂ TỰ ĐỘNG HÓA DATA CLEANING
4.1. Tại sao AI cực mạnh ở khâu này?
Đây là một trong những khâu mà AI mang lại lợi ích rõ rệt nhất. Lý do:
| Tác vụ | Thủ công (Excel) | Có AI hỗ trợ |
|---|---|---|
| Kiểm tra missing data | 30 phút | 30 giây |
| Phát hiện outliers | 1-2 giờ | 1 phút |
| Tạo summary statistics | 30 phút | 10 giây |
| Phát hiện duplicates | 20 phút | 10 giây |
| Tạo data quality report | 2-3 giờ | 2-3 phút |
| TỔNG | 5-7 giờ | <10 phút |
💡 AI không thay bạn quyết định — AI giúp bạn phát hiện vấn đề. Quyết định "giữ/sửa/loại" vẫn là của bạn.
4.2. Quy trình 5 bước với AI
BƯỚC 1: Mô tả dataset cho AI (variables, types, range expected)
↓
BƯỚC 2: Yêu cầu AI viết code Python kiểm tra quality
↓
BƯỚC 3: Chạy code, đọc báo cáo
↓
BƯỚC 4: Quyết định cleaning cho từng vấn đề
↓
BƯỚC 5: Ghi vào cleaning log + lưu phiên bản mới (KHÔNG ghi đè raw data)
4.3. Prompt mẫu chuẩn (sao chép dùng được ngay)
Prompt 1: Data Quality Assessment toàn diện
Tôi có một dataset y khoa và cần kiểm tra chất lượng dữ liệu trước khi
phân tích. Hãy giúp tôi viết Python code đầy đủ.
Mô tả dataset:
- File: diabetes_data.xlsx
- Số records: 200 bệnh nhân đái tháo đường
- Variables:
+ ID (text, unique)
+ Age (số nguyên, kỳ vọng 18-90)
+ Gender (text, "Nam"/"Nữ")
+ BMI (số thực, kỳ vọng 15-50)
+ HbA1c (số thực, kỳ vọng 4-15%)
+ SBP (số nguyên, kỳ vọng 80-200 mmHg)
+ DBP (số nguyên, kỳ vọng 50-120 mmHg)
+ Duration_DM (số nguyên, kỳ vọng 0-50 năm)
+ Treatment (text, các giá trị: "Diet", "Oral", "Insulin", "Both")
Hãy viết Python code để:
1. Đọc file Excel với pandas
2. In thông tin tổng quan: số dòng, số cột, kiểu dữ liệu mỗi cột
3. Báo cáo missing data (% và số lượng) cho từng biến
4. Summary statistics (mean, SD, median, min, max, Q1, Q3) cho biến số
5. Bảng tần suất cho biến phân loại
6. Phát hiện outliers (cả 3-sigma và IQR method)
7. Kiểm tra giá trị nằm ngoài khoảng kỳ vọng
8. Phát hiện duplicates dựa trên ID
9. Kiểm tra inconsistency (ví dụ: Gender="Nữ" nhưng treatment cụ thể của nam)
10. Tạo report tổng kết dạng bảng dễ đọc
Yêu cầu: Comments bằng tiếng Việt, code dùng được trên Google Colab.
Prompt 2: Visualize missing data pattern
Tôi đã phát hiện missing data trong dataset. Hãy viết Python code để
visualize pattern của missing data, giúp tôi xác định MCAR/MAR/MNAR.
Yêu cầu:
1. Heatmap matrix cho missing data (dùng missingno hoặc seaborn)
2. Bar chart % missing cho từng biến
3. Matrix của correlations giữa các biến missing
(nếu missing biến X correlate với missing biến Y → có pattern)
4. Test Little's MCAR (nếu có thể)
Comments bằng tiếng Việt.
Prompt 3: Imputation phù hợp
Trong dataset của tôi:
- HbA1c bị thiếu 8% (có vẻ MAR - liên quan đến tuổi)
- Cân nặng bị thiếu 3% (có vẻ MCAR)
- Income bị thiếu 25% (có vẻ MNAR - người thu nhập cao không trả lời)
Hãy:
1. Đề xuất phương pháp imputation cho từng biến và giải thích lý do
2. Viết Python code thực hiện multiple imputation
(dùng sklearn IterativeImputer hoặc fancyimpute)
3. So sánh distribution trước và sau imputation (visualization)
4. Đưa ra cảnh báo nếu cách imputation có giả định không phù hợp
Code dùng pandas + scikit-learn, comments tiếng Việt.
Prompt 4: Tạo Cleaning Log tự động
Hãy viết Python code để tạo "cleaning log" — một file Excel tự động ghi
lại MỌI thay đổi tôi thực hiện trên dataset.
Mỗi entry phải có các cột:
- Timestamp (ngày giờ thay đổi)
- ID bệnh nhân
- Variable
- Old value
- New value
- Action (Imputed/Corrected/Removed/Flagged)
- Reason (lý do)
- Person responsible (mặc định là tên tôi)
Code phải có function dễ dùng như:
log_change(df, patient_id, variable, old_val, new_val, action, reason)
Comments tiếng Việt.
4.4. ⚠️ 4 cảnh báo khi dùng AI cho data cleaning
Cảnh báo 1: AI không biết bệnh viện của bạn
- AI không biết "ở khoa Nhi BV X, tuổi 0 là chuyện bình thường"
- → Bạn phải cung cấp context lâm sàng trong prompt
Cảnh báo 2: AI có thể "tự ý xóa" trong code
- Một số code AI viết sẽ tự động drop rows có missing
- → Luôn đọc kỹ code trước khi chạy. Hỏi: "code có thay đổi gì với raw data không?"
Cảnh báo 3: AI không hiểu domain knowledge tinh tế
- AI có thể đề xuất imputation giá trị "trung bình" cho các biến không nên dùng mean (như HbA1c ở bệnh nhân ĐTĐ — không phù hợp)
- → Đối chiếu với hiểu biết lâm sàng của bạn
Cảnh báo 4: AI tạo code có bug — luôn phải test
- Hãy test code trên một subset nhỏ (10 dòng) trước khi chạy trên toàn bộ dataset
- Verify kết quả với phương pháp thủ công
💡 Quy tắc vàng: "AI viết code, BẠN đọc và hiểu code, BẠN chạy và verify kết quả."
✅ CHECKPOINT 4
ChatGPT viết cho bạn đoạn code Python sau để xử lý missing data:
df = df.dropna() # Xóa tất cả rows có missing
df['HbA1c'].fillna(df['HbA1c'].mean(), inplace=True) # Điền mean
df.to_excel('data_cleaned.xlsx', index=False)
Bạn nhìn thấy 3 vấn đề với code này. Vấn đề gì?
Đáp án ở cuối bài.
📋 PHẦN 5: NGUYÊN TẮC VÀNG — TÍNH TOÀN VẸN CỦA DỮ LIỆU
5.1. Quy tắc số 1: NEVER MODIFY RAW DATA
Đây là nguyên tắc không thể thương lượng:
┌─────────────────────────────────────────────────┐
│ │
│ 📁 raw_data.xlsx ← KHÔNG BAO GIỜ SỬA │
│ ↓ │
│ 📁 data_v01_initial.xlsx ← Copy đầu tiên │
│ ↓ │
│ 📁 data_v02_outliers.xlsx ← Sau khi xử outlier │
│ ↓ │
│ 📁 data_v03_imputed.xlsx ← Sau khi imputation │
│ ↓ │
│ 📁 data_final.xlsx ← Phiên bản phân tích│
│ │
└─────────────────────────────────────────────────┘
Tại sao?
- Có thể quay lại nếu phát hiện sai sót
- Có thể trả lời câu hỏi reviewer: "Cleaning đã thay đổi kết quả như thế nào?"
- Đảm bảo tính minh bạch khoa học
5.2. Cleaning Log — "Nhật ký pháp y" của dataset
Mỗi thay đổi phải được ghi vào cleaning log:
| Date | ID | Variable | Old | New | Action | Reason | By |
|---|---|---|---|---|---|---|---|
| 2026-05-01 | BN042 | Age | 150 | NA | Removed | Không khả thi sinh học, không có file gốc | NV.A |
| 2026-05-01 | BN087 | BMI | 85 | 85 | Flagged | Verify với hồ sơ - đúng, giữ | NV.A |
| 2026-05-02 | BN112 | HbA1c | NA | 7.8 | Imputed | Multiple imputation, m=5 | NV.B |
| 2026-05-03 | BN156 | Weight | 700 | 70 | Corrected | Lỗi nhập, gốc=70kg (kiểm tra phiếu) | NV.A |
5.3. Tại sao Cleaning Log quan trọng?
Tình huống thực tế: Bài báo của bạn được accept. 6 tháng sau, một researcher khác liên hệ: "Tôi muốn lặp lại nghiên cứu của bạn. Bạn xử lý missing data thế nào?"
Nếu có cleaning log → trả lời được tự tin Nếu không có → mất uy tín khoa học
5.4. 5 bước data cleaning chuẩn
┌──────────────────────────────────────────────────┐
│ BƯỚC 1: Backup raw data + tạo data dictionary │
│ BƯỚC 2: Kiểm tra completeness (missing data) │
│ BƯỚC 3: Kiểm tra consistency (logic giữa các │
│ biến) │
│ BƯỚC 4: Kiểm tra validity (range, outliers) │
│ BƯỚC 5: Document mọi thay đổi trong cleaning log │
└──────────────────────────────────────────────────┘
💡 Lưu ý cho TRIPOD+AI / CONSORT: Các guideline này đều yêu cầu báo cáo cách bạn xử lý missing data và outliers trong bài báo. Không thể bỏ qua.
💻 PHẦN 6: THỰC HÀNH (70 phút)
6.1. Chuẩn bị (5 phút)
Trước khi bắt đầu:
- [ ] Tải file
diabetes_sample_dirty.xlsxtừ giảng viên (200 records, có lỗi cố ý) - [ ] Mở Google Colab (https://colab.research.google.com)
- [ ] Mở ChatGPT hoặc Claude
Mô tả dataset:
- 200 bệnh nhân đái tháo đường
- 9 biến: ID, Age, Gender, BMI, HbA1c, SBP, DBP, Duration_DM, Treatment
- Có lỗi cố ý: missing values, outliers, duplicates, inconsistencies
6.2. Thực hành 1: Data Quality Assessment với AI (20 phút)
Bước 1 (3 phút): Upload file diabetes_sample_dirty.xlsx lên Google Colab.
Bước 2 (5 phút): Sao chép Prompt 1 ở Phần 4.3 vào ChatGPT. Đợi AI sinh code.
Bước 3 (7 phút):
- Đọc kỹ code AI sinh ra (đừng chạy ngay!)
- Trả lời: Code có chỗ nào sẽ thay đổi raw data không?
- Copy code vào Colab và chạy
Bước 4 (5 phút): Phân tích báo cáo:
- Có bao nhiêu records bị duplicate?
- Biến nào có nhiều missing nhất?
- Có bao nhiêu giá trị nằm ngoài khoảng kỳ vọng?
- Bạn tìm thấy outliers nào trong các biến số?
📝 Ghi lại trên giấy: Lập danh sách 5-10 vấn đề lớn nhất bạn phát hiện.
6.3. Thực hành 2: Quyết định Outliers (15 phút)
Lấy danh sách outliers từ Thực hành 1. Với mỗi outlier, quyết định:
Bảng quyết định mẫu:
| ID | Biến | Giá trị | Khả thi sinh học? | Hành động | Lý do |
|---|---|---|---|---|---|
| BN___ | ___ | ___ | Có/Không | Giữ/Sửa/Loại |
Hướng dẫn cho từng nhóm giá trị:
✅ Khả thi và có thể đúng: GIỮ + chú thích
- Ví dụ: BMI = 42 ở bệnh nhân ĐTĐ → có thể đúng
⚠️ Khả thi nhưng nghi ngờ: GIỮ + sensitivity analysis
- Ví dụ: HbA1c = 16% → cực hiếm nhưng có thể xảy ra
❌ Không khả thi: SỬA hoặc LOẠI
- Ví dụ: Age = 200 → chắc chắn sai
💡 Mẹo: Nếu có file gốc (phiếu giấy), luôn kiểm tra lại trước khi sửa. Có thể chỉ là lỗi nhập (200 thực ra là 20).
6.4. Thực hành 3: Xử lý Missing Data (20 phút)
Bước 1 (5 phút): Yêu cầu AI phân loại missing data trong dataset của bạn:
Trong dataset của tôi, các biến có missing như sau:
- HbA1c: ___% missing
- BMI: ___% missing
- Duration_DM: ___% missing
Hãy giúp tôi:
1. Phân tích pattern missing - có thể là MCAR/MAR/MNAR?
2. Đề xuất phương pháp xử lý cho từng biến
3. Viết code Python thực hiện
Bước 2 (10 phút): Chạy code AI sinh ra. Quan sát:
- Trước imputation: distribution của HbA1c trông thế nào?
- Sau imputation: distribution có thay đổi không?
- AI đã chọn giá trị gì cho các missing?
Bước 3 (5 phút): Sensitivity check — chạy code so sánh:
- Phân tích chỉ với complete cases (case deletion)
- Phân tích với mean imputation
- Phân tích với multiple imputation
Kết quả có khác nhau nhiều không?
6.5. Thực hành 4: Cleaning Log + Báo cáo (10 phút)
Bước 1 (5 phút): Sao chép Prompt 4 ở Phần 4.3. Yêu cầu AI tạo template cleaning log Excel.
Bước 2 (5 phút): Điền cleaning log với mọi thay đổi bạn đã làm trong Thực hành 1, 2, 3:
Tối thiểu phải có:
- [ ] Mỗi outlier đã quyết định
- [ ] Mỗi missing đã imputed
- [ ] Mỗi duplicate đã xử lý
- [ ] Lý do cụ thể cho mỗi quyết định
📋 Sản phẩm cuối:
- File
data_cleaned.xlsx - File
cleaning_log.xlsx - File
data_quality_report.html(nếu AI sinh ra)
💡 Lưu cả 3 file — đây sẽ là bằng chứng minh bạch khi bạn công bố nghiên cứu.
📋 PHẦN 7: CHECKLIST KIẾN THỨC SAU BÀI HỌC
Kiến thức cốt lõi
- [ ] Hiểu khái niệm "Garbage In, Garbage Out"
- [ ] Phân biệt được 4 loại lỗi: missing, outliers, duplicates, inconsistencies
- [ ] Phân biệt được MCAR, MAR, MNAR và cách xử lý mỗi loại
- [ ] Biết các ngưỡng % missing và phương pháp tương ứng
- [ ] Hiểu nguyên tắc "Never modify raw data"
Kỹ năng thực hành
- [ ] Đã viết được prompt yêu cầu AI sinh code data quality assessment
- [ ] Đã chạy code và đọc được data quality report
- [ ] Đã phát hiện và quyết định ít nhất 5 outliers
- [ ] Đã thực hiện multiple imputation cho missing data
- [ ] Đã tạo cleaning log đầy đủ
Thái độ
- [ ] Coi data như "bằng chứng pháp y" — cẩn trọng với mọi thay đổi
- [ ] Sẵn sàng ghi lại mọi quyết định, kể cả những quyết định có vẻ nhỏ
- [ ] Không vội xóa outliers — luôn hỏi "tại sao có giá trị này?"
📖 PHẦN 8: CÂU HỎI THẢO LUẬN
Câu hỏi cá nhân:
- Trong nghiên cứu của bạn, biến nào có nguy cơ MNAR cao nhất? Bạn xử lý thế nào?
- Nếu phát hiện 30% missing ở outcome chính, bạn sẽ làm gì?
- Bạn có sẵn sàng công bố cleaning log cùng với bài báo không?
Câu hỏi nhóm:
- Tại các BV Việt Nam, lỗi data nào là phổ biến nhất? Tại sao? (Gợi ý: nhập tay, không có data validation, áp lực thời gian)
- Khi cleaner thấy kết quả "đẹp hơn" sau khi xóa một số outliers, đó là thuần khoa học hay là p-hacking? Làm sao tránh?
- Có nên dùng AI để tự động quyết định cleaning không, hay AI chỉ nên gợi ý?
Câu hỏi phản biện:
- Multiple imputation tạo ra giá trị giả — vậy có vi phạm nguyên tắc khoa học không?
- Nếu cleaning thay đổi kết luận nghiên cứu (từ "có ý nghĩa thống kê" thành "không"), bạn báo cáo sao?
- Khi reviewer yêu cầu cleaning log nhưng bạn không có, bạn xử lý thế nào?
📚 TÀI LIỆU THAM KHẢO BÀI 10
Sách giáo khoa
- Van Buuren, S. (2018). Flexible Imputation of Missing Data (2nd ed.). CRC Press. (Sách kinh điển về missing data)
- Little, R. J., & Rubin, D. B. (2019). Statistical Analysis with Missing Data (3rd ed.). Wiley.
- Đại học Y Hà Nội. (2020). Phương pháp Nghiên cứu Khoa học Y học. NXB Y học. (Chương: Quản lý dữ liệu)
Bài báo khoa học chính
- Van den Broeck, J., Cunningham, S. A., Eeckels, R., & Herbst, K. (2005). Data cleaning: detecting, diagnosing, and editing data abnormalities. PLoS Medicine, 2(10), e267. (Bài kinh điển)
- Sterne, J. A., et al. (2009). Multiple imputation for missing data in epidemiological and clinical research: potential and pitfalls. BMJ, 338, b2393.
- Jakobsen, J. C., et al. (2017). When and how should multiple imputation be used for handling missing data in randomised clinical trials. BMC Medical Research Methodology, 17(1), 162.
Hướng dẫn quốc tế
- CONSORT 2025 Statement — yêu cầu báo cáo missing data và cleaning
- TRIPOD+AI Statement (2024) — báo cáo data preprocessing với AI
- STROBE Statement — báo cáo missing data trong observational studies
Công cụ AI và phần mềm
- Python libraries:
- pandas: https://pandas.pydata.org
- missingno (visualization): https://github.com/ResidentMario/missingno
- scikit-learn IterativeImputer
- fancyimpute: https://github.com/iskandr/fancyimpute
- R packages:
- mice (Multiple Imputation by Chained Equations)
- VIM (Visualization and Imputation of Missing values)
- SPSS: Multiple Imputation module (built-in)
Khóa học online
- Coursera — "Data Science Methods for Quality Improvement" (Johns Hopkins)
- edX — "Statistical Analysis with Missing Data" (Harvard)
- YouTube — StatQuest: "Multiple Imputation explained" (free, easy to understand)
Bối cảnh Việt Nam
- Bộ Y tế Việt Nam. (2023). Hướng dẫn quản lý dữ liệu nghiên cứu khoa học y tế.
- Hội Y học Dự phòng Việt Nam — Tài liệu về Data Management
✅ ĐÁP ÁN CÁC CHECKPOINT
Checkpoint 1:
Có 5 lỗi:
- Tuổi = 145: Không khả thi sinh học (outlier không khả thi)
- Cân nặng = NA: Missing data
- BMI = 999: Đây là code thường dùng cho missing — phải kiểm tra với data dictionary; nếu dữ liệu thật thì không khả thi
- Inconsistency: Giới = "Nam" nhưng "Mang thai": Mâu thuẫn nội tại
- (Suy luận) BMI = 999 nhưng cân nặng = NA: Nếu thiếu cân nặng thì BMI cũng phải thiếu, không thể tính được → thêm 1 inconsistency
Checkpoint 2:
- Tình huống A: MCAR — máy hỏng là sự kiện ngẫu nhiên, không liên quan đến đặc điểm bệnh nhân
- Tình huống B: MAR — việc thiếu liên quan đến giới tính (biến đã quan sát được). Nam có xu hướng không trả lời, không liên quan đến giá trị thực của câu trả lời
- Tình huống C: MNAR — việc thiếu liên quan đến chính giá trị stress (những người stress cao bỏ nghiên cứu) → đây là dạng nguy hiểm nhất, có thể làm bias kết quả nghiêm trọng
Checkpoint 3:
- HA = 220 mmHg ở BN 75 tuổi: ✅ Giữ — khả thi (cấp cứu tăng huyết áp)
- HA = 80 mmHg ở BN 60 tuổi: ✅ Giữ — khả thi (có thể là hạ HA, sốc, hoặc tác dụng phụ thuốc), nhưng phải verify với hồ sơ
- HA = 320 mmHg: ❌ Sửa hoặc Loại — không khả thi sinh học (HA tâm thu > 300 mmHg cực hiếm và bệnh nhân thường tử vong). Có thể là 220 nhập sai
- Tuổi = 0: Tùy bối cảnh — nếu là khoa Nhi sơ sinh thì hợp lý; nếu là khoa Nội thì phải sửa/loại
Checkpoint 4:
3 vấn đề với code AI:
df = df.dropna()— XÓA TẤT CẢ rows có missing trước khi imputation. Nghĩa là dòng tiếp theofillna()sẽ không có gì để xử lý. Đây là logic sai nghiêm trọng.fillna(mean)không phù hợp — Mean imputation sẽ:- Làm giảm phương sai (variance) của biến
- Bias các phân tích thống kê
- Không phù hợp nếu missing là MAR/MNAR
- → Nên dùng multiple imputation thay vì mean
df.to_excel('data_cleaned.xlsx')ghi đè không kiểm soát — không có:- Cleaning log
- Phiên bản file (data_v01, v02, ...)
- Backup raw data
- Comment giải thích những gì đã làm
Code đúng phải:
- Giữ nguyên raw data
- Phân loại missing trước khi imputation
- Dùng phương pháp phù hợp với loại missing
- Tạo cleaning log
- Lưu phiên bản mới
🎓 KẾT LUẬN BÀI 10
Chúc mừng bạn đã hoàn thành Bài 10 — bài học về kỹ năng không hào nhoáng nhưng cực kỳ quan trọng. Hãy nhớ ba thông điệp cốt lõi:
💡 Thông điệp 1: "Garbage In, Garbage Out". Phân tích thống kê dù có xuất sắc đến đâu cũng không cứu được dataset bẩn. Hãy đầu tư thời gian cho data cleaning — nó quyết định 50% chất lượng nghiên cứu của bạn.
💡 Thông điệp 2: AI là trợ thủ tuyệt vời cho data cleaning — tiết kiệm 70-80% thời gian. Nhưng AI không thay bạn quyết định "giữ/sửa/loại". Domain knowledge lâm sàng của bạn vẫn là quan trọng nhất.
💡 Thông điệp 3: Tính minh bạch là vàng. Never modify raw data. Mỗi thay đổi phải được ghi vào cleaning log. Nếu một ngày reviewer hỏi "bạn xử lý missing thế nào?", bạn phải trả lời được tự tin.
Soạn giả: Đoàn Thái Hòa
Phiên bản: 1.0 (2026)
Liên hệ: thaihoadoanbrvt@gmail.com
Phản hồi: Mọi góp ý xin gửi về email
"In God we trust. All others must bring data."
— W. Edwards Deming("Tin Chúa thì được. Còn lại — phải có dữ liệu.")
- Đăng nhập để gửi ý kiến