🔬 Bài 25: Dự án EDA — Kể chuyện bằng dữ liệu (Khoa học Dữ liệu & ML)
🎯 Sau bài này bạn sẽ: tự chy một dự án EDA nối tiếp 5 bước, biết đặt câu hỏi cho dữ liệu, chọn biểu đồ phù hợp, và viết ra insight thay vì chỉ liệt kê số.
1. EDA là gì? Tại sao phải "hỏi chuyện" dữ liệu?
EDA (Exploratory Data Analysis — phân tích khám phá) giống như lần đầu bạn gặp một người bạn mới: bạn hỏi chuyện để hiểu họ là ai. Với dữ liệu cũng vậy — bạn xem nó lớn cỡ nào, có chỗ nào lạ không, các cột liên hệ ra sao.
Một vòng EDA cơ bản bằng pandas: xem kích thước và kiểu dữ liệu, xem thống kê tóm tắt, rồi nhìn vài dòng đầu.
print(df.shape) # (so dong, so cot) print(df.info()) # kieu du lieu + so gia tri thieu print(df.describe()) # min/max/mean/std cho cot so df.head() # 5 dong dau
Nhà thống kê John Tukey đặt ra thuật ngữ EDA nhằm nhấn mạnh: nhìn dữ liệu trước khi kiểm định giả thuyết. Bỏ qua EDA dễ dẫn đến chọn sai mô hình, hiểu sai outlier, hoặc bỏ lọt rò rỉ dữ liệu.
2. Đặt câu hỏi & chọn biểu đồ
Biểu đồ không phải để "cho đẹp" — mỗi loại trả lời một câu hỏi: phân bố (histogram), so sánh nhóm (bar), liên hệ (scatter).
Ví dụ ba loại biểu đồ cơ bản trong matplotlib:
plt.hist(df["diem"]) # phan bo plt.bar(df["ten"], df["diem"]) # so sanh nhom plt.scatter(df["gio_hoc"], df["diem"]) # lien he
Trong nghiên cứu, một câu hỏi tốt phải có thể kiểm chứng. Thấy hai biến cùng tăng (tương quan) không đồng nghĩa nhân quả — correlation ≠ causation.
3. Từ số đến insight (kết luận có ý nghĩa)
"Điểm trung bình là 7.8" chưa phải insight — đó chỉ là con số. Insight là: "Lớp học nhiều giờ có xu hướng điểm cao hơn, nhưng bạn An là ngoại lệ đáng chú ý".
Dùng groupby để tóm tắt theo nhóm — thường là bước biến số thành câu chuyện:
df.groupby("to")["diem"].mean() # diem TB moi to df["diem"].idxmax() # vi tri diem cao nhat
Một báo cáo EDA tốt nêu rõ: câu hỏi — bằng chứng (số/biểu đồ) — giới hạn (cỡ mẫu nhỏ, thiếu dữ liệu). Đó là nền tảng cho mọi bài báo khoa học.
⚠️ Cạm bẫy thường gặp: đừng vội kết luận từ mẫu quá nhỏ (4–5 dòng), đừng bỏ qua giá trị thiếu, và luôn kiểm tra outlier trước khi tính trung bình.
📝 Bảng ghi nhớ: công cụ EDA
| Lệnh | Công dụng | Bước EDA |
|---|---|---|
df.shape | Kích thước (dòng, cột) | Nắm tổng quan |
df.info() | Kiểu dữ liệu + giá trị thiếu | Nắm tổng quan |
df.describe() | Thống kê tóm tắt cột số | Thống kê |
df.groupby(...) | Tóm tắt theo nhóm | Thống kê |
plt.hist(...) | Xem phân bố | Trực quan |
plt.bar(...) | So sánh giữa các nhóm | Trực quan |
plt.scatter(...) | Xem liên hệ giữa 2 biến | Trực quan |
✎ Kiểm tra nhanh (5 câu)
Câu 1: Lệnh nào cho biết số dòng và số cột của bảng?
df.shape trả về bộ (số dòng, số cột) — bước đầu tiên của EDA.Câu 2: Muốn xem phân bố của một cột số, dùng biểu đồ nào?
plt.hist) chia giá trị thành các khoảng và đếm tần suất — cho thấy phân bố.Câu 3: Muốn tính điểm trung bình theo từng tổ, dùng lệnh nào?
groupby("to") gom theo tổ, rồi ["diem"].mean() tính trung bình mỗi nhóm.Câu 4: Đâu là một insight chứ không phải con số khô?
Câu 5: Thấy hai biến cùng tăng (tương quan). Kết luận nào đúng?
💻 Thực hành: Dự án EDA mini với Python thật
Dưới đây là một dự án EDA hoàn chỉnh: nạp dữ liệu lớp 6A, xem thống kê, tính trung bình, rồi vẽ biểu đồ. Bấm ▶ Khởi động Python (tải pandas + matplotlib, mất ~10 giây), sau đó bấm ▶ Chạy. Gọi show_plot() để hiện biểu đồ.
🔌 Python chưa khởi động.
💡 Thử thách: Thêm dòng print(df.groupby(df["diem"]>=8)["ten"].count()) để đếm xem có bao nhiêu bạn đạt từ 8 điểm trở lên. Hoặc đổi scatter thành bar để so sánh điểm từng bạn.