DATA

Data yang digunakan adalah data kemiskinan multidimensi yang dikumpulkan dari Badan Pusat Statistik (BPS) untuk 34 provinsi di Indonesia pada tahun 2023. Variabel-variabel yang digunakan mencakup empat dimensi utama kemiskinan multidimensi yaitu ekonomi, pendidikan, ketenagakerjaan dan standar hidup.

data_bps <- read.csv("Data Kemiskinan Indonesia BPS 2023.csv")
data_bps
summary(data_bps)
##    Provinsi         Jumlah_Penduduk_Miskin Persentase_Penduduk_Miskin
##  Length:34          Min.   :  47.97        Min.   : 4.250            
##  Class :character   1st Qu.: 190.19        1st Qu.: 6.240            
##  Mode  :character   Median : 346.86        Median : 8.425            
##                     Mean   : 761.72        Mean   :10.089            
##                     3rd Qu.: 821.28        3rd Qu.:12.252            
##                     Max.   :4188.81        Max.   :26.030            
##        P1              P2         Garis_Kemiskinan Kurang_dari_SD 
##  Min.   :0.550   Min.   :0.1000   Min.   :433131   Min.   :10.24  
##  1st Qu.:0.865   1st Qu.:0.1925   1st Qu.:507224   1st Qu.:14.69  
##  Median :1.415   Median :0.3600   Median :584603   Median :17.71  
##  Mean   :1.734   Mean   :0.4544   Mean   :597448   Mean   :19.91  
##  3rd Qu.:2.080   3rd Qu.:0.5100   3rd Qu.:665597   3rd Qu.:24.02  
##  Max.   :6.250   Max.   :2.1500   Max.   :874204   Max.   :44.80  
##   Tamat_SD_SMP   Lebih_dari_SMA   Sekolah_7_12    Sekolah_13_15  
##  Min.   :35.70   Min.   :16.17   Min.   : 76.90   Min.   :73.75  
##  1st Qu.:49.88   1st Qu.:20.64   1st Qu.: 98.10   1st Qu.:89.44  
##  Median :53.40   Median :26.46   Median : 99.23   Median :92.88  
##  Mean   :53.45   Mean   :26.63   Mean   : 98.08   Mean   :92.17  
##  3rd Qu.:56.76   3rd Qu.:31.97   3rd Qu.: 99.58   3rd Qu.:95.44  
##  Max.   :66.67   Max.   :44.32   Max.   :100.00   Max.   :99.91  
##  Tidak_Bekerja_Formal_In Bekerja_Informal Bekerja_Formal 
##  Min.   :27.22           Min.   :20.86    Min.   : 3.67  
##  1st Qu.:40.35           1st Qu.:32.37    1st Qu.:13.85  
##  Median :43.98           Median :38.61    Median :17.84  
##  Mean   :43.44           Mean   :38.69    Mean   :17.86  
##  3rd Qu.:46.37           3rd Qu.:43.39    3rd Qu.:21.55  
##  Max.   :54.38           Max.   :69.11    Max.   :29.82  
##  Tidak_Bekerja_Pertanian Bekerja_Pertanian Bekerja_Bukan_Pertanian
##  Min.   :27.22           Min.   : 0.37     Min.   : 5.25          
##  1st Qu.:40.35           1st Qu.:22.63     1st Qu.:22.22          
##  Median :43.98           Median :29.14     Median :26.70          
##  Mean   :43.44           Mean   :29.10     Mean   :27.46          
##  3rd Qu.:46.37           3rd Qu.:33.98     3rd Qu.:33.09          
##  Max.   :54.38           Max.   :67.53     Max.   :45.25          
##      Miskin       Tidak_Miskin   Miskin_Tidak_Miskin   Air_Layak    
##  Min.   :55.04   Min.   :37.63   Min.   :37.82       Min.   :57.86  
##  1st Qu.:57.99   1st Qu.:47.27   1st Qu.:48.08       1st Qu.:74.12  
##  Median :60.22   Median :50.38   Median :50.72       Median :82.19  
##  Mean   :61.49   Mean   :49.33   Mean   :49.79       Mean   :81.65  
##  3rd Qu.:63.70   3rd Qu.:51.45   3rd Qu.:51.64       3rd Qu.:91.21  
##  Max.   :80.26   Max.   :56.82   Max.   :57.36       Max.   :98.21  
##  Jamban_Sendiri_Bersama
##  Min.   :54.69         
##  1st Qu.:79.26         
##  Median :85.66         
##  Mean   :83.35         
##  3rd Qu.:90.08         
##  Max.   :98.22

KORELASI DATA

library(tidymodels)
## ── Attaching packages ────────────────────────────────────── tidymodels 1.1.1 ──
## ✔ broom        1.0.5     ✔ recipes      1.0.8
## ✔ dials        1.2.0     ✔ rsample      1.2.0
## ✔ dplyr        1.1.3     ✔ tibble       3.2.1
## ✔ ggplot2      3.5.0     ✔ tidyr        1.3.0
## ✔ infer        1.0.5     ✔ tune         1.1.2
## ✔ modeldata    1.2.0     ✔ workflows    1.1.3
## ✔ parsnip      1.1.1     ✔ workflowsets 1.0.1
## ✔ purrr        1.0.2     ✔ yardstick    1.2.0
## Warning: package 'scales' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.3
## ── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
## ✖ purrr::discard() masks scales::discard()
## ✖ dplyr::filter()  masks stats::filter()
## ✖ dplyr::lag()     masks stats::lag()
## ✖ recipes::step()  masks stats::step()
## • Learn how to get started at https://www.tidymodels.org/start/
data_viz<-data_bps %>% 
  select(-Provinsi)
