Clustering merupakan salah satu metode Unsupervised Learning yang bertujuan untuk melakukan pengelompokan data berdasarkan kemiripan/jarak antar data. Clustering memiliki karakteristik dimana anggota dalam satu cluster memiliki kemiripan yang sama atau jarak yang dekat, sementara anggota antar cluster memiliki kemiripan yang sangat berbeda atau jarak yang sangat jauh (Tan et al., 2006). Metode clustering dibagi menjadi dua jenis, yaitu Hierarchical Clustering dan Partitional Clustering.
Hierarchical Clustering adalah metode pengelompokan data yang dilakukan dengan membuat suatu bagan hirarki (dendrogram) dengan tujuan menunjukkan kemiripan antar data.
Secara umum, hierarchical clustering dibagi menjadi dua jenis yaitu Agglomerative dan Divisive. Kedua metode ini dibedakan berdasarkan pendekatan dalam melakukan pengelompokkan data hingga membentuk dendrogram, menggunakan bottom-up atau top-down manner.
Agglomerative Clustering biasa disebut juga sebagai agglomerative nesting (AGNES) dimana cara kerja dalam melakukan pengelompokan data menggunakan bottom-up manner. Prosesnya dimulai dengan menganggap setiap data sebagai satu cluster kecil (leaf) yang hanya memiliki satu anggota saja, lalu pada tahap selanjutnya dua cluster yang memiliki kemiripan akan dikelompokkan menjadi satu cluster yang lebih besar (nodes) dan proses ini akan dilakukan terus menerus hingga semua data menjadi satu cluster besar (root).
Divisive Hierarchical Clustering biasa disebut juga sebagai divisive analysis (DIANA) di mana cara kerja dalam melakukan pengelompokan data menggunakan top-down manner. Prosesnya dimulai dengan menganggap satu set data sebagai satu cluster besar (root), lalu dalam setiap iterasinya setiap data yang memiliki karakteristik yang berbeda akan dipecah menjadi dua cluster yang lebih kecil (nodes) dan proses akan terus berjalan hingga setiap data menjadi satu cluster kecil (leaf) yang hanya memiliki satu anggota saja.
Berikut adalah ilustrasi mengenai bagaimana Agglomerative dan Disive Clustering bekerja
knitr::include_graphics("download.png")
Dalam hierarchical clustering, selain menghitung jarak antar data, diperlukan juga cara untuk menghitung jarak antar cluster sehingga dapat terbentuk dendrogram dari cluster-cluster yang memiliki kedekatan. Proses penggabungan cluster-cluster kecil menjadi satu dendrogram utuh dilakukan melalui beberapa pendekatan yang disebut Linkage Method.
Berikut ini beberapa linkage method yang sering digunakan pada agglomerative approach:
Pada metode complete linkage, jarak antar cluster ditentukan berdasarkan jarak terbesar (maximum distance) antara pasangan data dari dua cluster yang berbeda. Artinya, semua pasangan data antar cluster dihitung jaraknya terlebih dahulu, kemudian dipilih jarak yang paling besar sebagai jarak antar cluster.
Metode ini biasanya menghasilkan cluster yang lebih terpisah dan lebih kompak (compact).
Formula:
\[d_{12} = \max_{i,j} d(X_i, Y_j)\]
Keterangan:
\(Y_1,Y_2, ..., Y_k\) : observasi pada cluster 2
\(d(X_i,Y_j)\) : jarak antara data pada cluster 1 dan cluster 2
Pada metode single linkage, jarak antar cluster ditentukan berdasarkan jarak terkecil (minimum distance) antara pasangan data dari dua cluster yang berbeda.
Metode ini cenderung menghasilkan cluster yang lebih longgar (loose) karena penggabungan cluster hanya bergantung pada pasangan data yang lebih dekat.
Formula:
\[d_{12} = \min_{i,j} d(X_i, Y_j)\]
Pada metode average linkage, jarak antar cluster dihitung dengan mengambil rata-rata jarak dari semua pasangan data yang berasal dari dua cluster yang berbeda.
Metode ini biasanya menghasilkan cluster yang tidak terlalu rapat (compact) maupun terlalu longgar (loose).
Formula:
\[d_{12} = \frac{1}{kl}\sum_{i=1}^{k}\sum_{j=1}^{l} d(X_i, Y_j)\]
Pada metode centroid linkage, jarak antar cluster dihitung berdasarkan jarak antara centroid (titik pusat) dari masing-masing cluster. Centroid dihitung menggunakan rata-rata dari data pada cluster tersebut.
Cluster yang memiliki jarak centroid paling kecil akan digabungkan terlebih dahulu dalam proses pembentukan dendrogram.
Formula:
\[d_{12} = d(\bar{X}, \bar{Y})\]
USArrests AnalysisMengaplikasikan cara kerja hierarchical clustering
AGNES untuk menganalisis kedekatan Negara Bagian AS
berdasarkan tingkat kriminalitasnya. Analisis dilakukan menggunakan
dataset USArrests yang menyimpan informasi statistik
terkait jumlah kriminalitas assault,murder,
dan rape per 100,000 penduduk pada 50 negara bagian Amerika
Serikat pada tahun 1973.
head(USArrests)
# Cek missing value
anyNA(USArrests)
## [1] FALSE
# Cek skala tiap variable data
summary(USArrests)
## Murder Assault UrbanPop Rape
## Min. : 0.800 Min. : 45.0 Min. :32.00 Min. : 7.30
## 1st Qu.: 4.075 1st Qu.:109.0 1st Qu.:54.50 1st Qu.:15.07
## Median : 7.250 Median :159.0 Median :66.00 Median :20.10
## Mean : 7.788 Mean :170.8 Mean :65.54 Mean :21.23
## 3rd Qu.:11.250 3rd Qu.:249.0 3rd Qu.:77.75 3rd Qu.:26.18
## Max. :17.400 Max. :337.0 Max. :91.00 Max. :46.00
# Standarisasi
us <- scale(USArrests)
head(us)
## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144 1.7589234 2.067820292
## Colorado 0.02571456 0.3988593 0.8608085 1.864967207
# Menghitung distance
us_dist <- dist(x=us,method = "euclidean")
as.matrix(us_dist)[1:6,1:6]
## Alabama Alaska Arizona Arkansas California Colorado
## Alabama 0.000000 2.703754 2.293520 1.289810 3.263110 2.651067
## Alaska 2.703754 0.000000 2.700643 2.826039 3.012541 2.326519
## Arizona 2.293520 2.700643 0.000000 2.717758 1.310484 1.365031
## Arkansas 1.289810 2.826039 2.717758 0.000000 3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641 0.000000 1.287619
## Colorado 2.651067 2.326519 1.365031 2.831051 1.287619 0.000000
library(cluster)
library(factoextra)
library(dplyr)
us_hc_complete <- hclust(us_dist, method = "complete")
fviz_dend(us_hc_complete,
cex = 0.5,
main = "Cluster Dendrogram Complete Linkage")
complete_coph <- cophenetic(us_hc_complete)
cor(complete_coph, us_dist)
## [1] 0.6979437
complete_clust <- cutree(us_hc_complete, k = 4)
Berikut ini banyak anggota dari masing-masing cluster yang terbentuk.
table(complete_clust)
## complete_clust
## 1 2 3 4
## 8 11 21 10
Anggota pada masing-masing cluster cukup merata dengan cluster yang paling banyak memiliki anggota adalah cluster 3. Berikut hasil akhir cluster yang terbentuk apabila dilihat dari dendrogram.
fviz_dend(us_hc_complete,
k = 4,
cex = 0.5,
k_colors = "jco",
rect = TRUE,
main = "Complete Linkage Cluster")
Cara membaca cluster pada dendrogram sebagai berikut :
us_hc_single <- hclust(d = us_dist, method = "single")
fviz_dend(us_hc_single, cex = 0.5,
main = "Cluster Dendrogram Single Linkage")
single_coph <- cophenetic(us_hc_single)
cor(single_coph, us_dist)
## [1] 0.541272
korelasi yang diperoleh rendah, artinya cluster yang terbentuk kurang merepresentasikan kondisi data yang ada. Sehingga menggunakan single linkage untuk data USArrest kurang relevan.
single_clust <- cutree(us_hc_single, k = 4)
Berikut ini banyak anggota dari masing-masing cluster yang terbentuk.
table(single_clust)
## single_clust
## 1 2 3 4
## 46 1 2 1
Anggota pada cluster yang terbentuk sangat berbeda secara signifikan. Cluster 1 memiliki anggota yang paling banyak hampir sebanyak total observasi pada data. Hal ini yang dikarenakan terlalu rapatnya antar observasi sehingga sulit dipisahkan perbedaannya.
fviz_dend(us_hc_single, k = 4, k_colors = "jco", rect = T,
main = "Single Linkage Cluster")
Cara membaca cluster pada dendrogram yaitu sebagai berikut :
us_hc_avg <- hclust(d = us_dist, method = "average")
fviz_dend(us_hc_avg, cex = 0.5, main = "Cluster Dendrogram Average Linkage")
avg_coph <- cophenetic(us_hc_avg)
cor(avg_coph, us_dist)
## [1] 0.7180382
avg_clust <- cutree(us_hc_avg, k = 4)
Berikut ini banyak anggota dari masing-masing cluster yang terbentuk.
table(avg_clust)
## avg_clust
## 1 2 3 4
## 7 1 12 30
Anggota cluster paling banyak diperoleh pada cluster 4 sebanyak 30 cluster. Namun terdapat cluster yang hanya memiliki 1 anggota saja yaitu pada cluster 2. Hal ini dapat dijadikan indikasi bahwa observasi pada cluster 2 yaitu “Alaska” merupakan anomali data.
fviz_dend(us_hc_avg, k = 4, k_colors = "jco", rect = T,
main = "Average Linkage Cluster")
Cara membaca cluster pada dendrogram yaitu sebagai berikut :
us_hc_centroid <- hclust(d = us_dist, method = "centroid")
fviz_dend(us_hc_centroid, cex = 0.5, main = "Cluster Dendrogram Centroid Linkage")
centroid_coph <- cophenetic(us_hc_centroid)
cor(centroid_coph, us_dist)
## [1] 0.6074717
centroid_clust <- cutree(us_hc_centroid, k = 4)
Berikut ini banyak anggota dari masing-masing cluster yang terbentuk.
table(centroid_clust)
## centroid_clust
## 1 2 3 4
## 47 1 1 1
Anggota cluster didominasi pada cluster 1 sebanyak 47 observasi, namun untuk cluster yang lain hanya memiliki 1 observasi saja. Berikut visualiasi cluster yang terbentuk untuk masing-masing dendrogramnya.
fviz_dend(us_hc_centroid, k = 4, k_colors = "jco", rect = T,
main = "Centroid Linkage Cluster")
## Warning in get_col(col, k): Length of color vector was shorter than the number
## of clusters - color vector was recycled
Hasil partisi cluster yang terbentuk tidak sesuai dengan yang seharusnya. Berikut deskripsi anggota cluster yang seharusnya:
Dari keempat dendrogram yang sudah dibuat, dapat memilih salah satu yang ingin digunakan. Pemilihannya dapat berdasarkan hasil validasi cluster tree menggunakan korelasi cophenetic distance dengan jarak original masing-masing observasi yang tadi telah dihitung:
data.frame(complete = cor(complete_coph, us_dist),
single = cor(single_coph, us_dist),
average = cor(avg_coph, us_dist),
centroid = cor(centroid_coph, us_dist)) %>%
tidyr::pivot_longer(cols = colnames(.),names_to = "method", values_to = "correlation")
Dapat terlihat bahwa nilai korelasi yang dihasilkan average linkage paling tinggi dibanding metode lainnya, disusul oleh complete linkage. Mempertimbangkan pula dendrogram yang dihasilkan, dendrogram dari average linkage menghasilkan cluster outlier yang hanya berisi negara bagian Alaska, dan ditakutkan membuat hasil clustering tidak optimal. Oleh karena itu, akan dipilih metode complete linkage dengan pertimbangan hasil correlation yang tinggi dan menghasilkan dendrogram yang cukup mudah diinterpretasikan.
Partitional Clustering adalah metode pengelompokan data di mana sekumpulan objek data dibagi menjadi beberapa cluster (kelompok) yang tidak saling tumpang-tindih (non-overlapping). Setiap data hanya butuh berada di satu cluster saja, sehingga tidak ada data yang lebih dari satu cluster.
Tujuan partitional clustering adalah membentuk cluster yang anggotanya memiliki kemiripan tinggi di dalam cluster yang sama dan memiliki perbedaan yang cukup besar dengan cluster lain. Pada metode ini, jumlah cluster biasanya harus ditentukan terlebih dahulu sebelum proses clustering dilakukan.
Beberapa metode yang termasuk ke dalam partitional clustering antara lain K-Means, K-Medoids, dan Fuzzy C-Means.
Definisi Singkat
K-Means adalah metode clustering yang membagi data menjadi \(k\) cluster, di mana setiap observasi dimasukkan ke cluster dengan centroid terdekat. Centroid merupakan nilai rata-rata dari seluruh data pada cluster tersebut.
Formula:
\[ J = \sum_{i=1}^{k} \sum_{x_j \in C_i} \| x_j - \mu_i \|^2 \]
dengan:
Cara Kerja & Hyperparameter
Langkah-langkah K-Means adalah sebagai berikut:
Hyperparameter utama:
Kelebihan & Keterbatasan
| Kelebihan | Keterbatasan |
|---|---|
| Sederhana & mudah diimplementasikan. Cepat untuk dataset besar. Cocok bila cluster relatif kompak / berbentuk bulat. Mudah dipahami. |
Jumlah cluster harus ditentukan di awal. Sensitif terhadap inisialisasi centroid. Sensitif terhadap outlier. Kurang cocok untuk bentuk cluster kompleks. |
Hasil & Visualisasi
library(ggplot2)
# Ambil variabel numerik dari dataset iris
df <- iris[, 1:4]
# K-Means clustering
set.seed(123)
k <- 3
km_res <- kmeans(df, centers = k, nstart = 25)
# Tambahkan hasil cluster
iris_km <- iris
iris_km$Cluster <- factor(km_res$cluster)
# Jumlah anggota tiap cluster
table(iris_km$Cluster)
##
## 1 2 3
## 50 62 38
# Centroid tiap cluster
km_res$centers
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.006000 3.428000 1.462000 0.246000
## 2 5.901613 2.748387 4.393548 1.433871
## 3 6.850000 3.073684 5.742105 2.071053
# Cluster untuk 10 data pertama
head(iris_km$Cluster, 10)
## [1] 1 1 1 1 1 1 1 1 1 1
## Levels: 1 2 3
# Visualisasi
ggplot(iris_km, aes(x = Sepal.Length, y = Sepal.Width, color = Cluster)) +
geom_point(size = 3) +
theme_minimal() +
labs(
title = "K-Means Clustering pada Dataset Iris",
x = "Sepal Length",
y = "Sepal Width"
)
Interpretasi
Hasil K-Means membagi data iris ke dalam tiga cluster. Masing-masing cluster menunjukkan kelompok bunga dengan karakteristik ukuran sepal dan petal yang berbeda. Visualisasi memperlihatkan bahwa sebagian kelompok dapat dipisahkan dengan cukup jelas, meskipun masih terdapat beberapa titik yang berdekatan antar cluster.
Definisi Singkat
K-Medoids adalah metode clustering yang mirip dengan K-Means, tetapi pusat cluster yang digunakan adalah medoid, yaitu salah satu data asli dalam cluster. Karena menggunakan data asli sebagai pusat cluster, K-Medoids cenderung lebih tahan terhadap outlier.
Formula:
Tujuan K-Medoids adalah meminimalkan total jarak antara setiap data dengan medoid cluster-nya:
\[ J = \sum_{i=1}^{k} \sum_{x_j \in C_i} d(x_j, m_i) \]
dengan:
\(m_i\) = medoid cluster ke‑\(i\)
\(d(x_j, m_i)\) = jarak antara data ke-\(j\) dan medoid cluster ke-\(i\)
Cara Kerja & Hyperparameter
Langkah-langkah K-Medoids:
Hyperparameter Utama:
Kelebihan & Keterbatasan
| Kelebihan | Keterbatasan |
|---|---|
| Lebih robust terhadap outlier. Medoid adalah data nyata sehingga mudah diinterpretasi. Dapat memakai berbagai ukuran jarak. |
Lebih lambat dibanding K-Means. Kurang efisien untuk dataset besar. Sensitif terhadap medoid awal. |
Hasil & Visualisasi
library(cluster)
library(ggplot2)
# Ambil variabel numerik
df <- iris[, 1:4]
# Standarisasi data
df_scaled <- scale(df)
# K-Medoids dengan PAM
set.seed(123)
pam_res <- pam(df_scaled, k = 3)
# Tambahkan hasil cluster
iris_pam <- iris
iris_pam$Cluster <- factor(pam_res$clustering)
# Jumlah anggota tiap cluster
table(iris_pam$Cluster)
##
## 1 2 3
## 50 45 55
# Medoid tiap cluster
pam_res$medoids
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] -1.0184372 0.7861738 -1.2791040 -1.3110521
## [2,] 1.1553023 -0.1315388 0.9868021 1.1816087
## [3,] -0.1730941 -0.5903951 0.4203256 0.1320673
# Silhouette width rata-rata
pam_res$silinfo$avg.width
## [1] 0.4566432
# Visualisasi
ggplot(iris_pam, aes(x = Petal.Length, y = Petal.Width, color = Cluster)) +
geom_point(size = 3) +
theme_minimal() +
labs(
title = "K-Medoids Clustering pada Dataset Iris",
x = "Petal Length",
y = "Petal Width"
)
Interpretasi
Hasil K-Medoids menunjukkan pembagian data ke dalam tiga cluster berdasarkan kedekatan terhadap medoid. Karena pusat cluster berupa data nyata, hasil clustering ini lebih stabil terhadap nilai ekstrem dibandingkan K-Means. Pada dataset iris, pemisahan cluster umumnya terlihat cukup baik, terutama jika menggunakan variabel petal.
Definisi Singkat
Fuzzy C-Means adalah metode clustering di mana setiap data tidak harus menjadi anggota mutlak satu cluster saja, tetapi dapat memiliki derajat keanggotaan pada beberapa cluster sekaligus. Metode ini cocok digunakan ketika batas antar cluster tidak terlalu tegas.
Formula:
Tujuan Fuzzy C-Means adalah meminimalkan fungsi objektif berikut:
\[ J_m = \sum_{i=1}^{c} \sum_{j=1}^{n} u_{ij}^m \; \| x_j - c_i \|^2 \]
dengan:
Cara Kerja & Hyperparameter
Langkah-langkah Fuzzy C-Means:
Hyperparameter Utama:
Kelebihan & Keterbatasan
| Kelebihan | Keterbatasan |
|---|---|
| Data dapat memiliki keanggotaan pada lebih dari satu cluster.
Cocok untuk batas cluster yang tidak tegas. Memberikan informasi derajat keanggotaan. |
Interpretasi lebih rumit. Lebih lambat dibanding hard clustering. Sensitif terhadap inisialisasi dan parameter \(m\). |
Hasil & Visualisasi
library(e1071)
library(ggplot2)
# Ambil variabel numerik
df <- iris[, 1:4]
# Standarisasi data
df_scaled <- scale(df)
# Fuzzy C-Means
set.seed(123)
fcm_res <- cmeans(df_scaled, centers = 3, m = 2, iter.max = 200, dist = "euclidean")
# Hard cluster dari membership terbesar
hard_cluster <- fcm_res$cluster
# Tambahkan hasil cluster
iris_fcm <- iris
iris_fcm$Cluster <- factor(hard_cluster)
# Derajat keanggotaan terbesar
iris_fcm$MaxMembership <- apply(fcm_res$membership, 1, max)
# Tampilkan hasil
head(iris_fcm$Cluster, 10)
## [1] 2 2 2 2 2 2 2 2 2 2
## Levels: 1 2 3
head(round(fcm_res$membership, 3), 5)
## 1 2 3
## [1,] 0.005 0.992 0.003
## [2,] 0.119 0.829 0.052
## [3,] 0.047 0.929 0.023
## [4,] 0.089 0.870 0.041
## [5,] 0.016 0.974 0.010
round(fcm_res$centers, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 -0.038 -0.816 0.322 0.231
## 2 -1.001 0.844 -1.280 -1.235
## 3 1.066 0.037 0.967 1.026
# Visualisasi
ggplot(iris_fcm, aes(
x = Petal.Length,
y = Petal.Width,
color = Cluster,
size = MaxMembership
)) +
geom_point(alpha = 0.8) +
scale_size(range = c(2, 7)) +
theme_minimal() +
labs(
title = "Fuzzy C-Means pada Dataset Iris",
subtitle = "Ukuran titik menunjukkan derajat keanggotaan terbesar",
x = "Petal Length",
y = "Petal Width"
)
Interpretasi
Hasil Fuzzy C-Means menunjukkan bahwa setiap data memiliki derajat keanggotaan terhadap setiap cluster. Semakin besar nilai membership pada suatu cluster, semakin kuat data tersebut termasuk ke dalam cluster tersebut. Pada visualisasi, ukuran titik menunjukkan tingkat keanggotaan dominan, sehingga data dengan keanggotaan yang lebih tegas akan tampak lebih besar.