Kỹ thuật trực quan hóa dữ liệu Treemap Dendrogram và 3D Scatter

Kỹ thuật trực quan hóa dữ liệu Treemap Dendrogram và 3D Scatter

Các kỹ thuật trực quan hóa dữ liệu Treemap Dendrogram và 3D Scatter là những phương pháp quan trọng khi dữ liệu không còn đơn giản, phẳng và dễ đọc bằng các biểu đồ cột hay biểu đồ tròn.

Khi dữ liệu có nhiều thành phần, nhiều chiều hoặc có cấu trúc phân cấp, người phân tích cần những kỹ thuật trực quan mạnh hơn để không chỉ nhìn thấy số liệu, mà còn nhận ra mối quan hệ, quy luật và cấu trúc ẩn bên trong dữ liệu. Mỗi kỹ thuật trong ba kỹ thuật này giải quyết một nhu cầu khác nhau.

Treemap giúp nén dữ liệu phân cấp vào không gian 2D để người xem vừa thấy tổng thể vừa thấy tỷ trọng của từng thành phần.

Dendrogram giúp làm lộ ra mức độ giống nhau giữa các đối tượng và quá trình hình thành các cụm dữ liệu.

Trong khi đó, 3D Scatter mở rộng thêm một chiều quan sát, cho phép biểu diễn đồng thời ba biến số liên tục để phát hiện cụm, xu hướng và ngoại lệ trong dữ liệu đa biến.

1. Kỹ thuật Treemap

Treemap là kỹ thuật biểu diễn dữ liệu bằng các hình chữ nhật lồng nhau.

  • Mỗi ô chữ nhật đại diện cho một nhóm hoặc một mục con.
  • Diện tích ô thường thể hiện quy mô, giá trị hoặc tỷ trọng.
  • Màu sắc có thể dùng để thể hiện thêm một biến khác như tăng/giảm, mức độ quan trọng, hiệu suất.
  • Phù hợp khi cần xem nhanh cấu trúc cha–con và so sánh tỷ trọng giữa nhiều nhóm. Ví dụ: cơ cấu doanh thu theo ngành, rồi trong từng ngành lại chia theo sản phẩm.

Ý tưởng của kỹ thuật Treemap

Kỹ thuật Treemap biểu diễn dữ liệu bằng cách:

  • Bắt đầu từ một hình chữ nhật lớn.
  • Sau đó chia nhỏ thành các hình chữ nhật con dựa trên trọng số của dữ liệu. Diện tích mỗi hình chữ nhật lớn nhỏ tùy theo giá trị dữ liệu.
  • Kỹ thuật này cho phép nén hàng nghìn điểm dữ liệu vào một màn hình duy nhất mà không bị chồng lấp

Sức mạnh của Treemap

  • Hiển thị được rất nhiều dữ liệu trên một màn hình mà không bị chồng lấp (overplotting).
  • Nhìn nhanh được độ lớn của từng phần.
  • Quan sát nhanh toàn bộ hệ thống, thấy rõ cấu trúc cha-con.

Tính tương tác trong kỹ thuật Treemap

Treemap không chỉ là biểu đồ tĩnh mà có tính tương tác để nhìn dữ liệu tốt hơn, đó là:

  • Drill-down: click một nhóm để zoom, nhằm đi sâu vào các tầng sâu hơn phía dưới để xem dữ liệu.
  • Breadcrumb: Hiển thị lộ trình hiện tại, biết mình đang ở cấp nào.
  • Tooltip: Hiển thị thông số chi tiết khi di chuột

Cho nên đây là một bước tiến quan trọng: Từ “xem dữ liệu” → “khám phá dữ liệu”

Ứng dụng thực tế của Treemap

Một ví dụ là phần mềm WinDirStat, dùng treemap để:

  • Hiển thị toàn bộ ổ cứng
  • Xem file nào chiếm nhiều dung lượng

Chỉ cần nhìn, bạn biết ngay “thủ phạm” chiếm bộ nhớ.

Ví dụ 1: Thị trường chứng khoán S&P 500

Phân tích thị trường chứng khoán S&P 500 sử dụng Treemap. Ta muốn trả lời 3 câu hỏi cùng lúc:

  1. Ngành nào lớn nhất? → nhìn theo diện tích cụm ngành
  2. Trong từng ngành, mã nào chi phối mạnh nhất? → nhìn theo diện tích từng ô con
  3. Mã/ngành nào đang tăng hay giảm? → nhìn theo màu sắc

Vì S&P 500 có cấu trúc phân cấp tự nhiên nên treemap rất hợp. S&P 500 có:

  • rất nhiều công ty,
  • được chia theo ngành GICS,
  • mỗi công ty có quy mô khác nhau rất lớn,
  • và mỗi ngày còn có biến động giá.

