library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.3
## Warning: package 'tidyr' was built under R version 4.5.3
## Warning: package 'purrr' was built under R version 4.5.3
## Warning: package 'dplyr' was built under R version 4.5.3
## Warning: package 'forcats' was built under R version 4.5.3
## Warning: package 'lubridate' was built under R version 4.5.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(cluster)
## Warning: package 'cluster' was built under R version 4.5.3
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.5.3
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
library(dbscan)
## Warning: package 'dbscan' was built under R version 4.5.3
##
## Attaching package: 'dbscan'
##
## The following object is masked from 'package:stats':
##
## as.dendrogram
library(flexclust)
## Warning: package 'flexclust' was built under R version 4.5.3
library(e1071)
## Warning: package 'e1071' was built under R version 4.5.3
##
## Attaching package: 'e1071'
##
## The following object is masked from 'package:flexclust':
##
## bclust
##
## The following object is masked from 'package:ggplot2':
##
## element
library(fpc)
## Warning: package 'fpc' was built under R version 4.5.3
##
## Attaching package: 'fpc'
##
## The following object is masked from 'package:dbscan':
##
## dbscan
library(meanShiftR)
data <- read.csv("C:/Users/Lenovo/Downloads/Jumlah Perceraian Menurut Provinsi dan Faktor Penyebab Perceraian (perkara), 2025 (1).csv")
head(data)
## Provinsi Fakor.Perceraian...Zina Fakor.Perceraian...Mabuk
## 1 Aceh 9 7
## 2 Sumatera Utara 2 10
## 3 Sumatera Barat 3 8
## 4 Riau 1 11
## 5 Jambi 5 26
## 6 Sumatera Selatan 24 35
## Fakor.Perceraian...Madat Fakor.Perceraian...Judi
## 1 9 46
## 2 21 74
## 3 6 30
## 4 27 68
## 5 43 124
## 6 54 228
## Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak
## 1 439
## 2 1027
## 3 787
## 4 889
## 5 546
## 6 711
## Fakor.Perceraian...Dihukum.Penjara Fakor.Perceraian...Poligami
## 1 80 30
## 2 50 16
## 3 43 16
## 4 127 8
## 5 42 22
## 6 66 50
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga
## 1 138
## 2 115
## 3 102
## 4 132
## 5 114
## 6 295
## Fakor.Perceraian...Cacat.Badan
## 1 15
## 2 4
## 3 6
## 4 11
## 5 5
## 6 8
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus
## 1 5487
## 2 17183
## 3 7751
## 4 7646
## 5 4123
## 6 9604
## Fakor.Perceraian...Kawin.Paksa Fakor.Perceraian...Murtad
## 1 1 7
## 2 74
## 3 1 11
## 4 4 12
## 5 1 8
## 6 5 18
## Fakor.Perceraian...Ekonomi Fakor.Perceraian...Jumlah
## 1 203 6471
## 2 268 18844
## 3 199 8963
## 4 341 9277
## 5 345 5404
## 6 960 12058
str(data)
## 'data.frame': 42 obs. of 15 variables:
## $ Provinsi : chr "Aceh" "Sumatera Utara" "Sumatera Barat" "Riau" ...
## $ Fakor.Perceraian...Zina : chr "9" "2" "3" "1" ...
## $ Fakor.Perceraian...Mabuk : chr "7" "10" "8" "11" ...
## $ Fakor.Perceraian...Madat : chr "9" "21" "6" "27" ...
## $ Fakor.Perceraian...Judi : chr "46" "74" "30" "68" ...
## $ Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak : chr "439" "1027" "787" "889" ...
## $ Fakor.Perceraian...Dihukum.Penjara : chr "80" "50" "43" "127" ...
## $ Fakor.Perceraian...Poligami : chr "30" "16" "16" "8" ...
## $ Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga : chr "138" "115" "102" "132" ...
## $ Fakor.Perceraian...Cacat.Badan : chr "15" "4" "6" "11" ...
## $ Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus: chr "5487" "17183" "7751" "7646" ...
## $ Fakor.Perceraian...Kawin.Paksa : chr "1" "" "1" "4" ...
## $ Fakor.Perceraian...Murtad : chr "7" "74" "11" "12" ...
## $ Fakor.Perceraian...Ekonomi : chr "203" "268" "199" "341" ...
## $ Fakor.Perceraian...Jumlah : chr "6471" "18844" "8963" "9277" ...
data[data == ""] <- NA
data_clean <- data %>%
mutate(across(-Provinsi, ~as.numeric(.)))
## Warning: There were 14 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(-Provinsi, ~as.numeric(.))`.
## Caused by warning:
## ! NAs introduced by coercion
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 13 remaining warnings.
data_clean <- data_clean %>%
mutate(across(where(is.numeric),
~ifelse(is.na(.), median(., na.rm=TRUE), .)))
sum(is.na(data_clean))
## [1] 1
Hasil pengecekan menggunakan colSums(is.na(data)) menunjukkan bahwa tidak terdapat nilai NA pada dataset. Namun, setelah ditelusuri lebih lanjut, terdapat nilai kosong (““) pada beberapa variabel yang tidak terdeteksi sebagai NA. Nilai kosong tersebut berpotensi menimbulkan masalah saat proses konversi data. Oleh karena itu, akan diubah nilai kosong tersebut menjadi NA terlebih dahulu. Selanjutnya,dilakukan imputasi menggunakan median untuk menggantikan nilai yang hilang. Pemilihan median dilakukan karena lebih robust terhadap outlier dibandingkan mean, sehingga distribusi data tetap terjaga.
data_num <- data_clean %>%
select(where(is.numeric))
Hanya variabel numerik yang digunakan dalam proses clustering. Variabel non-numerik seperti nama provinsi tidak disertakan dalam analisis. Hal ini dilakukan karena metode clustering berbasis jarak.
summary(data_num)
## Fakor.Perceraian...Zina Fakor.Perceraian...Mabuk Fakor.Perceraian...Madat
## Min. : 1.00 Min. : 3.00 Min. : 1.00
## 1st Qu.: 3.00 1st Qu.: 14.75 1st Qu.: 6.50
## Median : 5.00 Median : 28.50 Median : 10.00
## Mean : 55.81 Mean : 102.24 Mean : 26.38
## 3rd Qu.: 14.50 3rd Qu.: 40.75 3rd Qu.: 16.50
## Max. :1147.00 Max. :2033.00 Max. :494.00
## Fakor.Perceraian...Judi Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak
## Min. : 3.00 Min. : 60.0
## 1st Qu.: 26.75 1st Qu.: 271.0
## Median : 49.00 Median : 470.0
## Mean : 228.31 Mean : 1555.9
## 3rd Qu.: 114.25 3rd Qu.: 887.8
## Max. :4623.00 Max. :31029.0
## Fakor.Perceraian...Dihukum.Penjara Fakor.Perceraian...Poligami
## Min. : 1.00 Min. : 1.00
## 1st Qu.: 13.25 1st Qu.: 10.75
## Median : 23.00 Median : 18.00
## Mean : 70.57 Mean : 50.81
## 3rd Qu.: 46.00 3rd Qu.: 26.25
## Max. :1390.00 Max. :959.00
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga Fakor.Perceraian...Cacat.Badan
## Min. : 18.00 Min. : 1.00
## 1st Qu.: 85.25 1st Qu.: 4.00
## Median : 115.00 Median : 5.00
## Mean : 359.07 Mean : 12.55
## 3rd Qu.: 189.00 3rd Qu.: 6.75
## Max. :7138.00 Max. :231.00
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus
## Min. : 300
## 1st Qu.: 2209
## Median : 3913
## Mean : 14096
## 3rd Qu.: 7725
## Max. :282326
## Fakor.Perceraian...Kawin.Paksa Fakor.Perceraian...Murtad
## Min. : 1.00 Min. : 1.00
## 1st Qu.: 2.00 1st Qu.: 8.00
## Median : 2.50 Median : 15.00
## Mean : 12.12 Mean : 42.45
## 3rd Qu.: 3.75 3rd Qu.: 24.50
## Max. :232.00 Max. :839.00
## Fakor.Perceraian...Ekonomi Fakor.Perceraian...Jumlah
## Min. : 5 Min. : 494
## 1st Qu.: 86 1st Qu.: 2871
## Median : 203 Median : 5404
## Mean : 5068 Mean : 21766
## 3rd Qu.: 466 3rd Qu.: 9198
## Max. :105727 Max. :438168
stat_deskriptif <- data_num %>%
summarise_all(list(
Mean = ~mean(.),
Median = ~median(.),
SD = ~sd(.),
Min = ~min(.),
Max = ~max(.)
))
print(stat_deskriptif)
## Fakor.Perceraian...Zina_Mean Fakor.Perceraian...Mabuk_Mean
## 1 55.80952 102.2381
## Fakor.Perceraian...Madat_Mean Fakor.Perceraian...Judi_Mean
## 1 26.38095 228.3095
## Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak_Mean
## 1 1555.905
## Fakor.Perceraian...Dihukum.Penjara_Mean Fakor.Perceraian...Poligami_Mean
## 1 70.57143 50.80952
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga_Mean
## 1 359.0714
## Fakor.Perceraian...Cacat.Badan_Mean
## 1 12.54762
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus_Mean
## 1 14096.26
## Fakor.Perceraian...Kawin.Paksa_Mean Fakor.Perceraian...Murtad_Mean
## 1 12.11905 42.45238
## Fakor.Perceraian...Ekonomi_Mean Fakor.Perceraian...Jumlah_Mean
## 1 5068.452 21765.81
## Fakor.Perceraian...Zina_Median Fakor.Perceraian...Mabuk_Median
## 1 5 28.5
## Fakor.Perceraian...Madat_Median Fakor.Perceraian...Judi_Median
## 1 10 49
## Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak_Median
## 1 470
## Fakor.Perceraian...Dihukum.Penjara_Median Fakor.Perceraian...Poligami_Median
## 1 23 18
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga_Median
## 1 115
## Fakor.Perceraian...Cacat.Badan_Median
## 1 5
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus_Median
## 1 3913
## Fakor.Perceraian...Kawin.Paksa_Median Fakor.Perceraian...Murtad_Median
## 1 2.5 15
## Fakor.Perceraian...Ekonomi_Median Fakor.Perceraian...Jumlah_Median
## 1 203 5404
## Fakor.Perceraian...Zina_SD Fakor.Perceraian...Mabuk_SD
## 1 214.464 321.2665
## Fakor.Perceraian...Madat_SD Fakor.Perceraian...Judi_SD
## 1 75.64453 732.6689
## Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak_SD
## 1 4818.05
## Fakor.Perceraian...Dihukum.Penjara_SD Fakor.Perceraian...Poligami_SD
## 1 212.658 150.8859
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga_SD
## 1 1117.198
## Fakor.Perceraian...Cacat.Badan_SD
## 1 35.51379
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus_SD
## 1 43862.49
## Fakor.Perceraian...Kawin.Paksa_SD Fakor.Perceraian...Murtad_SD
## 1 40.52217 128.6954
## Fakor.Perceraian...Ekonomi_SD Fakor.Perceraian...Jumlah_SD
## 1 17903.8 69054.83
## Fakor.Perceraian...Zina_Min Fakor.Perceraian...Mabuk_Min
## 1 1 3
## Fakor.Perceraian...Madat_Min Fakor.Perceraian...Judi_Min
## 1 1 3
## Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak_Min
## 1 60
## Fakor.Perceraian...Dihukum.Penjara_Min Fakor.Perceraian...Poligami_Min
## 1 1 1
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga_Min
## 1 18
## Fakor.Perceraian...Cacat.Badan_Min
## 1 1
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus_Min
## 1 300
## Fakor.Perceraian...Kawin.Paksa_Min Fakor.Perceraian...Murtad_Min
## 1 1 1
## Fakor.Perceraian...Ekonomi_Min Fakor.Perceraian...Jumlah_Min
## 1 5 494
## Fakor.Perceraian...Zina_Max Fakor.Perceraian...Mabuk_Max
## 1 1147 2033
## Fakor.Perceraian...Madat_Max Fakor.Perceraian...Judi_Max
## 1 494 4623
## Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak_Max
## 1 31029
## Fakor.Perceraian...Dihukum.Penjara_Max Fakor.Perceraian...Poligami_Max
## 1 1390 959
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga_Max
## 1 7138
## Fakor.Perceraian...Cacat.Badan_Max
## 1 231
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus_Max
## 1 282326
## Fakor.Perceraian...Kawin.Paksa_Max Fakor.Perceraian...Murtad_Max
## 1 232 839
## Fakor.Perceraian...Ekonomi_Max Fakor.Perceraian...Jumlah_Max
## 1 105727 438168
data_scaled <- scale(data_num)
Data dinormalisasi agar semua variabel memiliki skala yang sama. Hal ini penting karena clustering berbasis jarak sensitif terhadap perbedaan skala. Tanpa normalisasi, variabel dengan nilai besar akan mendominasi hasil. Dengan scaling, setiap variabel memiliki kontribusi yang seimbang.
wss <- sapply(1:10, function(k){
kmeans(data_scaled, centers = k, nstart = 20)$tot.withinss
})
plot(1:10, wss, type="b", pch=19,
xlab="Jumlah Cluster",
ylab="WSS")
Berdasarkan grafik elbow yang kami peroleh, terlihat bahwa nilai Within Sum of Squares (WSS) mengalami penurunan yang signifikan dari k=1 hingga k=3. Setelah itu, penurunan nilai WSS cenderung melandai. Hal ini menunjukkan bahwa titik optimal berada pada k=3, yang ditandai dengan adanya “siku” pada grafik. Dengan demikian, kami menetapkan jumlah cluster yang digunakan dalam analisis adalah sebanyak tiga.
avg_sil <- function(k){
km <- kmeans(data_scaled, centers = k, nstart = 25)
ss <- silhouette(km$cluster, dist(data_scaled))
mean(ss[,3])
}
k <- 2:10
sil <- sapply(k, avg_sil)
plot(k, sil, type="b", pch=19,
xlab="Jumlah Cluster",
ylab="Silhouette")
Untuk memperkuat hasil dari metode elbow, kami menggunakan metode silhouette. Hasil yang diperoleh menunjukkan bahwa nilai silhouette tertinggi berada pada k=3. Nilai silhouette yang berada pada kisaran 0.3–0.35 menunjukkan bahwa kualitas cluster berada pada kategori sedang. Hal ini berarti bahwa objek dalam cluster cukup mirip satu sama lain, meskipun masih terdapat sedikit overlap antar cluster.Dengan demikian, jumlah cluster yang dipilih menjadi lebih valid.
pca <- prcomp(data_scaled)
set.seed(123)
km <- kmeans(data_scaled, centers = 3, nstart = 25)
plot(pca$x[,1:2], col=km$cluster, pch=19)
length(unique(km$cluster))
## [1] 3
table(km$cluster)
##
## 1 2 3
## 38 1 3
km$centers
## Fakor.Perceraian...Zina Fakor.Perceraian...Mabuk Fakor.Perceraian...Madat
## 1 -0.2231711 -0.2190383 -0.16889111
## 2 5.0879899 6.0098445 6.18179576
## 3 1.1308371 0.7712036 0.07868885
## Fakor.Perceraian...Judi Fakor.Perceraian...Meninggalkan.Salah.satu.Pihak
## 1 -0.2290746 -0.2143004
## 2 5.9981943 6.1172246
## 3 0.9022135 0.6753967
## Fakor.Perceraian...Dihukum.Penjara Fakor.Perceraian...Poligami
## 1 -0.1930100 -0.2167483
## 2 6.2044627 6.0190555
## 3 0.3766387 0.7391269
## Fakor.Perceraian...Kekerasan.Dalam.Rumah.Tangga
## 1 -0.2069019
## 2 6.0677954
## 3 0.5981589
## Fakor.Perceraian...Cacat.Badan
## 1 -0.2103034
## 2 6.1511985
## 3 0.6134438
## Fakor.Perceraian...Perselisihan.dan.Pertengkaran.Terus.Menerus
## 1 -0.2149876
## 2 6.1152416
## 3 0.6847628
## Fakor.Perceraian...Kawin.Paksa Fakor.Perceraian...Murtad
## 1 -0.2328315 -0.1979768
## 2 5.4261887 6.1894040
## 3 1.1404691 0.4445714
## Fakor.Perceraian...Ekonomi Fakor.Perceraian...Jumlah
## 1 -0.2630009 -0.2289240
## 2 5.6221893 6.0300223
## 3 1.4572818 0.8896967
Berdasarkan hasil clustering menggunakan metode K-Means, diperoleh 3 cluster dengan distribusi data sebesar 38, 1, dan 3 observasi. Distribusi ini menunjukkan bahwa sebagian besar data terkonsentrasi pada satu cluster utama, sementara dua cluster lainnya hanya berisi sedikit observasi. Hal ini mengindikasikan adanya ketidakseimbangan dalam pembagian cluster.
Meskipun demikian, metode ini tetap mampu mengelompokkan seluruh data tanpa menghasilkan noise. Dari hasil evaluasi, K-Means memiliki nilai silhouette sebesar 0.8081 dan Dunn Index sebesar 0.4274, yang menunjukkan kualitas cluster yang cukup baik. Cluster yang terbentuk memiliki pemisahan yang jelas, meskipun distribusinya tidak merata.
kmed <- kcca(data_scaled, k=3, family=kccaFamily("kmedians"))
## Found more than one class "kcca" in cache; using the first, from namespace 'flexclust'
## Also defined by 'kernlab'
## Found more than one class "kcca" in cache; using the first, from namespace 'flexclust'
## Also defined by 'kernlab'
plot(pca$x[,1:2], col=clusters(kmed), pch=19)
kmed_cluster <- clusters(kmed)
length(unique(kmed_cluster))
## [1] 3
table(kmed_cluster)
## kmed_cluster
## 1 2 3
## 3 1 38
Metode K-Median menghasilkan 3 cluster dengan distribusi data sebesar 1, 31, dan 10 observasi. Pola ini juga menunjukkan ketidakseimbangan cluster, di mana satu cluster memiliki jumlah anggota yang sangat kecil.
Hal ini disebabkan oleh penggunaan median sebagai pusat cluster yang lebih sensitif terhadap distribusi data. Berdasarkan evaluasi, metode ini memiliki nilai silhouette sebesar 0.4909 dan Dunn Index sebesar 0.0574, yang lebih rendah dibandingkan metode lainnya. Hal ini menunjukkan bahwa kualitas cluster kurang optimal, baik dari segi kohesi maupun separasi.
db <- dbscan(data_scaled, eps=1, MinPts=4)
plot(pca$x[,1:2], col=db$cluster+1, pch=19)
length(unique(db$cluster)) - 1
## [1] 1
table(db$cluster)
##
## 0 1
## 4 38
Hasil clustering menggunakan DBSCAN menunjukkan bahwa metode ini hanya menghasilkan 1 cluster utama dengan 38 observasi, serta 4 data dikategorikan sebagai noise.
Karena hanya terdapat satu cluster setelah menghapus noise, maka evaluasi menggunakan Silhouette Score dan Dunn Index tidak dapat dilakukan (NA). Hal ini menunjukkan bahwa DBSCAN tidak mampu menangkap struktur cluster yang jelas pada dataset ini. Dengan demikian, metode ini kurang sesuai digunakan untuk analisis lebih lanjut.
ms <- meanShift(data_scaled)
plot(pca$x[,1:2], col=ms$assignment, pch=19)
length(unique(ms$assignment))
## [1] 3
table(ms$assignment)
##
## 1 2 3
## 40 1 1
Metode Mean Shift menghasilkan 3 cluster dengan distribusi data sebesar 40, 1, dan 1 observasi. Hasil ini menunjukkan bahwa hampir seluruh data tergabung dalam satu cluster utama, sementara dua cluster lainnya hanya berisi masing-masing satu observasi.
Meskipun distribusi cluster sangat tidak seimbang, hasil evaluasi menunjukkan nilai silhouette sebesar 0.8451 dan Dunn Index sebesar 1.4172, yang merupakan nilai tertinggi dibandingkan metode lainnya. Hal ini menunjukkan bahwa secara matematis cluster memiliki pemisahan yang sangat baik, namun secara praktis kurang representatif karena dominasi satu cluster yang terlalu besar.
fcm <- cmeans(data_scaled, centers=3, m=2)
plot(pca$x[,1:2], col=fcm$cluster, pch=19)
fcm_cluster <- apply(fcm$membership, 1, which.max)
length(unique(fcm_cluster))
## [1] 3
table(fcm_cluster)
## fcm_cluster
## 1 2 3
## 1 1 40
Metode Fuzzy C-Means menghasilkan 3 cluster dengan distribusi data sebesar 1, 1, dan 40 observasi. Pola ini sangat mirip dengan hasil Mean Shift, di mana sebagian besar data berada dalam satu cluster utama.
Hasil evaluasi juga menunjukkan nilai yang sama dengan Mean Shift, yaitu silhouette sebesar 0.8451 dan Dunn Index sebesar 1.4172. Hal ini menunjukkan kualitas cluster yang sangat baik secara numerik. Namun, seperti Mean Shift, hasil ini kurang ideal karena distribusi cluster yang tidak seimbang, sehingga kurang informatif untuk segmentasi wilayah.
sil_km <- mean(silhouette(km$cluster, dist(data_scaled))[,3])
sil_kmed <- mean(silhouette(clusters(kmed), dist(data_scaled))[,3])
valid <- db$cluster != 0
db_clusters <- db$cluster[valid]
if(length(unique(db_clusters)) > 1){
sil_db <- mean(silhouette(db_clusters, dist(data_scaled[valid,]))[,3])
} else {
sil_db <- NA
}
sil_ms <- mean(silhouette(ms$assignment, dist(data_scaled))[,3])
fcm_cluster <- apply(fcm$membership, 1, which.max)
sil_fcm <- mean(silhouette(fcm_cluster, dist(data_scaled))[,3])
dunn_km <- cluster.stats(dist(data_scaled), km$cluster)$dunn
dunn_kmed <- cluster.stats(dist(data_scaled), clusters(kmed))$dunn
if(length(unique(db_clusters)) > 1){
dunn_db <- cluster.stats(dist(data_scaled[valid,]), db_clusters)$dunn
} else {
dunn_db <- NA
}
dunn_ms <- cluster.stats(dist(data_scaled), ms$assignment)$dunn
dunn_fcm <- cluster.stats(dist(data_scaled), fcm_cluster)$dunn
hasil <- data.frame(
Metode = c("K-Means","K-Median","DBSCAN","Mean Shift","Fuzzy C-Means"),
Silhouette = c(sil_km, sil_kmed, sil_db, sil_ms, sil_fcm),
Dunn = c(dunn_km, dunn_kmed, dunn_db, dunn_ms, dunn_fcm)
)
print(hasil)
## Metode Silhouette Dunn
## 1 K-Means 0.8080858 0.4274215
## 2 K-Median 0.8080858 0.4274215
## 3 DBSCAN NA NA
## 4 Mean Shift 0.8451351 1.4172185
## 5 Fuzzy C-Means 0.8451351 1.4172185
hasil %>% arrange(desc(Silhouette))
## Metode Silhouette Dunn
## 1 Mean Shift 0.8451351 1.4172185
## 2 Fuzzy C-Means 0.8451351 1.4172185
## 3 K-Means 0.8080858 0.4274215
## 4 K-Median 0.8080858 0.4274215
## 5 DBSCAN NA NA
Berdasarkan hasil clustering dan evaluasi yang diperoleh, terlihat bahwa metode Mean Shift dan Fuzzy C-Means memiliki nilai evaluasi tertinggi, baik dari segi Silhouette Score maupun Dunn Index. Namun, kedua metode tersebut menghasilkan distribusi cluster yang sangat tidak seimbang, di mana hampir seluruh data terkumpul dalam satu cluster utama. Hal ini membuat hasil clustering kurang representatif untuk tujuan segmentasi.
Metode K-Means menunjukkan hasil yang lebih seimbang dibandingkan metode lain, meskipun masih terdapat ketimpangan jumlah anggota antar cluster. Dengan nilai silhouette sebesar 0.8081 dan Dunn Index sebesar 0.4274, K-Means tetap mampu memberikan pemisahan cluster yang cukup baik serta mengelompokkan seluruh data tanpa noise.
Sementara itu, metode K-Median memiliki performa yang lebih rendah, dan DBSCAN tidak dapat digunakan karena hanya menghasilkan satu cluster sehingga tidak dapat dievaluasi lebih lanjut.
Dengan mempertimbangkan kualitas cluster dan kemudahan interpretasi, kami menyimpulkan bahwa metode K-Means tetap menjadi metode yang paling sesuai untuk dataset ini, karena memberikan hasil yang lebih stabil dan representatif dibandingkan metode lainnya.