利用分群分布圖(Cluster Distribution Plot)洞察關鍵商業機會!

分群分布圖(Cluster Distribution Plot)是在商業分析當中,一種常見的視覺化分群分析工具,主要用於顯示資料集當中的不同群體(clusters)以及其分佈情況。 我們可以利用此圖表幫助我們理解資料分群當中隱含的結構資訊,用以辨識不同群體當中具有相似性和差異性的部分。

分群分布圖的組成架構

在分群分析中,根據所使用的算法不同,分群分布圖大致上可以分為兩大類:K-means 的散點圖和階層式分群的折線圖。

下面是這兩種圖形的組成架構說明:

1. K-means 散點圖

主要用於展示 K-means 分群結果,其組成要素包括:

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

2. 階層式分群折線圖

主要用於展示階層式分群結果,其組成要素包括:

  • 樹狀結構(Dendrogram)
    • 折線圖的核心是樹狀結構,它顯示了資料點之間的合併過程。
    • 樹狀結構中的每一個分支代表了一次合併操作,這意味著兩個或多個資料點被合併為一個新的群體。樹的高度則反映了合併時的相似度或距離,表示當兩個資料點或群體的距離較小時,它們會在樹狀結構中較低的位置合併;反之,當距離較大時,它們的合併會在樹的較高位置進行。
  • 坐標系
    • 樹狀結構通常在一個二維坐標系中呈現,其中X軸表示資料點(或聚類),Y軸表示相似度或距離。
  • 顏色:
    • 標示出相同顏色的資料點,就表示其族群為同一群體。

這兩種分群分布圖的呈現方式略有不同,適用於不同類型的數據分析需求。K-means 散點圖強調的是各聚類之間的位置和中心,而階層式分群折線圖則專注於資料之間的層次關係和相似度。

常見的分群分布方法

常見的分群演算法包括:

  1. K-means Clustering
    • 將數據分為 k 個群體,通過最小化每個點到其最近中心的距離來進行分群。
    • 適合於處理大型數據集,且計算效率高。
  2. Hierarchical Clustering
    • 通過建立樹狀結構來顯示數據之間的層級關係,可以是凝聚式或分裂式。
    • 便於可視化,但對於大型數據集計算較慢。
  3. 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()
  1. K-Means 視覺化部分:
    • 原始的 13 項特徵經過主成分分析 (PCA) 後,濃縮為 2 個主要成分 (PCA Component 1 和 PCA Component 2),這樣可以更容易在二維平面上觀察群體分佈。
    • 在散佈圖中,不同顏色 (紫色、綠色和黃色) 表示 K-Means 分群的 3 類結果。這種視覺化能幫助觀察分群的效果,例如是否有明顯的邊界或是否有部分點存在重疊。
  2. 階層聚類部分 (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),都有助於我們進一步的探索資料當中有用的特徵資訊,並支持下一步的商業決策執行。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *