# 2.  Dataset & EDA (Khám phá dữ liệu)

## 2.1.  Mục tiêu của bước này

Trong ML pipeline, bước “Dataset & EDA” nhằm:

* Hiểu dữ liệu gồm những gì (cột nào, ý nghĩa gì, nhãn mục tiêu là gì).
* Kiểm tra nhanh chất lượng dữ liệu (thiếu dữ liệu, dữ liệu sai kiểu, giá trị bất thường).
* Nhìn tổng quan phân bố nhãn (cân bằng hay mất cân bằng).
* Nhìn sơ bộ mối quan hệ giữa các đặc trưng và nhãn (EDA cơ bản).
* Chuẩn bị cơ sở để quyết định:
  * Có cần xử lý dữ liệu không?
  * Đánh giá mô hình cần dùng những metrics nào (Accuracy thôi hay cần Recall/F1/ROC-AUC)?

***

## 2.2.  Dataset đang dùng là gì?

Trong case study tiểu đường, dataset thường là dữ liệu dạng bảng (tabular) gồm các “chỉ số sức khỏe / hành vi / nhân khẩu học”.

* **Bài toán:** phân loại nhị phân (binary classification)
* **Nhãn (target):** `Diabetes_binary`
  * `0` = không bị tiểu đường
  * `1` = bị tiểu đường

Mỗi dòng dữ liệu đại diện cho 1 người, mỗi cột là 1 đặc trưng (feature).

***

## 2.3.  Cấu trúc thư mục dữ liệu trong project

Project chuẩn hóa theo 2 tầng dữ liệu:

```
data/
├── raw/        # dữ liệu gốc (backup, không chỉnh sửa)
└── processed/  # dữ liệu dùng trực tiếp cho toàn bộ thí nghiệm (training/evaluation/SHAP)
```

**Quy ước của project:**

* Toàn bộ pipeline **chỉ load dataset từ `data/processed/`**.
* Trong trường hợp dataset không cần xử lý gì, file trong `processed/` có thể **giống y hệt** file trong `raw/`.

Ý nghĩa:

* `raw/` giữ nguyên để đảm bảo “nguồn gốc dữ liệu”.
* `processed/` là “dataset version chính thức dùng cho thực nghiệm”, giúp reproducibility (tái lập kết quả).

```py
PROJECT_ROOT = Path(__file__).resolve().parents[1]
DATA_DIR = PROJECT_ROOT / "data" / "processed"
```

<figure><img src="/files/6sQZoOtQWUNwdaZHFd9y" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Quy tắc đặt tên cho file dataset:  \<source> \_ *\<problem>* \_ \<num\_records>.csv
{% endhint %}

***

## 2.4.  Kiểm tra nhanh dataset (EDA cơ bản)

Trong EDA, tối thiểu cần kiểm tra:

**(1) Kích thước dữ liệu**

* Có bao nhiêu dòng (samples)?
* Có bao nhiêu cột (features)?
* Có bao nhiêu lớp trong target?

Ví dụ mô tả:

* Số mẫu: \~100,000
* Số đặc trưng: 21
* Target: 2 lớp (0/1)

**(2) Kiểu dữ liệu từng cột**

* Các cột có phải là số (numeric) không?
* Có cột nào dạng text cần encoding không?

Với các dataset Kaggle kiểu “health indicators”, đa số là số/binary nên thường không cần encoding phức tạp.

**(3) Missing values (giá trị bị thiếu)**

* Có cột nào bị thiếu dữ liệu không?
* Nếu có thì xử lý bằng cách nào (fill/loại bỏ)?

**(4) Giá trị bất thường (outliers / invalid values)**

Ví dụ:

* BMI quá lớn/âm
* Age có giá trị ngoài range
* Các cột binary nhưng lại có giá trị không phải 0/1

Mục tiêu là đảm bảo dataset “hợp lý” trước khi bước sang training.

***

#### 2.5.  Phân bố nhãn (class balance)

Trong dữ liệu y tế, thường gặp tình trạng **mất cân bằng lớp**:

* Lớp “không bị tiểu đường” (0) thường nhiều hơn
* Lớp “bị tiểu đường” (1) thường ít hơn

Nếu dữ liệu mất cân bằng mạnh thì:

* Model dễ “thiên vị” về lớp 0
* Accuracy có thể cao nhưng dự đoán lớp 1 rất kém

Vì vậy, ngoài Accuracy, project cần đánh giá thêm:

* **Recall/Sensitivity**: khả năng bắt đúng bệnh (lớp 1)
* **F1-score**: cân bằng giữa Precision và Recall
* **ROC-AUC**: đo chất lượng phân biệt hai lớp

***

#### 2.6.  Phân bố đặc trưng (feature distribution)

EDA thường xem một số đặc trưng quan trọng:

* BMI phân bố ra sao?
* Tuổi (Age) phân bố ra sao?
* Các biến sức khỏe như HighBP, HighChol có tần suất như thế nào?

Mục tiêu:

* Kiểm tra dữ liệu có “hợp lý theo kiến thức thực tế” không.
* Ví dụ, BMI cao thường liên quan rủi ro tiểu đường — nếu dataset phản ánh xu hướng này thì tăng độ tin cậy.

***

#### 2.7.  Tương quan (Correlation Heatmap)

Biểu đồ tương quan giúp nhìn nhanh:

* Cột nào liên quan mạnh tới `Diabetes_binary`
* Cột nào trùng lặp thông tin (tương quan quá cao giữa các features)
* Có dấu hiệu đa cộng tuyến (multicollinearity) không

Lưu ý:

* Tương quan chỉ là nhìn sơ bộ, không nói lên quan hệ nhân quả.
* Vì vậy pipeline vẫn cần bước Explainability (SHAP) để giải thích ảnh hưởng của từng feature lên dự đoán.

***

#### 2.8.  Kết luận sau EDA và liên kết sang bước 3

Sau khi EDA xong, ta trả lời được các câu:

1. Dataset có sạch và hợp lý không?
2. Có cần xử lý gì không? (missing, encoding, scaling, outliers)
3. Dữ liệu có mất cân bằng lớp không?
4. Nên dùng những metrics nào để đánh giá?

Nếu dataset sạch sẵn:

* Bước preprocessing sẽ nhẹ, chủ yếu là:
  * tách X/y
  * train/test split
  * (tùy mô hình) chuẩn hóa/scaling

Nếu dataset mất cân bằng:

* Có thể cân nhắc:
  * class\_weight
  * resampling (SMOTE, undersampling)
  * hoặc giữ nguyên nhưng chú trọng metrics (Recall/F1/ROC-AUC)

{% hint style="info" %}
Lưu ý: pileline có thể như thế này nên tài liệu và source code theo hướng này:&#x20;

dataset\_registry\
↓\
DataPreprocessor\
↓\
split\
↓\
models\
↓\
evaluation\
↓\
SHAP
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://deeplearningcoban.gitbook.io/deeplearningcoban.com/case-study-ung-dung-thuc-te/ml-pipeline-healthcare-case-study-full-code/2.-dataset-and-eda-kham-pha-du-lieu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
