Lộ Trình Hoàn Chỉnh Seaborn Trong 2 Ngày
Mục tiêu: Nắm bắt các nguyên tắc cơ bản của Seaborn trong phân tích dữ liệu với bộ dữ liệu tips. Hướng dẫn này bao gồm thiết lập, giải thích, ví dụ mã, cạm bẫy, điểm kiểm tra và một dự án nhỏ. Cuối cùng, bạn sẽ có kỹ năng trực quan hóa sẵn sàng cho công việc.
Mục tiêu chính:
- Bộ dữ liệu:
sns.load_dataset("tips") - Tập trung: Phân tích khám phá dữ liệu (EDA) • Kể chuyện • Hình ảnh rõ ràng
- Kết quả: Kỹ năng vẽ đồ thị sẵn sàng cho công việc
Lưu ý: Đừng ghi nhớ. Đối với mỗi chủ đề:
- Chạy ví dụ
- Điều chỉnh 2–3 tham số
- Viết một hiểu biết bằng tiếng Việt đơn giản
Yêu cầu:
- Python ≥ 3.9
- Thư viện: pandas, numpy, matplotlib, seaborn
- IDE: Jupyter/Colab hoặc bất kỳ IDE Python nào
0) Thiết lập nhanh
python
pip install seaborn matplotlib pandas numpy
python
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")
tips.head()
Cột trong bộ dữ liệu:
total_bill, tip, sex, smoker, day, time, size
📅 Ngày 1 — Nền tảng & EDA chính
Mục tiêu: Hiểu API của Seaborn, khám phá phân phối, so sánh các danh mục và quét các mối quan hệ theo cặp nhanh chóng.
1) Cơ bản về Seaborn: Mức độ Figure vs Mức độ Axes
- Mức độ Axes → ví dụ:
sns.scatterplot(vẽ trên Axes của Matplotlib, trả vềAxes) - Mức độ Figure → ví dụ:
sns.catplot,sns.pairplot(quản lý figure/layout của riêng nó) - Tham số phổ biến:
data=,x=,y=,hue=,style=,size=
2) Phân phối đơn biến
Sử dụng những điều này để hiểu hình dạng, trung bình, độ phân tán và ngoại lệ:
histplot— biểu đồ histogram (+ tùy chọn KDE)kdeplot— ước lượng mật độ hạt nhânecdfplot— ECDF thực nghiệm (tuyệt vời cho giá trị trung bình & phân vị)countplot— tần số cho các biến phân loại
python
# Biểu đồ Histogram & KDE
sns.histplot(tips, x="total_bill", bins=20, kde=True)
plt.title("Phân phối Tổng Bill")
plt.show()
# ECDF
sns.ecdfplot(tips, x="tip")
plt.title("ECDF của Tip")
plt.show()
# Count
sns.countplot(data=tips, x="day")
plt.title("Số lượng theo Ngày")
plt.show()
Khi nào sử dụng: kiểm tra độ tin cậy, tính bất đối xứng, chọn biến đổi, phát hiện ngoại lệ.
3) So sánh Danh mục ↔ Số liệu
So sánh phân phối giữa các nhóm:
boxplot— trung vị, IQR, râu, ngoại lệviolinplot— phân phối đầy đủ thông qua KDEboxenplot— dành cho mẫu lớnstripplot/swarmplot— điểm dữ liệu thôbarplot/pointplot— trung bình/CI được tổng hợp
python
# Box vs Violin
fig, ax = plt.subplots(1,2, figsize=(10,4))
sns.boxplot(data=tips, x="day", y="total_bill", ax=ax[0])
sns.violinplot(data=tips, x="day", y="tip", ax=ax[1])
ax[0].set_title("Tổng Bill theo Ngày")
ax[1].set_title("Tip theo Ngày")
plt.tight_layout(); plt.show()
4) Mối quan hệ Số liệu ↔ Số liệu
Bắt đầu với biểu đồ phân tán, có thể thêm hồi quy.
python
# Biểu đồ phân tán cơ bản
sns.scatterplot(data=tips, x="total_bill", y="tip")
plt.title("Tổng Bill vs Tip")
plt.show()
5) Quét Nhanh Theo Cặp
python
sns.pairplot(tips, hue="sex", diag_kind="hist")
plt.suptitle("Mối quan hệ Theo Cặp (tips)", y=1.02)
plt.show()
✅ Điểm kiểm tra (Ngày 1 xong): Bạn có thể đọc phân phối, so sánh nhóm và xem các xu hướng theo cặp. Viết 3 hiểu biết từ bộ dữ liệu.
📅 Ngày 2 — Đa biến, Facets, Tương quan & Tạo kiểu
Mục tiêu: Thêm faceting, tương quan, bảng màu và tạo hình ảnh sẵn sàng cho bài thuyết trình.
6) Faceting & Nhiều Đồ Thị Nhỏ
Chia dữ liệu thành các subplot theo danh mục.
python
# Facet theo smoker
sns.catplot(data=tips, x="day", y="tip", hue="sex", col="smoker", kind="bar")
plt.suptitle("Tips theo Ngày (phân theo Smoker)", y=1.02)
plt.show()
7) Tương quan & Bảng Nhiệt
python
corr = tips[["total_bill","tip","size"]].corr()
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", square=True)
plt.title("Tương quan (tips)")
plt.show()
8) Xu hướng Thời gian/Thứ tự
python
avg = tips.groupby("size", as_index=False)["tip"].mean()
sns.lineplot(data=avg, x="size", y="tip")
plt.title("Tip Trung Bình theo Kích Thước Nhóm")
plt.show()
9) Tạo kiểu, Bảng màu & Bố cục
python
sns.set_theme(style="whitegrid", context="talk", palette="deep")
ax = sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex")
ax.set_title("Tips vs Tổng Bill")
ax.set_xlabel("Tổng Bill ($)")
ax.set_ylabel("Tip ($)")
sns.despine()
plt.tight_layout(); plt.show()
10) Chú giải, Chú thích & Lưu trữ
python
ax = sns.regplot(data=tips, x="total_bill", y="tip")
ax.annotate("Tips cao hơn với hóa đơn cao hơn",
xy=(40,7), xytext=(25,8.5),
arrowprops=dict(arrowstyle="->", color="white"))
ax.legend_.remove() if ax.legend_ else None
plt.tight_layout()
plt.savefig("tips_scatter.png", dpi=300, bbox_inches="tight", transparent=True)
plt.show()
11) Cheat-Sheet: Mức độ Axes vs Mức độ Figure
- Mức độ Axes:
scatterplot,lineplot,histplot,kdeplot,boxplot,violinplot,heatmap,regplot… - Mức độ Figure:
relplot,catplot,jointplot,pairplot,lmplot…
12) Cạm bẫy Thường gặp
- Quá tải dữ liệu → sử dụng alpha,
hexbin, hoặckdeplot - Đừng dựa vào mặc định → luôn đặt tiêu đề/nhãn
- Đối với các nhóm → ưu tiên violin/box + strip hơn là trung bình thanh
- Giữ ngữ nghĩa màu sắc đồng nhất
✅ Điểm kiểm tra (Ngày 2 xong): Bạn có thể phân đoạn, so sánh xu hướng đa biến, tạo kiểu cho rõ ràng và xuất bản.
Dự án Nhỏ (Sản phẩm)
Câu hỏi: Những yếu tố nào thúc đẩy tips cao hơn?
Bước:
- Đơn biến: phân phối của
total_bill,tip - Nhóm:
tiptheoday,sex,smoker,time - Mối quan hệ:
total_bill↔tip(thêm hue & hồi quy) - Bảng nhiệt tương quan cho các biến số
- Phân đoạn theo smoker/time
- Báo cáo: 5 hiểu biết + 2 biểu đồ cho LinkedIn/portfolio
python
import numpy as np
tips = sns.load_dataset("tips").assign(tip_pct=lambda d: d["tip"] / d["total_bill"] * 100)
# 1) Phân phối
sns.histplot(tips, x="tip_pct", bins=20, kde=True)
plt.title("Phân Phối % Tip"); plt.show()
Danh sách Kiểm tra Thực hành
- Vẽ biểu đồ hist+KDE cho
total_bill; mô tả tính bất đối xứng - So sánh
tiptheodaysử dụng box+strip - Biểu đồ phân tán
total_billvstipvớihue=sex,style=smoker - Tạo
pairplotvớihue=time - Xây dựng bảng nhiệt tương quan; viết 2 diễn giải
- Phân đoạn biểu đồ thanh theo
smokervàtime - Xuất một hình ảnh với 300 DPI có nền trong suốt
Tham khảo Nhanh
API thường dùng nhất:
scatterplot,lineplot,histplot,kdeplot,ecdfplotboxplot,violinplot,stripplot,barplot,pointplotpairplot,jointplot,relplot,catplotheatmap,clustermap,regplot
Tạo kiểu:
sns.set_theme(style, palette, context)sns.despine(),plt.tight_layout()- Bảng màu:
deep,muted,pastel,bright,dark,colorblind
Viết cho: Nivesh Bansal — Hành trình Phân tích Dữ liệu, Ngày 10. Bạn có thể sao chép bất kỳ khối mã nào và thực hành trực tiếp.
Chúc bạn vẽ đồ thị vui vẻ!