Skip to content

🏆 Tiêu chuẩn — Pandas & Numpy Data Cleaning

Các tiêu chuẩn và nguyên tắc làm sạch dữ liệu chuyên nghiệp dành cho Data Analyst

Tổng quan tiêu chuẩn buổi 8

Buổi 8 đánh dấu bước nhảy vọt: từ xử lý file bằng Python thuần (csv, json) sang Pandas — thư viện phân tích dữ liệu mạnh nhất hệ sinh thái Python. Bạn đã biết cách đọc CSV, viết function tính doanh thu, xuất báo cáo — nhưng khi dataset lên 10,000+ dòng, Python thuần trở nên chậm và cồng kềnh. Pandas giải quyết tất cả trong vài dòng code.

Tuy nhiên, có Pandas không có nghĩa là bạn clean data đúng cách. Trong thực tế, 60–80% thời gian Data Analyst dành cho data cleaning — và nếu không tuân thủ tiêu chuẩn, kết quả phân tích sẽ sai ngay từ gốc. "Garbage in, garbage out" — dữ liệu bẩn vào, insight rác ra.

Buổi này tập trung vào 3 tiêu chuẩn cốt lõi cho data cleaning:

  • Tidy Data (Hadley Wickham) — Cấu trúc DataFrame chuẩn cho phân tích
  • ISO 8000 — Tiêu chuẩn quốc tế về chất lượng dữ liệu
  • Notebook Best Practices — Quy tắc viết Jupyter Notebook tái sản xuất được

Theo khảo sát Kaggle State of Data Science (2025), 78% data professionals dành phần lớn thời gian cho data cleaning, và 65% cho rằng data quality issues là thách thức lớn nhất. Nắm vững các tiêu chuẩn này giúp bạn phân biệt giữa "clean data xong rồi" và "clean data đúng chuẩn".

📋 Danh sách tiêu chuẩn liên quan

#Tiêu chuẩnTổ chức / Tác giảÁp dụng cho Buổi 8
1Tidy DataHadley Wickham (RStudio / Posit, 2014)Chuẩn hóa cấu trúc DataFrame — mỗi biến 1 cột, mỗi quan sát 1 dòng
2ISO 8000 — Data QualityInternational Organization for StandardizationMissing values, duplicates, consistency checks
3Notebook Best PracticesCộng đồng Data Science (Google, Netflix, Jupyter)Cell order, markdown documentation, reproducibility

1️⃣ Tidy Data (Hadley Wickham, 2014)

Giới thiệu

Tidy Data là framework chuẩn hóa cấu trúc dữ liệu dạng bảng, được Hadley Wickham — Chief Scientist tại Posit (trước đây là RStudio) — đề xuất trong paper "Tidy Data" (Journal of Statistical Software, 2014). Dù bắt nguồn từ R, nguyên tắc Tidy Data áp dụng 100% cho Pandas DataFrame trong Python.

Triết lý cốt lõi:

"Tidy datasets are all alike, but every messy dataset is messy in its own way." — Dataset sạch thì giống nhau, nhưng mỗi dataset bẩn thì bẩn theo kiểu riêng.

Ba quy tắc của Tidy Data:

  1. Mỗi biến (variable) là một cộtprice, quantity, region là các cột riêng biệt
  2. Mỗi quan sát (observation) là một dòng — mỗi đơn hàng nằm trên 1 dòng
  3. Mỗi loại đơn vị quan sát (observational unit) là một bảng — bảng orders tách riêng bảng customers

Áp dụng trong buổi học

Messy DataFrame vs Tidy DataFrame

python
import pandas as pd

# ❌ Messy — Doanh thu các tháng nằm trên cùng 1 dòng (wide format)
messy_df = pd.DataFrame({
    "product": ["Laptop", "Phone"],
    "jan_revenue": [50000000, 30000000],
    "feb_revenue": [45000000, 35000000],
    "mar_revenue": [55000000, 40000000],
})
print(messy_df)
#   product  jan_revenue  feb_revenue  mar_revenue
# 0  Laptop     50000000     45000000     55000000
# 1   Phone     30000000     35000000     40000000
python
# ✅ Tidy — Mỗi quan sát (product + month) là 1 dòng (long format)
tidy_df = pd.DataFrame({
    "product": ["Laptop", "Laptop", "Laptop", "Phone", "Phone", "Phone"],
    "month": ["Jan", "Feb", "Mar", "Jan", "Feb", "Mar"],
    "revenue": [50000000, 45000000, 55000000, 30000000, 35000000, 40000000],
})
print(tidy_df)
#   product month   revenue
# 0  Laptop   Jan  50000000
# 1  Laptop   Feb  45000000
# 2  Laptop   Mar  55000000
# 3   Phone   Jan  30000000
# 4   Phone   Feb  35000000
# 5   Phone   Mar  40000000