Triển khai như sau:

  • Cấp 1 (parent): ngành GICS Sector
  • Cấp 2 (child): từng mã cổ phiếu Symbol
  • Diện tích ô: đại diện cho marketCap (vốn hóa thị trường)
  • Màu sắc: Đại diện cho biến động giá trong ngày
  • Phân cụm: Gom nhóm theo ngành công nghệ, tài chính…

Cài thư viện

pip install pandas plotly yfinance lxml html5lib

Lấy dữ liệu

import pandas as pd
import plotly.express as px
import yfinance as yf
import requests
from io import StringIO
import time

# 1. Lấy danh sách S&P 500 từ Wikipedia
url = "https://en.wikipedia.org/wiki/List_of_S%26P_500_companies"
headers = {"User-Agent": "Mozilla/5.0"}

response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status() # kiểm tra request có lỗi không, nếu có dừng ngay

tables = pd.read_html(StringIO(response.text)) # trả về list các DataFrame
sp500 = tables[0][["Symbol", "Security", "GICS Sector"]].copy()

# Yahoo Finance dùng dấu - thay cho.
sp500["YahooSymbol"] = sp500["Symbol"].str.replace(".", "-", regex=False)

print("Số dòng:", len(sp500))
print(sp500.head())

Hàm lấy market cap + biến động giá

def get_stock_data(symbol):
    try:
        ticker = yf.Ticker(symbol)  # ticker = đối tượng chứa 1 cổ phiếu 
        info = ticker.info # { 'marketCap': 120850030592, 'displayName': 'Ameren',...}

        market_cap = info.get("marketCap", None) # Vốn hóa thị trường

	 # Lấy giá lịch sử 5 ngày gần nhất {"Date":"2026-05-19", "Open":"56.2","Close":"55.9"}
        hist = ticker.history(period="5d", auto_adjust=False) 

	 #lấy các giá đóng cửa
        #[ 2026-05-19 149.3
        #   2026-05-20 149.7
        #   2026-05-21 151.600006
        #   2026-05-22 152.440002
        #   2026-05-26 154.029999   
        # ]
        close = hist["Close"].dropna() if not hist.empty else pd.Series(dtype=float)

        price = close.iloc[-1] if len(close) >= 1 else None
        change_pct_1d = ((close.iloc[-1] - close.iloc[-2]) / close.iloc[-2] * 100) if len(close) >= 2 else None
        change_pct_5d = ((close.iloc[-1] - close.iloc[0]) / close.iloc[0] * 100) if len(close) >= 2 else None

        return {
            "YahooSymbol": symbol,
            "marketCap": market_cap,
            "price": price,
            "change_pct_1d": change_pct_1d,
            "change_pct_5d": change_pct_5d
        }

    except Exception as e:
        print(f"Lỗi với {symbol}: {e}")
        return {
            "YahooSymbol": symbol,
            "marketCap": None,
            "price": None,
            "change_pct_1d": None,
            "change_pct_5d": None
        }

Chỉ lấy top 50 mã đầu để test cho nhanh

test_symbols = sp500["YahooSymbol"].head(50).tolist()

records = []
for i, sym in enumerate(test_symbols, 1):
    print(f"[{i}/{len(test_symbols)}] {sym}")
    records.append(get_stock_data(sym))
    time.sleep(0.2)

market_df = pd.DataFrame(records)

# chỉ ghép phần đã test
sp500_test = sp500.head(50).copy()
df = sp500_test.merge(market_df, on="YahooSymbol", how="left")
df = df.dropna(subset=["marketCap"]).copy()

Vẽ treemap

fig = px.treemap(
    df,
    path=[px.Constant("S&P 500"), "GICS Sector", "Symbol"],
    values="marketCap",
    color="change_pct_1d",
    color_continuous_scale="RdYlGn",
    color_continuous_midpoint=0,
    hover_data={
        "Security": True,
        "marketCap": ":,.0f",
        "price": ":.2f",
        "change_pct_1d": ":.2f",
        "change_pct_5d": ":.2f",
    },
    title="Treemap S&P 500: diện tích = vốn hóa, màu = % thay đổi 1 ngày"
)

fig.update_layout(margin=dict(t=50, l=25, r=25, b=25))
fig.show()

Phân tích từ biểu đồ:

  • Communication Services chiếm diện tích cực lớn. GOOGL + GOOG gần như chiếm toàn bộ block. So với các ngành khác → to vượt trội → Insight: Trong 50 mã đầu tiên, Google đang chi phối mạnh ngành Communication Services, thậm chí gần như “1 mình 1 cõi”.

