|
|
||
|---|---|---|
| output | ||
| workload_converter | ||
| README.md | ||
| calculate_area.py | ||
| create_buoc1_csv_v2.py | ||
| create_final_dataset.py | ||
| final_dataset.csv | ||
README.md
📊 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:
{
"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:
[
{
"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/*.jsonconverters/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ó
gionull 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:
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ý:
- Lọc tòa nhà: Chỉ giữ records có
ma_toa_nhatrong JSON diện tích (1120/1161 records) - 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"...
- 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:
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ý:
- Parse tasks: Split bằng delimiter
/(thay vì;) - 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
- 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:
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)
# 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
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ý
- ✅ Structural validation: 75/269 files có vấn đề → Position-level validation
- ✅ Missing values: Lọc bỏ records có
gionull/empty - ✅ Duplicate grouping: Group đúng theo
(ma_toa_nha, Khu_vuc_lam_sach) - ✅ Building code mismatch: Loại bỏ 11 mã tòa không có trong JSON diện tích
- ✅ 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_sachcó 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:
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