Python cho phân tích dữ liệu: pandas cơ bản với dữ liệu sản xuất | Ví dụ code

Python cho phân tích dữ liệu: pandas cơ bản với dữ liệu sản xuất | Ví dụ code
Nội dung bài viết 11 mục
  1. Khi nào nên dùng Python thay vì Excel?
  2. Chuẩn bị
  3. 1. Đọc dữ liệu
  4. 2. Làm sạch
  5. 3. Lọc và tính cột mới
  6. 4. Nhóm và tổng hợp (groupby)
  7. 5. Gộp bảng (merge)
  8. 6. Vẽ Pareto và xuất báo cáo
  9. Các thư viện nên biết
  10. Lỗi hay gặp
  11. Cần người làm giúp?

Tóm tắt nhanh

  • Python là ngôn ngữ lập trình miễn phí, phổ biến nhất cho phân tích dữ liệu; pandas là thư viện xử lý bảng dữ liệu.
  • Python mạnh khi: dữ liệu lớn, nhiều file, việc lặp lại, cần thống kê/học máy.
  • 6 thao tác cốt lõi: đọc – làm sạch – lọc – nhóm (groupby) – gộp bảng (merge) – xuất kết quả.
  • Không thay thế Excel/Power BI mà bổ sung: Python xử lý, Excel/Power BI trình bày.

Quy trình 6 thao tác xử lý dữ liệu với pandas

Khi nào nên dùng Python thay vì Excel?

Tình huốngExcelPython
Vài nghìn dòng, phân tích một lầnPhù hợpKhông cần
Gộp 200 file log máy mỗi tuầnChậm, dễ saiVài giây, lặp lại được
Hàng triệu dòng dữ liệu cảm biếnQuá giới hạnPhù hợp
Thống kê nâng cao, học máyHạn chếThư viện đầy đủ (scipy, scikit-learn)
Người xem cuối là lãnh đạoPhù hợpXuất ra Excel/Power BI

Chuẩn bị

Cài Anaconda (đã có sẵn Python, pandas, Jupyter Notebook) hoặc dùng Google Colab miễn phí trên trình duyệt. Jupyter Notebook cho phép chạy từng đoạn code và xem kết quả ngay — rất hợp để khám phá dữ liệu.

1. Đọc dữ liệu

import pandas as pd
from pathlib import Path

# Đọc một file
df = pd.read_excel("kiem_tra_2026_10.xlsx", sheet_name="Data")

# Gộp tất cả file trong thư mục
files = Path("bao_cao_loi").glob("*.xlsx")
df = pd.concat([pd.read_excel(f).assign(nguon=f.name) for f in files],
               ignore_index=True)

df.head()      # 5 dòng đầu
df.info()      # kiểu dữ liệu, số ô trống
df.describe()  # thống kê mô tả

2. Làm sạch

df.columns = df.columns.str.strip().str.lower()       # tên cột gọn
df["day_chuyen"] = df["day_chuyen"].str.strip().str.upper()
df["ngay"] = pd.to_datetime(df["ngay"], dayfirst=True, errors="coerce")
df = df.drop_duplicates(subset=["so_phieu"])          # bỏ phiếu trùng
df["so_loi"] = df["so_loi"].fillna(0)
print(df["ngay"].isna().sum(), "dòng ngày không hợp lệ")

3. Lọc và tính cột mới

thang10 = df[(df["ngay"] >= "2026-10-01") & (df["ngay"] < "2026-11-01")]
df["ti_le_loi"] = df["so_loi"] / df["so_kiem"]
df["thang"] = df["ngay"].dt.to_period("M")

4. Nhóm và tổng hợp (groupby)

theo_dc = (df.groupby("day_chuyen")
             .agg(so_kiem=("so_kiem", "sum"), so_loi=("so_loi", "sum"))
             .assign(ti_le=lambda x: x.so_loi / x.so_kiem)
             .sort_values("ti_le", ascending=False))

bang_thang = df.pivot_table(index="thang", columns="day_chuyen",
                            values="so_loi", aggfunc="sum", fill_value=0)

Lưu ý: tỉ lệ lỗi phải tính bằng tổng lỗi / tổng kiểm, không lấy trung bình của cột tỉ lệ.

5. Gộp bảng (merge)

sp = pd.read_excel("danh_muc_san_pham.xlsx")   # ma_sp, ten_sp, khach_hang
df = df.merge(sp, on="ma_sp", how="left")
print(df["ten_sp"].isna().sum(), "dòng không tìm thấy mã sản phẩm")

how="left" tương đương LEFT JOIN trong SQL.

6. Vẽ Pareto và xuất báo cáo

import matplotlib.pyplot as plt

p = df.groupby("ma_loi")["so_loi"].sum().sort_values(ascending=False)
cum = p.cumsum() / p.sum() * 100

fig, ax = plt.subplots(figsize=(9, 4))
ax.bar(p.index, p.values)
ax2 = ax.twinx(); ax2.plot(p.index, cum.values, marker="o", color="red")
ax2.axhline(80, ls="--", color="gray"); ax2.set_ylim(0, 105)
plt.title("Pareto lỗi tháng 10"); plt.tight_layout()
plt.savefig("pareto.png", dpi=150)

with pd.ExcelWriter("bao_cao.xlsx") as w:
    theo_dc.to_excel(w, sheet_name="Theo day chuyen")
    bang_thang.to_excel(w, sheet_name="Theo thang")

Xem cách đọc biểu đồ tại Pareto chart.

Các thư viện nên biết

Thư việnDùng để
pandasXử lý bảng dữ liệu
numpyTính toán số học
matplotlib, seaborn, plotlyVẽ biểu đồ
scipy, statsmodelsKiểm định thống kê, hồi quy
scikit-learnHọc máy
openpyxlĐọc ghi Excel, định dạng

Lỗi hay gặp

  • Ngày bị đảo ngày/tháng vì không đặt dayfirst=True.
  • Gộp bảng với danh mục có mã trùng → số dòng tăng bất thường; kiểm tra len(df) trước và sau merge.
  • Sửa dữ liệu trong notebook rồi quên lưu lại các bước → không lặp lại được.

Cần người làm giúp?

Industrial Knowledge viết script Python gộp, làm sạch dữ liệu và xuất báo cáo tự động theo quy trình riêng của nhà máy. Xem dịch vụ.

Bản tin Industrial Knowledge

Mỗi tuần một công cụ, đọc trong 5 phút

Đăng ký nhận bản tin và checklist 8D miễn phí (PDF). Không spam, hủy bất cứ lúc nào.