NhưngGOOGL / GOOG đều màu cam → đỏ nhạt, nghĩa là đang giảm nhẹ. → Insight: Một công ty rất lớn nhưng giảm nhẹ. Có thể kéo cả ngành (và thậm chí thị trường) đi xuống

  • Block Information Technology: AAPL rất to → công ty chủ lực. Các công ty nhỏ hơn: có xanh (APP, ADBE), có đỏ (ANET, APH), có trung tính. → Insight: Ngành công nghệ không đi cùng một hướng, đang có phân hóa nội bộ
  • Consumer Discretionary: AMZN chiếm gần như toàn bộ block. Các ô còn lại rất nhỏ → Insight: Ngành này bị Amazon chi phối mạnh. Nếu AMZN tăng → cả ngành tăng. Nếu AMZN giảm → cả ngành “đỏ”
  • Các ngành nhỏ (Financials, Utilities, Materials…)Diện tích nhỏ, Nhiều ô nhỏ →Insight: Các ngành này có ảnh hưởng thấp hơn lên toàn thị trường
  • Phân tích màu toàn cục: Nhiều màu cam/đỏ nhạt hơn xanh. Một số điểm xanh rải rác (AON, AJG…) → Insight: Thị trường đang có xu hướng giảm nhẹ hoặc trung tính, không phải panic sell (bán tháo hoảng loạn) mà là điều chỉnh nhẹ.

Kết luận: Treemap cho thấy cấu trúc thực của thị trường: một số ít công ty lớn như Google, Apple, Amazon chi phối phần lớn diện tích và do đó có ảnh hưởng lớn đến toàn bộ ngành. Đồng thời, thông qua màu sắc, ta thấy thị trường không di chuyển đồng đều mà có sự phân hóa giữa các công ty trong cùng ngành. Điều này cho thấy khi phân tích dữ liệu tài chính, không chỉ cần nhìn vào mức tăng giảm, mà cần đặt nó trong bối cảnh quy mô của từng thành phần.

Ví dụ 2: Doanh thu cửa hàng (mini dataset)

Giả sử bạn có dữ liệu:

  • Cấp 1: Danh mục sản phẩm. Cấp 2: Sản phẩm
  • Giá trị: Doanh thu. Màu: % tăng trưởng

Dataset

import pandas as pd
data = pd.DataFrame({
    "Category": [
        "Electronics", "Electronics", "Electronics",
        "Clothing", "Clothing", "Food", "Food", "Food"
    ],
    "Product": [
        "Laptop", "Phone", "Tablet", "Shirt", "Shoes", "Bread", "Milk", "Coffee"
    ],
    "Revenue": [500, 700, 300, 200, 400, 150, 180, 350],
    "Growth": [10, -5, 8, 3, -2, 1, 4, -6]
})

Vẽ Treemap

import plotly.express as px
fig = px.treemap( data,
    path=[px.Constant("Store"), "Category", "Product"],
    values="Revenue",
    color="Growth",
    color_continuous_scale="RdYlGn",
    color_continuous_midpoint=0,
    title="Treemap: Doanh thu cửa hàng (diện tích = revenue, màu = growth)"
)
fig.show()

Phân tích từ biểu đồ:

  • Electronics: chiếm diện tích lớn nhất → đóng góp doanh thu nhiều nhất
  • Trong Electronics: Phone lớn nhất, Laptop đứng thứ 2, Tablet nhỏ hơn. →Insight: Doanh thu tập trung vào Phone
  •  Nhìn màu sắc: Phone: đỏ (giảm) Laptop: xanh (tăng) → Insight: Sản phẩm bán nhiều nhất lại đang giảm. Nếu Phone tiếp tục giảm → toàn bộ danh mục Electronics sẽ bị ảnh hưởng mạnh
  • Food: Coffee khá to nhưng đỏ (giảm) Milk: xanh nhẹ. Bread: gần trung tính.→ Insight: Food không có sản phẩm nào thật sự nổi bật
    và sản phẩm lớn nhất lại đang giảm.
  • Clothing: Shoes lớn nhưng hơi âm. Shirt nhỏ hơn nhưng xanh → Insight: Clothing có xu hướng ổn định hơn Electronics và Food.

Treemap cho thấy rõ rằng doanh thu của cửa hàng đang phụ thuộc mạnh vào một sản phẩm chính là Phone. Tuy nhiên, sản phẩm này lại đang có xu hướng giảm, tạo ra rủi ro lớn cho toàn bộ hệ thống.
Trong khi đó, các sản phẩm khác như Laptop và Tablet đang tăng trưởng tốt nhưng chưa đủ lớn để bù đắp. Điều này cho thấy trong phân tích dữ liệu, cần kết hợp giữa quy mô và xu hướng để đưa ra quyết định, thay vì chỉ nhìn vào mức tăng trưởng.

Khi nào nên dùng kỹ thuật Treemap?

Trong nhóm các kỹ thuật trực quan hóa dữ liệu Treemap Dendrogram và 3D Scatter, Treemap là công cụ đặc biệt hữu ích khi cần biểu diễn dữ liệu phân cấp (2 tầng trở lên) và so sánh tỷ trọng giữa nhiều thành phần. Tránh dùng khi dữ liệu có giá trị âm hoặc giá trị của các thành phần quá gần nhau.

