# 📋 KẾ HOẠCH TIỀN XỬ LÝ DỮ LIỆU & HUẤN LUYỆN MODEL

**Ngày:** January 5, 2026  
**Target Variable:** `so_luong` (Số lượng nhân sự)  
**Dataset:** FINAL_DATASET_WITH_TEXT.xlsx (454 rows × 51 columns)

---

## 🎯 MỤC TIÊU

Dự đoán số lượng nhân sự cần thiết cho mỗi ca làm việc dựa trên:
- ✅ Task features (25 features từ text)
- ✅ Shift features (5 features về ca làm việc)
- ✅ Building features (17 features về tòa nhà)
- ⚪ Text columns (2 cột) - **GIỮ LẠI CHO SAU**

**Tổng features sử dụng:** 47 features (không tính 2 cột text và ma_dia_diem)

---

## 📊 PHÂN TÍCH DATASET HIỆN TẠI

### Thông tin cơ bản:
- **Tổng samples:** 454 shifts
- **Target:** `so_luong` (0-64, mean=4.64, median=4.0)
- **Features:** 47 numeric + categorical
- **Missing values:** Cần kiểm tra

### Phân bố features:

#### 1. Shift Features (5):
- `loai_ca` - Categorical (Part time, Ca sáng, Ca chiều, Hành chính, etc.)
- `bat_dau` - Time (cần parse)
- `ket_thuc` - Time (cần parse)
- `tong_gio_lam` - Numeric/Time (cần parse)
- `so_ca_cua_toa` - Numeric (1-41)

#### 2. Task Features (25):
- Counts (9): `num_tasks`, `num_cleaning_tasks`, etc.
- Areas (10): `num_wc_tasks`, `num_hallway_tasks`, etc.
- Ratios (4): `cleaning_ratio`, `trash_collection_ratio`, etc.
- Complexity (2): `area_diversity`, `task_complexity_score`

#### 3. Building Features (17):
- Categorical (3): `loai_hinh`, `ten_toa_thap`, `muc_do_luu_luong`
- Numeric (14): `so_tang`, `dien_tich_*`, binary features

---

## 🔧 PHASE 1: TIỀN XỬ LÝ DỮ LIỆU

### Step 1.1: Exploratory Data Analysis (EDA)

**Script:** `01_eda_analysis.py`

```python
Nhiệm vụ:
1. Load dataset và kiểm tra shape, dtypes
2. Phân tích missing values
3. Thống kê mô tả (describe) cho tất cả features
4. Phân tích target variable (so_luong):
   - Distribution (histogram, boxplot)
   - Outliers detection
   - Skewness và kurtosis
5. Correlation matrix với target
6. Identify zero-variance features
7. Save EDA report
```

**Output:**
- `EDA_REPORT.md` - Báo cáo chi tiết
- `eda_plots/` - Các biểu đồ phân tích

**Thời gian:** ~30 phút

---

### Step 1.2: Data Cleaning

**Script:** `02_data_cleaning.py`

```python
Nhiệm vụ:
1. Xử lý missing values:
   - Task features: Fill 0 (không có task đó)
   - Building features: Fill median hoặc mode
   - Shift features: Xác định cách xử lý
   
2. Xử lý outliers trong target:
   - Kiểm tra so_luong = 0 (có 16 ca)
   - Quyết định keep/remove/cap
   
3. Loại bỏ duplicate rows (nếu có)

4. Loại bỏ features không cần thiết:
   - ma_dia_diem (identifier, không dùng cho training)
   - all_task_normal (giữ lại cho sau)
   - all_task_dinhky (giữ lại cho sau)
   - ten_toa_thap (có thể redundant với ma_dia_diem)
   
5. Validate data quality sau cleaning
```

**Output:**
- `CLEANED_DATA.csv` - Dataset sau cleaning
- `CLEANING_REPORT.md` - Báo cáo chi tiết

