# 📊 DATASET TẠO LỊCH CÔNG VIỆC & DIỆN TÍCH LÀM SẠCH

## 🎯 Tổng Quan

Repository này chứa pipeline xử lý dữ liệu để tạo dataset huấn luyện mô hình dự đoán khối lượng công việc làm sạch. Dataset được tạo ra từ việc kết hợp:
- **Dữ liệu lịch làm việc** từ 285 file JSON (269 success + 16 null)
- **Dữ liệu diện tích** từ Link LLV 2025 For Dev.json (4536 records, 332 tòa nhà)

---

## 📁 Cấu Trúc Dữ Liệu Đầu Vào

### 1. Dữ Liệu Lịch Làm Việc
**Vị trí:** 
- `converters/output/sodonhansu/success/` (269 files)
- `converters/output/sodonhansu/null/` (16 files)

**Cấu trúc JSON:**
```json
{
  "Thong_tin_nhan_su": [
    {
      "Stt": 1,
      "Tên vị trí": "Nhân viên vệ sinh",
      "Khu Vực làm sạch": "Sảnh + hành lang tầng 2",
      "Ca_lam_viec": {
        "Ten_ca": "Hành chính",
        "Gio": "6h00-16h00",
        "So_nhan_su": 1
      }
    }
  ],
  "Chi_tiet_vi_tri": {
    "Nhân viên vệ sinh": {
      "Công việc thường": "Vệ sinh WC / Lau sàn / Thu gom rác",
      "Công việc định kỳ": "Đánh bóng sàn",
      "Thông tin bổ sung": ""
    }
  }
}
```

### 2. Dữ Liệu Diện Tích
**Vị trí:** `workload_converter/output_files/Link LLV 2025 For Dev.json`

**Cấu trúc JSON:**
```json
[
  {
    "Mã địa điểm": "101-1",
    "Tầng": "Tầng 5",
    "Khu vực": "Khu Văn phòng",
    "Sàn Phòng": 120,
    "Sàn Sảnh": 40,
    "Sàn Hành lang": 60,
    "Sàn WC": 30
  }
]
```

---

## 🔄 Pipeline Xử Lý (3 Bước)

### **BƯỚC 1: Trích Xuất & Validate JSON → CSV**
**Script:** `create_buoc1_csv_v2.py`

**Input:**
- `converters/output/sodonhansu/success/*.json`
- `converters/output/sodonhansu/null/*.json`

**Xử lý:**
- Validate cấu trúc JSON từng file (Thong_tin_nhan_su + Chi_tiet_vi_tri)
- Trích xuất position-level data (1631 valid positions từ 285 files)
- Lọc records có `gio` null hoặc rỗng
- Group by `(ma_toa_nha, Khu_vuc_lam_sach)` - cộng nhân sự, gộp task text

**Output:** `buoc1.csv` (1161 records)

**Columns:**
```
ma_toa_nha, Khu_vuc_lam_sach, gio, So_nhan_su, Ten_ca, all_task
```

**Chạy:**
```bash
python create_buoc1_csv_v2.py
```

---

### **BƯỚC 2: Tính Diện Tích Làm Sạch**
**Script:** `calculate_area.py`

**Input:**
- `buoc1.csv` (1161 records)
- `workload_converter/output_files/Link LLV 2025 For Dev.json` (4536 records)

**Xử lý:**
1. **Lọc tòa nhà:** Chỉ giữ records có `ma_toa_nha` trong JSON diện tích (1120/1161 records)
2. **Parse text khu vực:**
   - Extract tầng: "tầng 1", "T2", "từ tầng 3-5"
   - Extract khu vực: "văn phòng", "WC", "sảnh", "hành lang", "phòng bệnh"...
3. **Matching logic (fallback thông minh):**
   - Có cả tầng + khu vực → Match chặt (AND)
   - Chỉ có tầng → Lấy tất cả diện tích tầng đó
   - Chỉ có khu vực → Lấy khu vực đó trên tất cả tầng
   - Không parse được → Tổng toàn bộ tòa

**Output:** `buoc2_with_area_v3.csv` (1120 records)

**Columns:**
```
ma_toa_nha, Khu_vuc_lam_sach, gio, So_nhan_su, Ten_ca, 
dien_tich_m2, chi_tiet_tinh, all_task
```

**Kết quả:**
- 924 records (82%) tính được diện tích > 0
- 196 records (17%) chưa tính được (JSON thiếu data hoặc text phức tạp)
- Tổng diện tích: 18,739,738 m²

**Chạy:**
```bash
python calculate_area.py
```

---

### **BƯỚC 3: Trích Xuất Features Từ Text Công Việc**
**Script:** `create_final_dataset.py`

**Input:**
- `buoc2_with_area_v3.csv` (1120 records)

**Xử lý:**
1. **Parse tasks:** Split bằng delimiter `/` (thay vì `;`)
2. **Extract 15 features:**
   - **Task Type Counts (6):** cleaning, trash_collection, monitoring, deep_cleaning, support, total
   - **Area Coverage (5):** WC, hallway, elevator, patient_room, office
   - **Ratios & Diversity (4):** cleaning_ratio, trash_collection_ratio, monitoring_ratio, area_diversity
3. **Filter features:** Chỉ giữ features có non-zero >= 40%

**Output:** `final_dataset.csv` (1120 records, 21 columns)

