Pengelompokkan (Clustering) dengan K-Medoids

Library

Panggil Data

data_komponen_IPM <- read_excel("D:/PKL/LAPORAN PKL/[Metode Baru] DATA Indeks Pembangunan Manusia Menurut Kabupaten_Kota, 2024.xlsx")
View(data_komponen_IPM)
Data<-data_komponen_IPM[,c(1:4)]
Data
## # A tibble: 35 × 4
##    Kabupaten_Kota                UHH   RLS Pengeluaran_per_Kapita
##    <chr>                       <dbl> <dbl>                  <dbl>
##  1 3301 Kabupaten Cilacap       74.6  7.4                   11868
##  2 3302 Kabupaten Banyumas      74.3  7.91                  12960
##  3 3303 Kabupaten Purbalingga   73.6  7.36                  11343
##  4 3304 Kabupaten Banjarnegara  74.7  6.87                  10595
##  5 3305 Kabupaten Kebumen       74.0  7.87                  10176
##  6 3306 Kabupaten Purworejo     75.5  8.65                  11584
##  7 3307 Kabupaten Wonosobo      72.4  6.9                   11980
##  8 3308 Kabupaten Magelang      74.4  7.83                  10926
##  9 3309 Kabupaten Boyolali      76.4  8.17                  14195
## 10 3310 Kabupaten Klaten        77.3  9.29                  13513
## # ℹ 25 more rows

Cek Nama Kolom

colnames(data_komponen_IPM)
## [1] "Kabupaten_Kota"         "UHH"                    "RLS"                   
## [4] "Pengeluaran_per_Kapita"

Deskripsi Data

describe(Data)
##                        vars  n     mean      sd   median  trimmed     mad
## Kabupaten_Kota*           1 35    18.00   10.25    18.00    18.00   13.34
## UHH                       2 35    75.45    1.83    75.24    75.56    1.78
## RLS                       3 35     8.32    1.38     7.87     8.18    0.86
## Pengeluaran_per_Kapita    4 35 12463.20 1818.02 11830.00 12245.62 1375.85
##                             min      max   range  skew kurtosis     se
## Kabupaten_Kota*            1.00    35.00   34.00  0.00    -1.30   1.73
## UHH                       70.29    78.26    7.97 -0.50     0.15   0.31
## RLS                        6.41    11.48    5.07  0.98     0.00   0.23
## Pengeluaran_per_Kapita 10017.00 17096.00 7079.00  0.99     0.33 307.30

Deteksi Outlier dengan Box Plot

Kabupaten_Kota <- data_komponen_IPM$Kabupaten_Kota
Data <- data_komponen_IPM %>%
  dplyr::select(
    UHH,
    RLS,
    Pengeluaran_per_Kapita
  )
stopifnot(length(Kabupaten_Kota) == nrow(Data))
par(mfrow = c(2, 2))
for (i in 1:ncol(Data)) {
var_name <- colnames(Data)[i]
b <- boxplot(Data[[i]], main = var_name, ylab =
"Jumlah", col = "skyblue", outline = TRUE)
outlier_values <- b$out
outlier_indices <- which(Data[[i]] %in%
outlier_values & !is.na(Data[[i]]))
if (length(outlier_indices) > 0) {
print(paste("Outlier untuk", var_name, ":"))
print(Kabupaten_Kota[outlier_indices])
text(x = rep(1.1, length(outlier_indices)),
y = Data[[i]][outlier_indices],
labels = Kabupaten_Kota[outlier_indices],
pos = 4, cex = 0.9, col = "red", offset =
0.5)
}
}
## [1] "Outlier untuk UHH :"
## [1] "3329 Kabupaten Brebes"
## [1] "Outlier untuk Pengeluaran_per_Kapita :"
## [1] "3373 Kota Salatiga" "3374 Kota Semarang"

Kesimpulan :

Dari output grafik Box-Plot dapat disimpulkan bahwa terdapat variabel yang memiliki outlier, yaitu variabel Umur Harapan Hidup (UHH) dan Pengeluaran per Kapita.