Chuyển đổi Messy → Tidy bằng Pandas

python
# Dùng pd.melt() để chuyển wide → long
tidy_from_messy = pd.melt(
    messy_df,
    id_vars=["product"],
    value_vars=["jan_revenue", "feb_revenue", "mar_revenue"],
    var_name="month",
    value_name="revenue",
)

# Clean tên tháng
tidy_from_messy["month"] = (
    tidy_from_messy["month"].str.replace("_revenue", "").str.title()
)
print(tidy_from_messy)

💡 Khi nào dùng Wide vs Tidy?

  • Tidy (long format): dùng cho phân tích, visualization, merge — Pandas, Plotly, SQL đều thích format này
  • Wide format: dùng cho trình bày — bảng trong slide, dashboard, Excel pivot table
  • Chuyển đổi qua lại: pd.melt() (wide → long), pd.pivot_table() (long → wide)

Ví dụ thực tế

Nhận diện vi phạm Tidy Data trong dataset e-commerce:

Vi phạmVí dụCách sửa
Nhiều biến trong 1 cột"Nguyễn Văn A - 0901234567"str.split(" - ") tách thành name + phone
Nhiều quan sát trên 1 dòngCột Q1, Q2, Q3, Q4 cho doanh thupd.melt() thành cột quarter + revenue
Trộn loại dữ liệu trong bảngBảng orders chứa cả thông tin customerTách thành 2 bảng, dùng customer_id để join

Checklist Tidy Data

  • [ ] Mỗi cột chứa đúng 1 biến — không ghép 2 thông tin vào 1 cột
  • [ ] Mỗi dòng là 1 quan sát hoàn chỉnh — không có dòng tổng hợp xen lẫn dòng chi tiết
  • [ ] Dữ liệu dạng long format khi phân tích — chuyển wide bằng pd.melt() nếu cần
  • [ ] Tách bảng theo loại đơn vị quan sátorders, customers, products là bảng riêng
  • [ ] Tên cột dùng snake_case, không có dấu cách hoặc ký tự đặc biệt
  • [ ] Không có dòng metadata (title, note) trong DataFrame — chỉ chứa data thuần

2️⃣ ISO 8000 — Data Quality

Giới thiệu

ISO 8000 là bộ tiêu chuẩn quốc tế do International Organization for Standardization (ISO) ban hành, quy định các yêu cầu về chất lượng dữ liệu (data quality). ISO 8000 được sử dụng rộng rãi trong doanh nghiệp để đánh giá và cải thiện chất lượng dữ liệu — đặc biệt trong supply chain, e-commerce, và financial data.

Đối với Data Analyst, ISO 8000 cung cấp framework tư duy để đánh giá dataset: dữ liệu có đầy đủ không? Có chính xác không? Có nhất quán không? Thay vì clean data "theo cảm tính", bạn có checklist rõ ràng dựa trên tiêu chuẩn quốc tế.

Data Quality Dimensions — 5 chiều chất lượng dữ liệu

DimensionTiếng ViệtMô tảPandas Check
CompletenessĐầy đủKhông thiếu dữ liệu quan trọngdf.isnull().sum()
AccuracyChính xácDữ liệu phản ánh đúng thực tếdf.describe(), range checks
ConsistencyNhất quánCùng format, cùng quy tắcdf["col"].unique(), dtype checks
TimelinessKịp thờiDữ liệu cập nhật, không quá cũpd.to_datetime(), date range checks
UniquenessDuy nhấtKhông có bản ghi trùng lặpdf.duplicated().sum()

Áp dụng trong buổi học

Completeness — Kiểm tra missing values

python
import pandas as pd
import numpy as np

# Tạo DataFrame mẫu có missing values
df = pd.DataFrame({
    "order_id": [1001, 1002, 1003, 1004, 1005],
    "customer": ["An", None, "Bình", "Cường", None],
    "amount": [500000, 1200000, np.nan, 800000, 350000],
    "region": ["Bắc", "Nam", "Trung", None, "Bắc"],
})

# Audit missing values
print("=== COMPLETENESS AUDIT ===")
print(f"Total rows: {len(df)}")
print(f"\nMissing values per column:")
print(df.isnull().sum())
print(f"\nMissing percentage:")
print((df.isnull().sum() / len(df) * 100).round(1))

