Trực Quan Hóa Dữ Liệu với Python: Từ Biểu Đồ Đến Dashboard

Master data visualization in Python with matplotlib, seaborn, and Plotly.

Viết bởi admin
June 20, 2026 7 phút đọc 1 lượt xem
Trực quan hóa dữ liệu với Python

Một bộ dữ liệu với hàng triệu dòng không nói lên được gì nếu bạn không thể nhìn thấy câu chuyện đằng sau những con số. Đó là lý do tại sao trực quan hóa dữ liệu (data visualization) là kỹ năng không thể thiếu của bất kỳ data scientist hay analyst nào. Python có một hệ sinh thái phong phú để làm điều này — từ những biểu đồ tĩnh cơ bản đến dashboard tương tác phức tạp. Bài viết này sẽ hướng dẫn bạn làm chủ 4 thư viện quan trọng nhất: Matplotlib, Seaborn, Plotly và Streamlit.

Cài Đặt

pip install matplotlib seaborn plotly streamlit pandas numpy

Matplotlib — Nền Tảng Của Mọi Thứ

Matplotlib là thư viện trực quan hóa lâu đời nhất và cơ bản nhất trong Python. Mọi thư viện khác đều được xây dựng trên nền tảng của nó.

import matplotlib.pyplot as plt
import numpy as np

# Biểu đồ đường (Line Chart)
x = np.linspace(0, 10, 100)
fig, axes = plt.subplots(1, 2, figsize=(12, 4))

axes[0].plot(x, np.sin(x), color='steelblue', linewidth=2, label='sin(x)')
axes[0].plot(x, np.cos(x), color='tomato', linewidth=2, linestyle='--', label='cos(x)')
axes[0].set_title('Hàm Sin và Cos')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

# Biểu đồ cột (Bar Chart)
categories = ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5']
values = [23, 45, 56, 78, 43]
axes[1].bar(categories, values, color='steelblue', edgecolor='white', linewidth=0.5)
axes[1].set_title('Doanh Thu Theo Tháng (triệu VNĐ)')
for i, v in enumerate(values):
    axes[1].text(i, v + 1, str(v), ha='center', fontsize=10)

plt.tight_layout()
plt.savefig('matplotlib_demo.png', dpi=150, bbox_inches='tight')
plt.show()

Seaborn — Thống Kê Đẹp Hơn Với Ít Code Hơn

Seaborn được thiết kế để tạo ra các biểu đồ thống kê đẹp và có ý nghĩa với cú pháp ngắn gọn hơn nhiều so với Matplotlib.

import seaborn as sns
import pandas as pd

# Sử dụng dataset tích hợp
tips = sns.load_dataset('tips')  # Dataset về tiền tip ở nhà hàng

fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 1. Box plot — phân phối và outliers
sns.boxplot(data=tips, x='day', y='total_bill', hue='sex', palette='Set2', ax=axes[0,0])
axes[0,0].set_title('Hóa Đơn Theo Ngày và Giới Tính')

# 2. Violin plot — hiểu sâu hơn về phân phối
sns.violinplot(data=tips, x='day', y='tip', hue='sex', split=True, palette='muted', ax=axes[0,1])
axes[0,1].set_title('Tiền Tip Theo Ngày')

# 3. Scatter plot với regression line
sns.regplot(data=tips, x='total_bill', y='tip', color='steelblue', scatter_kws={'alpha': 0.5}, ax=axes[1,0])
axes[1,0].set_title('Mối Quan Hệ: Hóa Đơn vs Tiền Tip')

# 4. Heatmap tương quan
numeric_tips = tips.select_dtypes(include='number')
sns.heatmap(numeric_tips.corr(), annot=True, cmap='coolwarm', fmt='.2f', ax=axes[1,1])
axes[1,1].set_title('Ma Trận Tương Quan')

plt.tight_layout()
plt.show()

Plotly — Biểu Đồ Tương Tác

Plotly tạo ra biểu đồ tương tác (hover, zoom, pan) phù hợp hoàn hảo cho web app và báo cáo trực tuyến.

import plotly.express as px
import plotly.graph_objects as go

