Analisis Klaster

K-Means Clustering merupakan metode analisis klaster dimana pengguna menentukan jumlah klaster sebanyak ‘k’ yang ingin dibuatnya. Pengklasteran suatu objek didasarkan pada jarak terdekat antara objek tersebut dengan centroid/titik pusat/rata-rata suatu klaster. Cara kerja atau algoritma dari K-Means Clustering adalah sebagai berikut =

  1. Tentukan sebanyak ‘k’ klaster yang ingin dibentuk. Kemudian secara acak menempatkan sebanyak ‘k’ titik sebagai centroid awal.
  2. Alokasikan objek ke dalam klaster berdasarkan jarak ke centroid awal terdekat.
  3. Hitung centroid baru yang ada dalam klaster.
  4. Alokasikan kembali objek ke centroid baru yang terdekat.
  5. Kembali langkah 3, sampai tidak terdapat objek yang berpindah klaster atau perubahan nilai centroid.

Contoh Kasus : Pengelompokkan Indikator Kesehatan Pulau Jawa

Data yang digunakan adalah data indikator Kesehatan Kota/Kab di Indonesia pada tahun 2017. Data Indikator tersebut adalah :

  1. AHH=Angka Harapan Hidup
  2. RP=Rasio Puskesmas
  3. RRS=Rasio Rumah Sakit
  4. PHBS=Persentase RT PHBS
  5. SL=Persentase RT Sanitasi Layak
  6. BBLR=Persentase Bayi dengan Berat badan lahir rendah
  7. ASI=Persentase Bayi yang Mendapat Asi Eksklusif
  8. DIARE=Angka Kesakitan Diare (per 1rb penduduk)

Load Library

library(readr)  #Membaca data
library(dplyr)  #Data processing
library(DT)     #Menampilkan tabel agar mudah dilihat di browser
library(factoextra) #untuk clustering dan visualisasi

Input Data

jawa_data <- read_csv("kesehatan_jawa.csv")
datatable(jawa_data, caption = "Indikator Kesehatan di Pulau Jawa")

Tahapan Sebelum Analisis Klaster

Normalisasi Data

Karena data yang digunakan memiliki satuan dan rentang yang berbeda, maka perlu dilakukan standardisasi data terlebih dahulu sebelum masuk ke analisis klaster. Untuk melakukan standardisasi data ke dalam normal baku di R dapat menggunakan fungsi scale().

data_standardized <- round(scale(jawa_data[,2:9]),4) #Hanya memilih kolom/variabel yang berisikan indikator kesehatan
datatable(data_standardized, caption = "Data Hasil Standarisasi")

Menentukan jumlah klaster.

Dalam metode k-means banyaknya klaster ditentukan sendiri oleh pengguna. Maka dari itu perlu dicari jumlah klaster yang optimum yang dapat mengelompokkan objek dengan baik (Perlu diketahui bahwa metode ini relatif subjektif). Salah satu metode yang digunakan adalah Elbow Plot. Elbow Plot merupakan plot antara banyak klaster dengan total within-cluster variation (total dari simpangan per kluster). Banyak klaster yang dipilih adalah bagian “siku” atau titik dimana terdapat penurunan yang tajam sebelum titik tersebut dan disusul penurunan yang tidak tajam setelah titik tersebut. Hal ini karena penambahan jumlah klaster tidak membawa pengaruh banyak atas variasi yang ada di dalam klaster tersebut.

jumlah_klaster <- c(1:9)  #Vektor yang berisikan jumlah klaster yang ingin dilihat nilai dari total within-cluster sum of squares
within_ss <- c()  #Vektor kosong yang akan diisi nilai total within-cluster sum of squares
for (i in jumlah_klaster) {
  within_ss <- c(within_ss, kmeans(x = data_standardized, centers = i, nstart = 25)$tot.withinss)
}

plot(x = jumlah_klaster, y = within_ss, type = "b", xlab = "Jumlah Cluster",
     ylab = "Total Dalam Jumlah Kuadrat", main = "Elbow Plot")
abline(v = 4, col = 'red')

Dilihat dari Elbow Plot diatas, banyaknya klaster yang dipilih adalah 4 klaster.

Memulai Analisis Klaster

Analisis Klaster

Analisis klaster di R dapat dilakukan dengan fungsi kmeans() dan menggunakan data yang telah distandardisasi.