Uniqueness — Kiểm tra duplicates

python
# Phát hiện duplicate
print(f"Duplicate rows: {df.duplicated().sum()}")
print(f"Duplicate order_ids: {df.duplicated(subset=['order_id']).sum()}")

# Xem chi tiết dòng duplicate
dupes = df[df.duplicated(keep=False)]
print(f"\nChi tiết duplicates:\n{dupes}")

Consistency — Kiểm tra nhất quán

python
# Kiểm tra format không nhất quán
df_messy = pd.DataFrame({
    "status": ["completed", "Completed", "COMPLETED", "cancelled", "Cancelled"],
    "phone": ["0901234567", "090-123-4567", "+8490123456", "901234567", None],
})

print("=== CONSISTENCY AUDIT ===")
print(f"Unique status values: {df_messy['status'].unique()}")
# → ['completed', 'Completed', 'COMPLETED', 'cancelled', 'Cancelled']
# 😱 Cùng 1 giá trị nhưng viết 3 kiểu khác nhau!

# Fix: chuẩn hóa
df_messy["status"] = df_messy["status"].str.lower().str.strip()
print(f"After cleaning: {df_messy['status'].unique()}")
# → ['completed', 'cancelled'] ✅

⚠️ Trap thường gặp với Data Quality

  • Missing ≠ Xóa ngay: Không phải lúc nào cũng dropna(). Nếu cột region thiếu 5% → có thể fillna("Unknown"). Nếu cột amount thiếu → cân nhắc fillna(df["amount"].median()).
  • Duplicate ≠ Sai: Một khách hàng mua 2 lần cùng sản phẩm KHÔNG phải duplicate — chỉ duplicate khi order_id giống nhau.
  • Outlier ≠ Lỗi: Đơn hàng 50 triệu có thể là laptop, không phải lỗi nhập sai.

Checklist ISO 8000

  • [ ] Completeness: Kiểm tra isnull().sum() — ghi nhận % missing mỗi cột
  • [ ] Completeness: Quyết định strategy cho mỗi cột: drop, fillna(mean/median/mode), hoặc flag
  • [ ] Accuracy: Chạy df.describe() — kiểm tra min/max/mean có hợp lý không
  • [ ] Accuracy: Giá trị âm ở cột không nên âm? Số quá lớn hoặc quá nhỏ?
  • [ ] Consistency: Kiểm tra unique() — cùng 1 category có viết nhiều cách?
  • [ ] Consistency: Kiểm tra dtype — cột số có bị object? Cột ngày có đúng datetime?
  • [ ] Uniqueness: duplicated().sum() — có dòng trùng hoàn toàn?
  • [ ] Uniqueness: duplicated(subset=["id_column"]) — có trùng khóa?
  • [ ] Timeliness: Dữ liệu có nằm trong khoảng thời gian hợp lệ?

3️⃣ Notebook Best Practices

Giới thiệu

Jupyter Notebook là công cụ chính của Data Analyst — nhưng notebook cũng là nơi dễ bị "mess" nhất. Theo nghiên cứu của Joel Grus (Research Engineer tại Allen Institute for AI), trình bày tại JupyterCon 2018, phần lớn notebook trong thực tế không thể tái chạy (non-reproducible) do cell thứ tự lộn xộn, biến bị overwrite, hoặc thiếu documentation.

Các tổ chức như Google, Netflix, Airbnb đều publish internal notebook style guides. Buổi này tổng hợp các best practices từ các nguồn đó.

Áp dụng trong buổi học

Cell Ordering — Thứ tự cell

✅ Đúng thứ tự:

Cell 1: [Markdown] Title + mô tả mục tiêu
Cell 2: [Code] Import libraries
Cell 3: [Code] Load data
Cell 4: [Markdown] "## Data Audit"
Cell 5: [Code] df.info(), df.describe()
Cell 6: [Markdown] "## Data Cleaning"
Cell 7: [Code] Handle missing values
Cell 8: [Code] Remove duplicates
...
Cell N: [Markdown] "## Conclusion"
❌ Sai thứ tự — anti-pattern:

Cell 1: [Code] Chạy thử random
Cell 2: [Code] Import pandas (lẽ ra ở đầu!)
Cell 3: [Code] Load data lần 2 (duplicate)
Cell 4: [Code] cell cũ đã xóa output nhưng chưa xóa code
Cell 5: [Code] Dùng biến từ cell đã bị xóa → NameError

Restart & Run All — Test tái chạy

python
# Trước khi submit notebook:
# 1. Menu → Kernel → Restart & Run All
# 2. Nếu có cell nào lỗi → sửa ngay
# 3. Nếu chạy xong không lỗi → notebook reproducible ✅