Vài ví dụ dữ liệu dùng với Treemap

  1. Hệ thống file máy tính (4 tầng): Ổ đĩa → thư mục chính → thư mục con → file. Treemap giúp phát hiện thư mục hoặc file chiếm nhiều dung lượng nhất.
  2. Cơ cấu doanh thu tập đoàn (4 tầng): Tập đoàn → công ty con → ngành hàng → sản phẩm. Giúp thấy doanh thu tập trung ở công ty hoặc sản phẩm nào.
  3. Website thương mại điện tử (5 tầng): Website → ngành hàng → danh mục → sản phẩm → phiên bản sản phẩm. Giúp quan sát traffic hoặc doanh thu theo nhiều cấp.
  4. Ngân sách nhà nước (4 tầng): Quốc gia → bộ ngành → chương trình → hạng mục chi tiêu. Giúp nhìn nơi tiêu tốn ngân sách lớn nhất.
  5. Hệ thống giáo dục E-learning (5 tầng): Nền tảng → khoa → môn học → chương → bài học. Giúp phát hiện phần nội dung có nhiều học viên hoặc thời lượng cao nhất.
  6. Chuỗi bán lẻ (5 tầng): Hệ thống → khu vực → chi nhánh → nhóm sản phẩm → sản phẩm. Giúp thấy cửa hàng và sản phẩm chủ lực theo từng vùng.
  7. Hệ thống bệnh viện (4 tầng): Bệnh viện → khoa → nhóm bệnh → loại bệnh cụ thể. Giúp phát hiện khoa hoặc bệnh đang chiếm nhiều nguồn lực.
  8. Log hệ thống phần mềm (5 tầng): Application → service → module → loại lỗi → log chi tiết. Giúp xác định nơi phát sinh lỗi nghiêm trọng nhất.
  9. Hệ thống logistics (4 tầng): Quốc gia → kho → khu vực lưu trữ → mặt hàng. Giúp tối ưu không gian lưu kho và tồn kho.
  10. Dữ liệu dân số (5 tầng): Quốc gia → tỉnh/thành → quận/huyện → phường/xã → khu dân cư. Giúp quan sát phân bố dân số hoặc thu nhập theo nhiều cấp hành chính.

2. Kỹ thuật Dendrogram

Dendrogram là một kỹ thuật trực quan hóa dùng để biểu diễn quá trình phân cụm phân cấp (hierarchical clustering). Nó có dạng một biểu đồ cây, trong đó các đối tượng hoặc nhóm dữ liệu được ghép dần lại với nhau dựa trên mức độ giống nhau.

Nếu Treemap giúp ta nhìn thấy cấu trúc phân cấp và tỷ trọng, thì Dendrogram giúp ta nhìn thấy quan hệ tương đồng giữa các đối tượng.

Vì vậy, Dendrogram đặc biệt hữu ích khi ta không chỉ muốn biết dữ liệu được chia thành những nhóm nào, mà còn muốn hiểu cấu trúc phân nhánhmức độ khác biệt giữa các nhóm.

Từ bài toán sinh học đến AI

Một trong những bài toán kinh điển dẫn đến sự ra đời của Dendrogram là trong sinh học: khi có hàng trăm mẫu DNA, làm thế nào để biết mẫu nào giống nhau hơn, nhóm nào gần nhau, nhóm nào khác biệt rõ rệt?

Cách tiếp cận phù hợp là phân cụm phân cấp. Thay vì chia dữ liệu thành các nhóm rời rạc ngay từ đầu, phương pháp này tạo ra một cấu trúc cây, trong đó:

  • Các mẫu giống nhau sẽ được ghép lại sớm
  • Các nhóm khác biệt hơn chỉ được ghép ở các mức cao hơn
  • Toàn bộ quá trình ghép cụm có thể được quan sát trực tiếp

Dendrogram chính là hình ảnh trực quan của quá trình đó.

Ý tưởng của phân cụm phân cấp

Phân cụm phân cấp hoạt động theo một ý tưởng đơn giản:

  • Ban đầu, mỗi điểm dữ liệu được xem là một cụm riêng
  • Sau đó, thuật toán tìm hai cụm gần nhau nhất để ghép lại
  • Quá trình này lặp lại nhiều lần
  • Cuối cùng, tất cả điểm dữ liệu được nối về một gốc chung

Kết quả cuối cùng không chỉ là “có bao nhiêu cụm”, mà là một cây phân cấp của sự tương đồng.

Dendrogram – cây của dữ liệu

Kết quả của phân cụm phân cấp được biểu diễn bằng một biểu đồ cây gọi là Dendrogram.

Cách đọc Dendrogram:

  • Hai đối tượng hoặc hai cụm được nối với nhau ở độ cao thấp thì chúng giống nhau hơn
  • Hai cụm chỉ được ghép ở độ cao lớn thì chúng khác biệt nhiều hơn
  • Nhìn toàn bộ cây, ta có thể thấy dữ liệu được tổ chức thành các tầng nhóm như thế nào

Nói cách khác, Dendrogram không chỉ cho biết ai nằm cùng nhóm, mà còn cho biết mức độ gần nhau giữa các nhóm đó.

Các phương pháp ghép cụm

Trong Python, việc ghép cụm thường được thực hiện bằng hàm linkage:

Z = linkage(data_scaled, method='ward')

Trong đó, method là cách thuật toán quyết định nhóm nào sẽ được gộp lại với nhau trong từng bước của quá trình phân cụm. Mỗi phương pháp có cách đo “độ giống nhau” riêng, nên kết quả tạo ra cũng có thể khác nhau.

Các phương pháp phổ biến gồm:

  • Single linkage (method=”single”): thuật toán sẽ tìm hai nhóm có ít nhất một cặp điểm dữ liệu nằm rất gần nhau rồi ghép hai nhóm đó lại. Chỉ cần tồn tại một cặp điểm đủ gần là có thể ghép, dù các điểm còn lại của hai nhóm có thể khá xa nhau. Vì vậy, phương pháp này dễ tạo ra các cụm dài hoặc dạng chuỗi.
    Đây là phương pháp ghép dựa vào khoảng cách giữa hai điểm gần nhau nhất của hai nhóm.
  • Complete linkage (method=”complete”): thuật toán xem xét hai điểm xa nhau nhất giữa hai nhóm. Nếu ngay cả hai điểm xa nhất này vẫn còn tương đối gần nhau thì hai nhóm mới được ghép. Cách này tạo ra các cụm chặt chẽ và đồng đều hơn, nhưng đôi khi khá “khắt khe”.
    Đây là phương pháp ghép dựa vào khoảng cách giữa hai điểm xa nhau nhất của hai nhóm.
  • Average linkage (method=”average”): thay vì chỉ nhìn vào một cặp điểm gần nhất hay xa nhất, phương pháp này tính khoảng cách trung bình giữa toàn bộ các điểm của hai nhóm rồi mới quyết định có ghép hay không. Vì vậy, kết quả thường cân bằng hơn giữa single và complete linkage.
  • Ward linkage (method=”ward”): phương pháp này không tập trung vào một cặp điểm cụ thể mà cố gắng ghép sao cho các điểm trong cùng một nhóm sau khi ghép vẫn còn tương đối giống nhau. Nói cách khác, nó ưu tiên tạo ra các cụm gọn, ít bị phân tán và có tính đồng đều cao. Đây là phương pháp được dùng rất phổ biến vì thường cho kết quả dễ nhìn và ổn định.

Khoảng cách giữa các điểm – nền tảng của phân cụm

Cốt lõi của phân cụm là đo khoảng cách giữa các điểm dữ liệu. Một công thức thường dùng là Euclidean distance:

Cách tính gồm:

  • Lấy hiệu theo từng chiều rồi bình phương các hiệu đó
  • Cộng lại và lấy căn bậc hai

Khoảng cách nhỏ cho thấy hai điểm giống nhau hơn. Khoảng cách lớn hơn cho thấy chúng khác biệt hơn. Trong Dendrogram, chính những khoảng cách này quyết định cụm nào được ghép trước, cụm nào được ghép sau.

Ví dụ: Phân nhóm sinh viên theo kết quả học tập

Giả sử ta có dữ liệu của sinh viên theo ba tiêu chí: Toán, Lập trình, Tiếng Anh .

Tạo dữ liệu minh họa

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.preprocessing import StandardScaler

np.random.seed(42)
n_students = 40
data = np.random.uniform(0, 10, size=(n_students, 3))
df = pd.DataFrame(data, columns=["Toan", "Lap_trinh", "Tieng_Anh"])

print("5 sinh viên đầu tiên:")
print(df.head())

Chuẩn hóa dữ liệu và vẽ Dendrogram

Trước khi phân cụm, ta chuẩn hóa dữ liệu để các biến có cùng mặt bằng so sánh. Điều này quan trọng vì nếu một biến có thang đo lớn hơn hẳn biến khác, nó có thể chi phối khoảng cách.

# 2. Chuẩn hóa dữ liệu
scaler = StandardScaler()
data_scaled = scaler.fit_transform(df) # chuẩn hóa các cột số (nếu có cột chuỗi sẽ bị lỗi)

# 3. Tính khoảng cách, ghép cụm, kết quả lưu vào Z
Z = linkage(data_scaled, method='ward')

# 4. Vẽ Dendrogram
plt.figure(figsize=(12,6))
dendrogram(Z)

plt.title("Dendrogram – Phân nhóm sinh viên")
plt.xlabel("Sinh viên")
plt.ylabel("Khoảng cách")

plt.show()

Phân tích từ biểu đồ

