Dữ Liệu Phân Loại (Categorical) — Cách Lưu Giúp Nhanh Hơn Nhiều Lần

Tóm tắt nhanh: Nếu 1 cột dữ liệu chỉ có vài giá trị khác nhau nhưng lặp lại rất nhiều lần (miền, loại khách hàng, hạng sản phẩm…), lưu đúng cách bằng kiểu ‘category’ giúp giảm bộ nhớ và tăng tốc xử lý đáng kể — nguyên lý giống hệt cách các hệ thống dữ liệu lớn vẫn dùng.
Kỹ thuật: dimension tableTăng tốc độ, giảm bộ nhớDùng cho cột lặp giá trị nhiều

Bài trước bạn học xử lý văn bản tự do (regex). Nhưng có 1 loại dữ liệu văn bản đặc biệt: cột chỉ lặp lại 1 số giá trị cố định (như “Miền Bắc/Trung/Nam”, “Còn hàng/Hết hàng”). Loại này xử lý hiệu quả hơn nhiều nếu lưu đúng cách.

Vấn đề: lưu text lặp lại hàng triệu lần rất tốn tài nguyên

Lưu dạng text (object)“Miền Bắc”,”Miền Bắc”,”Miền Nam”…lặp lại hàng triệu lần → tốn RAMLưu dạng categoryChỉ lưu 1 lần: “Bắc”,”Trung”,”Nam”còn lại chỉ lưu SỐ tham chiếu
Nếu cột “Miền” chỉ có 3 giá trị nhưng lặp lại hàng triệu dòng, lưu dạng text thô sẽ tốn bộ nhớ hơn nhiều so với lưu dạng category (chỉ lưu 3 giá trị gốc + số tham chiếu).

Nguyên lý: giống “bảng tham chiếu” trong data warehouse

Ví dụ thật: “apple/orange” thành số tham chiếuDữ liệu gốcappleorangeappleappleLưu bằng số0100Bảng tham chiếu0 → apple, 1 → orange
Ví dụ thật: cột chỉ có 2 giá trị (apple/orange) lặp lại nhiều lần — thay vì lưu chữ mỗi dòng, chỉ cần lưu 1 số tham chiếu (0 hoặc 1) cùng 1 bảng tra cứu nhỏ.

Đây chính xác là kỹ thuật “dimension table” mà các hệ thống data warehouse chuyên nghiệp vẫn dùng từ lâu để lưu dữ liệu hiệu quả. pandas cho phép chuyển 1 cột sang kiểu này chỉ bằng .astype("category") — code đơn giản, nhưng hiểu ĐÚNG khi nào nên dùng (cột có ít giá trị khác nhau, lặp lại nhiều) mới là phần quan trọng.

Xem thêm

Video này (tiếng Anh) đo trực tiếp mức chênh lệch bộ nhớ trước/sau khi chuyển sang category trên dữ liệu thật.

Checklist tự kiểm tra sau bài này
  • Bạn giải thích được vì sao lưu dạng category tiết kiệm bộ nhớ hơn lưu text thô.
  • Bạn nhận diện được 1 cột dữ liệu thực tế nên chuyển sang category (ít giá trị, lặp nhiều).
  • Bạn viết được code .astype(‘category’) để chuyển đổi.
Cần nhớ

Không phải cột văn bản nào cũng nên chuyển sang category — chỉ hợp khi số giá trị KHÁC NHAU nhỏ hơn nhiều so với tổng số dòng dữ liệu (ví dụ: 3 miền nhưng có 1 triệu dòng). Nếu mỗi dòng đều có giá trị khác nhau (như tên khách hàng), chuyển sang category không có lợi ích gì.

Câu hỏi thường gặp

Làm sao biết 1 cột có nên chuyển sang category không?

So sánh số giá trị khác nhau (dùng .nunique()) với tổng số dòng — nếu tỷ lệ nhỏ (ví dụ dưới 50%), category thường có lợi.

Chuyển sang category có ảnh hưởng đến kết quả phân tích không?

Không thay đổi giá trị dữ liệu, chỉ thay đổi CÁCH LƯU TRỮ bên trong — kết quả phân tích/tính toán vẫn giữ nguyên, chỉ nhanh hơn và tốn ít bộ nhớ hơn.

Categorical có liên quan gì đến machine learning không?

Có — nhiều mô hình cần cột phân loại được mã hóa đúng cách trước khi đưa vào huấn luyện, kiểu category trong pandas là bước chuẩn bị tốt cho việc này, sẽ gặp lại ở Module 5.

Nguồn: Wes McKinney, Python for Data Analysis (3rd ed.), Chương 7, phần “Categorical Data” (O’Reilly, 2022). Nội dung diễn giải lại bằng lời riêng, không sao chép nguyên văn.