Python cho Data Analytics: Matplotlib, Seaborn và Trực quan hóa Dữ liệu cho Phỏng vấn

Làm chủ trực quan hóa dữ liệu Python với Matplotlib và Seaborn. Hướng dẫn thực hành bao gồm biểu đồ, styling, subplot và các câu hỏi phỏng vấn thường gặp cho vị trí data analytics năm 2026.

Trực quan hóa dữ liệu Python với Matplotlib và Seaborn cho phỏng vấn data analytics

Trực quan hóa dữ liệu Python là một trong những kỹ năng được kiểm tra nhiều nhất trong các buổi phỏng vấn data analytics. Nhà tuyển dụng mong đợi ứng viên có khả năng tạo ra các biểu đồ rõ ràng, dễ đọc từ dữ liệu thô — và giải thích các lựa chọn thiết kế của mình một cách tự tin.

Bài hướng dẫn này đề cập đến Matplotlib 3.10 và Seaborn 0.13, hai thư viện chiếm ưu thế trong các buổi phỏng vấn kỹ thuật cho vị trí phân tích và khoa học dữ liệu. Mọi đoạn mã đều có thể chạy trực tiếp với Python 3.12+.

Mẹo Phỏng vấn

Phần lớn các buổi phỏng vấn data analytics bao gồm một vòng live coding, nơi ứng viên phải tạo ra biểu đồ trực quan từ tập dữ liệu trong vòng chưa đầy 15 phút. Các mẫu dưới đây ánh xạ trực tiếp vào những bài tập đó.

Thiết lập Môi trường Trực quan hóa Dữ liệu Python

Trước khi viết bất kỳ đoạn mã biểu đồ nào, môi trường phát triển cần các dependency phù hợp. Một virtual environment sạch sẽ giúp tránh xung đột phiên bản giữa Matplotlib, Seaborn và nền tảng NumPy/Pandas chung.

bash
# setup.sh
python -m venv venv
source venv/bin/activate
pip install matplotlib==3.10.8 seaborn==0.13.2 pandas numpy

Kiểm tra nhanh để xác nhận mọi thứ hoạt động:

python
# verify_install.py
import matplotlib
import seaborn as sns
import pandas as pd

print(f"Matplotlib: {matplotlib.__version__}")
print(f"Seaborn: {sns.__version__}")
print(f"Pandas: {pd.__version__}")

Sau khi các dependency đã được cố định, bước tiếp theo tập trung vào các kiến thức cơ bản của Matplotlib — nền tảng cho mọi biểu đồ Seaborn.

Nền tảng Matplotlib: Figure, Axes và API Hướng Đối tượng

Matplotlib cung cấp hai API: state machine pyplot và giao diện hướng đối tượng (OO). API OO mang lại quyền kiểm soát rõ ràng đối với từng phần tử và là chuẩn mực được kỳ vọng trong mã nguồn chuyên nghiệp cũng như trong phỏng vấn.

python
# bar_chart_oo.py
import matplotlib.pyplot as plt
import numpy as np

# Sample quarterly revenue data
quarters = ["Q1", "Q2", "Q3", "Q4"]
revenue = [42_000, 58_000, 51_000, 67_000]

# Create figure and axes explicitly
fig, ax = plt.subplots(figsize=(8, 5))

# Draw bars with a specific color
ax.bar(quarters, revenue, color="#2563eb", width=0.5)

# Label axes clearly — interviewers check for this
ax.set_xlabel("Quarter")
ax.set_ylabel("Revenue (USD)")
ax.set_title("Quarterly Revenue — 2025")

# Format y-axis with dollar amounts
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))

# Remove top and right spines for a cleaner look
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("quarterly_revenue.png", dpi=150)
plt.show()

Những chi tiết quan trọng mà người phỏng vấn chú ý: việc tạo fig, ax một cách tường minh thay vì dùng plt.plot(), nhãn trục rõ ràng, giá trị tick được định dạng, và loại bỏ các thành phần biểu đồ không cần thiết (spines thừa). Những lựa chọn nhỏ này thể hiện tư duy sẵn sàng cho môi trường production.

Xây dựng Subplot cho Phân tích So sánh

Các buổi phỏng vấn thường yêu cầu so sánh nhiều chỉ số cạnh nhau. Hàm subplots() xử lý việc này với bố cục dạng lưới.