**Columns:**
```
# Gốc (6)
ma_toa_nha, Khu_vuc_lam_sach, gio, So_nhan_su, Ten_ca, dien_tich_m2

# Features (15)
num_tasks, num_cleaning_tasks, num_trash_collection_tasks, 
num_monitoring_tasks, num_deep_cleaning_tasks, num_support_tasks,
num_wc_tasks, num_hallway_tasks, num_elevator_tasks, 
num_patient_room_tasks, num_office_tasks,
cleaning_ratio, trash_collection_ratio, monitoring_ratio, area_diversity
```

**Chạy:**
```bash
python create_final_dataset.py
```

---

## 📈 Thống Kê Dataset Cuối

### Tổng Quan
| Metric | Value |
|--------|-------|
| **Total Records** | 1,120 |
| **Total Buildings** | 198 unique codes |
| **Total Personnel** | 1,353 people |
| **Total Area** | 18.7M m² |
| **Avg Tasks per Record** | 13.78 |
| **Avg Area per Record** | 16,732 m² |

### Feature Coverage
| Feature | Non-Zero % | Mean |
|---------|------------|------|
| num_cleaning_tasks | 96.3% | 7.19 |
| num_trash_collection_tasks | 84.5% | 2.90 |
| num_monitoring_tasks | 80.2% | 3.04 |
| num_support_tasks | 73.1% | 1.28 |
| num_wc_tasks | 65.8% | 3.13 |
| num_hallway_tasks | 51.3% | 2.45 |
| num_elevator_tasks | 49.4% | 1.75 |
| num_deep_cleaning_tasks | 46.2% | 1.25 |

### Correlation Với Diện Tích (Top 5)
| Feature | Correlation |
|---------|-------------|
| num_hallway_tasks | +0.242 |
| num_support_tasks | +0.228 |
| num_tasks | +0.188 |
| num_monitoring_tasks | +0.177 |
| cleaning_ratio | -0.143 |

---

## 🚀 Cách Sử Dụng

### Chạy Full Pipeline (Bước 1 → 3)
```bash
# Bước 1: Tạo CSV từ JSON
python create_buoc1_csv_v2.py

# Bước 2: Tính diện tích
python calculate_area.py

# Bước 3: Extract features
python create_final_dataset.py
```

### Load Dataset Trong Python
```python
import pandas as pd

# Load dataset cuối
df = pd.read_csv('final_dataset.csv', encoding='utf-8-sig')

print(f"Shape: {df.shape}")
print(f"Columns: {df.columns.tolist()}")
print(df.head())

# Features for modeling
feature_cols = [
    'num_tasks', 'num_cleaning_tasks', 'num_trash_collection_tasks',
    'num_monitoring_tasks', 'num_deep_cleaning_tasks', 'num_support_tasks',
    'num_wc_tasks', 'num_hallway_tasks', 'num_elevator_tasks',
    'num_patient_room_tasks', 'num_office_tasks',
    'cleaning_ratio', 'trash_collection_ratio', 'monitoring_ratio', 
    'area_diversity'
]

X = df[feature_cols]
y = df['dien_tich_m2']  # hoặc 'So_nhan_su' tùy mục tiêu
```

---

## 📊 Files Trung Gian

| File | Records | Columns | Mô Tả |
|------|---------|---------|-------|
| `buoc1.csv` | 1,161 | 6 | Raw data từ JSON, đã validate & group |
| `buoc2_with_area_v3.csv` | 1,120 | 8 | Thêm diện tích (loại bỏ 41 records không có trong JSON) |
| **`final_dataset.csv`** | **1,120** | **21** | **Dataset cuối với 15 features** |

---

## 🔍 Data Quality Notes

### Issues Đã Xử Lý
1. ✅ **Structural validation:** 75/269 files có vấn đề → Position-level validation
2. ✅ **Missing values:** Lọc bỏ records có `gio` null/empty
3. ✅ **Duplicate grouping:** Group đúng theo `(ma_toa_nha, Khu_vuc_lam_sach)`
4. ✅ **Building code mismatch:** Loại bỏ 11 mã tòa không có trong JSON diện tích
5. ✅ **Text parsing:** Fallback logic thông minh khi không parse được tầng/khu vực

### Limitations
- **196 records (17%)** chưa tính được diện tích chính xác (JSON thiếu data hoặc text phức tạp)
- **Natural language parsing** của `Khu_vuc_lam_sach` có thể không chính xác 100%
- **Medical facility bias:** Dataset chủ yếu từ bệnh viện/phòng khám

---

## 📝 Keywords Mapping

### Task Types
- **Cleaning:** vệ sinh, lau, chùi, quét, hút, đẩy khô, lau ẩm
- **Trash:** thu gom rác, thay rác, vận chuyển rác, tua rác
- **Monitoring:** trực, trực phát sinh, kiểm tra, giám sát
- **Deep Cleaning:** cọ rửa, cọ bồn cầu, gạt kính, đánh sàn
- **Support:** giao ca, bàn giao, vsdc, chuẩn bị dụng cụ

### Area Types
- **WC:** wc, toilet, nhà vệ sinh, bồn cầu, lavabo
- **Hallway:** hành lang, corridor, lối đi
- **Elevator:** thang máy, cầu thang, thang bộ, tay vịn
- **Patient Room:** phòng bệnh, giường bệnh, phòng bệnh nhân
- **Office:** phòng nhân viên, văn phòng, phòng họp, phòng giao ban

---

## 🛠️ Môi Trường

```
Python 3.x
pandas
```

**Install:**
```bash
pip install pandas
```

---

## 📧 Contact

Để biết thêm chi tiết về pipeline hoặc báo lỗi, vui lòng liên hệ qua issue tracker.

---

## 📜 License

Internal use only - HoanMy Group

---

**Last Updated:** January 22, 2026

