preditc_nhansu_phase2/README.md

8.6 KiB

📊 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/*.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:

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:

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:

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ý

  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:

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