Buku ini sedang dalam tahap tinjauan terbuka. Kami ingin umpan balik Anda untuk membuat buku ini lebih baik bagi. Anda dapat memberikan anotasi pada beberapa teks dengan memilihnya menggunakan kursor dan kemudian klik “Beri Anotasi” pada menu pop-up. Anda juga dapat melihat anotasi orang lain: klik tanda panah di sudut kanan atas halaman

5.2 Eksperimen Algoritma K-Medoids

Data

Dengan menggunakan fungsi read.csv() dari R, kami dapat mengimpor data langsung dari URL tersebut ke dalam lingkungan kerja R. Berikut adalah kode yang digunakan untuk membaca data: Package reader menyiapkan fungsi read_csv() untuk import data dari file CSV. Pada kasus ini digunakan data Data 40% Kemiskinan di jawa Tengah.

library (readr)
urlfile = "https://bit.ly/3VO3kRE"
data<-read.csv(url(urlfile), row.names = "Kabupaten")
Tabel 5.1: Basis Data Terpadu Jawa Tengah
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
CILACAP 5.19 5.67 5.08 5.44 5.22 6.05 11.47 9.78 5.55 5.12
BANYUMAS 5.71 4.47 5.18 5.51 5.02 6.21 7.39 6.96 5.98 8.22
PURBALINGGA 3.30 2.19 3.80 3.13 3.73 3.34 8.71 7.41 3.21 4.65
BANJARNEGARA 2.73 2.34 3.76 2.80 2.57 2.99 3.31 5.45 4.21 6.05
KEBUMEN 4.17 2.55 3.26 4.16 3.15 4.15 4.30 9.29 4.61 4.34
PURWOREJO 1.87 2.12 1.48 3.05 1.78 1.83 5.00 4.90 3.12 2.09
WONOSOBO 2.13 1.95 3.00 1.78 1.62 2.06 0.45 2.32 3.57 0.84
MAGELANG 3.95 3.01 4.22 4.15 3.01 3.64 1.44 3.35 5.69 3.67
BOYOLALI 2.19 3.07 1.61 2.74 2.11 1.82 1.71 2.34 3.41 1.55
KLATEN 3.84 5.15 1.93 4.64 4.04 3.78 8.71 4.45 3.99 3.09

R packages dan fungsi yang dibutuhkan

Untuk melakukan analisis cluster dengan metode k-medoids di R, diperlukan beberapa paket dan fungsi utama. Paket yang wajib digunakan adalah cluster, yang menyediakan fungsi pam() (Partitioning Around Medoids) sebagai implementasi utama algoritma k-medoids. Selain itu, paket factoextra berguna untuk visualisasi hasil clustering dengan fungsi fviz_cluster(). Untuk mengevaluasi kualitas clustering, paket fpc dan clusterCrit dapat digunakan sebagai opsi tambahan dengan fungsi seperti cluster.stats() untuk evaluasi statistik dan intCriteria() untuk menghitung indeks validasi clustering. Dalam proses analisis, fungsi silhouette() dapat digunakan untuk mengevaluasi kualitas clustering dengan Silhouette Width, sementara dist() diperlukan untuk membuat matriks jarak yang digunakan oleh algoritma. Sebagai langkah awal, data biasanya diskalakan menggunakan fungsi seperti scale() sebelum diterapkan algoritma k-medoids untuk memastikan hasil yang optimal. Kombinasi paket dan fungsi ini memungkinkan analisis cluster yang efektif, mulai dari pembentukan cluster hingga evaluasi hasil.

library(cluster)
library(factoextra)

Estimasi Jumlah Cluster Optimal

Untuk menentukan jumlah cluster yang optimal, metode average silhouette dapat digunakan. Konsepnya adalah menjalankan algoritma PAM dengan berbagai jumlah cluster \(k\). Kemudian, rata-rata silhouette dari masing-masing cluster dihitung dan diplot berdasarkan jumlah cluster. Average silhouette digunakan untuk menilai kualitas clustering, di mana nilai yang tinggi menunjukkan clustering yang baik. Jumlah cluster \(k\) yang optimal adalah yang menghasilkan rata-rata silhouette tertinggi dalam rentang nilai \(k\) yang dipertimbangkan.

Fungsi fviz_nbclust() dari paket factoextra menyediakan cara praktis untuk memperkirakan jumlah cluster yang optimal. Dengan memanfaatkan metode average silhouette, fungsi ini dapat membantu menentukan jumlah cluster yang menghasilkan hasil clustering terbaik. Contoh implementasinya adalah sebagai berikut:

fviz_nbclust(data, pam, method = "silhouette") +
  theme_classic()
Plot Jumlah Cluster Metode silhouette

Gambar 5.1: Plot Jumlah Cluster Metode silhouette

Hasilnya adalah grafik yang menampilkan nilai rata-rata silhouette untuk setiap jumlah cluster. Jumlah cluster optimal ditentukan oleh nilai silhouette tertinggi, yang menunjukkan pembagian cluster terbaik dalam data.Berdasarkan plot, jumlah cluster yang disarankan adalah 2. Pada langkah berikutnya, kita akan mengelompokkan observasi ke dalam 2 cluster.

Eksperimen K-Medoids Clustering

