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 =
Data yang digunakan adalah data indikator Kesehatan Kota/Kab di Indonesia pada tahun 2017. Data Indikator tersebut adalah :
library(readr) #Membaca data
library(dplyr) #Data processing
library(DT) #Menampilkan tabel agar mudah dilihat di browser
library(factoextra) #untuk clustering dan visualisasi
jawa_data <- read_csv("kesehatan_jawa.csv")
datatable(jawa_data, caption = "Indikator Kesehatan di Pulau Jawa")
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")
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.
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.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 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
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:
final <- kmeans(data_standardized, 4, nstart = 25)
fviz_cluster(final, data = data_standardized)