K-Means Clustering pada Data Penyusun Indikator Kerentanan Pandemi Covid-19 pada Tahun 2020

Library

library(viridis)
library(corrplot)
library(car)
library(glmnet)
library(factoextra)

Data

Dataset yang digunakan merupakan data penyusun indikator kerentanan pandemi Covid-19 pada tahun 2020 yang terdiri atas 12 indikator dan 31 amatan berupa provinsi di Indonesia.

dt.cluster <- read.csv("C:\\Users\\ASUS\\Downloads\\Soal UAS Smt 5\\dataCluster.csv", sep = ";")
head(dt.cluster)
##   Kode         Provinsi    X1    X2    X3      X4      X5    X6    X7     X8
## 1   11             Aceh 1.952 0.166 4.093  92.284 199.428 5.055 14.04 31.092
## 2   12   Sumatera Utara 5.477 0.123 3.741 166.876 106.022 5.072 12.24 30.420
## 3   13   Sumatera Barat 2.048 0.424 2.148 108.354  28.211 6.593 14.39 32.955
## 4   14             Riau 2.366 0.390 2.335 155.593  57.071 3.649 11.63 30.949
## 5   15            Jambi 1.313 0.091 1.704 176.671 204.015 4.631  9.66 30.349
## 6   16 Sumatera Selatan 3.134 0.140 5.167 188.755 131.193 5.334 12.20 33.039
##      X9   X10  X11     X12
## 1  3.35 15.43 6.59 566.520
## 2 37.53  9.14 6.91 595.835
## 3 29.48  6.56 6.88 683.944
## 4 33.43  7.04 6.32 755.177
## 5 46.88  7.97 5.13 754.782
## 6 38.15 12.98 5.51 800.098

Menghapus Kolom Kode dan Provinsi

Dilakukan penghapusan terhadap peubah kategorik karena tidak digunakan dalam analisis.

dt.cluster1 <- dt.cluster[,-1:-2]

Eksplorasi Data

summary(dt.cluster1)
##        X1                X2               X3              X4         
##  Min.   : 0.2600   Min.   :0.0410   Min.   :0.866   Min.   :  29.71  
##  1st Qu.: 0.9705   1st Qu.:0.1385   1st Qu.:1.832   1st Qu.:  84.94  
##  Median : 1.5980   Median :0.2240   Median :2.459   Median : 166.88  
##  Mean   : 3.1456   Mean   :0.3042   Mean   :2.816   Mean   : 306.46  
##  3rd Qu.: 3.2340   3rd Qu.:0.3670   3rd Qu.:3.494   3rd Qu.: 227.81  
##  Max.   :17.8660   Max.   :1.7400   Max.   :6.924   Max.   :3114.88  
##        X5               X6               X7              X8       
##  Min.   : 10.89   Min.   : 3.536   Min.   : 7.81   Min.   :22.14  
##  1st Qu.: 57.95   1st Qu.: 4.676   1st Qu.:12.01   1st Qu.:28.59  
##  Median : 87.71   Median : 5.064   Median :13.86   Median :30.35  
##  Mean   :127.28   Mean   : 5.598   Mean   :13.67   Mean   :30.21  
##  3rd Qu.:201.72   3rd Qu.: 5.946   3rd Qu.:14.88   3rd Qu.:32.90  
##  Max.   :360.88   Max.   :10.814   Max.   :21.09   Max.   :36.02  
##        X9             X10              X11              X12        
##  Min.   : 3.35   Min.   : 4.450   Min.   : 3.320   Min.   : 327.2  
##  1st Qu.:22.14   1st Qu.: 6.635   1st Qu.: 4.580   1st Qu.: 561.4  
##  Median :29.48   Median : 8.990   Median : 5.630   Median : 683.9  
##  Mean   :28.31   Mean   :10.062   Mean   : 6.094   Mean   : 701.7  
##  3rd Qu.:35.55   3rd Qu.:12.890   3rd Qu.: 6.875   3rd Qu.: 794.8  
##  Max.   :46.88   Max.   :21.210   Max.   :10.950   Max.   :1179.6

