K-Means merupakan salah satu metode data clustering nonhierarki yang berusaha mempartisi data yang ada dalam bentuk satu atau lebih cluster, sehingga data dengan karakteristik yang sama dikelompokan dalam satu cluster yang sama pula. Data dengan karakteristik yang berbeda dikelompokan dalam kelompok yang lain. Metode yang termasuk dalam algoritma clustering berbasis jarak yang membagi data kedalam sejumlah cluster dan algoritma ini hanya bekerja pada atribut numerik.
k-Means merupakan salah satu algoritma dalam data mining yang biasa digunakan untuk melakukan clustering suatu data. Ada banyak pendekatan untuk membuat cluster, diantaranya adalah membuat aturan yang mendikte keanggotaan dalam kelompok yang sama berdasarkan tingkat persamaan di antara anggotaanggotanya. Pendekatan lainnya adalah dengan membuat sekumpulan fungsi yang mengukur beberapa properti dari pengelompokan tersebut sebagai fungsi dari beberapa parameter dari sebuah clustering.
Berikut sebagai pengantar metode clustering k-means:
Replication Requirements: Apa yang Anda perlukan untuk mereproduksi analisis dalam tutorial ini
Persiapan Data: Mempersiapkan data untuk analisis klaster
Clustering Distance Measures: Memahami bagaimana mengukur perbedaan dalam pengamatan
K-Means Clustering: Perhitungan dan metode untuk membuat subgrup K dari data
Menentukan Cluster Optimal: Mengidentifikasi jumlah cluster yang tepat untuk mengelompokkan data Anda
Untuk melakukan Analysis ini, package yang diperlukan ialah:
library(tidyverse) # data manipulation
library(cluster) # clustering algorithms
library(factoextra) # clustering algorithms & visualization
library(PerformanceAnalytics)
library(ggpubr)
library(tibble)
library(MVN)Kemiskinan merupakan masalah multi dimensi yang dihadapi oleh negara-negara di dunia.Kemiskinan adalah ketidakmampuan untuk memenuhi standar hidup minimum (Kuncoro, 1997). Persentase jumlah penduduk miskin di Indonesia terkonsentrasi dipulau Jawa sebesar lebih dari 50 %, dimana provinsi Jawa Tengah merupakan provinsi yang persentase tingkat kemiskinan absolutnya paling tinggi se-Jawa dalam beberapa tahun belakangan ini. Masih tingginya rata-rata tingkat kemiskinan absolut di Jawa Tengah yang berada pada level 20,02% dimana hal tersebut masih tergolong Hard Core Poverty (>10% ) dalam artian tingkat kemiskinan masih berada pada level yang tinggi. Kemudian hampir sekitar 50% kabupaten / kota di Jawa Tengah masih memiliki tingkat kemiskinan absolut > 20%. Data yang digunakan adalah data Kemiskinan untuk melihat Dimensi Kualitas Kesehatan dan Kualitas Ekonomi di Jawa Tengah Tahun 2015.
#read data
data=read.csv(file.choose(),header=TRUE)
# cek data
head(data)Keterangan:
X1 = Persentase rumah tangga miskin yang luas lantai bangunan tempat tinggalnya kurang dari 32 m2
X2 = Persentase rumah tangga miskin yang jenis lantai bangunan tempat tinggalnya terbuat dari tanah/kayu berkualitas rendah per kabupaten
X3 = persentase rumah tangga miskin yang sumber air minumnya berasal dari sumur/mata air tidak terlindung/sungai per kabupaten
X4 = persentase rumah tangga miskin yang tidak mempunyai jenis atap dari genteng per kabupaten
X5 = persentase rumah tangga miskin yang tidak sanggup membayar biaya pengobatan di puskemas per kabupaten
X6 = persentase rumah tangga miskin yang menggunakan bahan bakar untuk memasak sehari-hari adalah kayu bakar per kabupaten
# mengambil variabel numerik
index <- data[,3:8]
rownames(index) <- data$Kabupaten[1:31]
str(index)> 'data.frame': 31 obs. of 6 variables:
> $ X1: num 43.6 35 36 24.5 22.5 ...
> $ X2: num 28.7 17.7 17.4 14.5 23.4 ...
> $ X3: num 82.2 95.7 52.7 44.9 52.5 48.2 36.6 70 67.4 52.1 ...
> $ X4: num 1.53 2.5 2.7 1.5 1.35 1.87 2.9 2.76 2.3 1.98 ...
> $ X5: num 2.74 1.92 5.54 4.62 4.51 2.54 3.77 1.65 6.98 5.83 ...
> $ X6: num 62.5 49.1 54.9 59.2 60.6 ...
# cek apakah ada atau tidaknya NA
index %>%
anyNA()> [1] FALSE
# Cek seberapa banyak jumlah NA pada masing-masing kolom
index %>%
is.na() %>%
colSums()> X1 X2 X3 X4 X5 X6
> 0 0 0 0 0 0
Tidak terdapat nilai outlier pada data dan tidak ada data yang dihilangkan
#cek korelasi
chart.Correlation(index)Karena X1 dan X3 memiliki korelasi/hubungan yang ditandai dengan
**, maka kita bisa menggunakan salah satu variabel saja.
#melakukan standarisasi data
data_standar <- scale(index)#cleansing variabel X3
kluster <- data_standar[,-3]Pilihan ukuran jarak merupakan langkah penting dalam pengelompokan. Ini mendefinisikan bagaimana kesamaan dua elemen (x, y) dihitung dan itu akan mempengaruhi bentuk cluster.
Menghitung dan memvisualisasikan matriks jarak menggunakan fungsi get_dist dan fviz_dist dari package factoextra .
jarak <- get_dist(kluster)
fviz_dist(jarak, gradient = list(low="#BF00FF",
mid="white", high="#FFC0CB"))Dilakukan pengelempokkan data menjadi 3 cluster (center=3). Selain center, k-means juga memiliki opsi nstart yang digunakan untuk mencoba beberapa konfigurasi awal dan melaporkan yang terbaik, misalnya menambahkan nstart = 25 akan menghasilkan 25 konfigurasi awal, pendekatan ini sering direkomendasikan.
Parameter:
x: datasetcenters: banyaknya centroid kNote: perlu dilakukan set.seed() karena terdapat random initialization pada tahap awal k-means
# k-means dengan 3 cluster
RNGkind(sample.kind = "Rounding")
set.seed(100)
k3 <- kmeans(x= kluster , centers = 3, nstart = 25)
#visualiasi
fviz_cluster(k3, data = kluster)Penentuan cluster itu subyektif tergantung peneliti, mari kita coba menggunakan cluster 2
k2 <- kmeans(kluster, centers = 2, nstart = 25)
# plots to compare
p1 <- fviz_cluster(k2, geom = "point", data = kluster) + ggtitle("k = 2")
p2 <- fviz_cluster(k3, geom = "point", data = kluster) + ggtitle("k = 3")
library(gridExtra)
grid.arrange(p1, p2, nrow = 2)Meskipun penilaian visual ini memberi tahu kita di mana dilineasi yang sebenarnya terjadi atau tidak terjadi antar klaster, itu tidak memberi tahu kita berapa jumlah klaster yang optimal.
Seperti yang kita ingat, ketika menentukan jumlah cluster yang akan digunakan sebaiknya menggunakan jumlah cluster yang optimal. Untuk membantu analisis kita akan menggunakan metode Elbow dengan fungsi fviz_nbclust
# Elbow
set.seed(100)
fviz_nbclust(kluster, kmeans, method = "wss")Ketika titik cluster di angka index 2 menunjukkan pergerakan yang mulai landai, maka didapatkan jumlah cluster optimum yaitu 2 kelompok
set.seed(123)
final <- kmeans(kluster, 2, nstart = 25)
print(final)> K-means clustering with 2 clusters of sizes 17, 14
>
> Cluster means:
> X1 X2 X4 X5 X6
> 1 0.4180072 0.04527236 0.6631895 0.2194396 -0.4352088
> 2 -0.5075801 -0.05497358 -0.8053015 -0.2664624 0.5284679
>
> Clustering vector:
> Cilacap Banyumas Purbalingga Banjarnegara Kebumen Purworejo
> 1 1 1 2 2 1
> Wonosobo Magelang Boyolali Klaten Sukoharjo Wonogiri
> 1 1 1 1 1 2
> Karanganyar Sragen Grobogan Blora Rembang Pati
> 1 2 1 1 2 1
> Kudus Jepara Demak Semarang Temanggung Kendal
> 2 2 2 1 1 1
> Batang Pekalongan Pemalang Tegal Brebes Surakarta
> 2 2 2 2 1 2
> Salatiga
> 2
>
> Within cluster sum of squares by cluster:
> [1] 67.41817 50.42880
> (between_SS / total_SS = 21.4 %)
>
> Available components:
>
> [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
> [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(final, data = kluster)Dari 31 kota diperoleh 2 group, Cluster 1 terdapat 14 kota, Cluster 2 terdapat 17 kota
Selanjutnya kita akan menampilkan data frame dari data yang telah uji dan ditambahkan dengan hasil cluster sebagai berikut :
df.cluster = data.frame(data, final$cluster)
df.clusterTerdapat 2 kelompok atau cluster yang diperoleh dari analisis yang dilakukan. Adapun cluster tersebut adalah sebagai berikut:
Cluster 1 terdapat 14 Kab/Kota yaitu, Banjarnegara, Kebumen, Wonogiri, Sragen, rembang, Kudus, Jepara, Demak, Batang, Pekalongan, Pemalang, Tegal, Surakarta, dan Salatiga.
Cluster 2 terdapat 14 Kab/Kota yaitu, Cilacap, Banyumas, Purbalingga, Purworejo, Wonosobo, Magelang, Boyolali, Klaten, Sukoharjo, Karanganyar, Grobogan, Blora, Pati, Semarang, Temanggung, Kendal, Brebes.
Indikator kemiripan antar anggota cluster 1 dapat didasarkan pada rata-rata angka persentase rumah tangga miskin yang menggunakan bahan bakar untuk memasak sehari-hari adalah kayu bakar yang tinggi yaitu 61% dibandingkan dengan cluster 2.
Indikator kemiripan antar anggota cluster 2 dapat didasarkan pada rata-rata angka persentase rumah tangga miskin yang sumber air minumnya berasal dari sumur/mata air tidak terlindung/sungai yang memiliki rata-rata yang tinggi yaitu 60% dibandingkan dengan cluster 1.
Cluster 2 merupakan kelompok tingkat kemiskinan yang lebih tinggi. Hal ini dibuktikan dengan rata-rata yang tinggi dari setiap variabel dibandingkan dengan cluster 1. Oleh karena itu pemerintah dapat lebih meperhatikan atau meningkatkan kualitas kesehatan dan kualitas ekonomi pada kota-kota tersebut
Dari pengclusteran yang telah terbentuk diperoleh kelompok daerah dengan tingkat kualitas kesehatan dan kualitas ekonomi yang kurang baik hingga baik berturut-turut adalah cluster 2, dan cluster 1.
K-means clustering adalah algoritma yang sangat sederhana dan cepat. Selain itu, ia dapat menangani kumpulan data yang sangat besar secara efisien. Namun, ada beberapa kelemahan dari pendekatan k-means.Salah satu kelemahan potensial dari pengelompokan K-means adalah mengharuskan kita untuk menentukan terlebih dahulu jumlah cluster dan sensitif terhadap outlier dan hasil yang berbeda dapat terjadi jika Anda mengubah urutan data Anda.