
7 Bước Tự Động Hóa Thống Kê Mô Tả Bằng Python
Ngừng viết hàm mean() và std() cho từng cột. Hãy tìm hiểu cách tự động hóa thống kê mô tả trong Python và tạo các bảng tóm tắt sẵn sàng để xuất bản chỉ trong vài bước.
7 bước tự động hóa thống kê mô tả bằng Python - KDnuggets
Blog
Bài viết hàng đầu
Giới thiệu
Chủ đề
AI
Lời khuyên nghề nghiệp
Thị giác máy tính
Kỹ thuật dữ liệu
Khoa học dữ liệu
Mô hình ngôn ngữ
Học máy
MLOps
NLP
Lập trình
Python
SQL
Bộ dữ liệu
Sự kiện
Tài nguyên
Tài liệu tham khảo nhanh
Đề xuất
Báo cáo kỹ thuật
Quảng cáo
Tham gia Bản tin
7 bước tự động hóa thống kê mô tả bằng Python
Ngừng viết mean() và std() cho từng cột. Tìm hiểu cách tự động hóa thống kê mô tả trong Python và tạo bảng tóm tắt sẵn sàng xuất bản chỉ trong vài bước.
Bởi Kanwal Mehreen, Biên tập viên kỹ thuật & Chuyên gia nội dung của KDnuggets vào ngày 9/7/2026 trong Python
# Giới thiệu
Mọi phân tích đều bắt đầu giống nhau: tải một tập dữ liệu và cố gắng tìm hiểu nội dung thực sự của nó. Có bao nhiêu hàng? Cột nào là số? Có bao nhiêu dữ liệu bị thiếu? Có điều gì bị lệch nghiêm trọng không? Hầu hết chúng ta trả lời những câu hỏi đó bằng cách sao chép các đoạn mã df.describe(), df.isna().sum() và df.groupby(...).agg(...) mà chúng ta đã gõ hàng nghìn lần, sau đó định dạng lại đầu ra bằng tay khi đến lúc đưa vào báo cáo.
Đó là sự lãng phí công sức. Hệ sinh thái Python hiện có các công cụ giúp bạn chuyển từ DataFrame thô sang bảng tóm tắt được định dạng, có thể chia sẻ chỉ trong một hoặc hai dòng — và các công cụ khác được xây dựng đặc biệt để tạo ra loại "Bảng 1" mà bạn thường thấy trong các bài báo nghiên cứu. Hướng dẫn này sẽ hướng dẫn bạn 7 bước để xây dựng một quy trình lặp lại thay vì một đống đoạn mã dùng một lần. Chúng ta sẽ sử dụng tập dữ liệu Palmer Penguins xuyên suốt. Nó nhỏ, mở và có sự kết hợp thực tế giữa các cột số và phân loại, các giá trị bị thiếu thực tế và một biến nhóm tự nhiên (loài). Vậy hãy bắt đầu.
# 1. Thiết lập môi trường và tải dữ liệu
Cài đặt các gói chúng ta sẽ sử dụng trong hướng dẫn này:
pip install pandas seaborn skimpy tableone great-tables fg-data-profiling
Một lưu ý quan trọng về gói cuối cùng: thư viện lập hồ sơ phổ biến đã được đổi tên nhiều lần. Ban đầu nó là pandas-profiling, trở thành ydata-profiling vào năm 2023 và được đổi tên lại thành fg-data-profiling vào tháng 4/2026. Gói ydata-profiling cũ hơn vẫn cài đặt và chạy, nhưng nó không còn nhận được cập nhật, vì vậy các dự án mới nên ưu tiên fg-data-profiling. Chúng ta sẽ đề cập đến cả hai kiểu nhập trong Bước 5.
Bây giờ hãy tải dữ liệu. Seaborn có một tập dữ liệu chim cánh cụt tích hợp sẵn, giúp chúng ta không phải tải xuống:
import pandas as pd
import seaborn as sns
df = sns.load_dataset("penguins")
print(df.shape)
print(df.dtypes)
print(df.isna().sum())
Đầu ra:
(344, 7)
species object
island object
bill_length_mm float64
bill_depth_mm float64
flipper_length_mm float64
body_mass_g float64
sex object
dtype: object
species 0
island 0
bill_length_mm 2
bill_depth_mm 2
flipper_length_mm 2
body_mass_g 2
sex 11
dtype: int64
Bạn sẽ thấy bảy cột: ba cột phân loại (species, island, sex) và bốn phép đo số (bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g). Các phép đo có 2 giá trị bị thiếu mỗi cột, và cột sex có 11 giá trị bị thiếu. Hãy ghi nhớ chi tiết này — chúng ta sẽ xem mỗi công cụ báo cáo dữ liệu bị thiếu này như thế nào.
# 2. Lấy đường cơ sở với df.describe()
Hàm `describe()` tích hợp của Pandas là điểm khởi đầu rõ ràng và có lý do chính đáng. Hàm này hoạt động tức thì và không yêu cầu cài đặt bổ sung:
`df.describe().round(2)`
Kết quả:
bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
count 342.00 342.00 342.00 342.00
mean 43.92 17.15 200.92 4201.75
std 5.46 1.97 14.06 801.95
min 32.10 13.10 172.00 2700.00
25% 39.22 15.60 190.00 3550.00
50% 44.45 17.30 197.00 4050.00
75% 48.50 18.70 213.00 4750.00
max 59.60 21.50 231.00 6300.00
Kết quả này thực sự hữu ích, nhưng cần lưu ý những điểm hạn chế của nó. Theo mặc định, hàm này bỏ qua hoàn toàn các cột phân loại. Hàm cung cấp số lượng giá trị không rỗng nhưng không trực tiếp cho biết tỷ lệ phần trăm thiếu. Hàm cũng chỉ dừng lại ở tóm tắt năm số – không có độ xiên, không có độ nhọn, không có cảm nhận về hình dạng phân phối. Đối với một kiểm tra nhanh, hàm này là đủ, nhưng làm nền tảng cho một báo cáo thì còn nhiều thiếu sót. Bước tiếp theo sẽ khắc phục một số thiếu sót đó mà không cần rời khỏi Pandas.
# 3. Đẩy mạnh Pandas với `include`, `.agg()` và `groupby`
Trước khi sử dụng các gói bên ngoài, cần biết Pandas có thể hỗ trợ đến mức nào – bởi vì đối với nhiều công việc hàng ngày, điều này là đủ.
Đầu tiên, gộp các cột phân loại vào cùng một bản tóm tắt với `include="all"`:
`df.describe(include="all").round(2)`
Kết quả:
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
count 344 344 342.00 342.00 342.00 342.00 333
unique 3 3 NaN NaN NaN NaN 2
top Adelie Biscoe NaN NaN NaN NaN Male
freq 152 168 NaN NaN NaN NaN 168
mean NaN NaN 43.92 17.15 200.92 4201.75 NaN
std NaN NaN 5.46 1.97 14.06 801.95 NaN
min NaN NaN 32.10 13.10 172.00 2700.00 NaN
25% NaN NaN 39.22 15.60 190.00 3550.00 NaN
50% NaN NaN 44.45 17.30 197.00 4050.00 NaN
75% NaN NaN 48.50 18.70 213.00 4750.00 NaN
max NaN NaN 59.60 21.50 231.00 6300.00 NaN
Hiện tại, bạn nhận được các giá trị `unique`, `top` và `freq` cho các cột văn bản cùng với các số liệu thống kê số (với `NaN` điền vào các ô mà một thống kê không áp dụng). Một bảng, mọi cột.
Thứ hai, xây dựng một bản tóm tắt tùy chỉnh với `.agg()` để bạn kiểm soát chính xác những số liệu thống kê nào xuất hiện – bao gồm cả những số liệu mà `describe()` bỏ qua, như độ xiên và độ nhọn – và thêm tỷ lệ phần trăm dữ liệu thiếu:
`numeric = df.select_dtypes("number")`
`summary = numeric.agg(["mean", "median", "std", "skew", "kurt"]).T`
`summary["missing_pct"] = df[numeric.columns].isna().mean().mul(100).round(1)`
`summary.round(2)`
Kết quả:
mean median std skew kurt missing_pct
bill_length_mm 43.92 44.45 5.46 0.05 -0.88 0.6
bill_depth_mm 17.15 17.30 1.97 -0.14 -0.91 0.6
flip
Nguồn tin: KDnuggets — Tác giả: Kanwal Mehreen. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.