Uji Asumsi Multikolinearitas

Data_VIF <- Data
dummy_y <- rnorm(nrow(Data_VIF))
Model_VIF <- lm(dummy_y~.,data=Data_VIF)
# Nilai VIF
vif(Model_VIF)
##                    UHH                    RLS Pengeluaran_per_Kapita 
##               2.453590               4.865981               2.960606

Kesimpulan :

Berdasarkan output nilai VIF, diperoleh nilai VIF (2.45359) < 10 untuk X1, VIF (4.865981) < 10 untuk X2, VIF (2.960606) < 10 untuk X3, artinya tidak terjadi Multikolinearitas atau tidak ada hubungan antara variabel X1, X2, dan X3. Sehingga dapat disimpulkan Asumsi Non-Multikolinearitas terpenuhi.

Standarisasi Data

# Bertujuan untuk menyetarakan skala antar variabel (dengan nilai rata-rata = 0 dan standar deviasi = 1) agar tidak terjadi dominasi oleh variabel yang memiliki satuan lebih besar.
Data_scaled <- scale(Data)
Data_scaled
##               UHH         RLS Pengeluaran_per_Kapita
##  [1,] -0.48143399 -0.66954128            -0.32738914
##  [2,] -0.60742695 -0.29872800             0.27326433
##  [3,] -1.03470744 -0.69862467            -0.61616485
##  [4,] -0.43213239 -1.05489625            -1.02760148
##  [5,] -0.81558924 -0.32781140            -1.25807200
##  [6,]  0.03349378  0.23931479            -0.48360305
##  [7,] -1.67015022 -1.03308370            -0.26578366
##  [8,] -0.54716945 -0.35689479            -0.84553527
##  [9,]  0.54294359 -0.10968594             0.95257480
## [10,]  1.01404772  0.70464909             0.57744140
## [11,]  1.40298253  1.22815018             0.16215444
## [12,]  0.76206179 -0.46595752            -1.00614957
## [13,]  1.34820298  0.68283655             0.14785316
## [14,]  0.40051677 -0.32054055             0.78480987
## [15,] -0.11441100 -0.74952061            -0.50340481
## [16,] -0.33352920 -0.77133316            -0.84553527
## [17,] -0.26231579 -0.42960328            -0.34829101
## [18,]  0.60867905 -0.36416564            -0.34884105
## [19,]  0.89353271  0.74827418             0.03839342
## [20,]  0.41695063 -0.03697746            -0.40384595
## [21,]  0.18687652 -0.02970661            -0.47975271
## [22,]  0.37860495 -0.11695679             0.50263475
## [23,]  0.27452380 -0.57502025            -1.06940520
## [24,] -0.39378671 -0.42233243             0.44762985
## [25,] -0.22944806 -0.90220843            -0.84938561
## [26,] -0.79367742 -0.61137449            -0.41924732
## [27,] -0.79915537 -1.28029255            -1.34552978
## [28,] -1.80162113 -0.69862467            -0.82023302
## [29,] -2.82599871 -1.38935528            -0.59086260
## [30,]  1.14004069  2.26061067             0.63574660
## [31,]  1.34272502  2.12973540             2.10547743
## [32,]  1.53993140  2.29696492             2.54826685
## [33,]  1.52897549  1.98431843             2.48996166
## [34,] -0.35544102  0.74100333             1.14619204
## [35,] -0.31709534  0.69737824             1.04223278
## attr(,"scaled:center")
##                    UHH                    RLS Pengeluaran_per_Kapita 
##              75.448857               8.320857           12463.200000 
## attr(,"scaled:scale")
##                    UHH                    RLS Pengeluaran_per_Kapita 
##               1.825499               1.375355            1818.019960

Menentukan Jumlah Cluster (k) Optimal

# 1. Metode Silhouette
fviz_nbclust(Data_scaled, pam, method = "silhouette")

# 2. Metode Elbow
fviz_nbclust(Data_scaled, pam, method = "wss")

Interpretasi :

