Link Dataset https://www.bps.go.id/id/statistics-table/3/YVdoU1IwVmlTM2h4YzFoV1psWkViRXhqTlZwRFVUMDkjMyMwMDAw/jumlah-perceraian-menurut-provinsi-dan-faktor-penyebab-perceraian--perkara-.html?year=2025

Import Library

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)

Load Data

data <- read.csv("C:/Users/Lenovo/Downloads/Jumlah Perceraian Menurut Provinsi dan Faktor Penyebab Perceraian (perkara), 2025 (1).csv")

Cek Struktur Data

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" ...

Missing Value

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.

Seleksi Data Numerik

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.

Statistik Deskriptif

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

Normalisasi Data

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.

Menentukan Jumlah Cluster

1. Elbow Method

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.

2. Silhouette Method

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.

Clustering

1. K-Means

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.

K-Median

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.

3. DBSCAN

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.

4. Mean Shift

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.

5. Fuzzy C-Means

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.

Evaluasi Silhouette Score

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])

Evaluasi Dunn Index

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

Perbandingan Metode

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

Kesimpulan

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.