Output di atas merupakan summary dari peubah X1 sampai dengan X12. Dihasilkan nilai minimum, kuartil 1, median, kuartil 3, rata-rata, dan nilai maksimum dari masing-masing peubah.

boxplot(dt.cluster1, col = "#966989")

Eksplorasi data dilakukan dengan menggunakan boxplot. Pada boxplot di atas, sebaran masing-masing peubah tidak terlihat karena rentang nilai beberapa peubah yang terpaut cukup jauh. Oleh karena itu, eksplorasi dilakukan dengan mengelompokkan peubah-peubah dengan rentang yang tidak berbeda terlalu jauh.

boxplot(dt.cluster1[,-c(4, 5, 12)], col = inferno(ncol(dt.cluster1[,-c(4, 5, 12)])))

Berdasarkan boxplot di atas, terlihat bahwa terdapat enam peubah yang memiliki pencilan atas, Akan tetapi, tidak ada peubah dengan pencilan bawah. Terlihat bahwa sebaran data pada peubah-peubah di atas sebagian besar cenderung simetris atau tidak menjulur ke salah satu sisi.

boxplot(dt.cluster1[,4], col = "maroon", xlab = "X4")

Boxplot di atas memperlihatkan sebaran peubah X4, yaitu rata-rata volume lalu lintas per meter jalan raya. Terlihat bahwa terdapat beberapa pencilan atas, tetapi hanya satu yang bernilai sangat tinggi. Hal ini mengindikasikan bahwa terdapat satu provinsi dengan lalu lintas jalan raya yang sangat padat saat pandemi Covid-19 pada tahun 2020.

boxplot(dt.cluster1[,c(5, 12)], col = c("steelblue", "#966989"))

Berdasarkan boxplot di atas, terlihat bahwa sebaran peubah penduduk di setiap provinsi yang telah mengalami pemeriksaan Covid-19 (X5) cenderung menjulur ke kanan. Sementara itu, sebaran peubah ketersediaan tempat tidur di rumah sakit pada setiap provinsi cenderung simetris, tetapi memiliki sebuah pencilan atas. Pencilan tersebut mengindikasikan bahwa terdapat satu provinsi yang memiliki ketersediaan tempat tidur di rumah sakit yang sangat besar saat pandemi Covid-19 pada tahun 2020.

K-Means Clustering

Metode K-Means adalah pendekatan sederhana untuk mempartisi kumpulan data ke dalam k buah gerombol yang berbeda dan tidak tumpang tindih. Untuk melakukan penggerombolan K-Means, harus ditentukan jumlah gerombol yang diinginkan.

Pemilihan Banyaknya Cluster

Banyaknya cluster ditentukan dengan menggunakan kriteria statistik, yaitu koefisien silhouette dan Within Sum of Square (WSS).

Koefisien Silhouette

Koefisien ini mengukur seberapa dekat suatu amatan dengan amatan lain yang berada di cluster yang sama (dikenal sebagai ukuran cohesion) dibandingkan jarak terhadap amatan lain yang berada di cluster berbeda (dikenal sebagai ukuran separation). Koefisien yang nilainya semakin besar menunjukkan bahwa cluster yang terbentuk sudah sesuai.

data.stdz = scale(dt.cluster1)
fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "silhouette")

Dengan menggunakan koefisien silhouette, jumlah cluster optimum yang didapatkan adalah delapan (k = 8).

Within Sum of Square (WSS)

Kriteria WSS merupakan kriteria yang menghitung keragaman dalam cluster yang terbentuk. Semakin kecil keragaman dalam cluster yang terbentuk menunjukkan bahwa cluster yang terbentuk sudah sesuai.

fviz_nbclust(data.stdz, FUNcluster = kmeans, method = "wss")

Ketika menggunakan WSS, banyaknya cluster yang dipilih didasarkan pada di mana garis berbentuk seperti siku (elbow) sehingga bersifat subjektif atau setiap individu dapat melihat pola siku pada cluster yang berbeda. Pada gambar di atas, dipilih k = 4 untuk penggerombolan dengan metode K-Means.

