Dataset Ecoli adalah dataset yang digunakan untuk analisis clustering berbasis kemiripan fitur numerik, Pada project ini digunakan metode K-Means untuk mengelompokkan data tanpa menggunakan label kelas.
library(cluster)
## Warning: package 'cluster' was built under R version 4.5.3
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.5.3
## Loading required package: ggplot2
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
ecoli <- read.table("ecoli.data", header = FALSE)
colnames(ecoli) <- c("seq", "mcg", "gvh", "lip", "chg", "aac", "alm1", "alm2", "class")
str(ecoli)
## 'data.frame': 336 obs. of 9 variables:
## $ seq : chr "AAT_ECOLI" "ACEA_ECOLI" "ACEK_ECOLI" "ACKA_ECOLI" ...
## $ mcg : num 0.49 0.07 0.56 0.59 0.23 0.67 0.29 0.21 0.2 0.42 ...
## $ gvh : num 0.29 0.4 0.4 0.49 0.32 0.39 0.28 0.34 0.44 0.4 ...
## $ lip : num 0.48 0.48 0.48 0.48 0.48 0.48 0.48 0.48 0.48 0.48 ...
## $ chg : num 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
## $ aac : num 0.56 0.54 0.49 0.52 0.55 0.36 0.44 0.51 0.46 0.56 ...
## $ alm1 : num 0.24 0.35 0.37 0.45 0.25 0.38 0.23 0.28 0.51 0.18 ...
## $ alm2 : num 0.35 0.44 0.46 0.36 0.35 0.46 0.34 0.39 0.57 0.3 ...
## $ class: chr "cp" "cp" "cp" "cp" ...
head(ecoli)
## seq mcg gvh lip chg aac alm1 alm2 class
## 1 AAT_ECOLI 0.49 0.29 0.48 0.5 0.56 0.24 0.35 cp
## 2 ACEA_ECOLI 0.07 0.40 0.48 0.5 0.54 0.35 0.44 cp
## 3 ACEK_ECOLI 0.56 0.40 0.48 0.5 0.49 0.37 0.46 cp
## 4 ACKA_ECOLI 0.59 0.49 0.48 0.5 0.52 0.45 0.36 cp
## 5 ADI_ECOLI 0.23 0.32 0.48 0.5 0.55 0.25 0.35 cp
## 6 ALKH_ECOLI 0.67 0.39 0.48 0.5 0.36 0.38 0.46 cp
Pada tahap preprocessing, dilakukan beberapa langkah penting sebelum proses clustering. Pertama, kolom yang tidak relevan seperti ID dan label kelas dihapus, karena clustering hanya menggunakan fitur numerik sebagai dasar pengelompokan
df <- ecoli[, -c(1, ncol(ecoli))]
Selanjutnya dilakukan proses scaling terhadap data. Scaling bertujuan untuk menyamakan skala antar variabel sehingga tidak ada fitur yang mendominasi hanya karena memiliki rentang nilai yang lebih besar. Proses ini penting dalam K-Means karena metode ini berbasis jarak
df_scaled <- scale(df)
Sebelum melakukan clustering, perlu ditentukan jumlah cluster yang optimal. Salah satu metode yang digunakan adalah Elbow Method. Metode ini bekerja dengan menghitung total within-cluster sum of squares (WSS) untuk berbagai jumlah cluster. Nilai WSS akan menurun seiring bertambahnya jumlah cluster, namun pada titik tertentu penurunannya tidak signifikan lagi. Titik tersebut disebut sebagai “elbow” dan dianggap sebagai jumlah cluster yang optimal.
fviz_nbclust(df_scaled, kmeans, method = "wss")
set.seed(123)
kmeans_model <- kmeans(df_scaled, centers = 3, nstart = 25)
kmeans_model
## K-means clustering with 3 clusters of sizes 79, 151, 106
##
## Cluster means:
## mcg gvh lip chg aac alm1
## 1 0.8867861 1.2790073 0.345778434 0.17747468 0.1518098 -0.1328362
## 2 -0.7583938 -0.5886906 -0.174881538 -0.05455447 -0.4380437 -0.7823259
## 3 0.4194468 -0.1146159 -0.008579094 -0.05455447 0.5108644 1.2134460
## alm2
## 1 -0.7893671
## 2 -0.5075602
## 3 1.3113357
##
## Clustering vector:
## [1] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [38] 1 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2
## [112] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3
## [149] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3
## [186] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 2 2 2 2 2 3 3 1 3
## [223] 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3
## [260] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [297] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 2 1 1
## [334] 1 1 1
##
## Within cluster sum of squares by cluster:
## [1] 780.7412 298.1104 319.4923
## (between_SS / total_SS = 40.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(kmeans_model, data = df_scaled)
Untuk mengevaluasi kualitas clustering, digunakan metode Silhouette Score. Nilai silhouette mengukur seberapa baik suatu data berada dalam cluster-nya dibandingkan dengan cluster lain. Nilai silhouette berkisar antara -1 hingga 1: Mendekati 1 → cluster sangat baik Mendekati 0 → cluster tumpang tindih Negatif → kemungkinan salah pengelompokan Dengan ini kita dapat diketahui apakah hasil clustering sudah cukup optimal atau masih perlu diperbaiki.
sil <- silhouette(kmeans_model$cluster, dist(df_scaled))
fviz_silhouette(sil)
## cluster size ave.sil.width
## 1 1 79 0.14
## 2 2 151 0.48
## 3 3 106 0.41
Berdasarkan hasil analisis, metode K-Means berhasil mengelompokkan data ke dalam beberapa cluster berdasarkan kemiripan fitur numerik. Meskipun dataset memiliki label kelas, pendekatan clustering tidak menggunakan informasi tersebut, sehingga hasil cluster bisa berbeda dari kelas asli. Analisis ini menunjukkan bahwa terdapat pola tertentu dalam dataset yang dapat diidentifikasi melalui pendekatan unsupervised learning. Hasil ini dapat menjadi dasar untuk analisis lanjutan atau eksplorasi lebih dalam terhadap struktur data.