head(data_viz)
data_standarisasi<-scale(data_viz)
head(data_standarisasi)
##      Jumlah_Penduduk_Miskin Persentase_Penduduk_Miskin          P1         P2
## [1,]             0.04235808                  0.8412993  0.82393210  0.7565661
## [2,]            -0.39637441                 -0.7985165 -0.73327596 -0.6376478
## [3,]            -0.25969736                 -0.6576853 -0.58879274 -0.4982264
## [4,]            -0.44520713                  0.7622023  0.32626767  0.1524067
## [5,]             0.19656073                  0.1969481 -0.07507462 -0.2193837
## [6,]            -0.65194892                 -1.0743914 -0.88578603 -0.7538323
##      Garis_Kemiskinan Kurang_dari_SD Tamat_SD_SMP Lebih_dari_SMA Sekolah_7_12
## [1,]        0.2573875     -1.1849131   -0.1624278      1.4516763    0.3495225
## [2,]        0.6029377     -0.1339583   -0.4416324      0.5749048    0.4228790
## [3,]        0.5232552     -0.8434862    0.3089175      0.6215106    0.4405858
## [4,]        0.3395852     -0.2819989   -0.5001753      0.7933695    0.2356933
## [5,]       -0.3288354     -0.2086454    0.4004846     -0.1605930    0.3975837
## [6,]        2.3676807      1.0183576   -0.1053860     -1.0096923    0.0560962
##      Sekolah_13_15 Tidak_Bekerja_Formal_In Bekerja_Informal Bekerja_Formal
## [1,]    0.94463655              0.54532590       -0.4312389      0.1731622
## [2,]   -0.03432816             -0.54933754        0.7717485     -0.7173162
## [3,]    0.04348234              1.26927264       -1.2231970      0.7562334
## [4,]    0.73834824             -1.06869064        0.8184564     -0.2963020
## [5,]    0.40358211             -0.07195237        0.4811217     -0.7072920
## [6,]   -2.21302227              0.27952902       -1.4079526      1.9975570
##      Tidak_Bekerja_Pertanian Bekerja_Pertanian Bekerja_Bukan_Pertanian
## [1,]              0.54532590         0.1874380             -0.63165688
## [2,]             -0.54933754         0.2875176             -0.01934577
## [3,]              1.26927264        -0.2990357             -0.45705254
## [4,]             -1.06869064         0.7722508             -0.33028500
## [5,]             -0.07195237         0.3406033             -0.41878309
## [6,]              0.27952902        -0.8159685              0.93021482
##          Miskin Tidak_Miskin Miskin_Tidak_Miskin  Air_Layak
## [1,]  0.4766656    1.7813965           1.7570887  0.4180017
## [2,]  0.1476828    0.8009320           0.7361343 -0.6507873
## [3,] -0.3580106    0.2964211           0.2385067  0.2382938
## [4,] -0.2940940    0.2559651           0.2758872 -1.0915446
## [5,] -0.2828146    0.5915124           0.5609133 -0.3916297
## [6,] -0.8975423    0.3511558           0.2665421 -1.0716821
##      Jamban_Sendiri_Bersama
## [1,]             -0.6776117
## [2,]             -0.6943808
## [3,]              0.6678635
## [4,]              0.6668771
## [5,]              1.1058335
## [6,]              0.6570129
library(GGally)
## Warning: package 'GGally' was built under R version 4.3.3
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
ggcorr(data_standarisasi,method = c("everything","pearson"),geom='tile',label = TRUE)

DIMENSI VARIABEL
Ekonomi Garis Kemiskinan (x1)
Pendidikan Persentase penduduk dengan pendidikan < SD (x2), Persentase penduduk tamat SD/SMP (x3), Persentase penduduk > SMA (x4)
Ketenagakerjaan Tingkat pengangguran terbuka (x5)
Standar Hidup Persentase rumah tangga dengan jamban sendiri/bersama (x6), Perrsentase rumah tangga dengan akses air layak (x7)
data <- data_bps %>%
  select(Provinsi,Garis_Kemiskinan,Kurang_dari_SD,Tamat_SD_SMP,Lebih_dari_SMA,
         Tidak_Bekerja_Formal_In,Jamban_Sendiri_Bersama,Air_Layak) %>%
  mutate_if(is.integer, as.numeric)
head(data)
summary(data)
##    Provinsi         Garis_Kemiskinan Kurang_dari_SD   Tamat_SD_SMP  
##  Length:34          Min.   :433131   Min.   :10.24   Min.   :35.70  
##  Class :character   1st Qu.:507224   1st Qu.:14.69   1st Qu.:49.88  
##  Mode  :character   Median :584603   Median :17.71   Median :53.40  
##                     Mean   :597448   Mean   :19.91   Mean   :53.45  
##                     3rd Qu.:665597   3rd Qu.:24.02   3rd Qu.:56.76  
##                     Max.   :874204   Max.   :44.80   Max.   :66.67  
##  Lebih_dari_SMA  Tidak_Bekerja_Formal_In Jamban_Sendiri_Bersama   Air_Layak    
##  Min.   :16.17   Min.   :27.22           Min.   :54.69          Min.   :57.86  
##  1st Qu.:20.64   1st Qu.:40.35           1st Qu.:79.26          1st Qu.:74.12  
##  Median :26.46   Median :43.98           Median :85.66          Median :82.19  
##  Mean   :26.63   Mean   :43.44           Mean   :83.35          Mean   :81.65  
##  3rd Qu.:31.97   3rd Qu.:46.37           3rd Qu.:90.08          3rd Qu.:91.21  
##  Max.   :44.32   Max.   :54.38           Max.   :98.22          Max.   :98.21
  • Analisis statistik deskriptif menunjukkan kesenjangan yang signifikan antar provinsi di Indonesia dalam berbagai aspek kemiskinan multidimensi. Garis kemiskinan, misalnya, bervariasi dari Rp433.131 hingga Rp874.204, dengan median Rp584.603. Rentang yang lebar ini mengindikasikan adanya perbedaan substansial dalam standar hidup minimum antar provinsi. Provinsi dengan garis kemiskinan tinggi mencerminkan biaya hidup yang lebih tinggi, namun juga bisa menunjukkan standar hidup yang lebih baik.
  • Dalam aspek pendidikan, terdapat variasi yang besar dalam proporsi penduduk dengan tingkat pendidikan berbeda. Persentase penduduk dengan pendidikan kurang dari SD bervariasi dari 10,24% hingga 44,80%, dengan median 17,71%. Ini menunjukkan bahwa di beberapa provinsi, hampir setengah populasi memiliki tingkat pendidikan yang sangat rendah, yang dapat menjadi hambatan serius dalam pengentasan kemiskinan. Di sisi lain, persentase penduduk dengan pendidikan lebih dari SMA berkisar antara 16,17% hingga 44,32%, dengan median 26,46%. Kesenjangan ini menggambarkan distribusi sumber daya manusia yang tidak merata di Indonesia, yang dapat berdampak pada perkembangan ekonomi dan sosial di berbagai daerah.
  • Berdasarkan aspek ketenagakerjaan, tingkat penduduk yang tidak bekerja atau pengangguran juga menunjukkan variasi yang signifikan, dengan rentang dari 27,22% hingga 54,38% dan median 43,98%. Angka ini mengindikasikan bahwa di banyak provinsi, hampir setengah dari populasi tidak bekerja, yang dapat berkontribusi pada ketidakstabilan ekonomi dan kerentanan terhadap kemiskinan.
  • Berdasarkan aspek standar hidup, akses terhadap fasilitas dasar seperti jamban dan air layak juga bervariasi antar provinsi. Kepemilikan jamban berkisar antara 54,69% hingga 98,22%, sementara akses air layak berkisar antara 57,86% hingga 98,21%. Meskipun beberapa provinsi hampir mencapai akses universal, masih ada daerah di mana hampir setengah populasi tidak memiliki akses ke fasilitas sanitasi dan air bersih yang layak, yang dapat berdampak serius pada kesehatan dan kualitas hidup.