**Thời gian:** ~20 phút

---

### Step 1.3: Feature Engineering

**Script:** `03_feature_engineering.py`

```python
Nhiệm vụ:

A. TIME FEATURES (từ bat_dau, ket_thuc, tong_gio_lam):
   - hour_start (giờ bắt đầu: 0-23)
   - hour_end (giờ kết thúc: 0-23)
   - work_hours_numeric (số giờ làm: float)
   - is_morning_shift (6-12h: 1/0)
   - is_afternoon_shift (12-18h: 1/0)
   - is_evening_shift (18-24h: 1/0)
   - is_night_shift (0-6h: 1/0)
   - is_cross_day (ca qua đêm: 1/0)

B. INTERACTION FEATURES:
   - tasks_per_hour = num_tasks / work_hours_numeric
   - tasks_per_floor = num_tasks / so_tang
   - wc_per_floor = num_wc_tasks / so_tang
   - cleaning_workload = num_cleaning_tasks * area_diversity
   
C. AGGREGATION FEATURES:
   - total_area = sum(dien_tich_*)
   - area_per_floor = total_area / so_tang
   - has_special_areas = (num_patient_room_tasks + 
                           num_surgery_room_tasks + 
                           num_clinic_room_tasks) > 0

D. CATEGORICAL ENCODING:
   - loai_ca: One-hot encoding
   - loai_hinh: Label encoding (có thứ tự)
   - muc_do_luu_luong: Label encoding (có thứ tự)
   
E. FEATURE SELECTION (optional):
   - Remove zero-variance features
   - Remove highly correlated features (>0.95)
```

**Output:**
- `ENGINEERED_DATA.csv` - Dataset với features mới
- `FEATURE_ENGINEERING_REPORT.md` - Báo cáo

**Thời gian:** ~40 phút

---

### Step 1.4: Feature Scaling

**Script:** `04_feature_scaling.py`

```python
Nhiệm vụ:
1. Tách features theo loại:
   - Numeric features cần scaling
   - Binary features (0/1) - không cần scaling
   - One-hot encoded features - không cần scaling

2. Apply scaling methods:
   Option A: StandardScaler (mean=0, std=1) - Recommended
   Option B: MinMaxScaler (0-1)
   Option C: RobustScaler (robust to outliers)

3. Save scaler object để dùng cho inference

4. Validate scaling: check mean, std sau khi scale
```

**Output:**
- `SCALED_DATA.csv` - Dataset đã scale
- `scaler.pkl` - Scaler object
- `SCALING_REPORT.md` - Báo cáo

**Thời gian:** ~15 phút

---

### Step 1.5: Train/Validation/Test Split

**Script:** `05_train_test_split.py`

```python
Nhiệm vụ:
1. Split strategy:
   - Train: 70% (318 samples)
   - Validation: 15% (68 samples)
   - Test: 15% (68 samples)

2. Stratified split (nếu cần):
   - Stratify by loai_ca hoặc binned so_luong
   
3. Random state = 42 (reproducibility)

4. Validate split:
   - Check distribution của so_luong trong mỗi set
   - Check no data leakage

5. Save splits
```

**Output:**
- `train.csv` (318 rows)
- `val.csv` (68 rows)
- `test.csv` (68 rows)
- `SPLIT_REPORT.md`

**Thời gian:** ~10 phút

---

## 🤖 PHASE 2: MODEL TRAINING

### Step 2.1: Baseline Model

**Script:** `06_baseline_model.py`

```python
Mục đích: Tạo baseline đơn giản để so sánh

Models:
1. Mean Baseline: Dự đoán = mean(so_luong) cho tất cả
2. Linear Regression: Simple linear model
3. Decision Tree (max_depth=5): Simple tree

Metrics:
- MAE (Mean Absolute Error)
- RMSE (Root Mean Squared Error)
- R² Score
- MAPE (Mean Absolute Percentage Error)

Output:
- Baseline scores
- Simple visualizations
```

