Pendahuluan

Provinsi Jawa Barat merupakan provinsi dengan kemunculan kasus pertama di Indonesia dan juga memiliki kasus positif tertinggi kedua di Indonesia. Banyaknya kota/kabupaten di Jawa Barat dapat menyulitkan pemerintah serta satuan tugas pengananan COVID-19 di tingkat provinsi dalam menangani kasus aktif COVID-19.

Perkembangan kasus aktif perlu dianalisis untuk setiap kota/kabupaten karena setiap kabupaten/kota memiliki karakteristik yang berbeda sehingga kabupaten/kota tersebut dikelompokkan berdasarkan karakteristik yang sama untuk mengetahui karakteristik pada setiap kota/kabupaten. Hal tersebut dapat mempermudah pemerintah dalam menangani kasus aktif COVID-19 berdasarkan karakteristiknya masing-masing.

Berdasarkan uraian tersebut maka diperlukan sebuah metode yang dapat mengelompokan kabupaten/kota di Jawa Barat, pada kasus ini akan dilakukan pengelompokan dengan analisis klaster menggunakan metode K-Mean Clustering.

Metode K-Means dari MacQueen (1967) merupakan salah satu metode pengelompokan dengan membagi data menjadi beberapa partisi dengan rata-rata menjadi centroid dalam prosesnya, setiap data yang mendekati rata-rata dari masing-masing partisi maka akan menjadi kelompok, setelah itu akan dilakukan iterasi hingga menemukan hasil yang optimal[1].

> Maksud dan Tujuan

Penelitian ini bertujuan untuk mempercepat penanganan COVID-19 yang lebih terarah untuk semua provinsi di Indonesia. Oleh karena itu, pemerintah perlu memahami karakteristik setiap provinsi dan penanganan yang sesuai untuk provinsi tersebut, dan perlu dilakukan peng-klasteran karakteristik tiap provinsi agar penanganan COVID-19 dapat dilakukan dengan tepat. Sehingga dengan hasil peng-klasteran tersebut dapat menjadi pertimbangan kinerja pemerintah dalam penanganan COVID-19 yang lebih efektif dan efisien.

> Benefit

  • Hasil peng-klasteran dapat dijadikan sebagai rekomendasi untuk pemerintah dalam mengatasi penyebaran Covid-19.

> Batasan

Pada penelitian ini masih terdapat permasalahan outlier, sedangkan algoritma K-Means sensitive terhadap noise dan outlier, sehingga dikhawatirkan ada masalah yang disebabkan objek dengan nilai besar yang menyimpang dari distribusi data.

Data Wrangling dan Eksplorasi Data

1. Import Library

# Import library untuk data wrangling
library(tidyverse)
library(dplyr)

# Import library untuk visualisasi
library(factoextra) # Visualisasi hasil clustering
library(gridExtra) # Visualisasi karakteristik cluster
library(GGally) # Correlation matrix
library(ggiraphExtra)
library(sf) # Read data map
library(plotly) # Interactive Plotting

2. Read Data