python
# subplots_comparison.py
import matplotlib.pyplot as plt
import numpy as np

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
users = [1200, 1350, 1500, 1420, 1680, 1820]
revenue = [24_000, 27_000, 30_000, 28_400, 33_600, 36_400]

# Two side-by-side plots sharing the x-axis
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5), sharey=False)

# Left panel: user growth as a line chart
ax1.plot(months, users, marker="o", color="#2563eb", linewidth=2)
ax1.set_title("Monthly Active Users")
ax1.set_ylabel("Users")
ax1.spines[["top", "right"]].set_visible(False)

# Right panel: revenue as a bar chart
ax2.bar(months, revenue, color="#16a34a", width=0.5)
ax2.set_title("Monthly Revenue")
ax2.set_ylabel("Revenue (USD)")
ax2.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax2.spines[["top", "right"]].set_visible(False)

fig.suptitle("Product Metrics — H1 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("product_metrics.png", dpi=150)
plt.show()

Việc sử dụng sharey=False cho phép mỗi panel có thang đo riêng — doanh thu tính bằng đô la và số người dùng là số đếm có độ lớn khác nhau. Hàm suptitle thêm tiêu đề bao quát phía trên cả hai subplot.

Lỗi Thường Gặp Trong Phỏng vấn

Ứng viên thường sử dụng plt.plot() cho mọi nhu cầu trực quan hóa thay vì API hướng đối tượng. Khi người phỏng vấn yêu cầu thêm trục y thứ hai hoặc điều chỉnh một subplot đơn lẻ, cách tiếp cận pyplot trở nên bất lực. Luôn mặc định sử dụng fig, ax = plt.subplots().

Biểu đồ Thống kê với Seaborn: Từ Phân phối đến Tương quan

Seaborn được xây dựng trên nền Matplotlib và chuyên về trực quan hóa thống kê. Trong khi Matplotlib yêu cầu cấu hình thủ công, Seaborn tự động suy luận các giá trị mặc định hợp lý từ cấu trúc dữ liệu.

Phân tích phân phối — một trong những nhiệm vụ phỏng vấn phổ biến nhất — chỉ cần một lời gọi hàm duy nhất:

python
# distribution_analysis.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Simulate salary data for two departments
np.random.seed(42)
data = pd.DataFrame({
    "salary": np.concatenate([
        np.random.normal(75_000, 12_000, 200),  # Engineering
        np.random.normal(65_000, 10_000, 150),  # Marketing
    ]),
    "department": ["Engineering"] * 200 + ["Marketing"] * 150
})

# KDE plot comparing salary distributions
fig, ax = plt.subplots(figsize=(10, 5))
sns.kdeplot(
    data=data,
    x="salary",
    hue="department",        # Automatically splits by category
    fill=True,               # Shaded area under the curve
    alpha=0.4,
    palette=["#2563eb", "#dc2626"],
    ax=ax                    # Attach to our explicit axes
)

ax.set_title("Salary Distribution by Department")
ax.set_xlabel("Annual Salary (USD)")
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
ax.spines[["top", "right"]].set_visible(False)

plt.tight_layout()
plt.savefig("salary_distribution.png", dpi=150)
plt.show()

Tham số hue tự động chia dữ liệu theo nhóm, và fill=True làm cho các vùng chồng lấn hiển thị rõ ràng. Mẫu này — nhóm các phân phối theo danh mục — xuất hiện trong hầu hết mọi vòng phỏng vấn analytics.

Sẵn sàng chinh phục phỏng vấn Data Analytics?

Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.

Heatmap Seaborn cho Ma trận Tương quan

Heatmap tương quan cho thấy mối quan hệ giữa các biến số một cách trực quan. Người phỏng vấn sử dụng chúng để kiểm tra xem ứng viên có thể nhận diện đa cộng tuyến hoặc phát hiện mối quan hệ đặc trưng mạnh hay không.

python
# correlation_heatmap.py
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Simulate e-commerce metrics
np.random.seed(42)
n = 500
page_views = np.random.poisson(15, n)
time_on_site = page_views * 2.5 + np.random.normal(0, 5, n)
cart_adds = np.random.binomial(page_views, 0.3)
purchases = np.random.binomial(cart_adds, 0.4)

df = pd.DataFrame({
    "page_views": page_views,
    "time_on_site": time_on_site,
    "cart_adds": cart_adds,
    "purchases": purchases
})

# Compute Pearson correlation
corr_matrix = df.corr()

fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(
    corr_matrix,
    annot=True,              # Show correlation values in cells
    fmt=".2f",               # Two decimal places
    cmap="RdBu_r",           # Diverging colormap centered on 0
    vmin=-1, vmax=1,         # Fixed scale for consistency
    square=True,             # Square cells
    linewidths=0.5,
    ax=ax
)

ax.set_title("E-commerce Metrics Correlation")
plt.tight_layout()
plt.savefig("correlation_heatmap.png", dpi=150)
plt.show()

Colormap phân kỳ RdBu_r làm cho tương quan dương có màu xanh và tương quan nghịch có màu đỏ — một quy ước mà người phỏng vấn kỳ vọng. Thiết lập vmin=-1vmax=1 đảm bảo thang màu luôn có thể diễn giải được bất kể phạm vi dữ liệu thực tế.

Tùy chỉnh Biểu đồ cho Thuyết trình Chuyên nghiệp

Kết xuất Matplotlib nguyên bản trông khá cũ. Vài dòng cấu hình có thể biến đổi biểu đồ thành hình ảnh sẵn sàng cho thuyết trình, thể hiện sự chú ý đến chi tiết trong quá trình phỏng vấn.

python
# professional_styling.py
import matplotlib.pyplot as plt
import seaborn as sns

# Apply Seaborn's built-in theme
sns.set_theme(
    style="whitegrid",       # Clean background with grid lines
    palette="muted",         # Professional color palette
    font_scale=1.1           # Slightly larger text
)

# Global Matplotlib overrides
plt.rcParams.update({
    "figure.facecolor": "white",
    "axes.facecolor": "white",
    "font.family": "sans-serif",
    "axes.titlesize": 14,
    "axes.labelsize": 12,
})

Áp dụng sns.set_theme() ở đầu script sẽ lan truyền styling nhất quán cho mọi biểu đồ sau đó. Trong phỏng vấn, điều này giúp tránh lãng phí thời gian định dạng từng biểu đồ.

Lưu ý Phiên bản

Seaborn 0.13 đã ngừng hỗ trợ set_style()set_palette() như các lời gọi riêng biệt. Hàm set_theme() thống nhất thay thế cả hai. Các câu trả lời Stack Overflow cũ vẫn tham chiếu API đã lỗi thời — nên tránh sử dụng chúng trong phỏng vấn 2026.

Các Câu hỏi Phỏng vấn Trực quan hóa Dữ liệu Thường gặp

Ngoài việc viết code, người phỏng vấn còn kiểm tra hiểu biết khái niệm về các phương pháp trực quan hóa tốt nhất. Các câu hỏi dưới đây xuất hiện thường xuyên trong phỏng vấn data analytics và data science.

Khi nào nên sử dụng biểu đồ cột thay vì biểu đồ đường? Biểu đồ cột hiển thị so sánh giữa các danh mục rời rạc (phòng ban, loại sản phẩm, khu vực). Biểu đồ đường thể hiện xu hướng theo khoảng thời gian liên tục hoặc tuần tự (chuỗi thời gian, phép đo tuần tự). Sử dụng biểu đồ đường cho các danh mục không có thứ tự ngụ ý một mối quan hệ sai giữa các cột liền kề.

Điều gì làm cho một biểu đồ trở nên sai lệch? Trục y bị cắt, hai trục y với thang đo khác nhau, hiệu ứng 3D trên dữ liệu 2D, và việc chọn lọc khoảng thời gian — tất cả đều bóp méo nhận thức. Giải pháp: bắt đầu trục y từ số không cho biểu đồ cột, gán nhãn trục rõ ràng, và tránh các yếu tố trang trí làm che khuất dữ liệu.

Việc lựa chọn bảng màu ảnh hưởng đến việc diễn giải dữ liệu như thế nào? Bảng màu tuần tự (nhạt-đến-đậm) phù hợp với dữ liệu có thứ tự như nhiệt độ hoặc doanh thu. Bảng màu phân kỳ (hai tông màu gặp nhau ở trung tâm trung tính) làm nổi bật sự sai lệch từ điểm giữa, chẳng hạn lãi/lỗ hoặc hệ số tương quan. Bảng màu phân loại sử dụng các màu khác biệt cho các nhóm không liên quan. Bảng màu thân thiện với người mù màu (như colorblind hoặc muted của Seaborn) đảm bảo khả năng tiếp cận — một chi tiết phân biệt ứng viên cấp cao.

Giải thích sự khác biệt giữa plt.show()plt.savefig(). plt.show() hiển thị hình ảnh ra cửa sổ tương tác và xóa trạng thái hình ảnh sau đó. plt.savefig() ghi hình ảnh ra file mà không xóa. Gọi savefig() sau show() sẽ tạo ra file trống — một lỗi phổ biến. Thứ tự đúng: savefig() trước, rồi show().

Tổng hợp: Bài tập Phỏng vấn End-to-End

Một bài tập take-home hoặc live coding điển hình kết hợp việc tải dữ liệu, làm sạch và nhiều loại biểu đồ. Ví dụ sau đây phản ánh các đề bài phỏng vấn thực tế từ các đội analytics.

python
# interview_exercise.py
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

sns.set_theme(style="whitegrid", palette="muted", font_scale=1.05)

# Simulate 12 months of product data
np.random.seed(42)
months = pd.date_range("2025-01", periods=12, freq="MS")
df = pd.DataFrame({
    "month": months,
    "revenue": np.cumsum(np.random.normal(5000, 2000, 12)) + 50_000,
    "customers": np.cumsum(np.random.poisson(50, 12)) + 500,
    "churn_rate": np.clip(np.random.normal(0.05, 0.015, 12), 0.01, 0.12)
})

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# Panel 1: Revenue trend
axes[0].plot(df["month"], df["revenue"], marker="o", color="#2563eb")
axes[0].set_title("Revenue Trend")
axes[0].set_ylabel("Revenue (USD)")
axes[0].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"${x:,.0f}"))
axes[0].tick_params(axis="x", rotation=45)
axes[0].spines[["top", "right"]].set_visible(False)