# Biểu đồ phân tán tương tác
df = px.data.gapminder().query("year == 2007")
fig = px.scatter(
    df,
    x='gdpPercap',
    y='lifeExp',
    size='pop',
    color='continent',
    hover_name='country',
    log_x=True,
    size_max=60,
    title='GDP Per Capita vs Tuổi Thọ (2007)',
    labels={
        'gdpPercap': 'GDP Per Capita (USD, log scale)',
        'lifeExp':   'Tuổi Thọ Trung Bình'
    }
)
fig.update_layout(template='plotly_white')
fig.show()

# Biểu đồ dòng thời gian
df_vn_like = px.data.gapminder().query("country in ['Japan', 'South Korea', 'China']")
fig2 = px.line(
    df_vn_like,
    x='year',
    y='gdpPercap',
    color='country',
    markers=True,
    title='GDP Per Capita — Các Nước Châu Á',
)
fig2.show()

Streamlit — Dashboard Tương Tác Trong 10 Phút

Streamlit biến script Python thành web app có thể chia sẻ mà không cần biết HTML hay JavaScript.

# dashboard.py
import streamlit as st
import pandas as pd
import plotly.express as px

st.set_page_config(page_title='Sales Dashboard', layout='wide')
st.title('📊 Dashboard Phân Tích Doanh Thu')

# Sidebar filters
st.sidebar.header('Bộ Lọc')

# Giả lập dữ liệu
@st.cache_data
def load_data():
    import numpy as np
    np.random.seed(42)
    dates = pd.date_range('2024-01-01', periods=365)
    products = ['Laptop', 'Phone', 'Tablet', 'Watch']
    data = []
    for date in dates:
        for product in products:
            data.append({
                'date':    date,
                'product': product,
                'revenue': np.random.randint(1000, 10000),
                'units':   np.random.randint(1, 50)
            })
    return pd.DataFrame(data)

df = load_data()

# Bộ lọc
selected_products = st.sidebar.multiselect(
    'Chọn sản phẩm:',
    options=df['product'].unique(),
    default=df['product'].unique()
)
df_filtered = df[df['product'].isin(selected_products)]

# KPIs
col1, col2, col3 = st.columns(3)
col1.metric('Tổng Doanh Thu', f"${df_filtered['revenue'].sum():,.0f}")
col2.metric('Số Đơn Hàng',   f"{len(df_filtered):,}")
col3.metric('Doanh Thu TB/Ngày', f"${df_filtered.groupby('date')['revenue'].sum().mean():,.0f}")

# Charts
col_left, col_right = st.columns(2)
with col_left:
    daily = df_filtered.groupby('date')['revenue'].sum().reset_index()
    fig = px.line(daily, x='date', y='revenue', title='Doanh Thu Theo Ngày')
    st.plotly_chart(fig, use_container_width=True)

with col_right:
    by_product = df_filtered.groupby('product')['revenue'].sum().reset_index()
    fig2 = px.pie(by_product, values='revenue', names='product', title='Phân Bổ Theo Sản Phẩm')
    st.plotly_chart(fig2, use_container_width=True)

Chạy dashboard: streamlit run dashboard.py — mở tự động tại http://localhost:8501

Nguyên Tắc Vàng Của Trực Quan Hóa Dữ Liệu

  • Chọn đúng loại biểu đồ: So sánh? Bar chart. Xu hướng theo thời gian? Line chart. Phân phối? Histogram hoặc violin. Tương quan? Scatter plot.
  • Tiêu đề và nhãn rõ ràng: Mỗi biểu đồ phải tự giải thích được — có tiêu đề, trục được đặt tên, đơn vị rõ ràng.
  • Màu sắc có mục đích: Không dùng màu chỉ để “đẹp”. Màu phải truyền tải thông tin. Chú ý colorblind-friendly palettes.
  • Không “chartjunk”: Bỏ đường lưới không cần thiết, hiệu ứng 3D thừa, và thông tin gây nhiễu.
  • Bắt đầu trục Y từ 0: Trừ khi có lý do rõ ràng, trục Y bắt đầu từ 0 để tránh phóng đại sự khác biệt.

Data visualization là cầu nối giữa phân tích và quyết định. Học tốt kỹ năng này, bạn không chỉ trở thành người phân tích dữ liệu tốt hơn — mà còn là người kể chuyện tốt hơn, và đó là điều phân biệt data scientist xuất sắc với người bình thường.

Enjoyed this article?

Get weekly insights on Tech, AI & Beauty — straight to your inbox.

Để lại bình luận

Your email address will not be published. Required fields are marked *