1 Introduction

Cluster analysis is a multivariate method which aims to classify a sample of subjects (or objects) on the basis of a set of measured variables into a number of different groups such that similar subjects are placed in the same group.

2 Approaches to cluster analysis

There are a number of different methods that can be used to carry out a cluster analysis; these methods can be classified as follows:

  1. Hierarchical methods
  2. Non-hierarchical methods (often known as k-means clustering methods)

3 Example k-means clustering methods

Prosedur penerapan K-means

  1. Pre-processing data

  2. Memilih banyaknya gerombol

  3. Menerapkan K-means

  4. Interprestasi Gerombol yang terbentuk

Package yang dibutuhkan

Ada beberapa package yang dibutuhkan.

  1. ggplot

  2. dplyr

  3. cluster

  4. factoextra

JIka belum diinstall, silahkan diinstall terlebih dahulu.

Kali ini saya akan memeriksa apakah package sudah terinstall atau belum, jika belum maka di install. Codenya adalah:

  if (!require("nama_package")) install.packages("nama_package")

Penjelasan:

  if (!require("nama_package"))
  

Bagian ini memeriksa apakah package tidak berhasil dimuat (nilai FALSE dari require). Tanda seru ! berarti “tidak”, sehingga kode akan dieksekusi hanya jika package belum terinstal.

  install.packages("nama_package")

Jika package tidak ada, maka kode ini akan menginstalnya secara otomatis.

Kemudian memanggil package dengan

library("nama_package")

Berikut adalah codenya:

if (!require("ggplot2")) install.packages("ggplot2") #Install and load required packages
## Loading required package: ggplot2
if (!require("dplyr")) install.packages("dplyr") #Install and load required packages
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
if (!require("cluster")) install.packages("cluster") #Install and load required packages
## Loading required package: cluster
if (!require("factoextra")) install.packages("factoextra") #Install and load required packages
## Loading required package: factoextra
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggplot2)
library(dplyr)
library(cluster)
library(factoextra)

Data

Saya ingin mengelompokan wilayah di Sumatera. Data yang dimiliki adalah stasiun ID (sebanyak 200), curah hujan dan suhu. Data belum ada sehingga pada kesempatan ini kita akan mensimulasikan data:

  1. Curah Hujan (0mm-500mm)

  2. Suhu (20°C-38°C)

Berikut code:

# Simulate data (replace this with your dataset)
set.seed(123)  # For reproducibility
Sumatera <- data.frame(
  StasiunID = 1:200,
  CurahHujan = sample(0:500, 200, replace = TRUE),
  Suhu = sample(20:38, 200, replace = TRUE)
)

head(Sumatera)
##   StasiunID CurahHujan Suhu
## 1         1        414   30
## 2         2        462   35
## 3         3        178   27
## 4         4         13   22
## 5         5        194   23
## 6         6        425   31

Preprosessing Data

Peubah yang digunakan untuk menerapkan k-means adalah 2 (dua) peubah (Curah Hujan dan Suhu). Oleh karena itu peubah StasiunID yang tidak kita gunakan akan kita sisihkan terlebih dahulu. dengan code:

Sumatera_features <- Sumatera %>% select(CurahHujan, Suhu) #remove StasiunId
head(Sumatera_features) # View the first few rows of the Sumatera_features data
##   CurahHujan Suhu
## 1        414   30
## 2        462   35
## 3        178   27
## 4         13   22
## 5        194   23
## 6        425   31

Pada dataframe yang baru, hanya tersisa dua peubah itu saja.

Standarisasi peubah

Standarisasi peubah merupakan proses transformasi peubah menjadi peubah yang memiliki rata-rata nol dan simpangan baku satu. Process standarisasi ini dilakukan jika kita melihat perbedanan satuan pengukuran peubah-peubah yang digunakan. Standarisasi dilakukan karena metode k-means menggunakan konsep jarak antara objek/amatan, yang mana sensitif terhadap satuan pengukuran.

Dalam R, standarisasi data bisa dilakukan dengan menggunakan fungsi scale.

Sumatera_features_standardize <- scale(Sumatera_features) # mean 0 and standar deviation 1
head(Sumatera_features_standardize)# View the first few rows of the Sumatera_features_standardize data # Check the scaled data
##      CurahHujan       Suhu
## [1,]  1.1020719  0.1531414
## [2,]  1.4298155  1.0926594
## [3,] -0.5093340 -0.4105693
## [4,] -1.6359526 -1.3500873
## [5,] -0.4000861 -1.1621837
## [6,]  1.1771798  0.3410450
apply(Sumatera_features_standardize,2,mean)
##   CurahHujan         Suhu 
## 1.149607e-17 2.399052e-16
apply(Sumatera_features_standardize,2,sd)
## CurahHujan       Suhu 
##          1          1

Data telah berubah setelah dilakukan standarisasi.Rata-rata dan simpangan baku peubah setelah distandarisasi mendekati nol dan satu.

Catatan: Dalam tahapan pre-processing data, kita menyiapkan data agar metode k-means bisa diterapkan secara maksimal. Terdapat dua hal yang umumnya dilakukan pada tahap ini adalah memilih peubah yang digunakan dan melakukan standarisasi peubah.

Memilih banyaknya gerombol

Dalam metode k-means, sebelum membentuk gerombol dilakukan terlebih dahulu penentuan banyaknya gerombol. Banyaknya gerombol dapat ditentukan dengan menggunakan beberapa kriteria statistik, seperti koefisien silhouette dan Within Sum of Square (WSS) yang dikenal dengan sebutan elbow.

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

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