K-Means

kmeans.cls <- eclust(dt.cluster1, stand = TRUE, FUNcluster = "kmeans", k = 4, graph = F)
kmeans.cls$cluster
##  [1] 3 1 1 1 1 3 3 3 1 1 4 2 2 4 2 1 4 3 3 1 1 1 1 1 1 3 1 3 3 3 1
kmeans.cls$centers
##           X1          X2         X3         X4         X5         X6         X7
## 1 -0.2946024  0.04279807 -0.3912438 -0.2631584 -0.4759269 -0.3698691 -0.6568970
## 2  2.8522550 -0.33410444  1.0593720  0.4750576 -0.4666915  1.0186437  0.8083135
## 3 -0.3542870 -0.47262694  0.3875526 -0.3575284  1.1333622 -0.2366646  0.7056615
## 4 -0.1982865  1.69553724 -0.3949948  2.0324957 -0.9315478  1.6195835  0.1239665
##           X8         X9        X10        X11        X12
## 1 -0.1271528  0.2520571 -0.5618356  0.2660717 -0.2568893
## 2  0.3541559  0.5042072  0.1190785  0.7225928  0.5681146
## 3  0.6218488 -0.1602026  0.9977893 -0.7541133  0.5888884
## 4 -1.7912212 -1.2304841 -0.6358648  0.4607598 -1.2466293

Output di atas menghasilkan centroid untuk data yang masih terstandardisasi sehingga sulit diinterpretasikan.

aggregate(dt.cluster1, by=list(cluster=kmeans.cls$cluster), FUN = mean)
##   cluster        X1        X2       X3        X4        X5       X6       X7
## 1       1  1.871933 0.3173333 2.294667  161.2444  81.07160 5.009867 11.81067
## 2       2 15.476667 0.2013333 4.228333  568.6137  81.96833 7.218000 15.95000
## 3       3  1.613900 0.1587000 3.332800  109.1683 237.32940 5.221700 15.66000
## 4       4  2.288333 0.8260000 2.289667 1428.0537  36.83200 8.173667 14.01667
##         X8       X9       X10      X11      X12
## 1 29.80587 30.75933  7.633333 6.646000 650.7127
## 2 31.33733 33.20667 10.576667 7.593333 814.4137
## 3 32.18910 26.75800 14.375000 4.529000 818.5357
## 4 24.51100 16.37000  7.313333 7.050000 454.3240

Output di atas menghasilkan nilai rata-rata 12 peubah pada setiap cluster, di mana terdapat empat cluster. Dapat disimpulkan bahwa cluster 2 berisi provinsi dengan persentase jumlah penduduk yang besar dibandingkan cluster 1, 3, dan 4. Provinsi dengan kasus konfirmasi positif Covid-19 terbanyak berada pada cluster 4. Provinsi dengan lalu lintas yang padat di jalan raya berada pada cluster 4, diikuti dengan cluster 2. Untuk provinsi dengan jumlah penduduk lanjut usia cenderung tidak berbeda signifikan pada keempat cluster. Pada saat pandemi Covid-19, banyak pasien yang tidak dapat menjalani pengobatan dengan layak karena tidak adanya ketersediaan tempat tidur di rumah sakit. Ketersediaan tempat tidur di rumah sakit paling banyak pada provinsi yang berada pada cluster 2 dan 3.

fviz_cluster(kmeans.cls)

Penggerombolan menggunakan metode K-Means dengan k = 4 menghasilkan hasil penggerombolan yang cukup baik. Pada keempat cluster yang terbentuk, tidak terjadi overlap atau tumpang tindih. Dalam artian, tidak terdapat sebuah individu atau provinsi yang masuk ke dalam dua cluster yang berbeda. Didapatkan bahwa kedua komponen utama dapat menjelaskan lebih dari 50% keragaman pada data, yaitu 50.9%.