Data pada penelitian ini merupakan data Sekunder, yang berisikan informasi mengenai kasus covid-19 bulan July 2022, fasilitas kesehatan, ekonomi dan kependudukan berdasarkan provinsi di Indonesia. Data yang digunakan diperoleh dari situs kawal COVID-19 (https://kawalcovid19.id/) dan Badan Pusat Statistik (https://www.bps.go.id/) yang diakses pada bulan Agustus 2022.

data_covid <- read.csv("(3) Dataset Sebaran Covid July.csv") %>%
  janitor::clean_names()

# Cek struktur data
glimpse(data_covid)
## Rows: 34
## Columns: 10
## $ provinsi                                  <chr> "Aceh", "Bali", "Banten", "B~
## $ total_sembuh                              <dbl> 94.90, 96.10, 97.59, 98.19, ~
## $ total_meninggal                           <dbl> 5.07, 2.84, 0.94, 1.79, 2.66~
## $ kasus_aktif                               <dbl> 0.03, 1.07, 1.47, 0.02, 0.57~
## $ jumlah_rumah_sakit_umum_per_1000_penduduk <dbl> 0.0124, 0.0151, 0.0078, 0.01~
## $ jumlah_puskesmas_per_1000_penduduk        <dbl> 0.0673, 0.0275, 0.0203, 0.08~
## $ persentase_penduduk_miskin                <dbl> 14.64, 4.57, 6.16, 14.62, 11~
## $ gini_ratio                                <dbl> 0.311, 0.363, 0.363, 0.315, ~
## $ persentase_penduduk                       <dbl> 1.96, 1.60, 4.42, 0.75, 1.36~
## $ kepadatan_penduduk_per_km_persegi_km2     <int> 92, 755, 1248, 102, 1185, 15~

Definisi Variabel:

  • Provinsi: 34 provinsi yang ada di Indonesia
  • total_sembuh: Persentase Total Sembuh dari Covid (Di bulan Juli)
  • total_meninggal: Persentase Total Kematian karena Covid (Di bulan Juli)
  • kasus_aktif: Persentase Total Kasus Aktif Covid (Di bulan Juli)
  • jumlah_rumah_sakit_umum_per_1000_penduduk: Jumlah Rumah Sakit Umum per 1000 Penduduk
  • jumlah_puskesmas_per_1000_penduduk: Jumlah Puskesmas per 1000 Penduduk
  • persentase_penduduk_miskin: Persentase Penduduk Miskin di tiap Provinsi
  • gini_ratio: Gini Ratio (indikator yang menunjukkan tingkat ketimpangan pengeluaran secara menyeluruh)
  • persentase_penduduk: Persentase Penduduk (Populasi Provinsi/Populasi Indonesia)
  • kepadatan_penduduk_per_km_persegi_km2: Kepadatan Penduduk per km persegi(km^2)

Aspek dari tiap Variabel:

  • total_sembuh, total_meninggal dan kasus_aktif: aspek kasus Covid-19.
  • jumlah_rumah_sakit_umum_per_1000_penduduk dan jumlah_puskesmas_per_1000_penduduk: aspek fasilitas kesehatan.
  • persentase_penduduk_miskin dan gini_ratio: aspek ekonomi
  • persentase_penduduk dan kepadatan_penduduk_per_km_persegi_km2: aspek populasi penduduk

3. Data Wrangling

Dibagian ini variabel data akan disesuaikan tipe datanya, kemudian agar memudahkan dalam kodingan tiap variabel akan diganti menjadi X1, X2, dst, dan untuk variabel provinsi akan dijadikan sebagai rowname atau nama dari tiap barisnya.

Mengubah tipe dan nama variabel

data_covid <- data_covid %>% 
  # Ubah nama variabel
  select(X1 = total_sembuh, X2 = total_meninggal, X3 = kasus_aktif, 
         X4 = jumlah_rumah_sakit_umum_per_1000_penduduk, X5 = jumlah_puskesmas_per_1000_penduduk, 
         X6 = persentase_penduduk_miskin, X7 = gini_ratio, X8 = persentase_penduduk, 
         X9 = kepadatan_penduduk_per_km_persegi_km2, Provinsi = provinsi)

# Mengubah tipe data
data_covid$X9 <- as.numeric(data_covid$X9)  

Meng-assign nilai dari kolom Provinsi menjadi rownames

rownames(data_covid) <- data_covid$Provinsi

glimpse(data_covid)
## Rows: 34
## Columns: 10
## $ X1       <dbl> 94.90, 96.10, 97.59, 98.19, 96.76, 97.09, 96.28, 97.61, 97.53~
## $ X2       <dbl> 5.07, 2.84, 0.94, 1.79, 2.66, 1.16, 3.49, 2.30, 1.40, 5.27, 5~
## $ X3       <dbl> 0.03, 1.07, 1.47, 0.02, 0.57, 1.75, 0.24, 0.09, 1.07, 0.19, 0~
## $ X4       <dbl> 0.0124, 0.0151, 0.0078, 0.0118, 0.0162, 0.0135, 0.0135, 0.010~
## $ X5       <dbl> 0.0673, 0.0275, 0.0203, 0.0881, 0.0326, 0.0297, 0.0787, 0.057~
## $ X6       <dbl> 14.64, 4.57, 6.16, 14.62, 11.34, 4.69, 15.42, 7.62, 8.06, 10.~
## $ X7       <dbl> 0.311, 0.363, 0.363, 0.315, 0.439, 0.423, 0.418, 0.320, 0.417~
## $ X8       <dbl> 1.96, 1.60, 4.42, 0.75, 1.36, 3.89, 0.43, 1.31, 17.89, 13.47,~
## $ X9       <dbl> 92, 755, 1248, 102, 1185, 15978, 105, 72, 1379, 1120, 855, 37~
## $ Provinsi <chr> "Aceh", "Bali", "Banten", "Bengkulu", "DI Yogyakarta", "DKI J~

Definisi Variabel:

  • X1 : Persentase Total Sembuh dari Covid (Di bulan Juli)
  • X2 : Persentase Total Kematian karena Covid (Di bulan Juli)
  • X3 : Persentase Total Kasus Aktif Covid (Di bulan Juli)
  • x4 : Jumlah Rumah Sakit Umum per 1000 Penduduk
  • x5 : Jumlah Puskesmas per 1000 Penduduk
  • x6 : Persentase Penduduk Miskin di tiap Provinsi
  • X7 : Gini Ratio (indikator yang menunjukkan tingkat ketimpangan pengeluaran secara menyeluruh)
  • X8 : Persentase Penduduk (Populasi Provinsi/Populasi Indonesia)
  • x9 : Kepadatan Penduduk per km persegi(km^2)
  • Provinsi: 34 provinsi yang ada di Indonesia

4. Eksplorasi Data

Ekplorasi data dilakukan agar kita menjadi lebih paham dengan gambaran awal dari data yang akan digunakan.

Cek Missing Value

data_covid %>% 
  is.na() %>% 
  colSums()
##       X1       X2       X3       X4       X5       X6       X7       X8 
##        0        0        0        0        0        0        0        0 
##       X9 Provinsi 
##        0        0

Insight :

  • Tidak terdapat missing value, sehingga dapat dilanjutkan ke proses analisis.

Melakukan pengecekan Summary Data

summary(data_covid)
##        X1              X2              X3               X4          
##  Min.   :94.25   Min.   :0.940   Min.   :0.0100   Min.   :0.006600  
##  1st Qu.:96.70   1st Qu.:1.768   1st Qu.:0.0800   1st Qu.:0.008425  
##  Median :97.47   Median :2.375   Median :0.1500   Median :0.011100  
##  Mean   :97.07   Mean   :2.602   Mean   :0.3318   Mean   :0.011535  
##  3rd Qu.:97.70   3rd Qu.:2.840   3rd Qu.:0.3100   3rd Qu.:0.014425  
##  Max.   :98.60   Max.   :5.590   Max.   :1.7500   Max.   :0.018200  
##        X5                X6               X7               X8         
##  Min.   :0.02030   Min.   : 4.450   Min.   :0.2360   Min.   : 0.2600  
##  1st Qu.:0.03480   1st Qu.: 6.258   1st Qu.:0.3140   1st Qu.: 0.8275  
##  Median :0.05060   Median : 8.525   Median :0.3365   Median : 1.5550  
##  Mean   :0.05939   Mean   :10.243   Mean   :0.3439   Mean   : 2.9418  
##  3rd Qu.:0.07717   3rd Qu.:12.223   3rd Qu.:0.3725   3rd Qu.: 2.9500  
##  Max.   :0.14000   Max.   :26.560   Max.   :0.4390   Max.   :17.8900  
##        X9             Provinsi        
##  Min.   :    9.00   Length:34         
##  1st Qu.:   54.25   Class :character  
##  Median :  103.50   Mode  :character  
##  Mean   :  744.26                     
##  3rd Qu.:  261.00                     
##  Max.   :15978.00

Insight :

  • Terdapat beberapa variabel dengan range yang kecil yaitu Persentase Total Sembuh(X1), Persentase Total Kematian(X2), dan Gini Ratio(X7), yang artinya untuk variabel-variabel tersebut tidak jauh berbeda di tiap provinsinya.

  • Sebaliknya terdapat variabel-variabel dengan range sangat besar (dapat dilihat dari nilai Max. dan Min.) seperti variabel Persentase Total Kasus Aktif Covid(X3), Persentase Penduduk(X8) dan Kepadatan Penduduk(X9).

  • Dari informasi diatas dapat diketahui bahwa tiap provinsi memiliki karakteristik tersendiri, maka dari itu provinsi-provinsi akan diklasterkan berdasarkan kemiripan dari karakteristiknya.

Cek hubungan antara variabel

# Cek korelasi
ggcorr(data_covid, label = TRUE)

Insight :

  • Terdapat korelasi yang tinggi dan bersifat negatif antara Persentase Total Sembuh(X1) dengan Persentase Total Kematian(X2) yaitu sebesar -0.9, artinya jika di suatu wilayah memiliki presentase kesembuhan yang tinggi maka wilayah tersebut cenderung memiliki presentase kematian yang rendah.

  • Terdapat beberapa varibel yang memiliki korelasi yang sedang yaitu -0.5, -0.4, 0.4, 0.5, dan 0.6, sedangkan sisanya berkorelasi rendah.

  • Terdapat beberapa varibel yang tidak memiliki korelasi, nilai korelasi 0, yaitu antara Total Sembuh(X1) dengan Kepadatan Penduduk(X9) artinya tidak ada pengaruh/hubungan antara persentase kesembuhan di suatu wilayah dengan Kepadatan Penduduk per km persegi(km^2), dan Total Kematian(X2) dengan Persentase Penduduk Miskin(X6) artinya tidak ada pengaruh/hubungan antara persentase kematian di suatu wilayah dengan Persentase Penduduk Miskin.

    Variabel-variabel yang memiliki hubungan perlu diteliti apakah terdapat permasalahan multikolinearitas, multikolinearitas ini berarti terdapat hubungan antara variabel independennya.

Pemeriksaan Masalah Data

Pemeriksaan masalah data yang akan dilakukan pada analasis ini adalah pemeriksaan multikolinearitas dan deteksi outlier.

1. Pemeriksaan Multikolinearitas

Pengujian multikolinearitas ini untuk melihat apakah ada variabel yang memberikan informasi yang sama dengan variabel lain atau biasa disebut redundan. Untuk menguji multikolinearitas akan dilihat dari nilai Variance Inflation Factor (VIF). Model dikatakan memiliki multikolinearitas jika nilai VIF > 10 yang mengindikasikan bahwa hasil estimasi yang kurang baik[1]. Berikut adalah rumus untuk menghitung nilai VIF: \[ VIF_k = (1-R_k^2)^{-1} \] Dimana: \(R_k^2\): Koefisien determinasi \(X_k\) dengan variabel lainnya yang ada pada model \(k\): 1, 2,…,p; p adalah jumlah variabel

Adapun selain itu, nilai VIF dapat diperolah dengan mencari nilai diagonal pada matrix korelasi data yang sudah di invers-kan. Berikut adalah perhitungan dengan menggunakan function dari R:

CekVIF <- function(data) {
  corr = as.matrix(cor(data))
  VIF = diag(solve(corr))
  
  return(VIF)
}

CekVIF(data_covid[1:9])
##           X1           X2           X3           X4           X5           X6 
## 56689.154039 61612.849596  7874.228488     1.957228     3.263877     2.295834 
##           X7           X8           X9 
##     2.142817     1.719329     1.810653

Insight :

  • Terdapat Multikolinearitas antara Persentase Total Sembuh(X1), Persentase Total Kematian(X2) dan Persentase Total Kasus Aktif Covid(X3). Salah satu penanganan yang dapat digunakan adalah denangan menghilangkan variabel yang memiliki masalah multikolinearitas. Oleh karena itu akan dicek nilai multikolinearitas variabel ketika salah satu ketiga variabel ini dihilangkan:

Cek nilai VIF setelah dikeluarkan salah satu variabel

CekVIF(data_covid[,c(1,2,4,5,6,7,8,9)])
##        X1        X2        X4        X5        X6        X7        X8        X9 
## 17.553950 16.661047  1.848965  3.227306  2.292446  1.953803  1.710718  1.792990
CekVIF(data_covid[,c(1,3,4,5,6,7,8,9)])
##       X1       X3       X4       X5       X6       X7       X8       X9 
## 1.415953 2.129311 1.848558 3.226553 2.291700 1.946732 1.710628 1.790069
CekVIF(data_covid[,c(2,3,4,5,6,7,8,9)])
##       X2       X3       X4       X5       X6       X7       X8       X9 
## 1.538934 2.438276 1.848586 3.225406 2.291785 1.947056 1.710399 1.790070

Insight :

  • Dari hasil perhitungan diatas dapat diketahui masalah multikolinearitas tetap ada ketika variabel Persentase Total Sembuh(X1) dan Persentase Total Kematian(X2) masih ada, sedangkan apabila salah satunya dihilangkan tidak terdapat masalah multikolinearitas. Hal ini dapat disebabkan karena antara variabel Persentase Total Sembuh(X1) dan Persentase Total Kematian(X2) memiliki korelasi yang tinggi (berdasarkan pengujian korelasi sebelumnya). Oleh karena itu dapat digunakan model tanpa variabel Persentase Total Sembuh(X1) atau Persentase Total Kematian(X2), namun disini saya memilih untuk menggunakan model tanpa variabel Persentase Total Kematian(X2).

Save data baru yang sudah dibersihkan

covid_clean <- data_covid[,c(1,3,4,5,6,7,8,9)]

2. Pendeteksian Outliers

Outlier adalah pengamatan yang sangat menyimpang dari pengamatan lain sehingga, menimbulkan kecurigaan yang dihasilkan oleh mekanisme yang berbeda[2].Pengecekan outlier akan dilihat melalui visualisasi dari Box-Plot.

# membagi jendela grafik menajdi 2 baris dan 4 kolom
par(mfrow=c(2,4))

# Looping Box-Plot
type <- c("X1", "X3", "X4", "X5", "X6", "X7", "X8", "X9")
for (i in type){
  boxplot(covid_clean[,i],
       main = paste("Variabel", i))
}

Insight :

  • Untuk variabel Jumlah Rumah Sakit Umum per 1000 Penduduk(X4), Jumlah Puskesmas per 1000 Penduduk(X5) dan Gini Ratio(X7) tidak terdapat data outlier.

  • Untuk variabel Persentase Total Sembuh(X1), Persentase Total Kasus Aktif Covid(X3), Persentase Penduduk Miskin(X6), Persentase Penduduk(X8) dan Kepadatan Penduduk(X9) terdapat outlier.

    Dalam beberapa penelitian outlier diperlakukan dengan cara dibuang. Tapi memperlakukan outlier sebagai noise dapat mengakibatkan hilangnya informasi penting yang tersembunyi[3]. Di banyak bidang, outlier lebih penting daripada data normal, karena dapat menunjukkan perilaku menyimpang atau awal dari pola baru.

    Namun demikian pada variabel Kepadatan Penduduk(X9) terdapat 1 outlier yang sangat besar yang dapat mengakibatkan range dari variabel Kepadatan Penduduk(X9) menjadi sangat besar. Maka dari itu outlier tersebut akan dikeluarkan. Sehingga pada kasus ini hanya akan mengeluarkan data pada Provinsi DKI Jakarta yang memiliki penyimpangan paling jauh dengan data lainnya.

Box-Plot X9 setelah dikeluarkan DKI Jakarta

covid_clean %>% 
  select(X9) %>% 
  filter(X9 != max(X9)) %>% 
  boxplot(main = "Variabel X9")

Insight :

  • Dari boxplot diatas dapat terlihat bahwa masih terdapat outlier pada variabel Kepadatan Penduduk(X9) namun outlier akan tetap dipertahankan dalam analisis.

Save data baru

covid_fil <- covid_clean %>% 
  filter(X9 != max(X9))

Selanjutnya akan dilanjutkan kedalam analis clustering dengan pendekatan K-Means Clustering.

Penerapan metode K-Means pada kasus Covid

Metode K-Means digunakan sebagai alternatif metode klaster untuk data dengan ukuran yang lebih besar. Hal ini dikarenakan metode ini memiliki kecepatan yang lebih tinggi jika dibandingkan dengan metode hirarki. Metode K-Means dapat digunakan untuk menjelaskan algoritma dalam penentuan suatu objek kedalam klaster tertentu berdasarkan rataan terdekat[4]. Dalam prosedur pembentukan K-Means Cluster terdapat langkah-langkah yang dapat dilakukan, antara lain:

  1. Tentukan banyaknya klaster (k) yang akan dibentuk.

  2. Random initialization: meletakkan \(k\) centroid secara random

  3. Cluster assignment: assign masing-masing observasi ke cluster terdekat, berdasarkan perhitungan jarak

  4. Centroid update: menggeser centroid ke rata-rata (means) dari cluster yang terbentuk

  5. Ulangi langkah 3 dan 4 sampai tidak ada observasi yang clusternya berubah lagi

1. Standardisasi Data

Bertujuan untuk menyamakan skala data atau menghilangkan kontras antar variabel yang memiliki satuan berbeda.

covid_scale <- scale(covid_fil)

2. Penentuan Jumlah Klaster (K optimum)

Menentukan jumlah klaster paling optimum untuk membagi 33 provinsi yang ada di Indonesia. Pada dasarnya nilai k optimum dapat ditentukan sendiri oleh peneliti, selain itu nilai k dapat ditentukan juga menggunakan bantuan grafik Elbow berikut. Dimana k minimum akan didapat ketika grafik sudah tidak bergerak menurun dengan tajam.

fviz_nbclust(x = covid_scale, 
             FUNcluster = kmeans,
             method = 'wss',
             k.max = 10)

  • Dari hasil diatas didapatkan nilai K optimum adalah 5.

3. Hasil pembagian klaster

RNGkind(sample.kind = "Rounding")
set.seed(100)

covid_kmeans <- kmeans(x = covid_scale, centers = 5)

Visualisasi hasil pembagian klaster:

fviz_cluster(object = covid_kmeans, data=covid_scale)

Insight :

  • Dari hasil visualisasi nampak jelas bahwa tiap klaster memiliki daerah tertentu yang terpisah dari klaster lain.

  • Terlihat bahwa klaster 1 dan klaster 3 saling tumpang tindih, namun itu bukan karena wilayah klaster nya sama melainkan keterbatasan dari visualisasi yang ditampilkan, karena hanya dapat menampilkan secara 2 Dimensi.

Agar lebih jelas lagi, berikut adalah rincian dari tiap-tiap klaster dan anggota Provinsinya:

Hasil clustering menggunakan metode K-Means:

table(covid_kmeans$cluster)
## 
##  1  2  3  4  5 
## 15  3  5  3  7

Rincian cluster tiap-tiap Provinsi:

covid_kmeans$cluster
##                      Aceh                      Bali                    Banten 
##                         3                         4                         4 
##                  Bengkulu             DI Yogyakarta                 Gorontalo 
##                         5                         4                         5 
##                     Jambi                Jawa Barat               Jawa Tengah 
##                         1                         2                         2 
##                Jawa Timur          Kalimantan Barat        Kalimantan Selatan 
##                         2                         1                         3 
##         Kalimantan Tengah          Kalimantan Timur          Kalimantan Utara 
##                         3                         1                         1 
## Kepulauan Bangka Belitung            Kepulauan Riau                   Lampung 
##                         1                         1                         3 
##                    Maluku              Maluku Utara       Nusa Tenggara Barat 
##                         5                         1                         1 
##       Nusa Tenggara Timur                     Papua               Papua Barat 
##                         5                         5                         5 
##                      Riau            Sulawesi Barat          Sulawesi Selatan 
##                         1                         1                         1 
##           Sulawesi Tengah         Sulawesi Tenggara            Sulawesi Utara 
##                         1                         5                         1 
##            Sumatera Barat          Sumatera Selatan            Sumatera Utara 
##                         1                         3                         1

Insight :

  • Klaster 1 berjumlah 15, yaitu: Jambi, Kalimantan Barat, Kalimantan Timur, Kalimantan Utara, Kepulauan Bangka Belitung, Kepulauan Riau, Maluku Utara, Nusa Tenggara Barat, Riau, Sulawesi Barat, Sulawesi Selatan, Sulawesi Tengah, Sulawesi Utara, Sumatera Barat dan Sumatera Utara.

  • Klaster 2 berjumlah 3, yaitu: Jawa Barat, Jawa Tengah dan Jawa Timur.

  • Klaster 3 berjumlah 5, yaitu: Aceh, Kalimantan Selatan, Kalimantan Tengah, Lampung dan Sumatera Selatan.

  • Klaster 4 berjumlah 3, yaitu: Bali, Banten dan DI Yogyakarta.

  • Klaster 5 berjumlah 7, yaitu: Bengkulu, Gorontalo, Maluku, Nusa Tenggara Timur, Papua, Papua Barat dan Sulawesi Tenggara.

3. Interpretasi dan Profiling

Dengan menggunakan visualisasi data, dapat memudahkan dalam melakukan profiling.

data_clus <- data_covid %>% 
  filter(X9 != max(X9))

data_clus$Cluster <- covid_kmeans$cluster

ggRadar(
  data = data_clus,
  mapping = aes(colours = Cluster),
  interactive = T
)

Insight :

Berdasarkan hasil diatas dapat diketahui bahwa karakteristik dari masing-masing klaster adalah sebagai berikut:

  • Klaster 1 : Memiliki nilai rata-rata Persentase Total Sembuh(X1) dan Jumlah Rumah Sakit Umum per 1000 Penduduk(X4) yang tinggi, sedangkan Persentase Total Kematian(X2), Persentase Total Kasus Aktif Covid(X3), Persentase Penduduk Miskin(X6), Persentase Penduduk(X8) dan Kepadatan Penduduk(X9) yang rendah.

  • Klaster 2 : Memiliki nilai rata-rata Persentase Total Kematian(X2), Gini Ratio(X7), Persentase Penduduk(X8) dan Kepadatan Penduduk(X9) yang tinggi, sedangkan Persentase Total Sembuh(X1), Jumlah Rumah Sakit Umum per 1000 Penduduk(X4) dan Jumlah Puskesmas per 1000 Penduduk(X5) yang rendah.

  • Klaster 3 : Memiliki nilai rata-rata Persentase Total Kematian(X2) yang tinggi, sedangkan Persentase Total Sembuh(X1) dan Kepadatan Penduduk(X9) yang rendah.

  • Klaster 4 : Memiliki nilai rata-rata Persentase Total Kasus Aktif Covid(X3), Jumlah Rumah Sakit Umum per 1000 Penduduk(X4), Gini Ratio(X7) dan Kepadatan Penduduk(X9) yang tinggi, sedangkan Persentase Total Kematian(X2), Jumlah Puskesmas per 1000 Penduduk(X5), Persentase Penduduk Miskin(X6) dan Persentase Penduduk(X8) yang rendah.

  • Klaster 5 : Memiliki nilai rata-rata Persentase Total Sembuh(X1), Jumlah Rumah Sakit Umum per 1000 Penduduk(X4), Jumlah Puskesmas per 1000 Penduduk(X5), Persentase Penduduk Miskin(X6) dan Gini Ratio(X7) yang tinggi, sedangkan Persentase Total Kematian(X2), Persentase Total Kasus Aktif Covid(X3), Persentase Penduduk(X8) dan Kepadatan Penduduk(X9) yang rendah.

Selain dengan visualisasi, berikut adalah nilai rata-rata dari masing-masing variabel di tiap cluster:

Melakukan profiling dengan summarise data

data_profil <- data_clus %>%
  select(-Provinsi) %>% 
  group_by(Cluster) %>% 
  summarise_all(mean)

round(data_profil, 3)

Insight :

Hasil yang didapat tidak berbeda dengan menggunakan visualisasi sebelumnya, dengan menggunakan summarise data karakteristik dari masing-masing klaster dapat dilihat melalui angka sehingga dapat diketahui nilai tertinggi dan terendah secara detail, berikut hasilnya:

  • Klaster 1 : Memiliki nilai rata-rata Persentase Total Sembuh(X1) dan Jumlah Rumah Sakit Umum per 1000 Penduduk(X4) yang tinggi, sedangkan Persentase Total Kematian(X2), Persentase Total Kasus Aktif Covid(X3)[-], Persentase Penduduk Miskin(X6), Persentase Penduduk(X8) dan Kepadatan Penduduk(X9) yang rendah.

  • Klaster 2 : Memiliki nilai rata-rata Persentase Total Kematian(X2), Gini Ratio(X7), Persentase Penduduk(X8)[+] dan Kepadatan Penduduk(X9)[+] yang tinggi, sedangkan Persentase Total Sembuh(X1), Jumlah Rumah Sakit Umum per 1000 Penduduk(X4)[-] dan Jumlah Puskesmas per 1000 Penduduk(X5)[-] yang rendah.

  • Klaster 3 : Memiliki nilai rata-rata Persentase Total Kematian(X2)[+] yang tinggi, sedangkan Persentase Total Sembuh(X1)[-] dan Kepadatan Penduduk(X9) yang rendah.

  • Klaster 4 : Memiliki nilai rata-rata Persentase Total Kasus Aktif Covid(X3)[+], Jumlah Rumah Sakit Umum per 1000 Penduduk(X4), Gini Ratio(X7)[+] dan Kepadatan Penduduk(X9) yang tinggi, sedangkan Persentase Total Kematian(X2), Jumlah Puskesmas per 1000 Penduduk(X5), Persentase Penduduk Miskin(X6)[-] dan Persentase Penduduk(X8) yang rendah.

  • Klaster 5 : Memiliki nilai rata-rata Persentase Total Sembuh(X1)[+], Jumlah Rumah Sakit Umum per 1000 Penduduk(X4)[+], Jumlah Puskesmas per 1000 Penduduk(X5)[+], Persentase Penduduk Miskin(X6)[+] dan Gini Ratio(X7) yang tinggi, sedangkan Persentase Total Kematian(X2)[-], Persentase Total Kasus Aktif Covid(X3), Persentase Penduduk(X8)[-] dan Kepadatan Penduduk(X9)[-] yang rendah.

  • Dari hasil penglasteran diatas korelasi Persentase Total Sembuh(X1) dan Persentase Total Kematian(X2) terbukti kuat, dimana jika nilai Persentase Total Sembuh(X1) tinggi di suatu provinsi maka untuk nilai Persentase Total Kematian(X2) akan rendah.

Keterangan:

  • [+] : Tertinggi

  • [-] : Terendah

    Selain itu, kita akan dibandingkan juga dengan nilai tiap variabel dari provinsi DKI Jakarta.

data_jakarta <- data_covid %>% 
  filter(X9 == max(X9))

data_jakarta  

Insight :

  • Provinsi DKI Jakarta memiliki nilai Persentase Total Sembuh(X1), Persentase Total Kasus Aktif Covid(X3), Jumlah Rumah Sakit Umum per 1000 Penduduk(X4), Gini Ratio(X7) dan Kepadatan Penduduk(X9) yang tinggi, sedangkan Persentase Total Kematian(X2) dan Persentase Penduduk Miskin(X6) yang rendah.

  • Nilai Kepadatan Penduduk(X9) pada provinsi ini sangat ekstrim, selain itu Persentase Total Kasus Aktif Covid(X3) dan Gini Ratio(X7) memiliki nilai lebih tinggi dari nilai rata-rata klaster yang terbentuk, serta Persentase Total Kematian(X2) dan Persentase Penduduk Miskin(X6) memiliki nilai lebih rendah dari nilai rata-rata klaster yang terbentuk.

4. Peta Penglasteran di Indonesia

Pada bagian ini akan dilihat persebaran provinsi-provinsi pada tiap cluster-nya melalui peta Indonesia.

Preparing Data

Akan digunakan data peta Indonesia berbentuk shapefile (.shp) untuk melakukan pemetaan. Cara untuk membaca data dalam file tersebut menggunakan fungsi st_read().

indo <- st_read("gadm41_IDN_1.shp")
## Reading layer `gadm41_IDN_1' from data source 
##   `D:\S44 Anugrah H\0. Job\Algoritma Data Science School\Project\LBB 1\gadm41_IDN_1.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 34 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 95.00971 ymin: -11.00761 xmax: 141.0194 ymax: 6.076941
## Geodetic CRS:  WGS 84
glimpse(indo)
## Rows: 34
## Columns: 12
## $ GID_1     <chr> "IDN.1_1", "IDN.2_1", "IDN.3_1", "IDN.4_1", "IDN.5_1", "IDN.~
## $ GID_0     <chr> "IDN", "IDN", "IDN", "IDN", "IDN", "IDN", "IDN", "IDN", "IDN~
## $ COUNTRY   <chr> "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indones~
## $ NAME_1    <chr> "Aceh", "Bali", "Bangka Belitung", "Banten", "Bengkulu", "Go~
## $ VARNAME_1 <chr> "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", ~
## $ NL_NAME_1 <chr> "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", ~
## $ TYPE_1    <chr> "Propinisi", "Propinisi", "Propinisi", "Propinisi", "Propini~
## $ ENGTYPE_1 <chr> "Province", "Province", "Province", "Province", "Province", ~
## $ CC_1      <chr> "11", "51", "19", "36", "17", "75", "31", "15", "32", "33", ~
## $ HASC_1    <chr> "ID.AC", "ID.BA", "ID.BB", "ID.BT", "ID.BE", "ID.GO", "ID.JK~
## $ ISO_1     <chr> "ID-AC", "ID-BA", "NA", "ID-BT", "ID-BE", "ID-GO", "ID-JK", ~
## $ geometry  <MULTIPOLYGON [°]> MULTIPOLYGON (((98.14903 2...., MULTIPOLYGON ((~

Keterangan :

  • Dalam membuat peta Indonesia berdasarkan Provinsinya hanya diperlukan variabel NAME_1 alias nama Provinsi dan geometry alias titik koordinat dari Provinsi.

  • NAME_1: Berisi 34 provinsi yang ada di Indonesia. Apabila diperhatikan jumlah rows adalah 34 ini sudah sesuai dengan jumlah Provinsi di Indonesia.

  • geometry: Titik koordinat dari tiap Provinsi. Dimana geometry type-nya MULTIPOLYGON dengan dimensi XY.

Selanjutnya akan dibuat koordinat untuk tiap Provinsi untuk masing-masing dimensi X dan Y:

cent <- indo %>% 
  select(Provinsi = NAME_1) %>% 
  st_centroid()

coordinat <- cent[2] %>% 
  st_coordinates() %>% 
  as.data.frame()

indo_coor <- indo %>%
  select(Provinsi = NAME_1) %>% 
  add_column(coordinat)

glimpse(indo_coor)
## Rows: 34
## Columns: 4
## $ Provinsi <chr> "Aceh", "Bali", "Bangka Belitung", "Banten", "Bengkulu", "Gor~
## $ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((98.14903 2...., MULTIPOLYGON (((~
## $ X        <dbl> 96.91174, 115.13202, 106.55223, 106.10941, 102.33629, 122.376~
## $ Y        <dbl> 4.22406854, -8.36972386, -2.44862217, -6.45641290, -3.5327631~

Setelah didapatkan titik koordinat X dan Y dari tiap Provinsi, selanjutnya data indo_coor akan disatukan dengan data hasil clustering dengan menggunakan K-Means Cluster. Namun agar tidak ada data yang hilang Provinsi DKI Jakarta akan dimasukan kembali kedalam dataframe hasil clustering dan akan dilabeli sebagai cluster 0.

data_jakarta$Cluster <- 0

covid_clus <- rbind(data_clus, data_jakarta) %>% 
  select(Provinsi, Cluster)

Karena data indo_coor akan disatukan dengan data hasil clustering (covid_clus), maka akan dipastikan penulisan dari Provinsi dari kedua dataframe tersebut harus sama agar tidak terjadi error.

indo_coor$Provinsi
##  [1] "Aceh"                "Bali"                "Bangka Belitung"    
##  [4] "Banten"              "Bengkulu"            "Gorontalo"          
##  [7] "Jakarta Raya"        "Jambi"               "Jawa Barat"         
## [10] "Jawa Tengah"         "Jawa Timur"          "Kalimantan Barat"   
## [13] "Kalimantan Selatan"  "Kalimantan Tengah"   "Kalimantan Timur"   
## [16] "Kalimantan Utara"    "Kepulauan Riau"      "Lampung"            
## [19] "Maluku"              "Maluku Utara"        "Nusa Tenggara Barat"
## [22] "Nusa Tenggara Timur" "Papua"               "Papua Barat"        
## [25] "Riau"                "Sulawesi Barat"      "Sulawesi Selatan"   
## [28] "Sulawesi Tengah"     "Sulawesi Tenggara"   "Sulawesi Utara"     
## [31] "Sumatera Barat"      "Sumatera Selatan"    "Sumatera Utara"     
## [34] "Yogyakarta"
covid_clus$Provinsi
##  [1] "Aceh"                      "Bali"                     
##  [3] "Banten"                    "Bengkulu"                 
##  [5] "DI Yogyakarta"             "Gorontalo"                
##  [7] "Jambi"                     "Jawa Barat"               
##  [9] "Jawa Tengah"               "Jawa Timur"               
## [11] "Kalimantan Barat"          "Kalimantan Selatan"       
## [13] "Kalimantan Tengah"         "Kalimantan Timur"         
## [15] "Kalimantan Utara"          "Kepulauan Bangka Belitung"
## [17] "Kepulauan Riau"            "Lampung"                  
## [19] "Maluku"                    "Maluku Utara"             
## [21] "Nusa Tenggara Barat"       "Nusa Tenggara Timur"      
## [23] "Papua"                     "Papua Barat"              
## [25] "Riau"                      "Sulawesi Barat"           
## [27] "Sulawesi Selatan"          "Sulawesi Tengah"          
## [29] "Sulawesi Tenggara"         "Sulawesi Utara"           
## [31] "Sumatera Barat"            "Sumatera Selatan"         
## [33] "Sumatera Utara"            "DKI Jakarta"

Dapat diketahui bahwa terdapat perbedaan penamaan untuk Provinsi Kepulauan Bangka Belitung, DKI Jakarta dan DI Yogyakarta. Oleh karena itu akan dilakukan penyesuaian sebelum datanya disatukan.

indo_coor$Provinsi[3] <- "Kepulauan Bangka Belitung"
indo_coor$Provinsi[7] <- "DKI Jakarta"
indo_coor$Provinsi[34] <- "DI Yogyakarta"

indo_coor$Provinsi  
##  [1] "Aceh"                      "Bali"                     
##  [3] "Kepulauan Bangka Belitung" "Banten"                   
##  [5] "Bengkulu"                  "Gorontalo"                
##  [7] "DKI Jakarta"               "Jambi"                    
##  [9] "Jawa Barat"                "Jawa Tengah"              
## [11] "Jawa Timur"                "Kalimantan Barat"         
## [13] "Kalimantan Selatan"        "Kalimantan Tengah"        
## [15] "Kalimantan Timur"          "Kalimantan Utara"         
## [17] "Kepulauan Riau"            "Lampung"                  
## [19] "Maluku"                    "Maluku Utara"             
## [21] "Nusa Tenggara Barat"       "Nusa Tenggara Timur"      
## [23] "Papua"                     "Papua Barat"              
## [25] "Riau"                      "Sulawesi Barat"           
## [27] "Sulawesi Selatan"          "Sulawesi Tengah"          
## [29] "Sulawesi Tenggara"         "Sulawesi Utara"           
## [31] "Sumatera Barat"            "Sumatera Selatan"         
## [33] "Sumatera Utara"            "DI Yogyakarta"

Dapat diketahui bahwa sekarang penamaan dari Provinsi di kedua dataframe sudah sama, maka akan dilanjutkan untuk menyatukan/menggabungkan kedua data frame tersebut.

Save dataset baru yang sudah digabungkan

data_join <- indo_coor %>% 
  left_join(y = covid_clus, key = "Provinsi")
## Joining, by = "Provinsi"

Pemetaan Provinsi berdasarkan hasil clustering

map_indo <- ggplot(data = data_join, aes(text = paste0('Provinsi: ', Provinsi))) +
  geom_sf(aes(fill=Cluster)) +
  scale_fill_gradient2(low = "blue", high = "red", mid = "yellow", midpoint = 3) +
  geom_text(data = data_join, aes(X,Y, label = Provinsi), size = 3, fontface = "bold", col = "navy") +
  theme_void() +
  labs(title = "Pemetaan Kasus Covid-19 Provinsi-Provinsi di Indonesia", 
       subtitle = "Menggunakan K-Means Cluster", 
       caption = "Update: Kasus Covid-19 bulan Juli") +
  theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))

