-1024x576.png)
分群分布圖的組成架構
在分群分析中,根據所使用的算法不同,分群分布圖大致上可以分為兩大類:K-means 的散點圖和階層式分群的折線圖。
下面是這兩種圖形的組成架構說明:
1. K-means 散點圖

主要用於展示 K-means 分群結果,其組成要素包括:
- 資料點:
- 每個資料點代表一個觀察值,通常以不同顏色或形狀來表示不同的群體。
- 群體中心:
- 每個群體的中心(centroid)會被標示出來,通常以不同的形狀或顏色表示。
- 群體中心是所有屬於該群體的資料點的平均位置,有助於快速識別各群體的特徵。
- 坐標系:
- 一般會使用二維坐標系來展示資料點的位置,而由於多項的特徵,不容易使用二維座標方法展示,所以會將資料特徵在事前進行降維 (dimensionality reduction),方便後續的觀察。
- 坐標系的選擇取決於所使用的特徵數量,通常二維圖更為常見。
- 標籤:
- 圖中的圖例會包含各群體的標籤或註釋,以增加可讀性和理解度。
2. 階層式分群折線圖

主要用於展示階層式分群結果,其組成要素包括:
- 樹狀結構(Dendrogram):
- 折線圖的核心是樹狀結構,它顯示了資料點之間的合併過程。
- 樹狀結構中的每一個分支代表了一次合併操作,這意味著兩個或多個資料點被合併為一個新的群體。樹的高度則反映了合併時的相似度或距離,表示當兩個資料點或群體的距離較小時,它們會在樹狀結構中較低的位置合併;反之,當距離較大時,它們的合併會在樹的較高位置進行。
- 坐標系:
- 樹狀結構通常在一個二維坐標系中呈現,其中X軸表示資料點(或聚類),Y軸表示相似度或距離。
- 顏色:
- 標示出相同顏色的資料點,就表示其族群為同一群體。
這兩種分群分布圖的呈現方式略有不同,適用於不同類型的數據分析需求。K-means 散點圖強調的是各聚類之間的位置和中心,而階層式分群折線圖則專注於資料之間的層次關係和相似度。
常見的分群分布方法
常見的分群演算法包括:
- K-means Clustering:
- 將數據分為 k 個群體,通過最小化每個點到其最近中心的距離來進行分群。
- 適合於處理大型數據集,且計算效率高。
- Hierarchical Clustering:
- 通過建立樹狀結構來顯示數據之間的層級關係,可以是凝聚式或分裂式。
- 便於可視化,但對於大型數據集計算較慢。
- Density-based Clustering (DBSCAN):
- 根據數據點的密度來形成群體,能夠識別任意形狀的群體並有效處理噪聲。
- 特別適合於地理數據或具有不規則分佈的數據集。
範例
本次會使用葡萄酒數據集資料進行分群分布圖的分析,並在最後部分找出關鍵辨識出不同群體之關鍵特徵,所有的code我都會放在我的 colab上面,歡迎自行取用。
首先,我們會先載入葡萄酒資料集 load_wine(),接下來我們需要載入兩種不同的分群模型(KMeans和 AgglomerativeClustering),同時我們預設的分群群數為3(n_clusters=3),本篇文章先不做分群最佳化的探討。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans, AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.decomposition import PCA
from matplotlib import rcParams
# 載入葡萄酒資料集
wine = load_wine()
X_wine = wine.data
feature_names_wine = wine.feature_names
# 標準化資料
scaler = StandardScaler()
X_wine_scaled = scaler.fit_transform(X_wine)
# 執行 K-Means 聚類於葡萄酒資料集
kmeans_wine = KMeans(n_clusters=3, random_state=42)
kmeans_wine_labels = kmeans_wine.fit_predict(X_wine_scaled)
# 執行階層聚類 (Hierarchical Clustering)
hierarchical_wine_labels = AgglomerativeClustering(n_clusters=3).fit_predict(X_wine_scaled)
# 執行階層聚類並計算連結矩陣,用於樹狀圖 (dendrogram)
linkage_matrix_wine = linkage(X_wine_scaled, method='ward')
# 使用PCA降維進行散佈圖視覺化
pca = PCA(n_components=2)
X_wine_pca = pca.fit_transform(X_wine_scaled)
# 繪製 K-Means 聚類散佈圖與階層聚類樹狀圖
fig, axes = plt.subplots(1, 2, figsize=(16, 8))
# 左側: K-Means 聚類散佈圖
sns.scatterplot(
x=X_wine_pca[:, 0],
y=X_wine_pca[:, 1],
hue=kmeans_wine_labels,
palette='viridis',
ax=axes[0],
legend='full'
)
axes[0].set_title("K-Means Clustering (Wine Dataset)")
axes[0].set_xlabel("PCA Component 1")
axes[0].set_ylabel("PCA Component 2")
# 右側: 階層聚類樹狀圖
dendrogram(
linkage_matrix_wine,
truncate_mode='level', # 限制樹狀圖的深度
p=5, # 顯示的層級數量
ax=axes[1]
)
axes[1].set_title("Hierarchical Clustering Dendrogram (Ward's Method)")
axes[1].set_xlabel("Sample Index or Cluster Size")
axes[1].set_ylabel("Distance")
plt.tight_layout()
plt.show()