Từ Dendrogram, ta có thể rút ra một số nhận xét:

  • Các cụm: Biểu đồ cho thấy dữ liệu tách thành 3 cụm chính rất rõ. Cụm bên trái (màu cam). Cụm giữa (màu xanh lá). Cụm bên phải (màu đỏ) → Nhận định: Dữ liệu có xu hướng chia thành 3nhóm sinh viên.
  • So sánh độ giống nhau giữa các cụm: Nhìn độ cao khi các cụm gộp lại: Cụm xanh + đỏ gộp ở khoảng ~7. Sau đó mới gộp với cụm cam ở ~8.5 → Insight: Cụm xanh và đỏ giống nhau hơn, cụm cam khác biệt nhất
  • Cụm xanh (ở giữa) Nhánh thấp, gộp sớm → Nhận định: Các sinh viên trong cụm này rất giống nhau
  • Cụm đỏ (bên phải) Nhánh cao hơn một chút → Nhận định: Có sự đa dạng hơn trong cụm
  • Cụm cam (bên trái) Tách biệt rõ với phần còn lại → Nhận định: Đây là nhóm khác biệt nhất

Ý nghĩa trong AI và phân tích dữ liệu

Dendrogram đặc biệt hữu ích trong các bài toán:

  • Phát hiện nhóm khách hàng
  • Phân tích hành vi người dùng
  • Phân nhóm tài liệu
  • Phân đoạn dữ liệu
  • Khám phá cấu trúc ẩn trước khi xây dựng mô hình

Trong AI và Data Mining, kỹ thuật này thường được dùng như một bước khám phá dữ liệu ban đầu. Nó giúp nhà phân tích hiểu:

  • Dữ liệu có xu hướng chia thành bao nhiêu nhóm
  • Nhóm nào gần nhau hơn
  • Có tồn tại các nhóm dị biệt hay không

Vì vậy, Dendrogram không chỉ là một biểu đồ minh họa, mà còn là công cụ giúp ta đọc cấu trúc ẩn của dữ liệu trước khi đi sâu vào các bước như clustering, segmentation hay recommendation.

Khi nào nên dùng Dendrogram?

Nên dùng khi:

  • Muốn khám phá cấu trúc nhóm của dữ liệu
  • Muốn hiểu mức độ giống nhau giữa các đối tượng hoặc cụm
  • Muốn quan sát toàn bộ quá trình ghép cụm
  • Cần một cái nhìn trực quan trước khi quyết định số cụm

Tránh dùng khi:

  • Dữ liệu quá lớn, số điểm quá nhiều khiến cây rất rối
  • Chỉ cần kết quả phân cụm cuối cùng mà không cần xem quá trình hình thành cụm
  • Cần tốc độ xử lý rất cao trên dữ liệu quy mô lớn

Vài ví dụ dữ liệu có thể dùng Dengrogram

  1. Phân cụm khách hàng: mỗi khách hàng có các đặc trưng như tuổi, thu nhập, mức chi tiêu. Dendrogram giúp tìm các nhóm khách hàng có hành vi mua sắm giống nhau.
  2. Phân nhóm bài viết văn bản: mỗi bài viết được chuyển thành vector đặc trưng từ khóa hoặc embedding. Dendrogram giúp phát hiện các bài viết có nội dung tương tự nhau.
  3. Phân tích hành vi người dùng website: mỗi người dùng được mô tả bằng số lần click, thời gian xem trang, tỷ lệ mua hàng… Dendrogram giúp phát hiện các nhóm hành vi tương đồng.
  4. Phân cụm sản phẩm thương mại điện tử: mỗi sản phẩm có giá, lượt bán, đánh giá, danh mục… Dendrogram giúp tìm các sản phẩm có đặc điểm gần giống nhau.
  5. Phân tích bệnh nhân trong y tế: mỗi bệnh nhân có các chỉ số xét nghiệm và triệu chứng. Dendrogram giúp phát hiện các nhóm bệnh nhân có đặc điểm y khoa tương tự.
  6. Phân cụm lỗi phần mềm: mỗi lỗi được mô tả bằng log, module, mức độ nghiêm trọng… Dendrogram giúp tìm các lỗi có nguyên nhân gần giống nhau.
  7. Phân tích thành phố theo kinh tế xã hội: mỗi thành phố có GDP, dân số, thu nhập, mật độ dân cư… Dendrogram giúp tìm các thành phố có cấu trúc phát triển tương đồng.
  8. Phân nhóm người chơi game: mỗi người chơi có thời gian chơi, tỷ lệ thắng, phong cách chơi… Dendrogram giúp phát hiện các kiểu người chơi giống nhau.

Kết luận

Dendrogram là kỹ thuật trực quan hóa đặc trưng của phân cụm phân cấp. Dendrogram cho phép ta nhìn thấy cách các nhóm hình thành, mức độ gần nhau giữa chúng, và cấu trúc phân tầng của sự tương đồng.

Nếu Treemap trả lời câu hỏi “cái gì nằm trong cái gì, và cái gì chiếm nhiều hơn?”, thì Dendrogram trả lời câu hỏi “cái gì giống nhau, và giống nhau đến mức nào?”.