library(tidymodels)
data_viz<-data %>% 
  select(-Provinsi)
head(data_viz)
library(dplyr)

viz_data <- data_viz %>%
  rename(X1 = Garis_Kemiskinan,
         X2 = Kurang_dari_SD,
         X3 = Tamat_SD_SMP,
         X4 = Lebih_dari_SMA,
         X5 = Tidak_Bekerja_Formal_In,
         X6 = Jamban_Sendiri_Bersama,
         X7 = Air_Layak)
viz_data
data_standarisasi<-scale(data_viz)
head(data_standarisasi)
##      Garis_Kemiskinan Kurang_dari_SD Tamat_SD_SMP Lebih_dari_SMA
## [1,]        0.2573875     -1.1849131   -0.1624278      1.4516763
## [2,]        0.6029377     -0.1339583   -0.4416324      0.5749048
## [3,]        0.5232552     -0.8434862    0.3089175      0.6215106
## [4,]        0.3395852     -0.2819989   -0.5001753      0.7933695
## [5,]       -0.3288354     -0.2086454    0.4004846     -0.1605930
## [6,]        2.3676807      1.0183576   -0.1053860     -1.0096923
##      Tidak_Bekerja_Formal_In Jamban_Sendiri_Bersama  Air_Layak
## [1,]              0.54532590             -0.6776117  0.4180017
## [2,]             -0.54933754             -0.6943808 -0.6507873
## [3,]              1.26927264              0.6678635  0.2382938
## [4,]             -1.06869064              0.6668771 -1.0915446
## [5,]             -0.07195237              1.1058335 -0.3916297
## [6,]              0.27952902              0.6570129 -1.0716821
standarisasi_data<-scale(viz_data)
head(standarisasi_data)
##              X1         X2         X3         X4          X5         X6
## [1,]  0.2573875 -1.1849131 -0.1624278  1.4516763  0.54532590 -0.6776117
## [2,]  0.6029377 -0.1339583 -0.4416324  0.5749048 -0.54933754 -0.6943808
## [3,]  0.5232552 -0.8434862  0.3089175  0.6215106  1.26927264  0.6678635
## [4,]  0.3395852 -0.2819989 -0.5001753  0.7933695 -1.06869064  0.6668771
## [5,] -0.3288354 -0.2086454  0.4004846 -0.1605930 -0.07195237  1.1058335
## [6,]  2.3676807  1.0183576 -0.1053860 -1.0096923  0.27952902  0.6570129
##              X7
## [1,]  0.4180017
## [2,] -0.6507873
## [3,]  0.2382938
## [4,] -1.0915446
## [5,] -0.3916297
## [6,] -1.0716821
library(GGally)
ggcorr(data_standarisasi,method = c("everything","pearson"),geom='tile',label = TRUE)

library(GGally)
ggcorr(standarisasi_data, method = c("everything", "pearson"), geom = "tile", label = TRUE)

Berdasarkan matriks korelasi, terlihat bahwa dimensi pendidikan, khususnya penduduk dengan pendidikan lebih dari SMA, memiliki korelasi tertinggi dengan garis kemiskinan sebesar -0.3, serta korelasi tertinggi dengan status ketenagakerjaan tidak bekerja secara formal sebesar -0.6. Sementara itu, penduduk dengan pendidikan kurang dari SD memiliki korelasi sebesar 0.3 dengan garis kemiskinan. Dalam dimensi standar hidup, akses terhadap air layak dan kepemilikan jamban sendiri/bersama memiliki korelasi sebesar 0.2. Dimensi ketenagakerjaan, yaitu penduduk yang tidak bekerja secara formal, memiliki korelasi sebesar 0.3 dengan garis kemiskinan dan 0.3 dengan akses air layak. Meskipun terdapat beberapa korelasi yang cukup signifikan, secara umum tidak ada korelasi yang sangat tinggi antar variabel (korelasi > 0.7 atau < -0.7) [23], sehingga analisis cluster masih dapat dilakukan untuk mengidentifikasi kelompok-kelompok yang memiliki karakteristik serupa berdasarkan kombinasi dari berbagai dimensi tersebut.

LINE PLOT DATA

ggplot(data, aes(x = Provinsi, y = Garis_Kemiskinan, group = 1)) +
  geom_line() +
  geom_point() +
  ggtitle("Line Plot Garis Kemiskinan Berdasarkan Provinsi di Indonesia") +
  xlab("Provinsi") +
  ylab("Garis Kemiskinan") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Garis kemiskinan tertinggi ditemukan di Bangka Belitung, sementara yang terendah di Sulawesi Barat, menunjukkan variasi yang signifikan dalam standar hidup minimum antar provinsi.

