Python - Bài 25: Dự án EDA - Kể chuyện bằng dữ liệu (Khoa học Dữ liệu & ML)

🔬 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ố.

Quy trinh EDA (Kham pha du lieu)📁1. Napread_csv🧹2. Lam sachdropna/fillna📈3. Thong kedescribe📊4. Truc quanmatplotlib💡5. Ket luaninsightDu lieu tho → Cau chuyen co y nghia
Hinh 1: Nam buoc cua mot du an EDA hoan chinh.

1. EDA là gì? Tại sao phải "hỏi chuyện" dữ liệu?

🟢 Lớp A · Trực giác

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.

🔵 Lớp B · Cơ chế

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
🟣 Lớp C · Nghiên cứu

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 đồ

🟢 Lớp A · Trực giác

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).

🔵 Lớp B · Cơ chế

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
🟣 Lớp C · Nghiên cứu

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.

Ba cau hoi de "hoi chuyen" du lieu1. Phan bo the nao?Histogram2. Nhom nao khac nhau?Bar chart theo nhom3. Co lien he khong?Scatter (tuong quan)
Hinh 2: Moi loai bieu do tra loi mot loai cau hoi khac nhau.

3. Từ số đến insight (kết luận có ý nghĩa)

🟢 Lớp A · Trực giác

"Đ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ú ý".

🔵 Lớp B · Cơ 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
🟣 Lớp C · Nghiên cứu

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ệnhCông dụngBước EDA
df.shapeKích thước (dòng, cột)Nắm tổng quan
df.info()Kiểu dữ liệu + giá trị thiếuNắ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ómThống kê
plt.hist(...)Xem phân bốTrực quan
plt.bar(...)So sánh giữa các nhómTrực quan
plt.scatter(...)Xem liên hệ giữa 2 biếnTrự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?

Histogram (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ô?

Insight mô tả mối quan hệ/xu hướng có ý nghĩa, không chỉ là một con số đơn lẻ.

Câu 5: Thấy hai biến cùng tăng (tương quan). Kết luận nào đúng?

Correlation ≠ causation. Có thể có biến thứ ba (confounder) gây ra cả hai.

💻 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.

Bieu do EDA

💡 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.