Chính vì thế, đây là một kỹ thuật rất quan trọng khi làm việc với dữ liệu nhiều chiều, đặc biệt trong các bài toán khám phá dữ liệu và AI.

3. Kỹ thuật 3D Scatter

3D Scatter là kỹ thuật trực quan hóa dữ liệu bằng các điểm trong không gian ba chiều. Mỗi điểm dữ liệu được xác định bởi ba tọa độ (x, y, z), tương ứng với ba biến số liên tục. Nhờ đó, biểu đồ cho phép người xem quan sát mối quan hệ giữa ba biến cùng lúc thay vì chỉ hai biến như trong biểu đồ phân tán 2D.

Nếu Treemap giúp ta nhìn thấy cấu trúc phân cấp và tỷ trọng, Dendrogram giúp ta nhìn thấy mức độ tương đồng giữa các nhóm, thì 3D Scatter giúp ta nhìn thấy phân bố dữ liệu trong không gian nhiều chiều, đặc biệt khi mối quan hệ giữa các điểm không thể hiện rõ nếu chỉ nhìn trên mặt phẳng 2D.

Ý tưởng của 3D Scatter

Trong không gian 2D, mỗi điểm chỉ có hai tọa độ: trục X và trục Y.
Nhưng trong nhiều bài toán thực tế, dữ liệu lại chịu ảnh hưởng đồng thời bởi ba biến quan trọng. Khi đó, thêm trục Z giúp ta có thêm một chiều quan sát để phát hiện: Cụm dữ liệu , Xu hướng phân bố , Ngoại lệ , Quan hệ giữa nhiều biến liên tục

Ví dụ, trong phân tích khách hàng, ta có thể đồng thời biểu diễn: Thu nhập , Độ tuổi , Mức chi tiêu.

Trong giáo dục, ta có thể đồng thời biểu diễn: Số giờ học , Tỷ lệ đi học , Số giờ ngủ

Thách thức của trực quan 3D trên màn hình 2D

Dù dữ liệu là 3 chiều, màn hình hiển thị vẫn là 2 chiều. Vì vậy, khi trực quan hóa 3D, ta luôn phải đối mặt với một số vấn đề:

  • Che khuất (Occlusion): các điểm ở phía trước có thể che mất các điểm phía sau
  • Biến dạng phối cảnh (Perspective distortion): điểm ở xa trông nhỏ hơn, điểm ở gần trông lớn hơn
  • Khó đánh giá khoảng cách chính xác: người xem có thể nhầm lẫn giữa gần – xa nếu chỉ nhìn từ một góc cố định

Chính vì vậy, biểu đồ 3D thường chỉ thực sự hiệu quả khi có khả năng xoay, phóng to, thu nhỏ và thay đổi góc nhìn.

3D Scatter – Tương quan đa biến

3D Scatter là biểu đồ phân tán trong không gian ba chiều, dùng để hiển thị mối quan hệ giữa ba biến số liên tục. Đặc điểm của 3D Scatter:

  • Mỗi điểm dữ liệu có tọa độ (x, y, z)
  • Có thể thêm màu sắc, kích thước điểm hoặc hình dạng điểm để biểu diễn thêm biến thứ tư hoặc thứ năm
  • Hữu ích khi cần phát hiện cụm điểm, xu hướng hoặc ngoại lệ trong dữ liệu đa biến
  • Đặc biệt hữu ích khi cấu trúc dữ liệu không thể hiện rõ nếu chỉ nhìn theo hai chiều

Tuy nhiên, 3D Scatter cũng có hạn chế:

  • Dễ bị rối nếu số điểm quá nhiều
  • Dễ che khuất giữa các điểm
  • Khó đọc hơn biểu đồ 2D nếu không có tương tác

Vì vậy, kỹ thuật này nên được dùng khi:

  • Mối quan hệ giữa ba biến là quan trọng
  • Các cụm dữ liệu không thể tách rõ nếu chỉ nhìn trên mặt phẳng 2D
  • Người xem có thể xoay biểu đồ để quan sát từ nhiều góc khác nhau

Ví dụ: Phát hiện sinh viên “Nguy cơ rớt môn”

Giả sử hệ thống của trường có ba thông tin cho mỗi sinh viên:

  • StudyHours – số giờ học mỗi tuần
  • Attendance – tỷ lệ đi học (%)
  • SleepHours – số giờ ngủ mỗi ngày

Ta muốn xem liệu ba biến này có giúp phân tách sinh viên thành các nhóm khác nhau hay không.