set.seed(123)
kmeans_clustering <- kmeans(x = data_standardized, centers = 4, nstart = 25)  #parameter nstart digunakan untuk memberitahu fungsi berapa kali inisiasi centroid awal (secara acak) yang akan dibentuk.
kmeans_clustering
## K-means clustering with 4 clusters of sizes 1, 53, 52, 13
## 
## Cluster means:
##          AHH         RP        RRS       PHBS         SL        BBLR        ASI
## 1  0.5718000 -1.3599000  1.5470000  0.4996000 -1.3642000 -1.69050000 -0.3508000
## 2  0.5887849 -0.2675434 -0.1618604  0.7283509  0.3466830 -0.09940377 -0.6497566
## 3 -0.6949077  0.1299365 -0.4348115 -0.6140654 -0.5387519  0.01485000  0.4986577
## 4  0.3352308  0.6756692  2.2801462 -0.5515462  0.8465077  0.47590000  0.6813308
##         DIARE
## 1  9.72220000
## 2 -0.26004906
## 3  0.08207308
## 4 -0.01596923
## 
## Clustering vector:
##   [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 2 3 3 2 2 3 3 3 3 4 4 4 3 3 4 4 2
##  [38] 4 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 2 2 2 2 2 2
##  [75] 3 3 2 3 3 3 2 2 3 3 2 2 3 3 2 3 3 2 3 2 4 2 2 3 3 3 3 3 3 3 2 2 3 2 4 4 3
## [112] 4 4 1 2 2 2 3 4
## 
## Within cluster sum of squares by cluster:
## [1]   0.00000 228.19076 276.63763  69.41555
##  (between_SS / total_SS =  39.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Output dari fungsi kmeans() terdiri atas beberapa informasi sebagai berikut :

  • cluster : vector yang berisikan lokasi klaster tiap objek.
  • centers : matriks yang berisikan centroid/rata-rata nilai tiap klaster.
  • withinss: vektor yang berisikan simpangan tiap klaster yang terbentuk.
  • tot.withinss : total dari simpangan tiap klaster yang terbentuk. Biasa digunakan untuk membuat Elbow Plot guna mengetahui banyak klaster yang sebaiknya dipilih.
  • size : jumlah objek pada tiap klaster.

Mengembalikan Nilai Centroid

Nilai means/centroid yang termuat masih dalam nilai yang distandardisasi, maka nilainya perlu dikembalikan ke nilai awal guna diketahui karakteristik sebenarnya dari tiap klaster.

jawa_data %>%
  mutate(Klaster = kmeans_clustering$cluster) %>%
  group_by(Klaster) %>%
  summarise(Mean_AHH = mean(AHH), Mean_RP = mean(RP), Mean_RRS = mean(RRS), Mean_PHBS = mean(PHBS), Mean_SL = mean(SL), Mean_BBLR = mean(BBLR), Mean_ASI = mean(ASI), Mean_DIARE = mean(DIARE))
## # A tibble: 4 x 9
##   Klaster Mean_AHH Mean_RP Mean_RRS Mean_PHBS Mean_SL Mean_BBLR Mean_ASI
##     <int>    <dbl>   <dbl>    <dbl>     <dbl>   <dbl>     <dbl>    <dbl>
## 1       1     73.8   0.260    3.04       71.3    50.0      0.92     55.5
## 2       2     73.9   0.755    0.990      75.0    83.5      3.58     50.1
## 3       3     70.4   0.935    0.663      53.1    66.2      3.77     71.1
## 4       4     73.2   1.18     3.92       54.1    93.3      4.55     74.5
## # ... with 1 more variable: Mean_DIARE <dbl>

Pengelompokkan Objek ke dalam Klaster

Pengelompokkan objek ke dalam klaster yang terbentuk dapat dilihat dari output cluster.

jawa_data %>%
  mutate (Klaster = kmeans_clustering$cluster) %>%
  select(`Kota/Kab`, Klaster) %>%
  arrange(Klaster)
## # A tibble: 119 x 2
##    `Kota/Kab`         Klaster
##    <chr>                <int>
##  1 KOTA JAKARTA PUSAT       1
##  2 KAB. SIDOARJO            2
##  3 KAB. NGAWI               2
##  4 KAB. LAMONGAN            2
##  5 KAB. GRESIK              2
##  6 KOTA SURABAYA            2
##  7 KAB. CILACAP             2
##  8 KAB. BANYUMAS            2
##  9 KAB. PURBALINGGA         2
## 10 KAB. BANJARNEGARA        2
## # ... with 109 more rows

Interpretasi Klaster

Untuk mempermudah dalam memahami dan interpretasi, maka dibuat tabel sebagai berikut :

Dilihat dari rata-rata angka Angka Harapan Hidup, Rasio Puskesmas, Rasio Rumah Sakit PHBS=Persentase RT PHBS, Persentase RT Sanitasi Layak, Persentase Bayi dengan BBLR, Persentase Bayi yang Mendapat Asi Eksklusif, Angka Kesakitan Diare (per 1rb penduduk) pada masing-masing klaster, maka dapat diinterpretasikan bahwa:

  • Klaster 1 berisikan Kota/Kab dengan kualitas kesehatan cukup tinggi di Pulau Jawa.
  • Klaster 2 berisikan Kota/Kab dengan kualitas kesehatan tinggi di Pulau Jawa.
  • Klaster 3 berisikan Kota/Kab dengan kualitas kesehatan rendah di Pulau Jawa.
  • Klaster 4 berisikan Kota/Kab dengan kualitas kesehatan cukup rendah di Pulau Jawa.

Klaster Plot

final <- kmeans(data_standardized, 4, nstart = 25)
fviz_cluster(final, data = data_standardized)