Berdasarkan output grafik Metode Silhouette, terlihat bahwa nilai silhouette tertinggi terjadi saat k = 2, sehingga dapat disimpulkan bahwa jumlah cluster (k) optimal dengan metode Silhouette adalah 2. Sedangkan pada output grafik Metode Elbow, terlihat bahwa penurunan SSE tajam terjadi pada k = 1 ke k = 2 serta k = 2 ke k = 3. Setelah k = 3, penurunan mulai melandai, sehingga siku terbentuk pada saat k = 3. Jadi, dapat disimpulkan bahwa jumlah cluster (k) optimal dengan metode Elbow adalah 3.

Clustering dengan k = 2 dan k = 3

pam.result_2<-pam(Data_scaled,2)
pam.result_3<-pam(Data_scaled,3)
print(pam.result_2)
## Medoids:
##      ID        UHH        RLS Pengeluaran_per_Kapita
## [1,] 16 -0.3335292 -0.7713332             -0.8455353
## [2,] 10  1.0140477  0.7046491              0.5774414
## Clustering vector:
##  [1] 1 1 1 1 1 1 1 1 2 2 2 1 2 2 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 2 2 2 2 2 2
## Objective function:
##    build     swap 
## 1.048122 1.044303 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"
print(pam.result_3)
## Medoids:
##      ID        UHH        RLS Pengeluaran_per_Kapita
## [1,] 16 -0.3335292 -0.7713332             -0.8455353
## [2,] 22  0.3786049 -0.1169568              0.5026347
## [3,] 31  1.3427250  2.1297354              2.1054774
## Clustering vector:
##  [1] 1 2 1 1 1 2 1 1 2 2 2 1 2 2 1 1 1 2 2 2 1 2 1 2 1 1 1 1 1 3 3 3 3 2 2
## Objective function:
##     build      swap 
## 0.8683687 0.8470971 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"
# Menghitung Davies-Bouldin Index menggunakan fungsi dari clusterSim
# Semakin kecil nilai DBI, semakin baik pemisahan antar klaster
dist_matrix <- dist(Data_scaled)
DBI_Medo2 <- index.DB(Data_scaled, pam.result_2$clustering, centrotypes = "medoids", d = dist_matrix)
DBI_Medo3 <- index.DB(Data_scaled, pam.result_3$clustering, centrotypes = "medoids", d = dist_matrix)

DBI_Medo2$DB 
## [1] 1.02959
DBI_Medo3$DB
## [1] 1.03396

Interpretasi :

Dari hasil output dapat ditarik kesimpulan bahwa banyak klaster optimal adalah 2 karena memiliki nilai Davies Bouldin Index (1.02959) lebih rendah dibandingkan banyak klaster 3 (1.03396).

Menambahkan Kolom Keanggotaan Cluster ke dalam Dataset