- K-Means 視覺化部分:
- 原始的 13 項特徵經過主成分分析 (PCA) 後,濃縮為 2 個主要成分 (PCA Component 1 和 PCA Component 2),這樣可以更容易在二維平面上觀察群體分佈。
- 在散佈圖中,不同顏色 (紫色、綠色和黃色) 表示 K-Means 分群的 3 類結果。這種視覺化能幫助觀察分群的效果,例如是否有明顯的邊界或是否有部分點存在重疊。
- 階層聚類部分 (Agglomerative Clustering):
- 採用的是 Ward 方法,此方法通過最小化組內平方誤差 (within-cluster variance) 來合併最相似的兩個群體。
- 樹狀圖 (Dendrogram) 中顏色標示了最終的 3 個主要群體 (橘色、綠色、紅色)。
- 樹狀圖的高度代表群體之間的相似性或距離。越低的分支表示群體內部的樣本更為相似,越高的分支則表示不同群體之間的差異性較大。
- 在右圖當中,3 個主要群體的分支大約分隔在高度約 13 附近,這表示在此距離門檻下將資料切分為 3 個群組。
import matplotlib.pyplot as plt
import pandas as pd
# Add cluster labels to the original dataset for KMeans
wine_df = pd.DataFrame(X_wine, columns=feature_names_wine)
wine_df['Cluster_KMeans'] = kmeans_wine_labels
# Calculate mean values for each KMeans cluster
cluster_means_kmeans = wine_df.groupby('Cluster_KMeans').mean()
# Add hierarchical cluster labels to the original dataset
wine_df['Cluster_Hierarchical'] = hierarchical_wine_labels
# Calculate mean values for each hierarchical cluster
cluster_means_hierarchical = wine_df.groupby('Cluster_Hierarchical').mean()
# Function to plot mean values for each cluster
def plot_mean_values_per_cluster(ax, cluster_means, feature_names, title):
cluster_means.T.plot(kind='bar', ax=ax, figsize=(12, 8), colormap='viridis', width=0.8)
ax.set_title(title, fontsize=16)
ax.set_ylabel("Mean Value (Standardized)")
ax.set_xlabel("Features")
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')
ax.legend(title="Cluster", loc='upper right')
# Create subplots for KMeans and hierarchical clustering
fig, axes = plt.subplots(1, 2, figsize=(24, 8))
# Plot for KMeans
plot_mean_values_per_cluster(axes[0], cluster_means_kmeans, feature_names_wine, "Mean Feature Values by KMeans Cluster")
# Plot for Hierarchical clustering
plot_mean_values_per_cluster(axes[1], cluster_means_hierarchical, feature_names_wine, "Mean Feature Values by Hierarchical Cluster")
# Adjust layout
plt.tight_layout()
plt.show()

我們將兩種分群方法所預估出的特徵分群,進行直條圖的方式呈現,可以發現到在proline 特徵在各個群體之間的平均值差異最為顯著,特別是在 Cluster 2 中,該值顯著高於其他群體。
Proline脯胺酸是一種氨基酸,與葡萄酒的成熟度和風味有關。- 它在葡萄酒中通常來自葡萄果實的自然生成,是葡萄酒品種和生長條件的間接指標。
另外 color_intensity 也是一個差異較大的特徵,其 Cluster 1 和 Cluster 2 表現出不同的特徵強度。
Color Intensity是葡萄酒顏色的強度,通常用來評估葡萄酒的外觀品質。- 它與葡萄酒的酚類化合物含量、萃取程度和氧化狀態有關。
- 濃烈的顏色 (高色澤強度) 通常與高單寧、高結構性或更陳年的葡萄酒有關。
兩個特徵分別反映了葡萄酒在生產過程 (proline) 和成品品質 (color intensity) 上的重要資訊。 所以此分群結果可以看得出,在葡萄酒方面,Proline ****可以解釋為原始葡萄酒品質等級的分群上,有最為重要的差異性;而Color Intensity 則是說明最終葡萄酒在成品的感官品評上,會有更加直接的影響。
進一步的研究分析則可以使用統計分析手法,例如ANOVA、T-test等方法,來驗證這兩個特徵在不同分群間是否具有顯著性差異。
結論
分群分布圖可以提供分析人員在大量數據資料當中,找出有用資訊的視覺化工具,我們舉例使用的兩種分群方法(KMeans和Agglomerative Clustering),都有助於我們進一步的探索資料當中有用的特徵資訊,並支持下一步的商業決策執行。
