Clustering merupakan salah satau metode machine learning dan termasuk dalam unsupervised learning. Unsupervised learning adalah metode machine learning dimana dalam data yang akan dianalisis tidak terdapat target variabel (label). Dalam unsupervised learning tujuannya lebih fokus dalam melakukan eksplorasi data seperti mencari atau mengelompokkan data berdasarkan kemiripan tanpa adanya label (ground truth). Dalam menentukan cluster yang baik adalah ketika suatu anggota dalam cluster memiliki kemiripan semirip mungkin sedangkan antar anggota cluster memiliki perbedaan yang cukup signifikan. Hal ini menyebabkan evaluasi hasil clustering menjadi tidak langsung dan membutuhkan pendekatan khusus yang disebut cluster validation.
Misalkan dataset \[ X = \{x_1, x_2, ..., x_n\}, \] maka clustering bertujuan membagi data ke dalam \[ ( k)cluster( C_1, ..., C_k). \]
Dalam clustering ada dua jenis yaitu 1. non fuzzy clustering (hard clustering), setiap data akan dibagi menjadi dalam beberapa kelompok dan setiap data poin hanya dapat dimiliki dalam 1 cluster saja. 2. fuzzy clustering (soft clusterig), setiap data poin memiliki kesempatan untuk dimiliki oleh lebih dari 1 cluster.
Karena suatu clustering sangat sulit untuk bisa kita tentukan keakuratan dari cluster yang kita bentuk. Oleh karena itu perlu dilakukan validasi cluster (cluster validation).
Validasi cluster adalah proses untuk mengevaluasi kualitas hasil clustering secara kuantitatif dengan menggunakan indeks tertentu. Tujuan utama dari validasi cluster/cluster validation adalah
Menurut Charred et al. validasi cluster dibedakan menjadi 3 jenis yaitu:
Internal cluster validation menggunakan informasi internal pada data untuk melakukan evaluasi cluster yang baik dan tepat tanpa menggunakan informasi eksternal data. Biasanya yang diukur pada validasi cluster ini adalah tingkat kepadatan (compactness), keterhubungan (connectedness), dan separasi yang ada pada cluster.
\[ W = \sum_{i=1}^{k} \sum_{x \in C_i} ||x - \mu_i||^2 \]
\[ B = \sum_{i=1}^{k} n_i ||\mu_i - \mu||^2 \]
Silhouette mengukur seberapa baik suatu observasi menjadi satu cluster atau memperkirakan nilai rata-rata jarak antar cluster. Nilai dari silhouette coefficient menginterpretasikan seberapa dekat suatu data pada satu cluster terhadap tetangga pada cluster yang lain. Semakin besar nilai silhouette (mendekati 1), maka semakin baik cluster tersebut.
\[ s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} \]
\[ a(i): within distance \]
\[ b(i): nearest cluster distance \]
library(cluster)
library(factoextra)
data(iris)
x <- scale(iris[, -5])
set.seed(123)
km <- kmeans(x, centers = 3)
sil <- silhouette(km$cluster, dist(x))
fviz_silhouette(sil)
## cluster size ave.sil.width
## 1 1 50 0.64
## 2 2 53 0.39
## 3 3 47 0.35
Interpretasi:
Nilai average silhouette sebesar 0.46 menunjukkan bahwa kualitas clustering berada pada kategori cukup baik, namun belum optimal karena masih terdapat overlap antar cluster. Cluster 1 memiliki nilai tertinggi (0.64) sehingga merupakan cluster paling baik dengan pemisahan yang jelas, sedangkan cluster 2 (0.35) dan cluster 3 (0.39) menunjukkan kualitas sedang dengan kemungkinan adanya kedekatan antar cluster. Secara keseluruhan, model sudah mampu menangkap struktur data, tetapi masih bisa ditingkatkan.
Davies-Bouldin Index (DBI) merupakan indeks internal yang mengukur rata-rata kemiripan antara setiap cluster dengan cluster lainnya. Kemiripan ini dihitung berdasarkan rasio antara dispersi dalam cluster dan jarak antar cluster.
\[ DBI = \frac{1}{k} \sum_{i=1}^{k} \max_{j \neq i} \left( \frac{S_i + S_j}{M_{ij}} \right) \]
\[ S_i : rata-rata jarak dalam cluster ke-i \]
\[ M_{ij}: jarak antara centroid cluster i dan j \]
\[ k: jumlah cluster \]
Nilai kecil → cluster lebih baik
Nilai besar → cluster overlap
library(clusterSim)
dbi <- index.DB(x, km$cluster)
dbi$DB
## [1] 0.9140889
Interpretasi:
Nilai Davies-Bouldin Index (DBI) sebesar 0.914 menunjukkan bahwa kualitas clustering cukup baik. Hal ini karena DBI yang lebih kecil mengindikasikan cluster yang lebih kompak dan memiliki pemisahan yang lebih jelas antar cluster. Nilai yang mendekati 0 menunjukkan hasil yang semakin optimal, sehingga nilai 0.914 masih tergolong baik, meskipun belum optimal sepenuhnya. Artinya, cluster sudah terbentuk dengan cukup jelas, namun masih terdapat sedikit overlap antar cluster yang bisa diperbaiki dengan pemilihan jumlah cluster atau metode clustering yang lebih sesuai.
Dunn index menilai seberapa rapat anggota dalam suatu cluster dengan variansi yang kecil dan seberapa terpisah cluster yang satu dengan yang lainnya. Cluster yang baik adalah yang memiliki nilai dunn index besar.
\[ Dunn = \frac{\min_{i \neq j} d(C_i, C_j)}{\max_k diam(C_k)} \]
\[ d(C_i, C_j): jarak antar cluster \]
\[ diam(C_k): diameter cluster k \]
library(clValid)
dunn_index <- dunn(dist(x), km$cluster)
print(dunn_index)
## [1] 0.02649665
Interpretasi:
Nilai Dunn Index sebesar 0.0265 menunjukkan bahwa kualitas clustering kurang baik. Hal ini karena nilai Dunn Index yang baik seharusnya tinggi, yang menandakan jarak antar cluster besar (separation tinggi) dan ukuran cluster kecil (cohesion tinggi). Sebaliknya, nilai yang sangat kecil seperti ini mengindikasikan bahwa jarak antar cluster relatif dekat atau terdapat cluster yang memiliki diameter besar, sehingga terjadi overlap antar cluster. Dengan demikian, hasil clustering masih belum optimal dan dapat diperbaiki, misalnya dengan mencoba jumlah cluster yang berbeda atau metode clustering lain.
Validasi cluster ini menggunakan informasi eksternal pada suatu data seperti label kelas atau kelas target yang disediakan dari sumber eksternal. Hal ini biasanya digunakan untuk mengukur kecocokan label suatu cluster yang terbentuk dengan label kelas yang ada.
Adjusted Rand Index (ARI) mengukur kesamaan antara hasil clustering dengan label sebenarnya dengan mempertimbangkan kemungkinan kesamaan secara acak.
\[ ARI = \frac{RI - Expected}{Max - Expected} \]
RI: Rand Index Expected: nilai ekspektasi acak
library(mclust)
ari <- adjustedRandIndex(km$cluster, iris$Species)
print(ari)
## [1] 0.6201352
Interpretasi:
Nilai Adjusted Rand Index (ARI) sebesar 0.620 menunjukkan bahwa hasil clustering memiliki tingkat kesesuaian yang cukup tinggi dengan label asli (ground truth). Karena nilai ARI berada di atas 0.5, ini menandakan bahwa struktur cluster yang dihasilkan sudah mampu merepresentasikan pola sebenarnya dalam data dengan baik. Namun, karena belum mendekati 1, masih terdapat beberapa perbedaan antara hasil clustering dan label asli, yang mengindikasikan adanya kesalahan pengelompokan pada sebagian data. Secara keseluruhan, model clustering dapat dikatakan baik tetapi belum sempurna.
Normalized Mutual Information (NMI) mengukur tingkat informasi bersama antara hasil clustering dan label sebenarnya.
\[ NMI = \frac{2I(X,Y)}{H(X)+H(Y)} \]
\[ I(X,Y) : mutual information \]
\[ H(X), H(Y) : entropy \]
library(aricode)
nmi <- NMI(km$cluster, iris$Species)
print(nmi)
## [1] 0.6591265
Interpretasi:
Nilai Normalized Mutual Information (NMI) sebesar 0.659 menunjukkan bahwa hasil clustering memiliki tingkat kesesuaian yang cukup tinggi dengan label asli. Karena nilai NMI berada di atas 0.6, hal ini mengindikasikan bahwa terdapat kesamaan informasi yang cukup kuat antara struktur cluster yang dihasilkan dengan distribusi label sebenarnya. Namun, karena nilainya belum mendekati 1, masih terdapat sebagian informasi yang tidak sepenuhnya sesuai, yang berarti masih ada beberapa data yang tidak terkelompok dengan sempurna. Secara keseluruhan, hasil clustering dapat dikatakan baik, tetapi belum optimal dan masih dapat ditingkatkan.
Validasi cluster ini menggunakan pendekatan dengan memberikan beberapa variasi nilai parameter yang berbeda seperti banyaknya jumlah cluster (k) pada satu metode yang sama. Biasanya cara ini digunakan untuk menentukan banyak cluster yang paling optimal.
Elbow Method digunakan untuk menentukan jumlah cluster optimal berdasarkan nilai WCSS.
\[ WCSS = \sum_{i=1}^{k} \sum_{x \in C_i} ||x - \mu_i||^2 \]
fviz_nbclust(x, kmeans, method = "wss")
Interpretasi:
Nilai WCSS (Within Cluster Sum of Squares) mengalami penurunan yang sangat tajam dari k = 1 ke k = 3, kemudian setelah itu penurunannya mulai melambat. Hal ini menunjukkan bahwa penambahan jumlah cluster setelah k = 3 tidak memberikan peningkatan yang signifikan dalam mengurangi variasi dalam cluster.
Berdasarkan metode Elbow, titik “siku” terlihat berada di sekitar k = 3, sehingga jumlah cluster optimal yang disarankan adalah 3 cluster. Ini berarti pembagian data menjadi 3 kelompok sudah cukup baik dalam merepresentasikan struktur data tanpa menambah kompleksitas yang tidak perlu.
Gap Statistic membandingkan hasil clustering dengan data acak untuk menentukan jumlah cluster optimal.
\[ Gap(k) = E^*(\log(W_k)) - \log(W_k) \]
- Nilai gap terbesar → jumlah cluster optimal
set.seed(123)
gap <- clusGap(x, FUN = kmeans, K.max = 10, B = 50)
fviz_gap_stat(gap)
Interpretasi:
Nilai Gap Statistic menunjukkan peningkatan yang cukup signifikan dari k = 1 ke k = 2, dan mencapai nilai tinggi di sekitar k = 2 hingga k = 3. Berdasarkan aturan Gap Statistic (memilih k pertama yang memenuhi kondisi optimal), garis putus-putus pada grafik menunjukkan bahwa jumlah cluster optimal berada pada k = 2.
Hal ini berarti bahwa pembagian data menjadi 2 cluster sudah cukup baik dalam merepresentasikan struktur data dibandingkan dengan jumlah cluster lainnya. Meskipun nilai gap pada k = 3 sedikit lebih tinggi, metode ini cenderung memilih jumlah cluster yang lebih sederhana jika perbedaannya tidak signifikan.
Secara keseluruhan, berdasarkan Gap Statistic, jumlah cluster optimal yang disarankan adalah 2 cluster.
Berdasarkan hasil evaluasi menggunakan berbagai metode validasi, dapat disimpulkan bahwa model clustering sudah mampu menangkap struktur data dengan cukup baik.
Internal validation menunjukkan bahwa kualitas cluster berada pada kategori cukup baik, meskipun masih terdapat overlap antar cluster. External validation memperlihatkan bahwa hasil clustering memiliki kesesuaian yang cukup tinggi dengan label asli, namun belum sempurna. Sementara itu, relative validation menunjukkan bahwa jumlah cluster optimal berada pada kisaran 2 hingga 3 cluster.
Dengan demikian, model clustering dapat dikatakan baik, tetapi masih dapat ditingkatkan untuk memperoleh hasil yang lebih optimal.
| Aspek | Internal | External | Relative |
|---|---|---|---|
| Data Label | Tidak | Ya | Tidak |
| Tujuan | Struktur cluster | Kesesuaian label | Pemilihan model |
| Fokus | Cohesion & Separation | Akurasi | Optimasi k |
| Contoh | Silhouette, DBI, Dunn | ARI, NMI | Elbow, Gap |
Implementasi cluster validation pada data
library(rattle)
data(wine)
head(wine)
Dataset Wine merupakan dataset yang berisi hasil analisis kimia dari
beberapa jenis wine yang berasal dari tiga kultivar anggur berbeda.
Dataset ini terdiri dari 178 observasi (data) dan 14 variabel, dimana
terdapat 1 variabel label/class yaitu Type yang menunjukkan
jenis wine, serta 13 variabel numerik yang merepresentasikan
karakteristik kimia wine seperti kadar alkohol, magnesium, phenols,
flavanoids, dan lain sebagainya. Dataset ini sering digunakan dalam
analisis clustering dan machine learning karena memiliki struktur data
yang cukup jelas dan cocok untuk proses pengelompokan data.
# Menghapus label
wine_x <- scale(wine[, -1])
label_wine <- wine$Type
print(label_wine)
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [112] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [149] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## Levels: 1 2 3
set.seed(123)
km_wine <- kmeans(wine_x, centers = 3)
library(cluster)
library(factoextra)
sil_wine <- silhouette(km_wine$cluster, dist(wine_x))
fviz_silhouette(sil_wine)
## cluster size ave.sil.width
## 1 1 51 0.35
## 2 2 62 0.34
## 3 3 65 0.18
Nilai average silhouette width sebesar 0.28 menunjukkan bahwa kualitas clustering pada data wine masih tergolong kurang optimal karena pemisahan antar cluster belum terlalu jelas dan masih terdapat overlap. Cluster 1 dan 2 memiliki kualitas clustering yang cukup baik dengan nilai silhouette masing-masing sebesar 0.34 dan 0.35, sedangkan cluster 3 memiliki kualitas paling rendah yaitu 0.18 sehingga menunjukkan bahwa beberapa data pada cluster tersebut masih sulit dibedakan dari cluster lain. Secara keseluruhan, model clustering sudah mampu membentuk kelompok data, namun hasilnya masih dapat ditingkatkan.
library(clusterSim)
dbi_wine <- index.DB(wine_x, km_wine$cluster)
dbi_wine$DB
## [1] 1.468143
Davies-Bouldin Index (DBI) sebesar 1.468 menunjukkan bahwa kualitas clustering pada data wine masih kurang optimal. Hal ini karena nilai DBI yang cukup besar mengindikasikan bahwa antar cluster masih memiliki overlap dan pemisahan cluster belum terlalu baik.
library(clValid)
dunn(dist(wine_x), km_wine$cluster)
## [1] 0.2322567
Dunn Index sebesar 0.232 menunjukkan bahwa kualitas clustering masih tergolong rendah karena nilai Dunn Index yang baik seharusnya besar. Nilai ini mengindikasikan bahwa jarak antar cluster masih relatif dekat atau cluster belum terpisah secara optimal.
library(mclust)
adjustedRandIndex(km_wine$cluster, label_wine)
## [1] 0.897495
Nilai Adjusted Rand Index (ARI) sebesar 0.897 menunjukkan bahwa hasil clustering memiliki tingkat kesesuaian yang sangat tinggi dengan label asli pada data wine. Nilai yang mendekati 1 menandakan bahwa sebagian besar data telah dikelompokkan dengan benar, sehingga model clustering dapat dikatakan memiliki performa yang sangat baik dalam merepresentasikan struktur data sebenarnya.
library(aricode)
NMI(km_wine$cluster, label_wine)
## [1] 0.8729636
Nilai Normalized Mutual Information (NMI) sebesar 0.873 menunjukkan bahwa hasil clustering memiliki tingkat kesesuaian yang sangat tinggi dengan label asli pada data wine. Nilai yang mendekati 1 menandakan bahwa informasi yang dihasilkan dari proses clustering sudah sangat mirip dengan distribusi kelas sebenarnya, sehingga model clustering dapat dikatakan mampu merepresentasikan struktur data dengan sangat baik.
fviz_nbclust(wine_x, kmeans, method = "wss")
Elbow Method menunjukkan bahwa penurunan nilai WCSS terjadi cukup tajam dari k=1 hingga k=3, kemudian setelah itu penurunannya mulai melambat. Hal ini menunjukkan bahwa penambahan cluster setelah k=3 tidak memberikan pengurangan variasi yang signifikan. Oleh karena itu, jumlah cluster optimal berdasarkan Elbow Method adalah 3 cluster.
set.seed(123)
gap_wine <- clusGap(
wine_x,
FUN = kmeans,
K.max = 10,
B = 50
)
fviz_gap_stat(gap_wine)
Gap Statistic menunjukkan bahwa nilai gap meningkat hingga mencapai nilai optimal pada k=3, yang ditunjukkan oleh garis putus-putus pada grafik. Hal ini mengindikasikan bahwa pembentukan 3 cluster memberikan struktur cluster yang paling baik dibandingkan jumlah cluster lainnya. Dengan demikian, berdasarkan Gap Statistic, jumlah cluster optimal yang disarankan juga adalah 3 cluster.
# Silhouette
avg_sil_wine <- summary(sil_wine)$avg.width
# Davies-Bouldin Index
dbi_value_wine <- dbi_wine$DB
# Dunn Index
dunn_value_wine <- dunn(dist(wine_x), km_wine$cluster)
# Membuat tabel perbandingan
internal_compare <- data.frame(
Metode = c(
"Silhouette Coefficient",
"Davies-Bouldin Index",
"Dunn Index"
),
Nilai = c(
round(avg_sil_wine, 3),
round(dbi_value_wine, 3),
round(dunn_value_wine, 3)
),
Interpretasi = c(
"Semakin mendekati 1 semakin baik",
"Semakin kecil semakin baik",
"Semakin besar semakin baik"
)
)
print(internal_compare)
## Metode Nilai Interpretasi
## 1 Silhouette Coefficient 0.285 Semakin mendekati 1 semakin baik
## 2 Davies-Bouldin Index 1.468 Semakin kecil semakin baik
## 3 Dunn Index 0.232 Semakin besar semakin baik
# ARI
ari_wine <- adjustedRandIndex(
km_wine$cluster,
label_wine
)
# NMI
nmi_wine <- NMI(
km_wine$cluster,
label_wine
)
# Membuat tabel perbandingan
external_compare <- data.frame(
Metode = c(
"Adjusted Rand Index (ARI)",
"Normalized Mutual Information (NMI)"
),
Nilai = c(
round(ari_wine, 3),
round(nmi_wine, 3)
),
Interpretasi = c(
"Semakin mendekati 1 semakin baik",
"Semakin mendekati 1 semakin baik"
)
)
print(external_compare)
## Metode Nilai Interpretasi
## 1 Adjusted Rand Index (ARI) 0.897 Semakin mendekati 1 semakin baik
## 2 Normalized Mutual Information (NMI) 0.873 Semakin mendekati 1 semakin baik
relative_compare <- data.frame(
Metode = c(
"Elbow Method",
"Gap Statistic"
),
Cluster_Optimal = c(
3,
3
),
Interpretasi = c(
"Titik siku berada pada k = 3",
"Gap terbesar berada pada k = 3"
)
)
print(relative_compare)
## Metode Cluster_Optimal Interpretasi
## 1 Elbow Method 3 Titik siku berada pada k = 3
## 2 Gap Statistic 3 Gap terbesar berada pada k = 3