Berdasarkan plot hasil analisis dengan metode average silhouette, jumlah cluster optimal yang disarankan adalah 2. Oleh karena itu, dalam analisis cluster menggunakan algoritma k-medoids, kita akan menggunakan jumlah cluster \(k = 2\). Langkah ini diharapkan dapat menghasilkan pembagian cluster yang optimal dan berkualitas tinggi sesuai dengan data yang dianalisis. Berikut adalah kode untuk menjalankan algoritma k-medoids dengan \(k = 2\) menggunakan fungsi pam() dan mencetak hasilnya:

## Menjalankan k-medoids clustering dengan k = 2
pam.res <- pam(data, 2)

Kode ini akan menampilkan detail hasil clustering, termasuk informasi tentang medoid, anggota cluster, dan ukuran setiap cluster.

# Mencetak hasil clustering
print(pam.res)
#> Medoids:
#>          ID   X1   X2   X3   X4   X5   X6   X7   X8   X9  X10
#> TEGAL    28 4.78 3.91 6.70 4.84 6.35 5.82 3.00 5.99 2.98 5.98
#> SEMARANG 22 1.76 2.19 1.61 2.33 1.88 1.61 0.92 0.49 2.67 1.56
#> Clustering vector:
#>         CILACAP        BANYUMAS     PURBALINGGA    BANJARNEGARA         KEBUMEN 
#>               1               1               1               1               1 
#>       PURWOREJO        WONOSOBO        MAGELANG        BOYOLALI          KLATEN 
#>               2               2               2               2               1 
#>       SUKOHARJO        WONOGIRI     KARANGANYAR          SRAGEN        GROBOGAN 
#>               2               2               2               2               1 
#>           BLORA         REMBANG            PATI           KUDUS          JEPARA 
#>               2               2               2               2               1 
#>         DEMAK          SEMARANG      TEMANGGUNG          KENDAL          BATANG 
#>               2               2               2               2               2 
#>      PEKALONGAN        PEMALANG           TEGAL          BREBES   KOTA MAGELANG 
#>               2               1               1               1               2 
#>  KOTA SURAKARTA   KOTA SALATIGA   KOTA SEMARANG KOTA PEKALONGAN      KOTA TEGAL 
#>               2               2               2               2               2 
#> Objective function:
#>    build     swap 
#> 4.702218 4.605625 
#> 
#> Available components:
#>  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
#>  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

Hasil analisis k-medoids dengan \(k = 2\) menunjukkan bahwa data berhasil dikelompokkan ke dalam dua cluster. Medoid yang terpilih sebagai representasi masing-masing cluster adalah TEGAL untuk Cluster 1 dan SEMARANG untuk Cluster 2, dengan nilai atribut masing-masing ditampilkan dalam tabel. Observasi lainnya dikelompokkan berdasarkan kedekatan mereka dengan medoid, misalnya CILACAP, BANYUMAS, dan PURBALINGGA masuk ke Cluster 1, sementara PURWOREJO, WONOSOBO, dan MAGELANG masuk ke Cluster 2. Secara keseluruhan, clustering ini memberikan pembagian yang optimal dengan dua cluster yang masing-masing diwakili oleh medoid terpilih.

Untuk menambahkan klasifikasi titik (cluster) ke data asli, Anda dapat menggunakan kode berikut. Kode ini akan menggabungkan hasil klasifikasi (cluster) dari analisis k-medoids ke dalam data dan menampilkan 3 baris pertama dari data yang telah diperbarui:

# Menambahkan klasifikasi cluster ke data asli
hasil_cluster <- cbind(data, cluster = pam.res$cluster)

# Menampilkan 3 baris pertama
head(hasil_cluster, n = 3)
#>               X1   X2   X3   X4   X5   X6    X7   X8   X9  X10 cluster
#> CILACAP     5.19 5.67 5.08 5.44 5.22 6.05 11.47 9.78 5.55 5.12       1
#> BANYUMAS    5.71 4.47 5.18 5.51 5.02 6.21  7.39 6.96 5.98 8.22       1
#> PURBALINGGA 3.30 2.19 3.80 3.13 3.73 3.34  8.71 7.41 3.21 4.65       1

Hasil dari kode ini akan menampilkan tiga baris pertama dari data, dengan kolom tambahan yang menunjukkan cluster tempat setiap observasi dikelompokkan. Kolom baru cluster berisi angka 1 atau 2 yang mewakili dua cluster yang terbentuk.

Visualisasi K-Medoids Clustering

Untuk memvisualisasikan hasil pengelompokan dengan k-medoids, kita akan menggunakan fungsi fviz_cluster() dari paket factoextra. Fungsi ini akan menghasilkan plot sebar titik data yang diwarnai sesuai dengan nomor cluster. Dalam kode ini, palet warna yang digunakan adalah #00AFBB untuk cluster pertama dan #FC4E07 untuk cluster kedua. Elips konsentrasi ditambahkan dengan parameter ellipse.type = “t”, yang menunjukkan distribusi data di setiap cluster. Selain itu, untuk menghindari tumpang tindih label, parameter repel = TRUE digunakan, meskipun ini dapat sedikit memperlambat proses visualisasi. Terakhir, tema plot yang klasik diterapkan dengan ggtheme = theme_classic(), memberikan tampilan yang bersih dan sederhana pada grafik.

fviz_cluster(pam.res,
  palette = c("#00AFBB", "#FC4E07"), # Palet warna
  ellipse.type = "t", # Elips konsentrasi
  repel = TRUE, # Menghindari label bertumpuk (proses ini dapat sedikit lebih lambat)
  ggtheme = theme_classic() # Tema plot klasik
)
Visualisasi Cluster K-Medoids

Gambar 5.2: Visualisasi Cluster K-Medoids