# Panel 2: Customer growth
axes[1].bar(df["month"], df["customers"], color="#16a34a", width=20)
axes[1].set_title("Customer Growth")
axes[1].set_ylabel("Total Customers")
axes[1].tick_params(axis="x", rotation=45)
axes[1].spines[["top", "right"]].set_visible(False)

# Panel 3: Churn rate with threshold line
axes[2].plot(df["month"], df["churn_rate"], marker="s", color="#dc2626")
axes[2].axhline(y=0.05, color="gray", linestyle="--", label="Target: 5%")
axes[2].set_title("Monthly Churn Rate")
axes[2].set_ylabel("Churn Rate")
axes[2].yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f"{x:.1%}"))
axes[2].tick_params(axis="x", rotation=45)
axes[2].spines[["top", "right"]].set_visible(False)
axes[2].legend()

fig.suptitle("Product Dashboard — FY 2025", fontsize=14, fontweight="bold")
plt.tight_layout()
plt.savefig("interview_dashboard.png", dpi=150)
plt.show()

Bài tập này minh họa ba loại biểu đồ trong bố cục thống nhất, định dạng trục chính xác, đường tham chiếu cho mục tiêu churn, và styling nhất quán. Đây chính xác là những yếu tố mà người phỏng vấn chấm điểm.

Kết luận

  • API hướng đối tượng của Matplotlib (fig, ax = plt.subplots()) mang lại quyền kiểm soát toàn diện và là chuẩn mực được kỳ vọng trong môi trường chuyên nghiệp lẫn phỏng vấn
  • Tham số hue của Seaborn và các hàm thống kê tích hợp (KDE, heatmap) xử lý phân tích theo nhóm với lượng code tối thiểu
  • Heatmap tương quan với colormap phân kỳ và thang đo cố định (vmin=-1, vmax=1) là yếu tố không thể thiếu trong phỏng vấn analytics
  • Luôn gọi savefig() trước show() để tránh file đầu ra trống
  • Styling gọn gàng — loại bỏ spines, định dạng nhãn tick, tiêu đề rõ ràng — thể hiện tư duy chất lượng production cho người phỏng vấn
  • Hãy luyện tập xây dựng dashboard nhiều panel dưới áp lực thời gian: hầu hết các vòng live coding phân bổ 10-15 phút cho mỗi nhiệm vụ trực quan hóa

Bắt đầu luyện tập!

Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.

Thẻ

#python
#matplotlib
#seaborn
#data-visualization
#data-analytics
#interview

Chia sẻ

Bài viết liên quan