map_indo

# # Interactive Map
# ggplotly(map_indo) %>% layout(
#     title = paste(
#       '<b>Pemetaan Provinsi-Provinsi di Indonesia</b>',
#       '<br>',paste("Menggunakan K-Means Cluster"),
#       '<br><span style="font-size: 15px;">',
#       "Berdasarkan Kasus Covid-19 di bulan Juli"
#     ),
#     margin = list(t = 100)
#   )

Insight :

Berdasarkan hasil persebaran diatas dapat diketahui bahwa :

  • Klaster 5: Cenderung tersebar di Indonesia bagian Timur.

  • Klaster 2: Tersebar di pulau Jawa.

  • Klaster 4: Tersebar antara pulai Jawa-Bali.

  • Sedangkan untuk Klaster 1 dan Klaster 3 tersebar di selain pulau Jawa-Bali.

Kesimpulan

Dari hasil analisis dan pembahasan yang telah diuraikan sebelumnya, maka diperoleh kesimpulan sebagai berikut :

  1. Berdasarkan nilai wss diperoleh jumlah klaster untuk kasus ini adalah sebanyak 5. Hal ini diketahui karena penurunan inersia setelah k = 5 tidak lagi signifikan (perubahan nilai nya kecil).

  2. Berdasarkan jumlah k tersebut, maka peng-klasteran dibuat kedalam 5 klaster.Hasil peng-klasteran menunjukan bahwa terdapat 15 provinsi pada klaster satu, 3 provinsi pada klaster dua, 5 provinsi pada klaster tiga, 3 provinsi pada klaster empat dan 7 provinsi pada klaster lima. Rincian dari ke lima klaster adalah pada berikut :

  • Klaster 1, yaitu provinsi Jambi, Kalimantan Barat, Kalimantan Timur, Kalimantan Utara, Kepulauan Bangka Belitung, Kepulauan Riau, Maluku Utara, Nusa Tenggara Barat, Riau, Sulawesi Barat, Sulawesi Selatan, Sulawesi Tengah, Sulawesi Utara, Sumatera Barat dan Sumatera Utara. Dengan karakteristik: memiliki nilai rata-rata Persentase Total Sembuh Covid-19 dan Jumlah Rumah Sakit Umum per 1000 Penduduk yang tinggi, sedangkan Persentase Total Kematian karena Covid-19, Persentase Total Kasus Aktif Covid-19, Persentase Penduduk Miskin, Persentase Penduduk dan Kepadatan Penduduk per km^2 yang rendah.

  • Klaster 2, yaitu provinsi Jawa Barat, Jawa Tengah dan Jawa Timur. Dengan karakteristik: memiliki nilai rata-rata Persentase Total Kematian karena Covid, Gini Ratio, Persentase Penduduk dan Kepadatan Penduduk per km^2 yang tinggi, sedangkan Persentase Total Sembuh Covid-19, Jumlah Rumah Sakit Umum per 1000 Penduduk dan Jumlah Puskesmas per 1000 Penduduk yang rendah.

  • Klaster 3, yaitu provinsi Aceh, Kalimantan Selatan, Kalimantan Tengah, Lampung dan Sumatera Selatan. Dengan karakteristik: memiliki nilai rata-rata Persentase Total Kematian karena Covid yang tinggi, sedangkan Persentase Total Sembuh Covid-19 dan Kepadatan Penduduk per km^2 yang rendah.

  • Klaster 4, yaitu provinsi Bali, Banten dan DI Yogyakarta. Dengan karakteristik: memiliki nilai rata-rata Persentase Total Kasus Aktif Covid-19, Jumlah Rumah Sakit Umum per 1000 Penduduk, Gini Ratio dan Kepadatan Penduduk per km^2 yang tinggi, sedangkan Persentase Total Kematian karena Covid, Jumlah Puskesmas per 1000 Penduduk, Persentase Penduduk Miskin dan Persentase Penduduk yang rendah.

  • Klaster 5, yaitu provinsi Bengkulu, Gorontalo, Maluku, Nusa Tenggara Timur, Papua, Papua Barat dan Sulawesi Tenggara. Dengan karakteristik: memiliki nilai rata-rata Persentase Total Sembuh Covid-19, Jumlah Rumah Sakit Umum per 1000 Penduduk, Jumlah Puskesmas per 1000 Penduduk, Persentase Penduduk Miskin dan Gini Ratio yang tinggi, sedangkan Persentase Total Kematian karena Covid, Persentase Total Kasus Aktif Covid-19, Persentase Penduduk dan Kepadatan Penduduk per km^2 yang rendah.

  • Terdapat provinsi yang tidak tergabung pada 5 klaster diatas, yaitu provinsi DKI Jakarta hal ini dikarekan terdapat perbedaan yang ekstrim dari provinsi ini jika dibandingkan dengan provinsi lainnya.

