Perbandingan Tiga Metode Clustering

DBSCAN | Spectral Clustering | Model-Based (GMM via Mclust)


Import Library & Persiapan Data

Analisis ini membandingkan tiga metode clustering yang berbeda pendekatan — DBSCAN (berbasis densitas), Spectral Clustering (berbasis graf), dan GMM / Model-Based Clustering (berbasis probabilistik) — pada dataset kecil berisi 10 observasi dengan 4 variabel numerik (X1–X4). Tujuannya adalah memahami bagaimana masing-masing metode mengelompokkan data dan sejauh mana hasilnya konsisten satu sama lain.

library(dbscan)
## 
## Attaching package: 'dbscan'
## The following object is masked from 'package:stats':
## 
##     as.dendrogram
library(kernlab)
library(mclust)
## Package 'mclust' version 6.1.2
## Type 'citation("mclust")' for citing this R package in publications.
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:kernlab':
## 
##     alpha
library(ggrepel)
library(patchwork)
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:kernlab':
## 
##     alpha
library(reshape2)
library(knitr)

Dataset (10 Observasi)

Dataset terdiri dari 10 observasi dengan 4 variabel numerik kontinu (X1, X2, X3, X4). Ukuran dataset yang kecil ini memungkinkan kita untuk menelusuri hasil clustering secara manual dan memahami perbedaan antar metode secara intuitif.

data <- data.frame(
  X1 = c(11, 6,  9,  3,  4, 15,  9, 13,  4, 13),
  X2 = c( 5, 3,  7,  7, 12,  8, 12,  9, 11,  7),
  X3 = c( 7,11, 11,  7,  7,  4, 12, 11, 14,  3),
  X4 = c( 6, 5,  8, 12, 12,  8,  6, 14,  6, 12)
)
rownames(data) <- paste0("Obs-", 1:10)

kable(data, caption = "Dataset Clustering (10 Observasi)")
Dataset Clustering (10 Observasi)
X1 X2 X3 X4
Obs-1 11 5 7 6
Obs-2 6 3 11 5
Obs-3 9 7 11 8
Obs-4 3 7 7 12
Obs-5 4 12 7 12
Obs-6 15 8 4 8
Obs-7 9 12 12 6
Obs-8 13 9 11 14
Obs-9 4 11 14 6
Obs-10 13 7 3 12

Statistik Deskriptif

stats_df <- as.data.frame(round(apply(data, 2, function(x) c(
  Min    = min(x),
  Mean   = mean(x),
  Median = median(x),
  Max    = max(x),
  SD     = sd(x)
)), 2))

kable(stats_df, caption = "Statistik Deskriptif")
Statistik Deskriptif
X1 X2 X3 X4
Min 3.0 3.00 3.00 5.00
Mean 8.7 8.10 8.70 8.90
Median 9.0 7.50 9.00 8.00
Max 15.0 12.00 14.00 14.00
SD 4.3 2.96 3.62 3.28

Dari statistik deskriptif terlihat bahwa keempat variabel memiliki rentang nilai yang cukup lebar (sekitar 3–15) dengan rata-rata di kisaran 7–9. Standar deviasi yang relatif mirip antar variabel mengindikasikan variabilitas yang setara, sehingga standarisasi tetap diperlukan sebelum clustering agar tidak ada variabel yang mendominasi perhitungan jarak.


Preprocessing – Standarisasi & Reduksi Dimensi (PCA)

Standarisasi Data

Sebelum clustering, data distandarisasi menggunakan z-score (mean = 0, SD = 1) melalui fungsi scale(). Langkah ini penting karena:

  • Ketiga metode clustering yang digunakan sensitif terhadap skala data.
  • Tanpa standarisasi, variabel dengan rentang nilai besar akan mendominasi perhitungan jarak Euclidean.

Principal Component Analysis (PCA)

PCA digunakan semata-mata untuk keperluan visualisasi — data 4 dimensi diproyeksikan ke 2 dimensi (PC1 dan PC2) agar dapat digambarkan dalam scatter plot. Proses clustering sendiri tetap dilakukan pada data 4 dimensi yang sudah distandarisasi.

X_scaled <- scale(data)

pca     <- prcomp(data, scale. = TRUE)
X_pca   <- as.data.frame(pca$x[, 1:2])
colnames(X_pca) <- c("PC1", "PC2")
rownames(X_pca) <- rownames(data)

var_exp   <- round(summary(pca)$importance[2, 1:2] * 100, 1)
total_var <- sum(var_exp)

Variansi yang berhasil dijelaskan oleh dua komponen pertama:

Komponen Variansi Dijelaskan
PC1 42%
PC2 31%
Total PC1 + PC2 73%

