Website CLBV.VN và các nền tảng trong hệ sinh thái QuanTriBenhVien.Vn được xây dựng bởi các thành viên có kinh nghiệm tại các bệnh viện, công ty. Web không có liên quan tới bất kỳ Vụ, Cục nào của BYT hay SYT --> chi tiết
Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập hoặc tài khoản đã hết hạn. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CLBV Members" các nội dung bạn quan tâm.

Kính gửi Anh/Chị/Em đồng nghiệp,

Trong thời gian qua, CLBV nhận được sự ủng hộ rất lớn từ cộng đồng. Website đã nằm trong nhóm đầu kết quả tìm kiếm với nhiều từ khóa liên quan đến Quản lý chất lượng (QLCL) và An toàn người bệnh (ATNB) trong lĩnh vực y tế.

Tuy nhiên, khi lượng truy cập ngày càng tăng, Công ty M.I.U nhận thấy một số vấn đề cần được điều chỉnh để đảm bảo phù hợp với đặc thù chuyên môn:

1. Nội dung QLCL & ATNB có tính chuyên ngành cao

  • Nhiều nội dung mang tính học tập từ sự cố, cải tiến sau sai sót.
  • Nếu tiếp cận ngoài bối cảnh chuyên môn, có thể bị hiểu chưa đầy đủ hoặc sai lệch.

2. Một số tài liệu quản trị cần được sử dụng đúng đối tượng

  • Dù là văn bản công khai, việc áp dụng hiệu quả đòi hỏi hiểu đúng bối cảnh ngành.
  • Phù hợp hơn khi chia sẻ trong cộng đồng những người trực tiếp làm công tác y tế.

3. Hạn chế nguy cơ nhầm lẫn về nhận diện

  • Tên miền clbv.vn có thể gây hiểu nhầm với các hệ thống chính thức của Bộ Y tế.
  • Việc làm rõ và chuẩn hóa nhận diện là cần thiết.

Công ty M.I.U quyết định nâng cấp hệ thống phục vụ đúng đối tượng chuyên môn

Để đảm bảo chất lượng nội dung và phục vụ tốt hơn cho cộng đồng, chúng tôi thực hiện các điều chỉnh:

  • Giới hạn truy cập nội dung: Website dành cho thành viên đã đăng ký, là các đồng nghiệp đang công tác trong lĩnh vực y tế.
  • Chuyển đổi nhận diện sang tên miền mới: QLCL.NET để đồng bộ thương hiệu với các trang trong hệ sinh thái QuanTriBenhVien.Vn như KHTH.VN; CNTT.IT; KSNK.VN; VTTB.VN; HCQT.VN ... hướng đến chia sẻ kiến thức quản trị hiện đại, liên ngành trong bệnh viện không chỉ giới hạn ở QLCL & ATNB.

Chúng tôi tin rằng đây là bước điều chỉnh cần thiết nhằm:

  • Bảo vệ giá trị chuyên môn của nội dung.
  • Đảm bảo thông tin được sử dụng đúng đối tượng, đúng bối cảnh.
  • Xây dựng cộng đồng chia sẻ chất lượng, hiệu quả.

Rất mong tiếp tục nhận được sự đồng hành của Anh/Chị/Em đồng nghiệp.

Công ty M.I.U

Bài 10: Quản lý và làm sạch dữ liệu

🎯 MỤC TIÊU

Về kiến thức (Knowledge):

  1. Định nghĩa được "data quality" và 4 nhóm lỗi phổ biến (missing, outliers, duplicates, inconsistencies)
  2. 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
  3. Mô tả được quy trình data cleaning chuẩn 5 bước
  4. 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ứu15%15%
Thu thập dữ liệu25%25%
Data cleaning40-50% ⚠️15-25%
Phân tích10-15%15-20%
Viết bài10-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:

IDTuổiGiớiChiều cao (cm)Cân nặng (kg)BMIChẩn đoán
042145Nam170NA999Mang 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ạiNguyên nhânMức độ biasPhương pháp xử lý
MCARHoàn toàn ngẫu nhiênThấpCase deletion OK; tốt hơn: multiple imputation
MARPhụ thuộc biến khác đã biếtTrung bìnhMultiple imputation (bắt buộc)
MNARPhụ thuộc chính giá trị thiếuCaoSensitivity 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ếnGiá trị khả thi tối thiểuGiá trị khả thi tối đaLưu ý
Tuổi0122Người sống lâu nhất ghi nhận = 122
Cân nặng người lớn (kg)25300Ngoài khoảng → sai
Chiều cao người lớn (cm)100230 
BMI1090BMI<10 hoặc >90 → sai hoặc cực kỳ hiếm
Nhịp tim (bpm)30250Nhịp xoang bình thường 60-100
HA tâm thu (mmHg)50280 
HA tâm trương (mmHg)30180 
Nhiệt độ cơ thể (°C)3243Ngoài khoảng → sống không nổi
Glucose máu (mg/dL)20800 
HbA1c (%)318>18% cực kỳ hiếm
Hemoglobin (g/dL)322 

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ânBiếnGiá trịQuyết địnhLý do
BN #042Tuổi150Loạ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 #087BMI85Giữ (kèm chú thích)Khả thi với béo phì độ III rất nặng. Cần verify lại.
BN #112HbA1c18%Giữ (kèm sensitivity analysis)Khả thi nhưng cực hiếm. Phân tích có và không có.
BN #156Cân nặng700 kgLoạiKhô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:

  1. HA tâm thu = 220 mmHg ở bệnh nhân 75 tuổi
  2. HA tâm thu = 80 mmHg ở bệnh nhân 60 tuổi
  3. HA tâm thu = 320 mmHg ở bệnh nhân 50 tuổi
  4. 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 data30 phút30 giây
Phát hiện outliers1-2 giờ1 phút
Tạo summary statistics30 phút10 giây
Phát hiện duplicates20 phút10 giây
Tạo data quality report2-3 giờ2-3 phút
TỔNG5-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:

DateIDVariableOldNewActionReasonBy
2026-05-01BN042Age150NARemovedKhông khả thi sinh học, không có file gốcNV.A
2026-05-01BN087BMI8585FlaggedVerify với hồ sơ - đúng, giữNV.A
2026-05-02BN112HbA1cNA7.8ImputedMultiple imputation, m=5NV.B
2026-05-03BN156Weight70070CorrectedLỗ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.xlsx từ 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:

IDBiếnGiá trịKhả thi sinh học?Hành độngLý do
BN_________Có/KhôngGiữ/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:

  1. 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?
  2. Nếu phát hiện 30% missing ở outcome chính, bạn sẽ làm gì?
  3. 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:

  1. 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)
  2. 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?
  3. 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:

  1. Multiple imputation tạo ra giá trị giả — vậy có vi phạm nguyên tắc khoa học không?
  2. 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?
  3. 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

  1. Van Buuren, S. (2018). Flexible Imputation of Missing Data (2nd ed.). CRC Press. (Sách kinh điển về missing data)
  2. Little, R. J., & Rubin, D. B. (2019). Statistical Analysis with Missing Data (3rd ed.). Wiley.
  3. Đạ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

  1. 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)
  2. Sterne, J. A., et al. (2009). Multiple imputation for missing data in epidemiological and clinical research: potential and pitfalls. BMJ, 338, b2393.
  3. 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ế

  1. CONSORT 2025 Statement — yêu cầu báo cáo missing data và cleaning
  2. TRIPOD+AI Statement (2024) — báo cáo data preprocessing với AI
  3. STROBE Statement — báo cáo missing data trong observational studies

Công cụ AI và phần mềm

  1. Python libraries:
    • pandas: https://pandas.pydata.org
    • missingno (visualization): https://github.com/ResidentMario/missingno
    • scikit-learn IterativeImputer
    • fancyimpute: https://github.com/iskandr/fancyimpute
  2. R packages:
    • mice (Multiple Imputation by Chained Equations)
    • VIM (Visualization and Imputation of Missing values)
  3. SPSS: Multiple Imputation module (built-in)

Khóa học online

  1. Coursera — "Data Science Methods for Quality Improvement" (Johns Hopkins)
  2. edX — "Statistical Analysis with Missing Data" (Harvard)
  3. YouTube — StatQuest: "Multiple Imputation explained" (free, easy to understand)

Bối cảnh Việt Nam

  1. 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ế.
  2. 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:

  1. Tuổi = 145: Không khả thi sinh học (outlier không khả thi)
  2. Cân nặng = NA: Missing data
  3. 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
  4. Inconsistency: Giới = "Nam" nhưng "Mang thai": Mâu thuẫn nội tại
  5. (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:

  1. HA = 220 mmHg ở BN 75 tuổi: ✅ Giữ — khả thi (cấp cứu tăng huyết áp)
  2. 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ơ
  3. 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
  4. 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:

  1. df = df.dropna() — XÓA TẤT CẢ rows có missing trước khi imputation. Nghĩa là dòng tiếp theo fillna() sẽ không có gì để xử lý. Đây là logic sai nghiêm trọng.
  2. 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
  3. 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.")

Từ khoá