Pendahuluan

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.

install library

install.packages(“cluster”)

install.packages(“factoextra”)

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/

load dan Import Data

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

Preprocessing data

Cleaning ID dan class

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))]

scaling

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)

Penentuan Jumlah Cluster

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")

K-means

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"

Visualisasi

fviz_cluster(kmeans_model, data = df_scaled)

Evaluasi

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

Kesimpulan

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.