Total variansi 73% menunjukkan bahwa proyeksi 2D ini cukup representatif untuk memvisualisasikan struktur data. Artinya, pola yang tampak di scatter plot PCA mencerminkan sebagian besar informasi asli dari data 4 dimensi.

kable(round(X_pca, 3), caption = "Koordinat PCA Setiap Observasi")
Koordinat PCA Setiap Observasi
PC1 PC2
Obs-1 -0.508 -1.435
Obs-2 0.851 -1.934
Obs-3 0.416 -0.479
Obs-4 -0.062 0.607
Obs-5 0.220 1.801
Obs-6 -1.593 -0.453
Obs-7 1.265 0.355
Obs-8 -0.689 1.032
Obs-9 2.205 0.316
Obs-10 -2.106 0.190

Metode 1 – DBSCAN

k-NN Distance Plot

# Menghitung jarak ke tetangga terdekat
nbrs_dist <- kNNdist(X_scaled, k = 2)

# Mengurutkan jarak
dist_sorted <- sort(nbrs_dist)

# Membuat plot
plot(dist_sorted,
     type = "l",
     col = "#E63946",
     lwd = 2,
     main = "k-NN Distance Plot (k = 2)",
     xlab = "Titik (diurutkan)",
     ylab = "2-NN Distance")

# Menentukan eps dari titik elbow
eps_val <- 1.8

# Garis merah putus-putus seperti contoh PDF
abline(h = eps_val,
       col = "blue",
       lty = 2,
       lwd = 2)

# Tambahkan teks eps
text(x = length(dist_sorted)*0.8,
     y = eps_val + 0.03,
     labels = paste("eps =", eps_val),
     col = "black")

Cara membaca plot ini: Sumbu-x adalah observasi yang diurutkan dari jarak 2-NN terkecil ke terbesar, dan sumbu-y adalah jarak ke tetangga ke-2 terdekatnya. Titik siku (elbow) pada kurva menunjukkan ambang pemisah antara titik yang berada di area padat (jarak kecil) dan titik yang lebih terisolasi (jarak besar). Nilai eps = 1.8 dipilih di sekitar titik ini.

Konsep & Parameter

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) adalah metode clustering berbasis densitas yang bekerja dengan prinsip: titik-titik yang berada di dalam lingkungan padat (dense region) dikelompokkan bersama, sedangkan titik-titik yang terisolasi dari area padat dianggap sebagai noise (outlier).

Keunggulan utama DBSCAN:

  • Tidak perlu menentukan jumlah cluster di awal.
  • Mampu menemukan cluster dengan bentuk arbitrer (non-convex, non-spherical).
  • Secara otomatis mengidentifikasi outlier/noise.

Parameter yang digunakan:

Parameter Nilai Penjelasan
eps 1.8 Radius lingkungan suatu titik (dalam ruang terstandarisasi)
minPts 2 Jumlah minimum titik dalam radius eps agar suatu titik dianggap core point

Nilai eps = 1.8 ditentukan berdasarkan k-NN distance plot (lihat tab sebelumnya), yaitu dengan mencari titik “siku” (elbow) pada kurva jarak yang terurut.

Parameter & Hasil

eps_val <- 1.8

db            <- dbscan(X_scaled, eps = eps_val, minPts = 2)
dbscan_labels <- db$cluster   # 0 = noise

n_clusters_db <- length(setdiff(unique(dbscan_labels), 0))
n_noise_db    <- sum(dbscan_labels == 0)

result_db <- data.frame(
  Observasi      = rownames(data),
  Cluster_DBSCAN = ifelse(dbscan_labels == 0, "Noise", paste0("Cluster ", dbscan_labels))
)

kable(result_db,
      caption = sprintf("Hasil DBSCAN (eps=%.1f, min_samples=2) — %d klaster, %d noise",
                        eps_val, n_clusters_db, n_noise_db))
Hasil DBSCAN (eps=1.8, min_samples=2) — 3 klaster, 1 noise
Observasi Cluster_DBSCAN
Obs-1 Cluster 1
Obs-2 Cluster 1
Obs-3 Cluster 1
Obs-4 Cluster 2
Obs-5 Cluster 2
Obs-6 Cluster 1
Obs-7 Cluster 3
Obs-8 Noise
Obs-9 Cluster 3
Obs-10 Cluster 1

Interpretasi hasil:

DBSCAN hanya menemukan 3 cluster dari data ini, dengan 1 observasi yang diklasifikasikan sebagai noise. Ini menunjukkan bahwa dengan parameter eps = 1.5 dan minPts = 2, sebagian besar observasi berada dalam satu area yang cukup padat, sementara observasi yang berlabel Noise letaknya terlalu terisolasi untuk masuk ke cluster manapun. Hasil yang hanya 1 cluster ini berbeda dari dua metode lain (yang menghasilkan 3 cluster), mengindikasikan bahwa DBSCAN pada konfigurasi ini lebih konservatif dalam memisahkan kelompok.


Metode 2 – Spectral Clustering

Konsep & Parameter

Spectral Clustering bekerja dengan cara yang berbeda dari metode berbasis jarak biasa. Algoritma ini terlebih dahulu mengkonstruksi graf kemiripan (similarity graph) antar observasi, kemudian menggunakan eigendekomposisi dari matriks Laplacian graf tersebut untuk mereduksi dimensi, dan baru menerapkan clustering (biasanya k-means) pada ruang berdimensi rendah hasil eigendekomposisi.

Keunggulan Spectral Clustering:

  • Efektif untuk cluster dengan bentuk non-convex dan struktur yang kompleks.
  • Menangkap hubungan global antar titik melalui representasi graf.

Parameter yang digunakan:

Parameter Nilai Penjelasan
centers 3 Jumlah cluster yang diinginkan
kernel rbfdot Kernel RBF (Radial Basis Function) untuk menghitung kemiripan
sigma 1.0 Parameter bandwidth kernel RBF — mengontrol seberapa cepat kemiripan menurun dengan jarak
set.seed(42)
spectral        <- specc(X_scaled, centers = 3,
                          kernel = "rbfdot", kpar = list(sigma = 1.0))
spectral_labels <- spectral@.Data

result_sp <- data.frame(
  Observasi        = rownames(data),
  Cluster_Spectral = paste0("Cluster ", spectral_labels)
)

kable(result_sp,
      caption = "Hasil Spectral Clustering (n_clusters=3, affinity=rbf, gamma=1.0)")
Hasil Spectral Clustering (n_clusters=3, affinity=rbf, gamma=1.0)
Observasi Cluster_Spectral
Obs-1 Cluster 3
Obs-2 Cluster 3
Obs-3 Cluster 3
Obs-4 Cluster 2
Obs-5 Cluster 2
Obs-6 Cluster 3
Obs-7 Cluster 1
Obs-8 Cluster 3
Obs-9 Cluster 1
Obs-10 Cluster 3

Anggota tiap cluster:

for (cl in sort(unique(spectral_labels))) {
  members <- rownames(data)[spectral_labels == cl]
  cat(sprintf("- **Cluster %d**: %s\n", cl, paste(members, collapse = ", ")))
}
  • Cluster 1: Obs-7, Obs-9
  • Cluster 2: Obs-4, Obs-5
  • Cluster 3: Obs-1, Obs-2, Obs-3, Obs-6, Obs-8, Obs-10

Interpretasi hasil:

Spectral Clustering berhasil membagi 10 observasi ke dalam 3 cluster tanpa ada noise — semua observasi masuk ke salah satu cluster. Pembagian ini mencerminkan struktur kemiripan dalam ruang graf RBF, yang tidak selalu sama dengan jarak Euclidean biasa. Karena Spectral Clustering mempertimbangkan konektivitas global antar titik, ia dapat memisahkan kelompok yang mungkin saling tumpang tindih jika hanya dilihat dari jarak langsung.


Metode 3 – Model-Based Clustering (GMM via Mclust)

Konsep & Parameter

Model-Based Clustering mengasumsikan bahwa data dihasilkan dari campuran beberapa distribusi probabilistik — dalam hal ini Gaussian Mixture Model (GMM). Setiap cluster dimodelkan sebagai distribusi Gaussian dengan mean dan matriks kovarians tersendiri. Parameter model diestimasi menggunakan algoritma EM (Expectation-Maximization).

Keunggulan GMM:

  • Menghasilkan probabilitas keanggotaan (soft assignment) — setiap observasi memiliki probabilitas berbeda untuk setiap cluster.
  • Fleksibel dalam bentuk cluster, bergantung pada tipe kovarians yang dipilih.
  • Model dipilih secara otomatis berdasarkan kriteria BIC (Bayesian Information Criterion).

Parameter yang digunakan:

Parameter Nilai Penjelasan
G 3 Jumlah komponen Gaussian (cluster)
Model kovarians otomatis Dipilih oleh Mclust berdasarkan BIC tertinggi
set.seed(42)
mb         <- Mclust(X_scaled, G = 3, verbose = FALSE)
gmm_labels <- mb$classification
gmm_proba  <- mb$z

result_gmm <- data.frame(
  Observasi   = rownames(data),
  Cluster_GMM = paste0("Cluster ", gmm_labels)
)

kable(result_gmm,
      caption = sprintf("Hasil GMM (n_components=3, covariance_type=%s)", mb$modelName))
