Lập trình
xử lý dữ liệu

Học kì 1, năm học 2026–2027

Viện Trí tuệ nhân tạo, Trường ĐH Công nghệ, ĐHQGHN

Bài 13
Trực quan hoá
nâng cao
& phản biện biểu đồ

seaborn, bản đồ, biểu đồ tương tác và cách thẩm định hình do AI sinh.

Bài trước

  • Bài 12 giới thiệu bốn dạng biểu đồ cơ bản và các nguyên tắc trình bày trung thực.
  • Bài này mở rộng sang biểu đồ thống kê nhiều chiều, bản đồ theo vùng và cách phản biện biểu đồ.

Tổng quan

  1. seaborn: hình thống kê cấp cao
  2. Bản đồ choropleth với GeoJSON
  3. Biểu đồ tương tác (giới thiệu)
  4. Phản biện biểu đồ
  5. Làm việc với AI thì sao?

1.
seaborn:
hình thống kê
cấp cao

Giao diện thống kê cấp cao được xây trên matplotlib.

set_theme: thiết lập phong cách chung

  • seaborn nhận DataFrame và tên cột; nhiều biểu đồ không cần gộp nhóm trước.
  • seaborn vẫn dùng matplotlib và trả về ax, nên có thể chỉnh tiếp như ở bài 12.

Boxplot: so sánh phân phối giữa các nhóm

Boxplot giá theo loại phòng
Mỗi hộp thể hiện trung vị và khoảng tứ phân vị (IQR) của một nhóm trên thang log. Hình cho thấy cả mức giá và độ chồng lấn giữa bốn phân phối.

hue: thể hiện nhóm bằng màu

Histogram giá hai quận theo hue

hue= tách nhóm bằng màu ngay trong lệnh vẽ; common_norm=False chuẩn hoá riêng từng nhóm để so hình dạng thay vì quy mô.

Heatmap: bảng pivot bằng màu

Heatmap giá theo quận và loại phòng
sns.heatmap(annot=True) dùng màu để so sánh nhanh các ô trong bảng pivot, đồng thời giữ lại giá trị ở từng ô.

Dữ liệu dạng dài phù hợp với seaborn

seaborn thường dùng dữ liệu có mỗi dòng là một quan sát và mỗi cột là một biến (tidy data). melt chuyển bảng pivot từ dạng rộng sang dạng dài.

FacetGrid: lưới nhiều biểu đồ nhỏ

📖 Tự học
  • sns.displot(..., col="snapshot") tạo một biểu đồ nhỏ cho mỗi mốc chụp, dùng chung thang đo.
  • Nhiều khung nhỏ cùng khuôn thường dễ đọc hơn một biểu đồ nhồi nhiều đường màu.
FacetGrid phân phối giá theo mốc chụp

2.
Bản đồ choropleth

Bổ sung ranh giới quận cho bản đồ điểm ở bài 12.

GeoJSON + geopandas + merge

Ba bước: đọc ranh giới → tính chỉ số theo quận → merge rồi plot(column=...). File GeoJSON có sẵn trong mỗi mốc chụp Inside Airbnb.

Kết quả và bẫy diện tích

Choropleth giá trung vị Santiago
Giá trung vị cao hơn ở khu vực đông bắc Santiago. Tuy nhiên, Lo Barnechea chiếm gần nửa diện tích bản đồ mà chỉ có 791 chỗ ở.

Choropleth: diện tích ≠ tầm quan trọng

Cẩn thận Vùng có diện tích lớn thường thu hút sự chú ý hơn vùng nhỏ, ngay cả khi có ít chỗ ở hơn. Choropleth thể hiện giá trị theo vùng, không thể hiện quy mô nguồn cung.
  • Luôn kèm bảng hoặc chú thích cỡ mẫu n của mỗi quận, hoặc thêm bản đồ thể hiện số chỗ ở.
  • Dùng một dải màu tuần tự từ nhạt đến đậm để thể hiện độ lớn.

3.
Biểu đồ tương tác

Dùng khi cần khám phá chi tiết của từng điểm dữ liệu.

plotly express: xem chi tiết khi rê chuột

Biểu đồ phân tán tương tác plotly

Cú pháp tương tự seaborn; biểu đồ HTML cho phép rê chuột xem tên chỗ ở, giá và quận của từng điểm (ảnh tĩnh minh hoạ nội dung hover).

Biểu đồ tĩnh hay tương tác?