💡 Quy tắc vàng của Notebook

"If you can't Restart & Run All successfully, it's not a notebook — it's a scratch pad." — Nếu không thể restart kernel và chạy lại từ đầu, đó không phải notebook, đó là giấy nháp.

Markdown Documentation — Ghi chú bằng Markdown

Mỗi notebook nên có:

PhầnVị tríNội dung
TitleCell đầu tiên# Tên project + mô tả ngắn
Section headersTrước mỗi phần## Data Loading, ## Cleaning, ## Analysis
Inline commentsTrong code cell# Giải thích logic phức tạp
InterpretationSau output→ 15% đơn hàng bị thiếu region — cần fillna
ConclusionCell cuốiTóm tắt kết quả + next steps

Naming Conventions — Quy tắc đặt tên

python
# ✅ Đúng — tên notebook mô tả nội dung + ngày
# HoTen_Buoi08_DataCleaning.ipynb
# 2026_02_ecommerce_cleaning.ipynb

# ❌ Sai — không biết notebook này làm gì
# Untitled.ipynb
# test.ipynb
# final_final_v2_REAL.ipynb
python
# ✅ Đúng — tên biến DataFrame rõ ràng
df_raw = pd.read_csv("orders.csv")          # Data gốc
df_clean = df_raw.dropna(subset=["amount"]) # Data đã clean
df_merged = pd.merge(df_clean, customers)   # Data đã merge

# ❌ Sai — df, df2, df3 không biết cái nào là cái nào
df = pd.read_csv("orders.csv")
df2 = df.dropna()
df3 = pd.merge(df2, customers)

Checklist Notebook Best Practices

  • [ ] Cell đầu tiên là Markdown — title, mô tả, ngày tạo
  • [ ] Cell thứ hai là imports — tất cả import nằm ở 1 cell duy nhất
  • [ ] Có section headers (## Markdown) trước mỗi phần chính
  • [ ] Restart & Run All chạy thành công từ đầu đến cuối
  • [ ] Không có cell trống hoặc cell test/debug còn sót
  • [ ] Tên notebook mô tả nội dung: HoTen_Project_Date.ipynb
  • [ ] Tên DataFrame prefix rõ: df_raw, df_clean, df_merged
  • [ ] Output cell quan trọng có interpretation bằng Markdown

📊 Bảng tổng hợp

Tiêu chuẩnPhạm viÁp dụng Buổi 8Mức độ bắt buộc
Tidy DataCấu trúc — cách tổ chức DataFrameMỗi biến 1 cột, mỗi quan sát 1 dòng, tách bảng đúng⭐⭐⭐ Nên tuân thủ — nền tảng cho mọi phân tích
ISO 8000Chất lượng — data quality dimensionsCompleteness, Accuracy, Consistency, Uniqueness checks⭐⭐⭐ Gần như bắt buộc — dữ liệu bẩn = kết quả sai
Notebook Best PracticesQuy trình — cách viết notebookCell order, markdown, restart & run all, naming⭐⭐ Nên tuân thủ — đặc biệt khi làm việc nhóm

⚠️ Quan trọng

Các tiêu chuẩn này không phải quy trình cứng nhắc — chúng là framework giúp bạn clean data có hệ thống thay vì "clean theo cảm tính". Trong thực tế, 90% lỗi phân tích bắt nguồn từ data quality — nắm vững ISO 8000 dimensions giúp bạn phát hiện vấn đề sớm trước khi nó ảnh hưởng đến insight.


📚 Tài liệu tham khảo

Tài liệuLinkGhi chú
Tidy Data Paper (Hadley Wickham)vita.had.co.nz/papers/tidy-data.pdfPaper gốc 2014 — Journal of Statistical Software
ISO 8000 Overviewiso.org/standard/81745.htmlTrang chính thức ISO 8000
Pandas Documentation — Working with Missing Datapandas.pydata.org/docs/user_guide/missing_data.htmlHướng dẫn chính thức xử lý missing values
Google Colab Best Practicescolab.research.google.comGoogle internal notebook guidelines
Joel Grus — I Don't Like NotebooksJupyterCon 2018 TalkPhê bình notebook practices — rất hay để hiểu anti-patterns
Pandas Cheat Sheet (DataCamp)datacamp.com/cheat-sheet/pandas-cheat-sheetQuick reference Pandas methods
Real Python — Pandas Data Cleaningrealpython.com/python-data-cleaning-numpy-pandasTutorial thực hành data cleaning