Hasil GMM (n_components=3, covariance_type=VII)
Observasi Cluster_GMM
Obs-1 Cluster 1
Obs-2 Cluster 1
Obs-3 Cluster 1
Obs-4 Cluster 2
Obs-5 Cluster 2
Obs-6 Cluster 2
Obs-7 Cluster 3
Obs-8 Cluster 2
Obs-9 Cluster 3
Obs-10 Cluster 2

Informasi model yang terpilih:

Metrik Nilai
Model kovarians VII
AIC 125.16
BIC -130.3

Model VII dipilih oleh Mclust karena memberikan nilai BIC terbaik di antara berbagai kandidat model kovarians. Dalam notasi mclust, huruf-huruf pada nama model menggambarkan karakteristik kovarians: volume, bentuk, dan orientasi cluster.

Probabilitas Keanggotaan (GMM)

Salah satu fitur paling informatif dari GMM adalah kemampuannya menghasilkan probabilitas keanggotaan lunak (soft assignment). Berbeda dari DBSCAN dan Spectral Clustering yang memberikan label tegas (hard assignment), GMM menyatakan seberapa besar keyakinan bahwa suatu observasi berasal dari masing-masing cluster.

proba_df           <- as.data.frame(round(gmm_proba, 3))
colnames(proba_df) <- paste0("P(Cluster ", 1:3, ")")
rownames(proba_df) <- rownames(data)

kable(proba_df, caption = "Probabilitas Keanggotaan Tiap Observasi (GMM)")
Probabilitas Keanggotaan Tiap Observasi (GMM)
P(Cluster 1) P(Cluster 2) P(Cluster 3)
Obs-1 0.942 0.058 0.000
Obs-2 0.998 0.002 0.000
Obs-3 0.828 0.172 0.000
Obs-4 0.000 1.000 0.000
Obs-5 0.000 1.000 0.000
Obs-6 0.000 1.000 0.000
Obs-7 0.000 0.005 0.995
Obs-8 0.000 1.000 0.000
Obs-9 0.000 0.001 0.999
Obs-10 0.000 1.000 0.000

Cara membaca tabel ini: Nilai mendekati 1.000 berarti observasi tersebut dengan sangat yakin termasuk dalam cluster itu. Nilai mendekati 0.000 berarti hampir pasti bukan anggota. Observasi dengan probabilitas tinggi di satu cluster disebut observasi yang well-separated, sedangkan yang memiliki probabilitas moderat di beberapa cluster menunjukkan ambiguitas keanggotaan — observasi tersebut berada di “batas” antar cluster.


Visualisasi Perbandingan Ketiga Metode

Visualisasi berikut menampilkan hasil ketiga metode clustering dalam ruang PCA 2 dimensi. Perlu diingat bahwa clustering dilakukan pada data 4 dimensi — PCA hanya digunakan untuk memudahkan visualisasi. Oleh karena itu, ada kemungkinan dua titik yang terlihat berdekatan di plot 2D sebenarnya relatif jauh di ruang 4 dimensi, dan sebaliknya.

p_db <- ggplot(pca_df, aes(PC1, PC2, color = DBSCAN, shape = DBSCAN)) +
  geom_point(size = 4, alpha = 0.9, stroke = 0.8) +
  geom_text_repel(aes(label = Obs), size = 3, color = "#333333",
                  box.padding = 0.4, point.padding = 0.3, max.overlaps = 20) +
  scale_color_manual(values = label_db) +
  scale_shape_manual(values = c("Cluster 1" = 16, "Noise" = 4)) +
  theme_cluster("DBSCAN")

p_sp <- ggplot(pca_df, aes(PC1, PC2, color = Spectral, shape = Spectral)) +
  geom_point(size = 4, alpha = 0.9, stroke = 0.8) +
  geom_text_repel(aes(label = Obs), size = 3, color = "#333333",
                  box.padding = 0.4, point.padding = 0.3, max.overlaps = 20) +
  scale_color_manual(values = label_sp) +
  scale_shape_manual(values = c("Cluster 1" = 16, "Cluster 2" = 17, "Cluster 3" = 15)) +
  theme_cluster("Spectral Clustering")

p_gmm <- ggplot(pca_df, aes(PC1, PC2, color = GMM, shape = GMM)) +
  geom_point(size = 4, alpha = 0.9, stroke = 0.8) +
  geom_text_repel(aes(label = Obs), size = 3, color = "#333333",
                  box.padding = 0.4, point.padding = 0.3, max.overlaps = 20) +
  scale_color_manual(values = label_gmm) +
  scale_shape_manual(values = c("Cluster 1" = 16, "Cluster 2" = 17, "Cluster 3" = 15)) +
  theme_cluster(sprintf("Model-Based / GMM (%s)", mb$modelName))