**Output:**
- `BASELINE_RESULTS.md`
- `baseline_models/` - Saved models

**Thời gian:** ~15 phút

---

### Step 2.2: Advanced Models Training

**Script:** `07_train_models.py`

```python
Models to train:

1. Random Forest Regressor
   - n_estimators: [100, 200, 300]
   - max_depth: [10, 20, 30, None]
   - min_samples_split: [2, 5, 10]
   
2. Gradient Boosting Regressor
   - n_estimators: [100, 200]
   - learning_rate: [0.01, 0.05, 0.1]
   - max_depth: [3, 5, 7]
   
3. XGBoost Regressor
   - n_estimators: [100, 200]
   - learning_rate: [0.01, 0.05, 0.1]
   - max_depth: [3, 5, 7]
   - subsample: [0.8, 1.0]
   
4. LightGBM Regressor
   - n_estimators: [100, 200]
   - learning_rate: [0.01, 0.05, 0.1]
   - num_leaves: [31, 50, 70]

Training approach:
- Cross-validation (5-fold) trên train set
- Hyperparameter tuning với GridSearchCV/RandomizedSearchCV
- Evaluate trên validation set
- Save best models
```

**Output:**
- `trained_models/` - Saved models
- `MODEL_TRAINING_REPORT.md`
- `training_logs/` - Training logs

**Thời gian:** ~1-2 giờ (tùy hyperparameter tuning)

---

### Step 2.3: Model Evaluation

**Script:** `08_model_evaluation.py`

```python
Nhiệm vụ:

1. Load all trained models

2. Evaluate trên validation set:
   - MAE, RMSE, R², MAPE
   - Residual plots
   - Actual vs Predicted plots
   
3. Compare models:
   - Performance comparison table
   - Visual comparison (bar charts)
   
4. Analyze errors:
   - Where models fail (high errors)
   - Error distribution by loai_ca, so_tang, etc.
   
5. Feature importance:
   - Top 20 important features
   - SHAP values (if possible)
```

**Output:**
- `EVALUATION_REPORT.md`
- `evaluation_plots/`
- `feature_importance.csv`

**Thời gian:** ~30 phút

---

### Step 2.4: Final Model Selection & Test

**Script:** `09_final_evaluation.py`

```python
Nhiệm vụ:

1. Select best model based on validation performance

2. Re-train best model on train+val combined (optional)

3. Final evaluation on test set:
   - MAE, RMSE, R², MAPE
   - Confidence intervals
   - Error analysis
   
4. Create production-ready pipeline:
   - Preprocessing + Model
   - Save as single pickle file
   
5. Generate final report
```

**Output:**
- `FINAL_MODEL.pkl` - Production model
- `FINAL_EVALUATION_REPORT.md`
- `final_plots/`

**Thời gian:** ~20 phút

---

## 📊 PHASE 3: ANALYSIS & INSIGHTS

### Step 3.1: Feature Importance Analysis

**Script:** `10_feature_analysis.py`

```python
Nhiệm vụ:
1. Feature importance from best model
2. SHAP values analysis (detailed)
3. Partial dependence plots
4. Feature interactions
5. Recommendations for feature engineering v2
```

**Output:**
- `FEATURE_IMPORTANCE_REPORT.md`
- `shap_plots/`

**Thời gian:** ~30 phút

---

### Step 3.2: Business Insights

**Script:** `11_business_insights.py`

```python
Nhiệm vụ:
1. Phân tích theo loại ca:
   - Ca nào cần nhiều nhân sự nhất?
   - Features quan trọng cho từng loại ca
   
2. Phân tích theo loại tòa:
   - Loại tòa nào phức tạp nhất?
   - Correlation với số nhân sự
   
3. Task features impact:
   - Task nào ảnh hưởng nhiều nhất?
   - Recommendations cho task planning
   
4. Optimization opportunities:
   - Cách giảm số nhân sự mà vẫn hiệu quả
   - Resource allocation recommendations
```