df.cluster_2<-data.frame(data_komponen_IPM,pam.result_2$clustering)
df.cluster_2
##                 Kabupaten_Kota   UHH   RLS Pengeluaran_per_Kapita
## 1       3301 Kabupaten Cilacap 74.57  7.40                  11868
## 2      3302 Kabupaten Banyumas 74.34  7.91                  12960
## 3   3303 Kabupaten Purbalingga 73.56  7.36                  11343
## 4  3304 Kabupaten Banjarnegara 74.66  6.87                  10595
## 5       3305 Kabupaten Kebumen 73.96  7.87                  10176
## 6     3306 Kabupaten Purworejo 75.51  8.65                  11584
## 7      3307 Kabupaten Wonosobo 72.40  6.90                  11980
## 8      3308 Kabupaten Magelang 74.45  7.83                  10926
## 9      3309 Kabupaten Boyolali 76.44  8.17                  14195
## 10       3310 Kabupaten Klaten 77.30  9.29                  13513
## 11    3311 Kabupaten Sukoharjo 78.01 10.01                  12758
## 12     3312 Kabupaten Wonogiri 76.84  7.68                  10634
## 13  3313 Kabupaten Karanganyar 77.91  9.26                  12732
## 14       3314 Kabupaten Sragen 76.18  7.88                  13890
## 15     3315 Kabupaten Grobogan 75.24  7.29                  11548
## 16        3316 Kabupaten Blora 74.84  7.26                  10926
## 17      3317 Kabupaten Rembang 74.97  7.73                  11830
## 18         3318 Kabupaten Pati 76.56  7.82                  11829
## 19        3319 Kabupaten Kudus 77.08  9.35                  12533
## 20       3320 Kabupaten Jepara 76.21  8.27                  11729
## 21        3321 Kabupaten Demak 75.79  8.28                  11591
## 22     3322 Kabupaten Semarang 76.14  8.16                  13377
## 23   3323 Kabupaten Temanggung 75.95  7.53                  10519
## 24       3324 Kabupaten Kendal 74.73  7.74                  13277
## 25       3325 Kabupaten Batang 75.03  7.08                  10919
## 26   3326 Kabupaten Pekalongan 74.00  7.48                  11701
## 27     3327 Kabupaten Pemalang 73.99  6.56                  10017
## 28        3328 Kabupaten Tegal 72.16  7.36                  10972
## 29       3329 Kabupaten Brebes 70.29  6.41                  11389
## 30          3371 Kota Magelang 77.53 11.43                  13619
## 31         3372 Kota Surakarta 77.90 11.25                  16291
## 32          3373 Kota Salatiga 78.26 11.48                  17096
## 33          3374 Kota Semarang 78.24 11.05                  16990
## 34        3375 Kota Pekalongan 74.80  9.34                  14547
## 35             3376 Kota Tegal 74.87  9.28                  14358
##    pam.result_2.clustering
## 1                        1
## 2                        1
## 3                        1
## 4                        1
## 5                        1
## 6                        1
## 7                        1
## 8                        1
## 9                        2
## 10                       2
## 11                       2
## 12                       1
## 13                       2
## 14                       2
## 15                       1
## 16                       1
## 17                       1
## 18                       1
## 19                       2
## 20                       1
## 21                       1
## 22                       2
## 23                       1
## 24                       1
## 25                       1
## 26                       1
## 27                       1
## 28                       1
## 29                       1
## 30                       2
## 31                       2
## 32                       2
## 33                       2
## 34                       2
## 35                       2

Tabulasi Kabupaten_Kota per Cluster

table(pam.result_2$clustering,data_komponen_IPM$Kabupaten_Kota)
##    
##     3301 Kabupaten Cilacap 3302 Kabupaten Banyumas 3303 Kabupaten Purbalingga
##   1                      1                       1                          1
##   2                      0                       0                          0
##    
##     3304 Kabupaten Banjarnegara 3305 Kabupaten Kebumen 3306 Kabupaten Purworejo
##   1                           1                      1                        1
##   2                           0                      0                        0
##    
##     3307 Kabupaten Wonosobo 3308 Kabupaten Magelang 3309 Kabupaten Boyolali
##   1                       1                       1                       0
##   2                       0                       0                       1
##    
##     3310 Kabupaten Klaten 3311 Kabupaten Sukoharjo 3312 Kabupaten Wonogiri
##   1                     0                        0                       1
##   2                     1                        1                       0
##    
##     3313 Kabupaten Karanganyar 3314 Kabupaten Sragen 3315 Kabupaten Grobogan
##   1                          0                     0                       1
##   2                          1                     1                       0
##    
##     3316 Kabupaten Blora 3317 Kabupaten Rembang 3318 Kabupaten Pati
##   1                    1                      1                   1
##   2                    0                      0                   0
##    
##     3319 Kabupaten Kudus 3320 Kabupaten Jepara 3321 Kabupaten Demak
##   1                    0                     1                    1
##   2                    1                     0                    0
##    
##     3322 Kabupaten Semarang 3323 Kabupaten Temanggung 3324 Kabupaten Kendal
##   1                       0                         1                     1
##   2                       1                         0                     0
##    
##     3325 Kabupaten Batang 3326 Kabupaten Pekalongan 3327 Kabupaten Pemalang
##   1                     1                         1                       1
##   2                     0                         0                       0
##    
##     3328 Kabupaten Tegal 3329 Kabupaten Brebes 3371 Kota Magelang
##   1                    1                     1                  0
##   2                    0                     0                  1
##    
##     3372 Kota Surakarta 3373 Kota Salatiga 3374 Kota Semarang
##   1                   0                  0                  0
##   2                   1                  1                  1
##    
##     3375 Kota Pekalongan 3376 Kota Tegal
##   1                    0               0
##   2                    1               1