(p_db | p_sp | p_gmm) +
  plot_annotation(
    title    = "Perbandingan Hasil Clustering pada Data (X1–X4)",
    subtitle = sprintf("Visualisasi Ruang PCA (%.1f%% variansi)", total_var),
    theme    = theme(
      plot.title    = element_text(face = "bold", size = 15, hjust = 0.5),
      plot.subtitle = element_text(size = 11, hjust = 0.5, color = "gray40"),
      plot.background = element_rect(fill = "white", color = NA)
    )
  )
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_point()`).

Membaca visualisasi di atas:

  • DBSCAN (kiri): Hasil DBSCAN menunjukkan sebagian besar observasi tergabung ke dalam satu cluster utama berwarna merah, sedangkan satu titik yaitu Obs-8 teridentifikasi sebagai noise yang ditandai simbol × abu-abu. Hal ini menunjukkan bahwa DBSCAN menganggap sebagian besar data masih berada dalam kepadatan yang saling terhubung, sementara Obs-8 memiliki karakteristik yang cukup berbeda dibanding titik lainnya sehingga tidak masuk ke dalam cluster utama.

  • Spectral Clustering (tengah): Spectral Clustering berhasil membagi data menjadi tiga kelompok yang relatif lebih seimbang. Cluster 1 (merah) berisi observasi yang cenderung berada pada sisi kanan bawah, Cluster 2 (hijau) berada pada area tengah hingga atas, sedangkan Cluster 3 (kuning) banyak tersebar pada sisi kiri dan kanan tertentu. Pemisahan ini menunjukkan bahwa metode Spectral Clustering mampu menangkap hubungan antar titik berdasarkan struktur konektivitas global data.

  • GMM (kanan): Model-Based Clustering/GMM juga membentuk tiga cluster, namun pola pengelompokannya terlihat lebih fleksibel dibanding Spectral Clustering. Cluster hijau mendominasi area atas dan kiri, cluster merah berada pada bagian bawah, sedangkan cluster kuning cenderung berada pada sisi kanan grafik. Pendekatan GMM mengelompokkan data berdasarkan distribusi probabilitas Gaussian sehingga pembagian cluster tampak lebih halus dan adaptif terhadap sebaran data.

Evaluasi & Metrik Perbandingan

Penjelasan Metrik

Untuk mengevaluasi kualitas clustering secara kuantitatif, digunakan tiga metrik yang tidak memerlukan label ground truth (unsupervised evaluation metrics):

Metrik Cara Membaca Nilai Terbaik
Silhouette Score Seberapa mirip suatu titik dengan clusternya sendiri dibanding cluster lain. Rentang: −1 hingga 1. Mendekati 1 (lebih tinggi = lebih baik)
Davies-Bouldin Index (DBI) Rata-rata rasio jarak intra-cluster terhadap jarak antar-cluster. Mendekati 0 (lebih rendah = lebih baik)
Calinski-Harabasz Index (CHI) Rasio variansi antar-cluster terhadap variansi intra-cluster. Lebih tinggi = lebih baik
metrics_df <- data.frame(
  Metode              = c("DBSCAN", "Spectral Clustering", "GMM (Model-Based)"),
  Jumlah_Cluster      = c(n_clusters_db, 3, 3),
  Jumlah_Noise        = c(n_noise_db, 0, 0),
  Silhouette          = c(sil_score(X_scaled, dbscan_labels),
                          sil_score(X_scaled, spectral_labels),
                          sil_score(X_scaled, gmm_labels)),
  Davies_Bouldin      = c(db_score(X_scaled, dbscan_labels),
                          db_score(X_scaled, spectral_labels),
                          db_score(X_scaled, gmm_labels)),
  Calinski_Harabasz   = c(ch_score(X_scaled, dbscan_labels),
                          ch_score(X_scaled, spectral_labels),
                          ch_score(X_scaled, gmm_labels))
)

kable(metrics_df, caption = "Metrik Evaluasi Ketiga Metode Clustering", digits = 4)
Metrik Evaluasi Ketiga Metode Clustering
Metode Jumlah_Cluster Jumlah_Noise Silhouette Davies_Bouldin Calinski_Harabasz
DBSCAN 3 1 0.5045 0.8848 3.8747
Spectral Clustering 3 0 0.4378 1.0033 3.2097
GMM (Model-Based) 3 0 0.4358 1.0633 3.7594
met_long <- melt(
  metrics_df[, c("Metode","Silhouette","Davies_Bouldin","Calinski_Harabasz")],
  id.vars = "Metode", variable.name = "Metrik", value.name = "Nilai"
)

ggplot(met_long, aes(x = Metode, y = Nilai, fill = Metode)) +
  geom_col(width = 0.6, alpha = 0.85, color = "white", linewidth = 0.5) +
  geom_text(aes(label = round(Nilai, 3)), vjust = -0.4, size = 3.2,
            fontface = "bold") +
  facet_wrap(~Metrik, scales = "free_y", ncol = 3) +
  scale_fill_manual(values = c("#E63946", "#2A9D8F", "#E9C46A")) +
  theme_minimal(base_size = 11) +
  theme(
    legend.position    = "none",
    strip.text         = element_text(face = "bold", size = 11),
    axis.text.x        = element_text(size = 9, angle = 10, hjust = 1),
    panel.grid.major.x = element_blank(),
    plot.title         = element_text(face = "bold", hjust = 0.5, size = 13),
    plot.background    = element_rect(fill = "white", color = NA)
  ) +
  labs(title = "Evaluasi & Metrik Perbandingan Clustering", x = NULL, y = "Nilai")

Interpretasi Metrik

Catatan penting: Perbandingan metrik antar metode ini perlu dilakukan dengan hati-hati. DBSCAN hanya menghasilkan 1 cluster (sisanya noise), sehingga metrik berbasis pemisahan antar cluster tidak dapat dihitung untuk DBSCAN, nilai yang muncul hanya mencerminkan kekompakan titik-titik yang masuk cluster, bukan kualitas pemisahan secara keseluruhan.

Untuk Spectral Clustering vs GMM (keduanya menghasilkan 3 cluster), bandingkan:

  • Silhouette Score: Nilai yang lebih tinggi menunjukkan cluster yang lebih kompak dan terpisah dengan baik. Metode dengan Silhouette lebih tinggi menghasilkan pengelompokan yang lebih “bersih”.
  • Davies-Bouldin Index: Nilai lebih rendah berarti cluster lebih kompak secara internal dan lebih terpisah dari cluster lain — kondisi ideal.
  • Calinski-Harabasz Index: Nilai lebih tinggi berarti pemisahan antar cluster jauh lebih besar dibanding variasi di dalam cluster — semakin tinggi semakin baik.

Rekap Hasil Cluster per Observasi

Tabel berikut merangkum label cluster yang diberikan oleh ketiga metode untuk setiap observasi, beserta kolom Konsisten yang menunjukkan apakah ketiga metode sepakat dalam pengelompokan observasi tersebut.

summary_df <- data.frame(
  Observasi = rownames(data),
  DBSCAN    = ifelse(dbscan_labels == 0, "Noise", paste0("Cluster ", dbscan_labels)),
  Spectral  = paste0("Cluster ", spectral_labels),
  GMM       = paste0("Cluster ", gmm_labels)
)
summary_df$Konsisten <- apply(summary_df[, 2:4], 1, function(r) {
  if (r[1] == "Noise") return("~")
  if (r[1] == r[2] && r[2] == r[3]) "✓" else "~"
})

kable(summary_df, caption = "Rekap Hasil Cluster per Observasi (✓ = ketiga metode setuju)")
Rekap Hasil Cluster per Observasi (✓ = ketiga metode setuju)
Observasi DBSCAN Spectral GMM Konsisten
Obs-1 Cluster 1 Cluster 3 Cluster 1 ~
Obs-2 Cluster 1 Cluster 3 Cluster 1 ~
Obs-3 Cluster 1 Cluster 3 Cluster 1 ~
Obs-4 Cluster 2 Cluster 2 Cluster 2
Obs-5 Cluster 2 Cluster 2 Cluster 2
Obs-6 Cluster 1 Cluster 3 Cluster 2 ~
Obs-7 Cluster 3 Cluster 1 Cluster 3 ~
Obs-8 Noise Cluster 3 Cluster 2 ~
Obs-9 Cluster 3 Cluster 1 Cluster 3 ~
Obs-10 Cluster 1 Cluster 3 Cluster 2 ~

Catatan: Tanda ~ tidak selalu berarti hasil yang buruk perbedaan antar metode justru mencerminkan karakteristik dan asumsi masing-masing algoritma yang berbeda. Perbedaan terbesar wajar terjadi karena DBSCAN mendeteksi banyak noise, sementara Spectral dan GMM memaksa semua observasi masuk ke salah satu cluster.

Profil Rata-Rata Tiap Cluster (GMM)

Tabel berikut menampilkan rata-rata nilai variabel X1–X4 untuk setiap cluster hasil GMM. Profil ini membantu kita memahami karakteristik khas masing-masing kelompok.

data_gmm <- cbind(data, Cluster = paste0("Cluster ", gmm_labels))
agg_gmm  <- aggregate(. ~ Cluster,
                       data_gmm[, c("X1","X2","X3","X4","Cluster")],
                       mean)
agg_gmm[, -1] <- round(agg_gmm[, -1], 2)

kable(agg_gmm, caption = "Profil Rata-Rata Variabel per Cluster (GMM)")
Profil Rata-Rata Variabel per Cluster (GMM)
Cluster X1 X2 X3 X4
Cluster 1 8.67 5.0 9.67 6.33
Cluster 2 9.60 8.6 6.40 11.60
Cluster 3 6.50 11.5 13.00 6.00

Heatmap Probabilitas Keanggotaan (GMM)

Heatmap di bawah ini memvisualisasikan probabilitas keanggotaan lunak (soft membership) dari GMM. Warna yang lebih merah/gelap menunjukkan probabilitas tinggi (keyakinan kuat), sementara warna putih/kuning menunjukkan probabilitas rendah.

proba_long <- melt(data.frame(
  Observasi  = rownames(data),
  `Cluster 1` = round(gmm_proba[, 1], 3),
  `Cluster 2` = round(gmm_proba[, 2], 3),
  `Cluster 3` = round(gmm_proba[, 3], 3),
  check.names = FALSE
), id.vars = "Observasi", variable.name = "Cluster", value.name = "Probabilitas")

proba_long$Observasi <- factor(proba_long$Observasi,
                               levels = rev(paste0("Obs-", 1:10)))

ggplot(proba_long, aes(x = Cluster, y = Observasi, fill = Probabilitas)) +
  geom_tile(color = "white", linewidth = 0.8) +
  geom_text(aes(label = sprintf("%.3f", Probabilitas)),
            size  = 3.5, fontface = "bold",
            color = ifelse(proba_long$Probabilitas > 0.5, "white", "#333333")) +
  scale_fill_gradient2(low = "#FFFFFF", mid = "#E9C46A", high = "#E63946",
                       midpoint = 0.5, limits = c(0, 1),
                       name = "Probabilitas") +
  theme_minimal(base_size = 11) +
  theme(
    plot.title      = element_text(face = "bold", hjust = 0.5, size = 13),
    plot.subtitle   = element_text(hjust = 0.5, size = 10, color = "gray40"),
    axis.title      = element_blank(),
    legend.position = "right",
    panel.grid      = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  ) +
  labs(title    = "Probabilitas Keanggotaan Tiap Observasi (GMM)",
       subtitle = "Nilai mendekati 1 = kepastian tinggi")

Interpretasi heatmap:

  • Observasi yang menampilkan satu sel merah gelap dan dua sel putih adalah observasi yang sangat jelas kelompoknya — GMM sangat yakin ia masuk ke satu cluster tertentu.
  • Observasi yang memiliki beberapa sel dengan warna sedang (kuning/oranye) menunjukkan ambiguitas observasi tersebut berada di perbatasan antar cluster. Dalam konteks praktis, observasi semacam ini perlu diperhatikan lebih lanjut, misalnya dengan mempertimbangkan informasi domain.
  • Secara keseluruhan, semakin “kontras” pola setiap baris (satu sel dominan, sisanya mendekati nol), semakin baik pemisahan cluster secara probabilistik.

Interpretasi & Kesimpulan

Perbandingan Karakteristik Metode

aspek_df <- data.frame(
  Aspek = c(
    "Pendekatan dasar",
    "Asumsi bentuk cluster",
    "Penanganan noise/outlier",
    "Tipe keanggotaan",
    "Parameter utama",
    "Perlu jumlah cluster di awal?",
    "Sensitif terhadap skala?"
  ),
  DBSCAN = c(
    "Density-based",
    "Bebas (arbitrary shape)",
    "Otomatis (diberi label noise)",
    "Hard (0/1)",
    "eps, minPts",
    "Tidak",
    "Ya"
  ),
  `Spectral Clustering` = c(
    "Graph & eigenvalue decomposition",
    "Bebas (non-convex)",
    "Semua titik masuk cluster",
    "Hard (0/1)",
    "n_clusters, gamma/sigma",
    "Ya",
    "Ya"
  ),
  `GMM (Model-Based)` = c(
    "Probabilistik (distribusi Gaussian)",
    "Ellipsoidal (bergantung kovarians)",
    "Semua titik masuk cluster",
    "Soft (probabilistik)",
    "n_components, tipe kovarians",
    "Ya",
    "Ya"
  ),
  check.names = FALSE
)

kable(aspek_df, caption = "Perbandingan Karakteristik Metode Clustering",
      align = c("l","c","c","c"))
Perbandingan Karakteristik Metode Clustering
Aspek DBSCAN Spectral Clustering GMM (Model-Based)
Pendekatan dasar Density-based Graph & eigenvalue decomposition Probabilistik (distribusi Gaussian)
Asumsi bentuk cluster Bebas (arbitrary shape) Bebas (non-convex) Ellipsoidal (bergantung kovarians)
Penanganan noise/outlier Otomatis (diberi label noise) Semua titik masuk cluster Semua titik masuk cluster
Tipe keanggotaan Hard (0/1) Hard (0/1) Soft (probabilistik)
Parameter utama eps, minPts n_clusters, gamma/sigma n_components, tipe kovarians
Perlu jumlah cluster di awal? Tidak Ya Ya
Sensitif terhadap skala? Ya Ya Ya

Interpretasi Tiap Cluster (GMM sebagai Referensi)

GMM dipilih sebagai referensi interpretasi karena: (1) menghasilkan 3 cluster seperti Spectral, (2) menyediakan probabilitas keanggotaan yang informatif, dan (3) dipilih secara objektif berdasarkan BIC.

for (cl in 1:3) {
  idx <- which(gmm_labels == cl)
  obs <- rownames(data)[idx]
  cmn <- round(colMeans(data[idx, , drop = FALSE]), 2)
  cat(sprintf("\n### Cluster %d\n\n", cl))
  cat(sprintf("**Observasi:** %s\n\n", paste(obs, collapse = ", ")))
  cat(sprintf(
    "**Rata-rata variabel:** X1 = %.2f | X2 = %.2f | X3 = %.2f | X4 = %.2f\n\n",
    cmn["X1"], cmn["X2"], cmn["X3"], cmn["X4"]
  ))
}

Cluster 1

Observasi: Obs-1, Obs-2, Obs-3

Rata-rata variabel: X1 = 8.67 | X2 = 5.00 | X3 = 9.67 | X4 = 6.33

Cluster 2

Observasi: Obs-4, Obs-5, Obs-6, Obs-8, Obs-10

Rata-rata variabel: X1 = 9.60 | X2 = 8.60 | X3 = 6.40 | X4 = 11.60

Cluster 3

Observasi: Obs-7, Obs-9

Rata-rata variabel: X1 = 6.50 | X2 = 11.50 | X3 = 13.00 | X4 = 6.00

Perbedaan rata-rata variabel antar cluster di atas menggambarkan “profil” masing-masing kelompok. Cluster dengan nilai X1 tinggi cenderung berbeda secara fundamental dari cluster dengan nilai X4 tinggi, misalnya. Profil inilah yang menjadi dasar interpretasi substantif — misalnya, jika variabel ini merepresentasikan fitur produk atau karakteristik pelanggan, cluster tersebut dapat diberi nama yang bermakna.

Ringkasan & Rekomendasi

Kesimpulan utama dari analisis ini:

  1. DBSCAN mendeteksi struktur yang paling konservatif — hanya 1 cluster besar dengan beberapa noise. Ini berguna ketika kita tidak ingin memaksakan jumlah cluster dan perlu mengidentifikasi outlier secara otomatis. Namun, pemilihan parameter eps sangat krusial dan sensitif.

  2. Spectral Clustering berhasil memisahkan data menjadi 3 cluster dengan mempertimbangkan konektivitas global melalui graf kemiripan RBF. Metode ini cocok untuk data dengan struktur non-linear atau non-convex yang tidak dapat dipisahkan dengan baik menggunakan pendekatan berbasis jarak biasa.

  3. GMM (Model-Based) memberikan informasi paling kaya berupa probabilitas keanggotaan lunak, sehingga ketidakpastian pengelompokan tiap observasi dapat dikuantifikasi. Model kovarians dipilih secara objektif melalui BIC, menjadikannya pilihan yang dapat dipertanggungjawabkan secara statistik.

Rekomendasi pemilihan metode:

  • Gunakan DBSCAN jika jumlah cluster tidak diketahui dan deteksi outlier penting.
  • Gunakan Spectral Clustering jika data memiliki struktur non-linear atau cluster berbentuk kompleks.
  • Gunakan GMM jika interpretasi probabilistik dan kerangka statistik formal diperlukan, terutama untuk pengambilan keputusan berbasis ketidakpastian. “) ```

Catatan teknis: Semua metode sensitif terhadap skala data — standarisasi adalah langkah wajib sebelum clustering. Pada dataset kecil (n=10), hasil clustering sangat dipengaruhi oleh pilihan parameter dan dapat berubah secara signifikan jika parameter diubah sedikit. Disarankan untuk melakukan analisis sensitivitas parameter pada dataset yang lebih besar sebelum menarik kesimpulan final.