Dengan menggunakan kriteria tersebut, kita bisa membandingkan banyaknya gerombol yang paling sesuai pada data yang kita sedang analisis.

Dalam R, fungsi fviz_nbclust dari package factoextra dapat digunakan untuk memilih banyaknya gerombol.

# Elbow method to determine optimal k
fviz_nbclust(Sumatera_features_standardize, kmeans, method = "wss") +
  labs(title = "Elbow Method for Choosing Optimal k")

Untuk kriteria koefisien silhoutte, banyaknya gerombol dengan nilai koefisien tertinggi yang kita pilih. Sedangkan pada WSS, banyaknya gerombol yang kita pilih didasarkan pada banyaknya gerombol yang mana garisnya berbentuk seperti siku (elbow). Pada gambar diatas garis membentuk siku saat berada di gerombol keempat. Karena penentuan ini berdasarkan visual,jadi setiap orang mungkin berbeda melihat pola sikunya.

Berdasarkan kriteria tersebut, banyaknya gerombol terbaik yang dipilih adalah 4.

Kadangkala kedua metode memberikan penilaian yang berbeda. Jika terjadi demikian, banyaknya gerombol bisa ditentukan berdasarkan kemudahan interpretasi gerombol yang terbentuk.

Note: secara default banyaknya gerombol yang dicobakan pada fungsi fviz_nbclust adalah 10, jika ingin merubah hal tersebut bisa dilakukan dengan menggunakan argumen kmax dalam fungsi,misal kmax=20.

Menerapkan K-means

Setelah kita mendapatkan banyaknya gerombol terbaik, maka selajutnya kita akan menerapkan metode k-means untuk mendapatkan label gerombol pada setiap amatan.

# Perform k-means clustering with k = 4
set.seed(123)
kmeans_result <- kmeans(Sumatera_features_standardize, centers = 4, nstart = 50)
kmeans_result
## K-means clustering with 4 clusters of sizes 61, 45, 40, 54
## 
## Cluster means:
##   CurahHujan       Suhu
## 1  0.9942792  0.7014503
## 2 -1.1086799 -0.8323085
## 3 -0.8311031  1.0081028
## 4  0.4163646 -0.8455314
## 
## Clustering vector:
##   [1] 1 1 2 2 2 1 1 2 1 4 3 3 4 3 3 3 4 2 1 2 1 1 3 4 4 4 2 2 1 2 4 4 1 3 2 3 1
##  [38] 1 1 3 2 1 2 4 1 1 4 2 1 1 1 2 4 4 3 3 4 4 1 2 2 2 2 2 4 4 1 3 4 4 4 2 1 3
##  [75] 1 4 2 3 3 4 4 1 2 1 3 2 3 4 4 1 1 2 2 2 2 4 3 1 4 4 2 4 1 2 1 4 1 4 4 4 2
## [112] 3 2 3 2 1 4 1 4 3 3 2 1 1 2 3 3 2 3 3 1 4 2 4 4 3 4 4 3 4 4 4 1 1 4 1 4 1
## [149] 1 1 2 1 3 1 1 1 3 2 2 1 4 3 1 3 4 3 1 1 3 4 1 3 1 4 1 4 4 1 1 2 1 1 2 1 4
## [186] 3 3 2 3 1 4 3 2 3 2 4 2 1 4 1
## 
## Within cluster sum of squares by cluster:
## [1] 31.71485 22.55079 19.10382 31.57920
##  (between_SS / total_SS =  73.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Interprestasi Hasil Gerombol

Label gerombol untuk setiap amatan/objek, bisa diperoleh dengan menggunakan $cluster. Kemudian,interpretasi setiap gerombol yang terbentuk dapat dilakukan dengan menggunakan bantuan nilai rata-rata dari masing-masing peubah dihitung berdasarkan gerombol. Karena kita melakukan standarisasi peubah, maka nilai rata-rata yang diperoleh juga dalam skala standarisasi.

kmeans_result$centers
##   CurahHujan       Suhu
## 1  0.9942792  0.7014503
## 2 -1.1086799 -0.8323085
## 3 -0.8311031  1.0081028
## 4  0.4163646 -0.8455314

Jika sulit membaca hasil dalam bentuk skala standarisasi maka kita bisa menggunakan fungsi aggregate untuk melihat rata-ratanya dalam skala aslinya. Fungsi ini dapat menghitung rata-rata setiap peubah berdasarkan gerombol yang terbentuk.

aggregate(Sumatera_features,by =list(gerombol=kmeans_result$cluster),
            FUN = mean)
##   gerombol CurahHujan     Suhu
## 1        1  398.21311 32.91803
## 2        2   90.22222 24.75556
## 3        3  130.87500 34.55000
## 4        4  313.57407 24.68519

Jika gerombol mengacu pada wilayah tertentu, dapat dikatakan:

Gerombol 1: Wilayah dengan curah hujan sangat tinggi dan suhu cukup tinggi.

Gerombol 2: Wilayah dengan curah hujan rendah dan suhu cukup rendah.

Gerombol 3: Wilayah dengan curah hujan sedang dan suhu tinggi.

Gerombol 4: Wilayah dengan curah hujan tinggi dan suhu rendah.

# Alternative 2D plot
ggplot(Sumatera, aes(x = CurahHujan, y = Suhu, color = factor(kmeans_result$cluster))) +
  geom_point(size = 3) +
  labs(title = "Iklim", x = "Curah Hujan", y = "Suhu") +
  theme_minimal()

# Visualize clusters
fviz_cluster(kmeans_result, data = Sumatera_features_standardize, 
             geom = "point", ellipse.type = "norm", 
             main = "Iklim")