**Output:**
- `BUSINESS_INSIGHTS_REPORT.md`
- `insights_plots/`

**Thời gian:** ~30 phút

---

## 📁 FOLDER STRUCTURE

```
Predict_calamviecHM/
├── data/
│   ├── raw/
│   │   └── FINAL_DATASET_WITH_TEXT.xlsx
│   ├── cleaned/
│   │   ├── CLEANED_DATA.csv
│   │   ├── ENGINEERED_DATA.csv
│   │   └── SCALED_DATA.csv
│   └── splits/
│       ├── train.csv
│       ├── val.csv
│       └── test.csv
│
├── models/
│   ├── baseline_models/
│   ├── trained_models/
│   │   ├── random_forest.pkl
│   │   ├── xgboost.pkl
│   │   ├── lightgbm.pkl
│   │   └── gradient_boosting.pkl
│   ├── scaler.pkl
│   └── FINAL_MODEL.pkl
│
├── scripts/
│   ├── 01_eda_analysis.py
│   ├── 02_data_cleaning.py
│   ├── 03_feature_engineering.py
│   ├── 04_feature_scaling.py
│   ├── 05_train_test_split.py
│   ├── 06_baseline_model.py
│   ├── 07_train_models.py
│   ├── 08_model_evaluation.py
│   ├── 09_final_evaluation.py
│   ├── 10_feature_analysis.py
│   └── 11_business_insights.py
│
├── reports/
│   ├── EDA_REPORT.md
│   ├── CLEANING_REPORT.md
│   ├── FEATURE_ENGINEERING_REPORT.md
│   ├── MODEL_TRAINING_REPORT.md
│   ├── EVALUATION_REPORT.md
│   ├── FINAL_EVALUATION_REPORT.md
│   ├── FEATURE_IMPORTANCE_REPORT.md
│   └── BUSINESS_INSIGHTS_REPORT.md
│
├── plots/
│   ├── eda_plots/
│   ├── evaluation_plots/
│   ├── final_plots/
│   ├── shap_plots/
│   └── insights_plots/
│
└── notebooks/
    ├── EDA_Notebook.ipynb
    └── Model_Comparison.ipynb
```

---

## 📊 EXPECTED PERFORMANCE

### Target Metrics (Realistic):

| Metric | Baseline | Target | Stretch |
|--------|----------|--------|---------|
| MAE | ~2.5 | <2.0 | <1.5 |
| RMSE | ~3.5 | <3.0 | <2.5 |
| R² | 0.30 | >0.60 | >0.75 |
| MAPE | ~50% | <30% | <20% |

**Giải thích:**
- Baseline: Simple mean/linear model
- Target: Mục tiêu hợp lý với dataset này
- Stretch: Mục tiêu lý tưởng (có thể khó đạt được)

---

## ⏱️ TIMELINE TỔNG QUAN

| Phase | Time | Status |
|-------|------|--------|
| **Phase 1: Tiền xử lý** | ~2 giờ | 📋 Planned |
| - EDA | 30 min | |
| - Cleaning | 20 min | |
| - Feature Engineering | 40 min | |
| - Scaling | 15 min | |
| - Split | 10 min | |
| **Phase 2: Training** | ~2-3 giờ | 📋 Planned |
| - Baseline | 15 min | |
| - Advanced Models | 1-2h | |
| - Evaluation | 30 min | |
| - Final Selection | 20 min | |
| **Phase 3: Analysis** | ~1 giờ | 📋 Planned |
| - Feature Analysis | 30 min | |
| - Business Insights | 30 min | |
| **TOTAL** | **~5-6 giờ** | 📋 Planned |

---

## 🎯 FEATURES SỬ DỤNG (47 features)

### ✅ Sẽ dùng ngay:

**Shift Features (5):**
1. loai_ca (encoded)
2. hour_start (engineered)
3. hour_end (engineered)
4. work_hours_numeric (engineered)
5. so_ca_cua_toa

**Task Features (25):**
6-14. Task counts (9)
15-24. Area coverage (10)
25-28. Ratios (4)
29-30. Diversity & Complexity (2)

**Building Features (17):**
31-33. Categorical (3 - encoded)
34-47. Numeric (14)

### ⚪ Giữ lại cho Phase 2 (sau này):
- `all_task_normal` - Text column (TF-IDF/BERT)
- `all_task_dinhky` - Text column (TF-IDF/BERT)

### ❌ Không dùng:
- `ma_dia_diem` - Identifier
- `bat_dau` - Raw time (đã engineer)
- `ket_thuc` - Raw time (đã engineer)
- `tong_gio_lam` - Raw time (đã engineer)

---

## 🚀 BẮT ĐẦU TỪ BƯỚC NÀO?

### Option 1: Toàn bộ pipeline tự động
```python
# Script: run_full_pipeline.py
# Chạy tất cả steps từ 1-11 tự động
```

### Option 2: Từng bước (Recommended)
```python
# Bắt đầu với EDA
python scripts/01_eda_analysis.py
# Sau đó tiếp tục 02, 03, ...
```

### Option 3: Notebook interactive
```python
# Sử dụng Jupyter Notebook
# EDA_Notebook.ipynb để khám phá và thử nghiệm
```

---

## 📝 NOTES QUAN TRỌNG

### 1. Data Quality:
- ⚠️ 27 rows không có task text (5.9%)
- ⚠️ 16 shifts có so_luong = 0
- ✅ 429/454 shifts có đầy đủ data (94.5%)

### 2. Feature Engineering:
- Time features rất quan trọng (giờ bắt đầu ảnh hưởng lớn)
- Interaction features có thể boost performance
- Task complexity score đã tính sẵn, có thể dùng trực tiếp

### 3. Model Selection:
- Tree-based models (RF, XGB, LGBM) thường tốt nhất cho tabular data
- Ensemble methods có thể kết hợp nhiều models
- Consider model interpretability cho business

### 4. Text Features (Phase 2):
- Sau khi có baseline với 47 features
- Thêm TF-IDF vectors từ text
- Compare performance improvement
- Có thể tăng R² thêm 5-10%

---

## ✅ CHECKLIST TRƯỚC KHI BẮT ĐẦU

- [ ] Dataset sẵn sàng: `FINAL_DATASET_WITH_TEXT.xlsx`
- [ ] Python environment setup (pandas, sklearn, xgboost, lightgbm)
- [ ] Tạo folder structure
- [ ] Backup data gốc
- [ ] Set random seed = 42 (reproducibility)
- [ ] Chuẩn bị notebook/IDE để code

---

## 🎯 SUCCESS CRITERIA

### Minimum Viable Model:
- ✅ MAE < 2.0
- ✅ R² > 0.60
- ✅ Model có thể explain được (feature importance)
- ✅ Reproducible (có scripts + saved models)

### Stretch Goals:
- 🎯 MAE < 1.5
- 🎯 R² > 0.75
- 🎯 SHAP analysis hoàn chỉnh
- 🎯 Business insights actionable

---

**Kế hoạch tạo bởi:** GitHub Copilot  
**Ngày:** January 5, 2026  
**Status:** 📋 READY TO START  
**Next Step:** Bắt đầu với `01_eda_analysis.py`

---

## ❓ BẠN MUỐN BẮT ĐẦU VỚI BƯỚC NÀO?

1. **Tạo toàn bộ scripts** (11 files) - Recommended
2. **Chỉ tạo EDA script** để khám phá data trước
3. **Tạo full pipeline script** chạy một lần
4. **Tạo Jupyter Notebook** để interactive

Hãy cho tôi biết! 🚀