import pandas as pd
import plotly.express as px
data = [
    [8.9, 95, 7.6, "Tốt"], [9.4, 91, 7.2, "Tốt"], 
    [8.3, 97, 7.9, "Tốt"], [9.1, 93, 7.4, "Tốt"], 
    [8.6, 90, 7.8, "Tốt"], [9.5, 96, 7.3, "Tốt"],
    [8.4, 92, 7.7, "Tốt"], [9.0, 98, 8.0, "Tốt"],
    [5.8, 76, 6.1, "Trung bình"], [6.4, 72, 5.8, "Trung bình"],
    [5.3, 80, 6.4, "Trung bình"], [6.1, 74, 6.0, "Trung bình"],
    [5.6, 71, 6.3, "Trung bình"], [6.5, 78, 5.9, "Trung bình"],
    [5.4, 73, 6.2, "Trung bình"], [6.0, 79, 6.5, "Trung bình"],
    [2.8, 56, 5.0, "Nguy cơ"],    [3.4, 51, 4.6, "Nguy cơ"],
    [2.3, 60, 5.3, "Nguy cơ"],    [3.0, 53, 4.8, "Nguy cơ"],
    [2.6, 50, 5.1, "Nguy cơ"],    [3.5, 58, 4.7, "Nguy cơ"],
    [2.4, 54, 5.2, "Nguy cơ"],    [3.1, 59, 4.9, "Nguy cơ"],
]
df = pd.DataFrame(data, columns=["StudyHours", "Attendance", "SleepHours", "Label"])
fig = px.scatter_3d( df,
    x="StudyHours", y="Attendance", z="SleepHours", color="Label",
    color_discrete_map={
        "Tốt": "blue",
        "Trung bình": "orange",
        "Nguy cơ": "red"
    },
    title="3D Scatter – Sinh viên (phân bố thưa và tự nhiên hơn)",
)
fig.update_traces(marker=dict(size=6))
fig.show()

Phân tích

Các cụm: Có 3 cụm rất rõ: Tốt → phía trên, Trung bình → ở giữa, Nguy cơ → phía dưới.

Hình 1: Nhìn hơi chéo, thấy cả 3 chiều nhưng hơi khó đánh giá khoảng cách. Hình 2: Nhìn nghiêng hơn,trục Z rất rõ. Lúc này 3 cụm tách hoàn toàn theo chiều cao, không còn chồng lấp.→ Cùng một dữ liệu, nhưng góc nhìn khác nhau sẽ làm lộ ra hoặc che đi pattern.

Biểu đồ 3D cho thấy ba nhóm sinh viên được phân tách rõ ràng trong không gian ba chiều. Đặc biệt, khi thay đổi góc nhìn, ta có thể thấy rõ vai trò của từng biến trong việc phân biệt các nhóm. Điều này cho thấy trực quan 3D giúp phát hiện các pattern mà biểu đồ 2D có thể không thể hiện được.

Tóm lại, 3D Scatter là kỹ thuật trực quan hóa phù hợp khi ta cần quan sát đồng thời ba biến số liên tục trong cùng một không gian.
Nó đặc biệt hữu ích trong việc phát hiện cụm dữ liệu, xu hướng phân bố và những pattern khó nhìn thấy nếu chỉ dùng biểu đồ 2D.

Tuy nhiên, giá trị thực sự của 3D Scatter không nằm ở việc “thêm một chiều cho đẹp”, mà ở chỗ nó giúp ta nhìn dữ liệu từ nhiều góc độ hơn. Khi dùng đúng chỗ, đúng mục đích, và có khả năng tương tác phù hợp, 3D Scatter có thể làm lộ ra những cấu trúc mà một hình chiếu 2D đơn lẻ khó thể hiện rõ.

Kết luận

Kỹ thuật trực quan hóa dữ liệu Treemap Dendrogram và 3D Scatter cho thấy rằng khi dữ liệu trở nên phức tạp hơn, việc trực quan hóa cũng phải chuyển từ mức “minh họa số liệu” sang mức “khám phá cấu trúc dữ liệu”. Treemap phù hợp khi cần nhìn nhanh cấu trúc phân cấp và tỷ trọng giữa các thành phần. Dendrogram hữu ích khi cần hiểu mức độ tương đồng và quan hệ phân nhóm giữa các đối tượng. 3D Scatter phát huy tác dụng khi cần quan sát đồng thời ba biến và phát hiện những pattern khó thấy trong không gian 2D.

Ba Kỹ thuật trực quan hóa dữ liệu Treemap Dendrogram và 3D Scatter này đại diện cho ba cách tiếp cận khác nhau, nhưng cùng hướng tới một mục tiêu chung: giúp con người nhìn thấy điều mà bảng số liệu thô rất khó thể hiện. Vì vậy, điều quan trọng nhất không chỉ là biết công cụ nào tồn tại, mà là hiểu khi nào nên dùng Treemap, khi nào nên dùng Dendrogram, và khi nào 3D Scatter thực sự cần thiết. Khi được sử dụng đúng chỗ, trực quan hóa không chỉ làm dữ liệu dễ nhìn hơn, mà còn làm cho việc phân tích trở nên sâu hơn, rõ hơn và có giá trị hơn.