Visualisasi Clustering

fviz_cluster(pam.result_2, data = Data_scaled)

Keterangan : Dari output grafik, dapat diketahui anggota dari masing-masing cluster secara visual.

Profiling Cluster

profiling <- Data %>% mutate(Cluster = pam.result_2$clustering) %>% group_by(Cluster) %>% summarise(across(where(is.numeric), .fns = list(median = ~median(.), sd = ~sd(.)), .names = "{.col}_{.fn}"), jumlah = n())
print(profiling)
## # A tibble: 2 × 8
##   Cluster UHH_median UHH_sd RLS_median RLS_sd Pengeluaran_per_Kapita_median
##     <int>      <dbl>  <dbl>      <dbl>  <dbl>                         <dbl>
## 1       1       74.7   1.51       7.51  0.549                        11468.
## 2       2       77.3   1.20       9.34  1.27                         13890 
## # ℹ 2 more variables: Pengeluaran_per_Kapita_sd <dbl>, jumlah <int>

Interpretasi :

Karakteristik dari masing-masing cluster adalah sebagai berikut.

  1. Cluster 1

    Cluster 1 memiliki median Umur Harapan Hidup (UHH) sebesar 74.7 tahun, Rata-rata Lama Sekolah (RLS) sebesar 7.51 tahun, dan Pengeluaran per Kapita sebesar 11.468. Ketiga indikator ini lebih rendah dibandingkan Cluster 2. Kondisi ini menunjukkan bahwa wilayah dalam Cluster 1 memiliki tingkat pembangunan manusia yang relatif lebih rendah dan masih perlu ditingkatkan baik dari sisi kualitas kesehatan, akses pendidikan, maupun kesejahteraan ekonomi. Cluster 1 memiliki 22 anggota, terdiri dari Kabupaten Cilacap, Kabupaten Banyumas, Kabupaten Purbalingga, Kabupaten Banjarnegara, Kabupaten Kebumen, Kabupaten Purworejo, Kabupaten Wonosobo, Kabupaten Wonogiri, Kabupaten Grobogan, Kabupaten Blora, Kabupaten Rembang, Kabupaten Pati, Kabupaten Jepara, Kabupaten Demak, Kabupaten Temanggung, Kabupaten Kendal, Kabupaten Batang, Kabupaten Pekalongan, Kabupaten Pemalang, Kabupaten Tegal, dan Kabupaten Brebes.

  2. Cluster 2

    Pada Cluster 2 nilai median Umur Harapan Hidup (UHH) sebesar 77.3 tahun dan median Rata-rata Lama Sekolah (RLS) sebesar 9.34 tahun menunjukkan kondisi yang lebih baik dibandingkan Cluster 1. Selain itu, median Pengeluaran per Kapita sebesar 13.890 juga lebih tinggi dibandingkan Cluster 1. Hal ini menunjukkan bahwa wilayah dalam Cluster 2 memiliki capaian yang lebih baik pada tiga dimensi utama pembangunan manusia dan dapat dikategorikan sebagai kelompok wilayah dengan tingkat pembangunan manusia yang relatif lebih maju dibandingkan Cluster 1. Cluster 2 memiliki 13 anggota, yaitu Kabupaten Boyolali, Kabupaten Klaten, Kabupaten Sukoharjo, Kabupaten Karanganyar, Kabupaten Sragen, Kabupaten Kudus, Kabupaten Semarang, Kota Magelang, Kota Surakarta, Kota Salatiga, Kota Semarang, Kota Pekalongan, dan Kota Tegal.