Saran

Berdasarkan hasil peng-klasteran diatas terdapat beberapa saran yang daapat dilakukan agar kasus Covid-19 dapat ditangani secara optimal.

  • Klaster 1: Penanganan Covid-19 di klaster ini sudah baik ditandai dengan Jumlah Persentase Total Sembuh Covid-19 tinggi sebaliknya Persentase Total Kematian karena Covid-19 dan Persentase Total Kasus Aktif Covid-19 rendah, serta banyaknya Rumah sakit. Kondisi ekonomi di klaster ini juga baik dengan kondisi wilayah yang tidak terlalu padat penduduk. Namun demikian tetap disarankan untuk menaati protokol kesehatan agar terhindar Covid-19.

  • Klaster 2: Penanganan Covid-19 di klaster ini harus tetap ditingkatkan karena Jumlah Persentase Total Sembuh Covid-19 masih rendah sebaliknya Persentase Total Kematian karena Covid-19 tinggi, serta masih kurangnya fasilitas kesehatan. Kondisi ini juga dapat semakin parah dikarenakan klaster ini cukup padat penduduk dan terdapat ketimpangan ekonomi. Sebaiknya pada klaster ini masih dibatasi untuk berkerumun, serta akses untuk fasilitas kesehatannya ditingkatkan seperti tetap memberikan vaksinasi.

  • Klaster 3: Penanganan Covid-19 di klaster ini harus tetap ditingkatkan karena Jumlah Persentase Total Sembuh Covid-19 masih rendah sebaliknya Persentase Total Kematian karena Covid-19 tinggi. Penerapan kebijakan jaga jarak pada wilayah diklaster ini akan berdampak karena pada klaster ini tidak terlalu padat penduduk sehingga dapat mencegah penyebaran Covid-19.

  • Klaster 4: Penanganan Covid-19 di klaster ini cukup baik dengan Jumlah Persentase Total Kematian karena Covid-19 rendah, serta jumlah rumah sakit tinggi. Namun masih tetap harus waspada karena Persentase Total Kasus Aktif Covid-19 masih tinggi dan disarankan untuk tetap melakukan isolasi mandiri jika terkena Covid-19 agar tidak mudah menyebar kembali karena pada klaster ini Kepadatan Penduduk per km^2 yang tinggi.

  • Klaster 5: Penanganan Covid-19 di klaster ini sudah baik ditandai dengan Jumlah Persentase Total Sembuh Covid-19 tinggi sebaliknya Persentase Total Kematian karena Covid-19 dan Persentase Total Kasus Aktif Covid-19 rendah, serta banyaknya fasilitas kesehatan. Persebaran Covid-19 di klaster ini juga dapat diatasi dengan kebijakan jaga jarak berhubung di klaster ini populasinya rendah dan tidak padat penduduk. Namun peru diperhatikan terkait kegiatan ekonominya karena Persentase Penduduk Miskin dan ketimpangan ekonomi masih tinggi.

Reference

  • [1] Jhonson, R.A. and Wichern, D.W. Applied Multivariate Statistical Analysis 6th Edition. New Jersey: Prentice Hill. Inc, 2005.

  • [2] Montgomery, D. C., Peck, E. A., & Vining, G. G. Introduction to Linear Regression Analysis, 2012.

  • [3] Hawkins, Douglas M. Identification of outliers. Vol. 11. London: Chapman and Hall, 1980.

  • [4] Jiang, S. Y., & An, Q. B. Clustering-based outlier detection method, 2008.