Bối cảnh Lựa chọn
Khám phá dữ liệu, minh hoạ trên lớp, dashboard nội bộ biểu đồ tương tác (plotly; xem chi tiết khi rê chuột)
Báo cáo PDF, slide và bản in biểu đồ tĩnh (matplotlib/seaborn; dùng chú thích thay cho tương tác)

4.
Phản biện
ba biểu đồ lỗi

AI có thể tạo biểu đồ nhanh nhưng không bảo đảm cách trình bày đúng. Ba ví dụ sau minh hoạ những lỗi thường gặp.

Hình lỗi A

Biểu đồ trục kép
Hình gợi ra kết luận gì? Dữ liệu có đủ căn cứ không?

Hình A: trục kép

  • Hai trục y có thang đo riêng. Điều chỉnh ylim có thể làm hai đường trông đồng biến dù hình chưa chứng minh được tương quan.
  • Trục bên phải chỉ chạy từ 54 đến 63, nên biến động khoảng 5% trông lớn hơn thực tế.
Bản sửa: hai khung chung trục thời gian
Sửa: tách thành hai khung riêng, chung trục thời gian — không dựng tương quan giả.

Hình lỗi B

Biểu đồ tròn 12 lát
Đọc thử: Ñuñoa hơn hay kém La Florida bao nhiêu?

Hình B: biểu đồ tròn 12 lát

  • Biểu đồ có 12 lát và nhiều nhãn chồng lấn, nên khó so sánh chính xác các góc gần nhau.
  • Mười hai màu không mã hoá thêm thông tin và làm hình khó đọc hơn.
Bản sửa: thanh ngang xếp hạng
Sửa: thanh ngang xếp hạng — so bằng độ dài, đủ chỗ cho nhãn.

Hình lỗi C

Hai thành phố hai tiền tệ một trục
Có thể so trực tiếp CLP với BRL trên cùng một trục không?

Hình C: hồ sơ lỗi và bản sửa

CLP và BRL không thể so trực tiếp. Quy hai chuỗi về chỉ số với tháng đầu = 100 để so nhịp thay đổi:

Quy hai chuỗi về chỉ số 100
Hai chuỗi minh hoạ đã được quy về cùng mốc 100.

Năm câu hỏi để thẩm định một biểu đồ

Kiểm tra trước khi dùng biểu đồ
  1. Trục: bắt đầu từ đâu, có bị nén/cắt không, có trục kép không?
  2. Đơn vị và thang: các đại lượng trên cùng trục có cùng đơn vị không? Thang log hay thường?
  3. Cỡ mẫu: nhóm được vẽ có bao nhiêu quan sát (n)?
  4. Dạng hình có hợp câu hỏi không (pie 12 lát, 3D…)?
  5. Tiêu đề và lời diễn giải có vượt quá điều dữ liệu cho phép không?

Tổng kết

  • seaborn dùng DataFrame và tên cột để so sánh phân phối giữa các nhóm.
  • Bản đồ choropleth cần dữ liệu vùng, chỉ số đã gộp và cỡ mẫu của từng vùng.
  • Biểu đồ tương tác phù hợp để khám phá; biểu đồ tĩnh phù hợp để xuất bản.
  • Năm điểm cần kiểm tra là trục, đơn vị, cỡ mẫu, dạng biểu đồ và lời diễn giải.

Làm việc với AI thì sao?

🤖 Làm việc với AI
AI làm tốt Sinh mã nguồn seaborn hoặc plotly theo mô tả, gợi ý dạng biểu đồ và hỗ trợ sửa lỗi cú pháp geopandas.
AI hay sai Có thể dùng trục kép hoặc biểu đồ tròn quá nhiều lát, ghép hai đơn vị vào một trục, hoặc đặt tiêu đề vượt quá điều dữ liệu cho phép.

Kiểm chứng thế nào?

🤖 Làm việc với AI
  • Kiểm tra mọi hình do AI sinh bằng năm câu hỏi ở phần 4.
  • Tự tính lại ít nhất một giá trị trên hình và đối chiếu với dữ liệu nguồn.

Đọc thêm

  • VanderPlas, Python Data Science Handbook, 2nd ed. — mục Seaborn.
  • Tài liệu seaborn — tutorial gallery (chọn biểu đồ theo bài toán).
  • 📖 Tự học: Financial Times, Visual Vocabulary — hướng dẫn chọn dạng biểu đồ.