ggplot(data, aes(x = Provinsi, y = Kurang_dari_SD, group = 1)) +
  geom_line() +
  geom_point() +
  ggtitle("Line Plot Pendidikan Masyarakat yang Kurang dari SD Berdasarkan Provinsi di Indonesia") +
  xlab("Provinsi") +
  ylab("Pendidikan < SD (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Dalam aspek pendidikan, Papua menunjukkan persentase tertinggi penduduk dengan pendidikan kurang dari SD, sedangkan Maluku memiliki persentase terendah.

ggplot(data, aes(x = Provinsi, y = Tamat_SD_SMP, group = 1)) +
  geom_line() +
  geom_point() +
  ggtitle("Line Plot Pendidikan Masyarakat yang Tamat SD-SMP Berdasarkan Provinsi di Indonesia") +
  xlab("Provinsi") +
  ylab("Pendidikan Tamat SD-SMP (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Jawa Barat memimpin dalam hal penduduk yang tamat SD-SMP, sementara Papua berada di posisi terendah.

ggplot(data, aes(x = Provinsi, y = Lebih_dari_SMA, group = 1)) +
  geom_line() +
  geom_point() +
  ggtitle("Line Plot Pendidikan Masyarakat yang Lebih dari SMA Berdasarkan Provinsi di Indonesia") +
  xlab("Provinsi") +
  ylab("Pendidikan > SMA (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Untuk pendidikan lebih dari SMA, DKI Jakarta menempati posisi tertinggi, kontras dengan Nusa Tenggara Timur yang terendah.

ggplot(data, aes(x = Provinsi, y = Tidak_Bekerja_Formal_In, group = 1)) +
  geom_line() +
  geom_point() +
  ggtitle("Line Plot Masyarakat yang Tidak Bekerja Berdasarkan Provinsi di Indonesia") +
  xlab("Provinsi") +
  ylab("Tidak Bekerja (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

DKI Jakarta juga memiliki persentase tertinggi masyarakat yang tidak bekerja, sedangkan Papua justru terendah.

ggplot(data, aes(x = Provinsi, y = Jamban_Sendiri_Bersama, group = 1)) +
  geom_line() +
  geom_point() +
  ggtitle("Line Plot Masyarakat yang Memiliki Jamban Sendiri/Bersama Berdasarkan Provinsi di Indonesia") +
  xlab("Provinsi") +
  ylab("Jamban Sendiri/Bersama (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Dalam hal fasilitas, DI Yogyakarta memiliki persentase tertinggi kepemilikan jamban sendiri/bersama, sementara Papua kembali berada di posisi terendah.

ggplot(data, aes(x = Provinsi, y = Air_Layak, group = 1)) +
  geom_line() +
  geom_point() +
  ggtitle("Line Plot Masyarakat yang Memiliki Air Layak Berdasarkan Provinsi di Indonesia") +
  xlab("Provinsi") +
  ylab("Air Layak (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Akses air layak tertinggi ditemukan di DKI Jakarta, dengan Papua sekali lagi menempati posisi terendah.

K-MEANS CLUSTERING

library(cluster)
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
set.seed(123)

# Menghitung nilai silhouette untuk berbagai nilai k
silhouette_score <- function(k) {
  km_res <- kmeans(data_standarisasi, centers = k, nstart = 25)
  ss <- silhouette(km_res$cluster, dist(data_standarisasi))
  mean(ss[, 3])  # rata-rata nilai silhouette
}

# Nilai k yang diuji
k_values <- 2:33

# Menghitung silhouette score untuk setiap nilai k
avg_silhouette <- sapply(k_values, silhouette_score)

silhouette_index <- data.frame(
  Clusters = k_values,
  Silhouette_Index = avg_silhouette
)
silhouette_index
# Plot silhouette score
plot(k_values, avg_silhouette, type = "b", pch = 19, frame = FALSE,
     xlab = "Number of Clusters k",
     ylab = "Average Silhouette Score",
     main = "Silhouette Method untuk Nilai k")
#max_silhouette_row <- silhouette_index[which.max(silhouette_index$Silhouette_Index), ]
#print(max_silhouette_row)
abline(h = max(avg_silhouette), col = "red", lty = 2)
abline(v = k_values[which.max(avg_silhouette)], col = "red", lty = 2)

Metode elbow diterapkan dengan menghitung Average Silhouette Score untuk jumlah cluster (k) mulai dari 2 hingga 33. Hasil analisis menunjukkan bahwa nilai Silhouette Score meningkat secara signifikan hingga k = 14, setelah itu peningkatannya mulai melambat. Titik k = 14 ini diidentifikasi sebagai ‘elbow point’, yang menandakan jumlah cluster optimal. Grafik menunjukkan kurva mengalami kenaikan dari k = 5 hingga k = 14, kemudian mulai mendatar dan mengalami penurusan setelahnya, membentuk bentuk siku atau “elbow” yang karakteristik. Berdasarkan analisis ini, jumlah cluster optimal yang dipilih adalah 14. Pemilihan 14 cluster ini memungkinkan segmentasi yang lebih granular dari provinsi-provinsi berdasarkan karakteristik kemiskinan mereka, sambil tetap menjaga keseimbangan antara detail dan generalisasi.

# Menentukan jumlah cluster
k <- k_values[which.max(avg_silhouette)]

# Lakukan clustering K-Means
kmeans_result <- kmeans(data_standarisasi, centers = k, nstart = 25)

# Melihat hasil clustering
print(kmeans_result)
## K-means clustering with 14 clusters of sizes 4, 2, 3, 2, 2, 1, 2, 1, 3, 1, 5, 3, 2, 3
## 
## Cluster means:
##    Garis_Kemiskinan Kurang_dari_SD Tamat_SD_SMP Lebih_dari_SMA
## 1        -0.8527920      0.6512570   0.16556250     -0.8716955
## 2        -0.3945260      0.5382260  -1.32502978      0.6979732
## 3         1.1377700     -0.8968341   0.09726245      0.8851246
## 4        -0.2648474     -0.4673831   0.95363999     -0.4147402
## 5        -0.8490000      1.0316946  -0.58348639     -0.5596551
## 6        -1.3282197      2.3120457  -1.12012964     -1.4378831
## 7        -0.3462537     -0.8014747   1.68542623     -0.7613708
## 8         1.6688210     -1.0355388  -1.48940023      2.5760412
## 9         0.3485025     -1.1120042  -0.03933765      1.2526307
## 10        0.7615840      3.3189884  -2.66476152     -1.0402774
## 11       -0.1836583     -0.2526575   0.74964050     -0.4512966
## 12       -1.2801542     -0.0917245  -0.21296488      0.3069214
## 13        2.1267341      0.2341426   0.77500909     -1.0082359
## 14        0.6882351     -0.2353194  -0.56071971      0.8011371
##    Tidak_Bekerja_Formal_In Jamban_Sendiri_Bersama   Air_Layak
## 1              -1.00836174              0.2935176  0.85923180
## 2              -1.36071746              1.1571272  1.20824343
## 3               0.77848105              1.0071916 -0.34496867
## 4               0.01460648             -1.8065680 -0.05964299
## 5              -0.02473845             -0.1592486 -1.00547396
## 6              -0.35173855             -1.7005279  0.72728838
## 7               1.29987425              0.3078207  0.81525066
## 8               1.91278086              0.5327242  1.56624046
## 9               0.23697821             -0.6388125  0.67306074
## 10             -2.83658957             -2.8270182 -2.25018753
## 11              0.13404021              0.1332246 -0.94569745
## 12              1.02679128              0.6310372  0.68567182
## 13              0.26029372              0.5721809 -0.65315193
## 14             -0.62219852             -0.3287482 -0.80117447
## 
## Clustering vector:
##  [1]  9 14  3 14 11 13  7  1  7  1  5 13 12 12  6  5 14 10  9 11 11  3  8  1  2
## [26]  2  1 11 11  3  4 12  9  4
## 
## Within cluster sum of squares by cluster:
##  [1] 3.9316964 0.4962696 2.1591549 0.9900507 2.7071008 0.0000000 1.2784220
##  [8] 0.0000000 3.1867162 0.0000000 6.1087085 3.7217686 3.2617604 2.4813366
##  (between_SS / total_SS =  86.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
data_cluster <- data.frame(data, Cluster_Kmeans = kmeans_result$cluster)
data_cluster

Hasil K-Means Clustering berdasarkan dimensi ekonomi, pendidikan, ketenagakerjaan, dan standar hidup mengungkapkan adanya 14 cluster provinsi dengan karakteristik yang beragam. Beberapa cluster menunjukkan kombinasi yang kontras, seperti Cluster 1 dengan garis kemiskinan rendah dan pendidikan dasar tinggi, serta Cluster 14 dengan garis kemiskinan tinggi dan pendidikan rendah. Cluster 3 dan 5 memiliki garis kemiskinan yang sama-sama rendah, namun berbeda dalam hal akses fasilitas, di mana Cluster 3 memiliki akses fasilitas baik sementara Cluster 5 memiliki akses fasilitas rendah. Perbedaan karakteristik antar cluster ini mengindikasikan adanya keterkaitan dan trade-off antara dimensi-dimensi tersebut. Misalnya, provinsi dengan tingkat pendidikan tinggi cenderung memiliki tingkat kemiskinan yang lebih rendah, seperti terlihat pada Cluster 2 dan 8. Di sisi lain, Cluster 10 menunjukkan bahwa provinsi dengan tingkat pendidikan sangat rendah juga memiliki tingkat kemiskinan yang tinggi. Dalam hal ketenagakerjaan, cluster-cluster dengan tingkat pendidikan menengah ke atas cenderung memiliki karakteristik yang lebih baik.

OPTICS CLUSTERING

Untuk menentukan nilai parameter eps (epsilon) dan MinPts yang optimal, dilakukan pengujian dengan berbagai kombinasi nilai. Nilai eps divariasikan dari 1 hingga 5 dengan langkah 0.1, MinPts divariasikan dari 1 hingga 5 dengan langkah 1, dan eps_cl (epsilon untuk ekstraksi cluster) divariasikan dari 1 hingga 5 dengan langkah 0.1.

eps_values <- seq(1, 5, by = 0.1)       # Vary eps from 4 to 6 with steps of 0.1
minPts_values <- seq(1, 5, by = 1)    # Vary minPts from 15 to 20 with steps of 1
eps_cl_values <- seq(1, 5, by = 0.1)    # Vary eps_cl from 3 to 5 with steps of 0.2
library(dbscan)
## Warning: package 'dbscan' was built under R version 4.3.3
## 
## Attaching package: 'dbscan'
## The following object is masked from 'package:stats':
## 
##     as.dendrogram
# Function to apply OPTICS clustering and extract clusters
run_optics <- function(data, eps, minPts, eps_cl) {
  optics_result <- optics(data, eps = eps, minPts = minPts)
  clusters <- extractDBSCAN(optics_result, eps_cl = eps_cl)
  return(clusters$cluster)
}

# Initialize a list to store results
results <- list()

# Loop through each combination of eps, minPts, and eps_cl
for (eps in eps_values) {
  for (minPts in minPts_values) {
    for (eps_cl in eps_cl_values) {
      # Run OPTICS with the current parameter combination
      clusters <- run_optics(data_standarisasi, eps, minPts, eps_cl)
      
      # Store the result
      #results[[paste("eps:", eps, "minPts:", minPts, "eps_cl:", eps_cl)]] <- clusters
      
      # Optional: Print the current combination
      #cat("eps =", eps, "minPts =", minPts, "eps_cl =", eps_cl, "\n")
    }
  }
}
library(cluster)

# Function to calculate silhouette score
calculate_silhouette <- function(data, clusters) {
  if (length(unique(clusters)) > 1) {  # Silhouette requires at least 2 clusters
    return(mean(silhouette(clusters, dist(data))[, 3]))
  } else {
    return(NA)  # If only one cluster is found
  }
}

# Example of storing silhouette score for each combination
silhouette_scores <- data.frame()

for (eps in eps_values) {
  for (minPts in minPts_values) {
    for (eps_cl in eps_cl_values) {
      # Run OPTICS with the current parameter combination
      clusters <- run_optics(data_standarisasi, eps, minPts, eps_cl)
      
      # Calculate silhouette score
      score <- calculate_silhouette(data_standarisasi, clusters)
      
      # Store the silhouette score
      silhouette_scores <- rbind(silhouette_scores, 
        data.frame(eps = eps, minPts = minPts, eps_cl = eps_cl, silhouette = score))
    }
  }
}

# View the silhouette scores
head(silhouette_scores)
# Find the best parameter combination based on silhouette score
best_combination <- silhouette_scores[which.max(silhouette_scores$silhouette), ]
print(best_combination)
##      eps minPts eps_cl silhouette
## 4533 3.2      1    3.2   0.500675

Hasil pengujian menunjukkan bahwa kombinasi parameter eps = 3.2, MinPts = 1, dan eps_cl = 3.2 menghasilkan nilai Silhouette Score tertinggi sebesar 0.500675.

# Mengelompokkan data berdasarkan eps dengan kondisi minPts == 1
max_silhouette_per_eps_minPts_1 <- silhouette_scores %>%
  filter(minPts == 1) %>%    # Filter data dimana minPts bernilai 1
  group_by(eps) %>%          # Kelompokkan berdasarkan eps
  slice(which.max(silhouette))  # Ambil baris dengan nilai silhouette maksimal

# Menampilkan hasil
print(max_silhouette_per_eps_minPts_1)
## # A tibble: 41 × 4
## # Groups:   eps [41]
##      eps minPts eps_cl silhouette
##    <dbl>  <dbl>  <dbl>      <dbl>
##  1   1        1    1        0.130
##  2   1.1      1    1        0.130
##  3   1.2      1    1.2      0.168
##  4   1.3      1    1.2      0.168
##  5   1.4      1    1.2      0.168
##  6   1.5      1    1.5      0.189
##  7   1.6      1    1.5      0.189
##  8   1.7      1    1.5      0.189
##  9   1.8      1    1.5      0.189
## 10   1.9      1    1.5      0.189
## # ℹ 31 more rows
library(ggplot2)

# Create the plot
ggplot(data = max_silhouette_per_eps_minPts_1, aes(x = eps, y = silhouette)) +
  geom_point(color = "red") +   # Menambahkan titik pada garis
  labs(x = "minPts", y = "Silhouette Score", 
       title = "Silhouette Index Berdasarkan Nilai Epsilon untuk Minimum Points bernilai 1") +
  theme_minimal() + # Menggunakan tema dengan latar belakang putih yang bersih
  # Menambahkan garis horizontal pada nilai silhouette maksimal
  geom_hline(yintercept = max(max_silhouette_per_eps_minPts_1$silhouette), color = "red", linetype = "dashed") +
  
  # Menambahkan garis vertikal pada eps dengan silhouette maksimal
  geom_vline(xintercept = max_silhouette_per_eps_minPts_1$eps[which.max(max_silhouette_per_eps_minPts_1$silhouette)], 
             color = "red", linetype = "dashed")

Nilai eps menentukan radius tetangga yang dipertimbangkan dalam menentukan kepadatan suatu titik. Semakin besar nilai eps, semakin banyak titik yang dianggap sebagai tetangga, dan sebaliknya. MinPts menentukan jumlah minimum titik dalam radius eps untuk menganggap suatu titik sebagai core point. Sedangkan eps_cl adalah nilai epsilon yang digunakan untuk mengekstraksi cluster dari urutan titik yang dihasilkan oleh OPTICS. Pemilihan kombinasi parameter eps = 3.2, MinPts = 1, dan eps_cl = 3.2 didasarkan pada nilai Silhouette Score tertinggi yang diperoleh. Silhouette Score adalah metrik evaluasi Clustering yang mengukur seberapa baik setiap objek cocok dengan clusternya sendiri dibandingkan dengan cluster lainnya. Silhouette Score berkisar antara -1 hingga 1, di mana nilai yang lebih tinggi menunjukkan struktur cluster yang lebih baik.

library(dbscan)

data_standarisasi <- as.matrix(data_standarisasi)

# Menentukan parameter
eps <- 3.2
minPts <- 1

# Melakukan clustering OPTICS
optics_result <- optics(data_standarisasi, eps = eps, minPts = minPts)

# Mengekstrak klaster dari hasil OPTICS
eps_cl <- 3.2 # Ubah sesuai kebutuhan
clusters <- extractDBSCAN(optics_result, eps_cl)

# Periksa hasil klaster
print(clusters)
## OPTICS ordering/clustering for 34 objects.
## Parameters: minPts = 1, eps = 3.2, eps_cl = 3.2, xi = NA
## The clustering contains 2 cluster(s) and 0 noise points.
## 
##  1  2 
## 33  1 
## 
## Available fields: order, reachdist, coredist, predecessor, minPts, eps,
##                   eps_cl, xi, cluster
library(dbscan)

# Data sudah distandarisasi ke dalam matrix
data_standarisasi <- as.matrix(data_standarisasi)

# Gunakan nilai k = minPts yang ditentukan sebelumnya
k <- 1

# Hitung jarak ke tetangga ke-k menggunakan fungsi kNNdist
k_dist <- kNNdist(data_standarisasi, k = k)

# Plot K-Distance untuk melihat elbow
plot(sort(k_dist), type = "l", main = paste(k, "NN Distance Plot"),
     xlab = "Points", ylab = paste(k, "NN Distance"))

# Optional: Garis bantu untuk membantu menemukan elbow
abline(h = 3.2, col = "red", lty = 2)

Grafik K-Distance Plot menunjukkan bahwa nilai epsilon sekitar 3.2 berada pada titik “elbow” atau perubahan yang signifikan dalam jarak ke tetangga terdekat. Titik “elbow” ini mengindikasikan perubahan kepadatan yang signifikan dalam data. Memilih nilai epsilon pada atau sedikit di atas titik “elbow” dapat memberikan hasil Clustering yang baik. Hal ini mengonfirmasi bahwa eps = 3.2 adalah pilihan yang tepat untuk parameter OPTICS.

library(dbscan)

# Pastikan data_standarisasi sudah berbentuk matrix
data_standarisasi <- as.matrix(data_standarisasi)

# Melakukan clustering OPTICS
optics_result <- optics(data_standarisasi, eps = 3.2, minPts = 1)

# Visualisasi Reachability Plot
plot(optics_result, main = "Reachability Plot")
abline(h = 3.2, col = "red", lty = 2)  # Threshold value adalah nilai jarak yang Anda pilih sebagai pemisah

Reachability Plot menggambarkan urutan titik yang dihasilkan oleh OPTICS berdasarkan jarak keterjangkauan (reachability distance). Jarak keterjangkauan suatu titik adalah jarak terkecil yang diperlukan untuk mencapai titik tersebut dari core point terdekat. Semakin rendah jarak keterjangkauan, semakin padat area di sekitar titik tersebut. Pada Reachability Plot, Cluster 1 (33 provinsi) ditunjukkan dengan jarak keterjangkauan yang relatif rendah dan konsisten, mengindikasikan bahwa provinsi-provinsi dalam Cluster 1 memiliki kepadatan yang lebih tinggi dan karakteristik yang serupa. Sementara itu, Cluster 2 (Papua) memiliki jarak keterjangkauan yang lebih tinggi dan terpisah dari Cluster 1, menunjukkan perbedaan signifikan dalam pola kemiskinan multidimensi dibandingkan dengan provinsi lainnya.

library(dbscan)
library(cluster)

# Misalnya dataset bernama 'data'
# Lakukan clustering dengan OPTICS
optics_result <- optics(data_standarisasi, eps = 3.2, minPts = 1)

# Ekstrak cluster labels dari hasil OPTICS
clusters_optics <- extractDBSCAN(optics_result, eps_cl = 3.2)$cluster

# Hitung jarak antar poin (misalnya menggunakan jarak Euclidean)
distance_matrix <- dist(data_standarisasi)

# Hitung Silhouette Index
silhouette_optics <- silhouette(clusters_optics, distance_matrix)

# Menampilkan hasil Silhouette Index
summary(silhouette_optics)
## Silhouette of 34 units in 2 clusters from silhouette.default(x = clusters_optics, dist = distance_matrix) :
##  Cluster sizes and average silhouette widths:
##       33        1 
## 0.515847 0.000000 
## Individual silhouette widths:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.4664  0.5397  0.5007  0.5854  0.6391
# Hitung rata-rata Silhouette Index (Average Silhouette Index)
average_silhouette <- mean(silhouette_optics[, 3])

# Tampilkan average silhouette index
average_silhouette
## [1] 0.500675
data_cluster <- data.frame(data_cluster, Cluster_Optics = clusters_optics)
data_cluster

Hampir seluruh provinsi di Indonesia, kecuali Papua, berada dalam satu cluster yang sama (Cluster 1), mengindikasikan bahwa sebagian besar provinsi memiliki karakteristik kemiskinan multidimensi yang relatif serupa. Provinsi-provinsi dalam Cluster 1 cenderung memiliki tingkat ekonomi, pendidikan, kondisi ketenagakerjaan, dan akses fasilitas yang lebih baik dibandingkan dengan Papua. Di sisi lain, Papua berada dalam cluster tersendiri (Cluster 2), menunjukkan perbedaan signifikan dalam pola kemiskinan multidimensi dibandingkan provinsi lainnya. Papua menghadapi tantangan yang lebih besar dalam berbagai dimensi kemiskinan, seperti tingkat pendidikan yang lebih rendah, tingkat kemiskinan yang lebih tinggi, kondisi ketenagakerjaan yang kurang baik, serta akses fasilitas yang terbatas.

VISUALISASI HASIL CLUSTERING

library(tidymodels)

data_cluster <- data_cluster %>%
  mutate(Provinsi = recode(Provinsi,
                           "JAKARTA" = "DKI JAKARTA",
                           "YOGYAKARTA" = "DAERAH ISTIMEWA YOGYAKARTA"))
library(sf)
## Linking to GEOS 3.11.2, GDAL 3.6.2, PROJ 9.2.0; sf_use_s2() is TRUE
indonesia_map <- st_read("BATAS PROVINSI DESEMBER 2019 DUKCAPIL/BATAS_PROVINSI_DESEMBER_2019_DUKCAPIL.shp")
## Reading layer `BATAS_PROVINSI_DESEMBER_2019_DUKCAPIL' from data source 
##   `C:\Users\Tasya Anisah Rizqi\Documents\VISDAT\BATAS PROVINSI DESEMBER 2019 DUKCAPIL\BATAS_PROVINSI_DESEMBER_2019_DUKCAPIL.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 34 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XYZ
## Bounding box:  xmin: 95.01079 ymin: -11.00762 xmax: 141.0194 ymax: 6.07693
## z_range:       zmin: 2.65e-05 zmax: 2.65e-05
## Geodetic CRS:  WGS 84
library(ggplot2)
library(sf)
library(RColorBrewer)

# Definisikan palet warna dari RColorBrewer untuk 14 cluster
colors <- brewer.pal(n = 12, name = "Set3")
colors <- c(colors, "mistyrose", "lightcyan")  # Tambahkan 2 warna tambahan jika diperlukan

# Ambil data peta provinsi Indonesia
map_data_with_cluster <- merge(indonesia_map, data_cluster, by.x = "PROVINSI", by.y = "Provinsi")

# Plot peta Indonesia dengan hasil clustering per provinsi
ggplot(data = map_data_with_cluster) +
  geom_sf(aes(fill = as.factor(Cluster_Kmeans)), color = "black") +
  scale_fill_manual(values = colors) +  # Gunakan palet warna kustom
  labs(title = "Visualisasi Hasil K-Means Clustering per Provinsi di Indonesia",
       fill = "Cluster") +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    panel.background = element_rect(fill = "white"),
    plot.background = element_rect(fill = "white"),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank()
  )+
  guides(fill = guide_legend(nrow = 2))

library(ggplot2)
library(sf)
library(RColorBrewer)

# Definisikan palet warna dari RColorBrewer untuk 14 cluster
#colors <- brewer.pal(n = 12, name = "Set3")
colors <- c("pink", "lightgreen")  # Tambahkan 2 warna tambahan jika diperlukan

# Ambil data peta provinsi Indonesia
map_data_with_cluster <- merge(indonesia_map, data_cluster, by.x = "PROVINSI", by.y = "Provinsi")

# Plot peta Indonesia dengan hasil clustering per provinsi
ggplot(data = map_data_with_cluster) +
  geom_sf(aes(fill = as.factor(Cluster_Optics)), color = "black") +
  scale_fill_manual(values = colors) +  # Gunakan palet warna kustom
  labs(title = "Visualisasi Hasil OPTICS Clustering per Provinsi di Indonesia",
       fill = "Cluster") +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    panel.background = element_rect(fill = "white"),
    plot.background = element_rect(fill = "white"),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank()
  )

PERBANDINGAN HASIL CLUSTERING

SILHOUETTE INDEX

data_cluster_standarisasi <- data_cluster %>%
  mutate(
    Garis_Kemiskinan = scale(Garis_Kemiskinan),
    Kurang_dari_SD = scale(Kurang_dari_SD),
    Tamat_SD_SMP = scale(Tamat_SD_SMP),
    Lebih_dari_SMA = scale(Lebih_dari_SMA),
    Tidak_Bekerja_Formal_In = scale(Tidak_Bekerja_Formal_In),
    Jamban_Sendiri_Bersama = scale(Jamban_Sendiri_Bersama),
    Air_Layak = scale(Air_Layak)
  )
library(cluster)
library(dplyr)

# Menghitung silhouette score untuk K-Means
silhouette_kmeans <- silhouette(data_cluster_standarisasi$Cluster_Kmeans, dist(data_cluster_standarisasi[, -which(names(data_cluster_standarisasi) %in% c("Provinsi", "Cluster_Kmeans", "Cluster_Optics"))]))
avg_silhouette_kmeans <- mean(silhouette_kmeans[, 'sil_width'])

# Menghitung silhouette score untuk OPTICS
silhouette_optics <- silhouette(data_cluster_standarisasi$Cluster_Optics, dist(data_cluster_standarisasi[, -which(names(data_cluster_standarisasi) %in% c("Provinsi", "Cluster_Kmeans", "Cluster_Optics"))]))
avg_silhouette_optics <- mean(silhouette_optics[, 'sil_width'])

# Menampilkan hasil
print(paste("Average Silhouette Score for K-Means:", avg_silhouette_kmeans))
## [1] "Average Silhouette Score for K-Means: 0.273929376594677"
print(paste("Average Silhouette Score for OPTICS:", avg_silhouette_optics))
## [1] "Average Silhouette Score for OPTICS: 0.500675047291555"
library(ggplot2)

# Buat dataframe dengan nilai-nilai tersebut
silhouette_data <- data.frame(
  Method = c("K-Means", "OPTICS"),
  Silhouette = c(avg_silhouette_kmeans, avg_silhouette_optics)
)

print(silhouette_data)
##    Method Silhouette
## 1 K-Means  0.2739294
## 2  OPTICS  0.5006750
# Plot menggunakan ggplot2
ggplot(silhouette_data, aes(x = Method, y = Silhouette, fill = Method)) +
  geom_bar(stat = "identity", width = 0.5) +
  geom_text(aes(label = round(Silhouette, 2)),  # Menampilkan nilai pada batang
            vjust = -0.5, size = 5) +  # Atur posisi teks sedikit di atas batang
  labs(title = "Perbandingan Silhouette Index",
       x = "Metode Clustering",
       y = "Silhouette Index") +
  theme_minimal() +
  theme(legend.position = "none") +
  scale_fill_manual(values = c("K-Means" = "lightblue", "OPTICS" = "lightcoral"))

Berdasarkan Silhouette Index, OPTICS menghasilkan nilai yang lebih tinggi (0.501) dibandingkan K-Means (0.274). Silhouette Index mengukur seberapa baik setiap objek cocok dengan clusternya sendiri dibandingkan dengan cluster lainnya. Nilai Silhouette Index yang lebih tinggi menunjukkan struktur cluster yang lebih baik, dengan jarak antar objek dalam cluster yang lebih kecil dan jarak antar cluster yang lebih besar.

WCSS INDEX

library(dplyr)

# Fungsi untuk menghitung WCSS
calculate_wcss <- function(data, cluster_col) {
  data %>%
    group_by(!!sym(cluster_col)) %>%
    summarize(
      WCSS = sum(sqrt(rowSums((data[, -which(names(data) %in% c("Provinsi", cluster_col))] - colMeans(data[, -which(names(data) %in% c("Provinsi", cluster_col))]))^2)))
    ) %>%
    summarize(Total_WCSS = sum(WCSS))
}

# Menghitung WCSS untuk K-Means dan OPTICS
wcss_kmeans <- calculate_wcss(data_cluster_standarisasi, "Cluster_Kmeans")
wcss_optics <- calculate_wcss(data_cluster_standarisasi, "Cluster_Optics")

# Menampilkan hasil
print(paste("Total WCSS for K-Means:", wcss_kmeans$Total_WCSS))
## [1] "Total WCSS for K-Means: 1345.83015795697"
print(paste("Total WCSS for OPTICS:", wcss_optics$Total_WCSS))
## [1] "Total WCSS for OPTICS: 725.981388735203"
library(ggplot2)

# Buat dataframe dengan nilai-nilai tersebut
wcss_data <- data.frame(
  Method = c("K-Means", "OPTICS"),
  WCSS = c(wcss_kmeans$Total_WCSS, wcss_optics$Total_WCSS)
)

print(wcss_data)
##    Method      WCSS
## 1 K-Means 1345.8302
## 2  OPTICS  725.9814
# Plot menggunakan ggplot2
ggplot(wcss_data, aes(x = Method, y = WCSS, fill = Method)) +
  geom_bar(stat = "identity", width = 0.5) +
  geom_text(aes(label = round(WCSS, 2)),  # Menampilkan nilai pada batang
            vjust = -0.5, size = 5) +  # Atur posisi teks sedikit di atas batang
  labs(title = "Perbandingan WCSS Index",
       x = "Metode Clustering",
       y = "WCSS Index") +
  theme_minimal() +
  theme(legend.position = "none") +
  scale_fill_manual(values = c("K-Means" = "lightblue", "OPTICS" = "lightcoral"))

Berdasarkan WCSS Index, OPTICS juga mengungguli K-Means. OPTICS memiliki nilai WCSS yang lebih rendah (725.981) dibandingkan K-Means (1345.830). WCSS (Within-Cluster Sum of Squares) mengukur jumlah kuadrat jarak setiap objek terhadap centroid clusternya. Nilai WCSS yang lebih rendah mengindikasikan bahwa OPTICS menghasilkan cluster yang lebih kohesif dan kompak, dengan variasi yang lebih kecil di dalam setiap cluster.

KESIMPULAN

Berdasarkan hasil yang diperoleh, dapat disimpulkan beberapa poin penting terkait analisis pola kemiskinan multidimensi di Indonesia menggunakan metode Clustering: 1. Analisis statistik deskriptif mengungkap adanya kesenjangan yang signifikan antar provinsi di Indonesia dalam berbagai aspek kemiskinan multidimensi, seperti ekonomi, tingkat pendidikan, ketenagakerjaan, dan standar hidup. Hal ini menunjukkan kompleksitas tantangan kemiskinan di Indonesia dan pentingnya pendekatan yang terlokalisasi dan multidimensi dalam upaya pengentasan kemiskinan. 2. Penerapan K-Means Clustering menghasilkan 14 cluster provinsi dengan karakteristik kemiskinan multidimensi yang beragam. Perbedaan karakteristik antar cluster mengindikasikan adanya keterkaitan dan trade-off antara dimensi-dimensi kemiskinan. Misalnya, provinsi dengan tingkat pendidikan tinggi cenderung memiliki tingkat kemiskinan yang lebih rendah, sementara provinsi dengan tingkat pendidikan sangat rendah juga memiliki tingkat kemiskinan yang tinggi. 3. Implementasi OPTICS Clustering mengungkap bahwa hampir seluruh provinsi di Indonesia, kecuali Papua, berada dalam satu cluster yang sama (Cluster 1). Hal ini mengindikasikan bahwa sebagian besar provinsi memiliki karakteristik kemiskinan multidimensi yang relatif serupa. Sementara itu, Papua berada dalam cluster tersendiri (Cluster 2), menunjukkan perbedaan signifikan dalam pola kemiskinan multidimensi dibandingkan provinsi lainnya. 4. Perbandingan performa antara K-Means dan OPTICS menunjukkan bahwa OPTICS merupakan metode Clustering yang lebih unggul dalam konteks analisis pola kemiskinan multidimensi di Indonesia. OPTICS mampu menangkap struktur cluster yang lebih alami dan menghasilkan cluster yang lebih kohesif, meskipun jumlah cluster yang dihasilkan lebih sedikit.