Perbandingan Metode Clustering Berdasarkan Validasi Cluster

Sistem Machine Learning

Deskripsi Dataset

Sumber dan Konteks Data

Dataset Wine Quality tersedia secara publik di UCI Machine Learning Repository, dikembangkan oleh A. Cerdeira, F. Almeida, T. Matos, dan J. Reis (2009) dan dapat diakses di: https://archive.ics.uci.edu/dataset/186/wine+qualitys. Dataset ini berisi informasi mengenai kualitas wine merah (red wine) dan wine putih (white wine) yang diproduksi di wilayah Vinho Verde, Portugal.

Setiap baris dalam dataset merepresentasikan satu sampel wine, sedangkan setiap kolom berisi karakteristik fisikokimia yang digunakan untuk menilai kualitas wine tersebut. Dataset ini memiliki 11 variabel prediktor, yaitu fixed acidity⁠,⁠ volatile acidiy ,⁠ citric acid ,residual sugar⁠, ⁠ chlorides ⁠, ⁠ free sulfur dioxide ⁠,⁠ total sulfur dioxide ⁠, ⁠ density⁠,⁠ pH ⁠, ⁠ sulphates ⁠, dan ⁠ alcohol ⁠, serta 1 variabel target, yaitu ⁠ quality ⁠, yang menunjukkan skor kualitas wine menurut penilaian sensorik para ahli. Dataset ini banyak digunakan dalam penelitian dan pembelajaran machine learning untuk analisis data, klasifikasi, regresi, serta clustering.

Tujuan Analisis

Tugas clustering ini memiliki tujuan analisis sebagai berikut: 1. Memahami karakteristik data wine melalui eksplorasi data dan analisis statistik deskriptif. 2. Melakukan preprocessing data, berupa standardisasi (scalling), untuk memastikan seluruh variabel memiliki skala yang sebanding dalam proses clustering. 3. Mengelompokkan sampel wine berdasarkan kemiripan karakteristik fisikokimianya menggunakan metode K-Means Clustering dan **Hierarchical Clustering.* 4. Mengevaluasi kualitas cluster yang terbentuk menggunakan metode validasi cluster yang sesuai. 5. Membandingkan hasil pengelompokan dari metode K-Means dan Hierarchical Clustering untuk menentukan metode yang memberikan performa terbaik. 5. Mengevaluasi kualitas cluster menggunakan metode validasi cluster yang sesuai, seperti Silhouette Coefficient, Davies-Bouldin Index, atau indeks validasi lainnya. 6. Menginterpretasikan karakteristik setiap cluster yang terbentuk sehingga diperoleh pemahaman mengenai pola alami dan segmentasi sampel wine berdasarkan sifat kimianya.

Input dan Eksplorasi Data Awal

library(readxl)
library(cluster)
library(factoextra)
wine <- read_excel("~/Documents/SML_T4/Dataset_Soal2.xlsx")
cat("Dimensi dataset:", nrow(wine), "baris x", ncol(wine), "kolom\n")
Dimensi dataset: 1599 baris x 12 kolom
str(wine)
tibble [1,599 × 12] (S3: tbl_df/tbl/data.frame)
 $ fixed acidity       : num [1:1599] 7.4 7.8 7.8 11.2 7.4 7.4 7.9 7.3 7.8 7.5 ...
 $ volatile acidity    : num [1:1599] 0.7 0.88 0.76 0.28 0.7 0.66 0.6 0.65 0.58 0.5 ...
 $ citric acid         : num [1:1599] 0 0 0.04 0.56 0 0 0.06 0 0.02 0.36 ...
 $ residual sugar      : num [1:1599] 1.9 2.6 2.3 1.9 1.9 1.8 1.6 1.2 2 6.1 ...
 $ chlorides           : num [1:1599] 0.076 0.098 0.092 0.075 0.076 0.075 0.069 0.065 0.073 0.071 ...
 $ free sulfur dioxide : num [1:1599] 11 25 15 17 11 13 15 15 9 17 ...
 $ total sulfur dioxide: num [1:1599] 34 67 54 60 34 40 59 21 18 102 ...
 $ density             : num [1:1599] 0.998 0.997 0.997 0.998 0.998 ...
 $ pH                  : num [1:1599] 3.51 3.2 3.26 3.16 3.51 3.51 3.3 3.39 3.36 3.35 ...
 $ sulphates           : num [1:1599] 0.56 0.68 0.65 0.58 0.56 0.56 0.46 0.47 0.57 0.8 ...
 $ alcohol             : num [1:1599] 9.4 9.8 9.8 9.8 9.4 9.4 9.4 10 9.5 10.5 ...
 $ quality             : num [1:1599] 5 5 5 6 5 5 5 7 7 5 ...
sum(is.na(wine))
[1] 0

Prepocessing Data (Scalling)

wine_features <- wine[, 1:11]         # hapus variabel quality
wine_scaled <- scale(wine_features)   # scalling data

summary(wine)                         # sebelum scalling
 fixed acidity   volatile acidity  citric acid    residual sugar  
 Min.   : 4.60   Min.   :0.1200   Min.   :0.000   Min.   : 0.900  
 1st Qu.: 7.10   1st Qu.:0.3900   1st Qu.:0.090   1st Qu.: 1.900  
 Median : 7.90   Median :0.5200   Median :0.260   Median : 2.200  
 Mean   : 8.32   Mean   :0.5278   Mean   :0.271   Mean   : 2.539  
 3rd Qu.: 9.20   3rd Qu.:0.6400   3rd Qu.:0.420   3rd Qu.: 2.600  
 Max.   :15.90   Max.   :1.5800   Max.   :1.000   Max.   :15.500  
   chlorides       free sulfur dioxide total sulfur dioxide    density      
 Min.   :0.01200   Min.   : 1.00       Min.   :  6.00       Min.   :0.9901  
 1st Qu.:0.07000   1st Qu.: 7.00       1st Qu.: 22.00       1st Qu.:0.9956  
 Median :0.07900   Median :14.00       Median : 38.00       Median :0.9968  
 Mean   :0.08747   Mean   :15.87       Mean   : 46.47       Mean   :0.9967  
 3rd Qu.:0.09000   3rd Qu.:21.00       3rd Qu.: 62.00       3rd Qu.:0.9978  
 Max.   :0.61100   Max.   :72.00       Max.   :289.00       Max.   :1.0037  
       pH          sulphates         alcohol         quality     
 Min.   :2.740   Min.   :0.3300   Min.   : 8.40   Min.   :3.000  
 1st Qu.:3.210   1st Qu.:0.5500   1st Qu.: 9.50   1st Qu.:5.000  
 Median :3.310   Median :0.6200   Median :10.20   Median :6.000  
 Mean   :3.311   Mean   :0.6581   Mean   :10.42   Mean   :5.636  
 3rd Qu.:3.400   3rd Qu.:0.7300   3rd Qu.:11.10   3rd Qu.:6.000  
 Max.   :4.010   Max.   :2.0000   Max.   :14.90   Max.   :8.000  
summary(wine_scaled)                  # setelah scalling
 fixed acidity     volatile acidity    citric acid       residual sugar   
 Min.   :-2.1364   Min.   :-2.27757   Min.   :-1.39104   Min.   :-1.1623  
 1st Qu.:-0.7005   1st Qu.:-0.76969   1st Qu.:-0.92903   1st Qu.:-0.4531  
 Median :-0.2410   Median :-0.04367   Median :-0.05634   Median :-0.2403  
 Mean   : 0.0000   Mean   : 0.00000   Mean   : 0.00000   Mean   : 0.0000  
 3rd Qu.: 0.5056   3rd Qu.: 0.62649   3rd Qu.: 0.76501   3rd Qu.: 0.0434  
 Max.   : 4.3538   Max.   : 5.87614   Max.   : 3.74240   Max.   : 9.1928  
   chlorides        free sulfur dioxide total sulfur dioxide    density        
 Min.   :-1.60344   Min.   :-1.4221     Min.   :-1.2302      Min.   :-3.53762  
 1st Qu.:-0.37111   1st Qu.:-0.8485     1st Qu.:-0.7438      1st Qu.:-0.60757  
 Median :-0.17989   Median :-0.1792     Median :-0.2574      Median : 0.00176  
 Mean   : 0.00000   Mean   : 0.0000     Mean   : 0.0000      Mean   : 0.00000  
 3rd Qu.: 0.05383   3rd Qu.: 0.4900     3rd Qu.: 0.4722      3rd Qu.: 0.57664  
 Max.   :11.12355   Max.   : 5.3656     Max.   : 7.3728      Max.   : 3.67890  
       pH             sulphates          alcohol       
 Min.   :-3.69924   Min.   :-1.9359   Min.   :-1.8983  
 1st Qu.:-0.65494   1st Qu.:-0.6380   1st Qu.:-0.8661  
 Median :-0.00721   Median :-0.2251   Median :-0.2092  
 Mean   : 0.00000   Mean   : 0.0000   Mean   : 0.0000  
 3rd Qu.: 0.57574   3rd Qu.: 0.4239   3rd Qu.: 0.6353  
 Max.   : 4.52687   Max.   : 7.9162   Max.   : 4.2011  

Metode Clustering

K-Means Clustering

## Penentuan Jumlah Cluster (k) Optimal 
# Elbow Method 
fviz_nbclust(wine_scaled, kmeans, method = "wss") + 
  labs(title    = "Elbow Method - Red Wine Quality",
       subtitle = "Menentukan jumlah cluster optimal (k)",
       x        = "Jumlah Cluster (k)",
       y        = "Total Within Sum of Squares")

# Silhouette Method 
fviz_nbclust(wine_scaled, kmeans, method = "silhouette") + 
  labs(title    = "Silhouette Score - Red Wine Quality",
       subtitle = "Nilai tertinggi = jumlah cluster optimal",
       x        = "Jumlah Cluster (k)",
       y        = "Average Silhouette Width")

Penentuan jumlah cluster optimal dilakukan dengan menggunakan Elbow Method dan Silhouette Method. Elbow Method dipakai untuk menentukan jumlah cluster yang paling tepat berdasarkan nilai Within Cluster Sum of Squares (WSS). Dari grafik Elbow Method, terlihat bahwa nilai WSS mengalami penurunan yang cukup tajam dari k = 1 ke k = 2, lalu penurunannya mulai melambat saat melihat jumlah cluster yang lebih banyak. Titik paling ideal terlihat di sekitar k = 2, jadi jumlah cluster yang layak digunakan adalah 2 cluster.

Kemudian, dilakukan evaluasi menggunakan Silhouette Method. Dari grafik Silhoutte Method, nilai Average Silhouette Width tertinggi ditemukan pada k = 2. Nilai ini lebih tinggi dibandingkan dengan jumlah cluster lainnya, yang menandakan bahwa pembentukan dua cluster menghasilkan hasil kekompakan dan pemisahan antar cluster yang paling baik.

Dari hasil Elbow Method dan Silhouette Method, jumlah cluster yang dipilih untuk analisis selanjutnya adalah 2 cluster. Pemilihan ini didasarkan pada kesamaan hasil dari kedua metode yang menunjukkan bahwa k = 2 adalah jumlah cluster yang paling optimal untuk dataset Wine Quality.

# Menjalankan K-Means 
set.seed(123)

km_wine <- kmeans(wine_scaled, centers = 2, nstart = 25) 
km_wine
K-means clustering with 2 clusters of sizes 590, 1009

Cluster means:
  fixed acidity volatile acidity citric acid residual sugar  chlorides
1     0.9207271       -0.6361774   0.9851367     0.16097077  0.2641746
2    -0.5383835        0.3719967  -0.5760462    -0.09412562 -0.1544728
  free sulfur dioxide total sulfur dioxide    density         pH  sulphates
1          -0.2356324           -0.2152177  0.4994664 -0.7077417  0.5314734
2           0.1377831            0.1258458 -0.2920566  0.4138430 -0.3107723
     alcohol
1  0.1730540
2 -0.1011911

Clustering vector:
   [1] 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 1 1 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2
  [38] 1 2 1 1 2 1 1 2 2 2 1 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2
  [75] 1 1 1 2 2 2 2 1 2 1 2 2 1 2 1 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2
 [112] 2 2 1 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 1
 [149] 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
 [186] 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 2 1 1 2 2 1 1 2 1 2 2 2 2 2 2 2 2 2
 [223] 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 1 1 2 2 2 2 2 1 2 1 2 2 2 1 2 1
 [260] 1 2 2 2 2 1 1 2 1 2 1 2 1 1 2 2 2 2 1 1 1 1 1 2 1 2 2 1 2 2 1 2 1 1 2 1 1
 [297] 1 2 2 2 2 1 2 2 1 1 2 1 1 2 1 2 2 2 2 2 2 2 1 2 1 2 2 1 1 1 1 1 1 1 1 1 2
 [334] 2 2 1 1 2 1 1 1 1 1 1 1 2 2 1 1 2 1 2 2 1 2 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1
 [371] 2 1 1 2 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 2 1 1 1 1 1 2 1 1 2 2 2 1 1 2 1 1
 [408] 1 1 1 2 2 2 1 2 1 1 2 1 2 1 2 2 1 2 2 2 2 1 1 1 2 1 1 1 1 2 1 1 2 1 1 1 1
 [445] 2 2 1 1 2 1 1 1 2 1 2 1 1 2 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1
 [482] 1 1 1 1 1 1 1 1 1 2 1 1 2 2 1 2 2 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [519] 1 2 1 2 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 2 1
 [556] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2 1 1 2
 [593] 1 1 2 1 1 1 2 1 2 1 2 1 2 2 1 1 1 2 1 1 2 1 1 2 2 1 1 1 2 2 1 2 2 2 2 2 2
 [630] 2 2 1 2 2 2 2 2 2 2 1 1 2 1 2 1 2 2 2 2 2 1 2 1 1 1 1 1 1 2 2 2 2 2 1 1 2
 [667] 1 1 1 1 2 2 2 2 1 1 1 2 2 1 1 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 1 2 2
 [704] 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2
 [741] 2 2 2 1 1 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2
 [778] 2 1 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 1 1 1 2 2 2 1 1 2
 [815] 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 1 2 1 2 1 2 1 2 2 2 2 2 1
 [852] 1 1 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2 2 2 2 1 2 2 2 2 1
 [889] 2 1 2 2 1 2 2 2 1 2 1 2 1 2 2 2 2 2 2 2 2 2 1 1 1 1 2 1 2 2 2 2 1 2 2 2 1
 [926] 2 1 2 1 1 2 2 2 2 2 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 1 2
 [963] 2 1 1 1 1 2 1 2 1 1 1 1 1 2 2 2 2 1 1 2 2 1 1 2 1 2 2 1 2 2 2 2 1 2 2 2 2
[1000] 2 2 1 1 2 2 2 1 1 1 1 1 1 2 2 2 1 1 2 2 2 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 1
[1037] 2 2 1 2 2 2 2 1 2 2 2 2 1 1 2 1 2 1 2 2 1 2 1 1 1 1 1 1 2 2 2 1 1 2 1 2 2
[1074] 2 2 1 1 1 1 1 1 1 2 1 2 2 1 1 1 1 1 1 2 1 2 1 2 1 1 1 1 2 2 2 2 2 1 1 2 1
[1111] 2 2 1 1 2 2 2 2 2 2 2 2 2 1 2 1 2 2 1 1 2 2 2 2 1 2 1 1 2 2 2 1 2 2 2 1 2
[1148] 1 2 1 1 2 2 1 2 2 1 2 1 1 1 1 1 2 2 1 1 1 2 2 1 2 1 2 2 2 2 2 2 1 1 1 1 2
[1185] 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 1 2 2 2 2 2 1 1 1 2 2 1 1 1
[1222] 1 2 1 1 1 2 1 2 2 1 2 2 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[1259] 2 2 1 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 1 2 2 1 1 2 2 2 2 2
[1296] 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 2 1 1 2 2 2 2 2 2 2 2
[1333] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 1 2 2 2 2 1 2
[1370] 2 1 1 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 1 1 2 1
[1407] 1 2 1 2 2 2 1 1 1 2 1 2 2 2 2 2 2 2 1 1 1 2 2 1 2 2 2 2 1 1 1 2 2 2 2 2 2
[1444] 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 1 2 2 1
[1481] 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 1 2 2 2 2 2 2 2
[1518] 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2
[1555] 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2
[1592] 2 2 2 2 2 2 2 2

Within cluster sum of squares by cluster:
[1] 6810.586 7510.572
 (between_SS / total_SS =  18.5 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      
km_clust <- km_wine$cluster
table(km_clust)              
km_clust
   1    2 
 590 1009 
fviz_cluster(km_wine, data = wine_scaled, geom = "point")

Hasil clustering menunjukkan bahwa dari total 1.599 data yang diperiksa, Cluster 1 terdiri dari 590 data dan Cluster 2 terdiri dari 1.009 data. Visualisasi menggunakan PCA menjadi 2 dimensi, dimana sumbu Dim1 menunjukkan 28,2% variasi, dan Dim2 menunjukkan 17,5% variasi, jadi jika kita jumlahkan kedua dimensi itu, mereka mewakili sekitar 45,7% informasi dari data yang asli.

Dari cluster plot yang dibuat, terlihat bahwa Cluster 1 (merah) lebih banyak berada di sisi kanan dengan nilai Dim1 positif, sementara Cluster 2 (wbiru) lebih banyak ada di sisi kiri dengan nilai Dim1 negatif. Kedua cluster ini menunjukkan pemisahan yang jelas, meskipun ada sedikit area di tengah yang bercampur, yang normal karena kedua dimensi hanya menggambarkan sebagian dari total variasi data. Secara keseluruhan, gambar ini menunjukkan bahwa K-Means berhasil membagi 2 kelompok wine yang memiliki ciri yang berbeda satu sama lain.

Hierarchial Clustering

## Matriks Jarak
set.seed(123)
dist_wine <- dist(wine_scaled, method = "euclidean")

## Pemilihan Linkage Terbaik (Agglomerative Coefficient) --
linkage_methods        <- c("average", "single", "complete", "ward")
names(linkage_methods) <- c("Average", "Single", "Complete", "Ward")
 
ac_values <- sapply(linkage_methods, function(m) round(agnes(wine_scaled, method = m)$ac, 4))
 
data.frame(Linkage                   = names(ac_values),
           Agglomerative_Coefficient = ac_values,
           row.names                 = NULL)
   Linkage Agglomerative_Coefficient
1  Average                    0.9199
2   Single                    0.8729
3 Complete                    0.9548
4     Ward                    0.9881

Untuk membuat model Hierarchical Clustering, gunakan cara Euclidean Distance untuk mengukur jarak antara data yang berbeda. Setelah itu, tentukan metode linkage terbaik berdasarkan nilai Agglomerative Coefficient (AC). Nilai AC yang mendekati 1 menandakan bahwa struktur cluster lebih kuat. Dari empat cara linkage yang diuji, cara Ward memberikan nilai AC tertinggi yaitu 0.9881, jadi cara ini dipilih sebagai yang terbaik untuk analisis Hierarchical Clustering berikutnya.

# => Linkage dengan AC tertinggi dipilih (Ward)
 
## Pemodelan menggunakan Ward's Linkage
hc_ward <- hclust(dist_wine, method = "ward.D2")

plot(
  hc_ward, labels = FALSE, hang = -1,
  main = "Dendrogram Hierarchical Clustering"
)

rect.hclust(
  hc_ward,
  k = 2,
  border = "green"
)

cl_ward     <- cutree(hc_ward, k = 2)
cl_ward 
   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1
  [38] 2 1 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1
  [75] 1 2 2 1 1 1 1 2 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2
 [112] 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
 [149] 1 1 2 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1
 [186] 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 2 2 1 1 2 2 1 2 1 1 1 1 1 1 1 1 1
 [223] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 2 2 1 1 1 1 1 2 1 2 1 1 1 2 1 2
 [260] 2 1 1 1 1 2 2 1 2 1 2 1 2 1 1 1 1 1 2 2 1 2 2 1 1 1 1 1 1 1 1 1 2 1 1 2 2
 [297] 1 1 1 1 1 2 1 1 1 2 1 2 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1
 [334] 1 1 2 2 1 1 2 2 2 2 2 2 1 1 2 1 1 1 1 1 2 1 1 1 2 2 2 1 1 2 2 2 2 2 2 1 2
 [371] 1 2 1 1 2 2 2 2 2 1 2 2 2 2 1 1 1 1 1 1 1 2 2 1 2 2 1 2 2 1 1 2 2 2 1 2 2
 [408] 2 2 1 1 1 1 2 1 1 2 1 2 1 1 1 1 2 1 1 1 1 2 2 2 1 2 2 1 2 1 2 1 1 2 2 2 2
 [445] 1 1 1 1 1 2 2 2 1 2 2 2 1 1 2 2 2 1 2 1 2 2 1 2 2 1 2 1 1 2 2 1 2 2 1 1 1
 [482] 2 2 2 2 1 1 1 1 2 1 2 2 1 1 2 1 1 2 1 1 2 2 2 2 2 2 2 1 2 1 1 2 2 2 1 2 2
 [519] 2 1 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 2 2 1 2 1 1 2 1 1 2 1 2 1 1 1 1 2
 [556] 2 2 2 2 2 2 1 1 1 2 2 2 2 2 1 2 1 2 1 1 1 1 1 1 1 2 2 2 2 1 1 2 1 1 2 1 1
 [593] 1 2 1 1 2 2 1 2 1 2 1 2 1 1 2 1 1 1 1 2 1 2 1 1 1 2 2 2 1 1 1 2 1 1 1 1 1
 [630] 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2 2 1 2 2 2 1 2 1 1 2 2 1
 [667] 2 2 1 2 1 1 1 1 2 2 2 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 2 1 1 1
 [704] 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1
 [741] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1
 [778] 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 2 1 1 2 2 2 1 1 1 1 1 2 2 2 2 1 1 2 1 2
 [815] 2 1 2 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 2
 [852] 2 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 2 1 1 1 1 1
 [889] 1 1 1 1 2 1 1 1 2 1 2 1 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 2 1 1 1 2
 [926] 1 1 1 2 2 1 1 1 1 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 1
 [963] 1 2 2 1 2 1 2 1 2 2 2 2 2 1 1 1 2 2 2 1 1 2 2 1 2 1 1 2 1 1 1 1 1 1 1 1 1
[1000] 1 2 1 2 2 1 2 2 2 2 1 2 2 1 1 1 2 2 1 1 1 2 2 1 2 1 1 2 1 1 1 1 1 1 1 1 2
[1037] 2 1 2 1 1 1 1 2 2 1 1 1 2 2 1 2 1 2 1 1 2 1 1 2 2 2 2 2 1 1 1 2 2 1 2 1 1
[1074] 1 1 1 2 2 2 1 2 1 1 1 1 1 2 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 1 2 2 1 2 2 1 1
[1111] 1 1 2 2 1 1 1 1 1 1 2 1 1 1 1 2 2 1 1 1 1 1 2 1 2 2 2 2 1 1 1 1 1 2 1 1 2
[1148] 2 2 2 2 1 1 1 1 1 1 1 2 1 2 2 2 1 1 2 1 1 2 2 2 1 2 1 1 1 1 1 1 2 2 2 1 1
[1185] 1 2 1 2 1 1 2 1 2 1 1 1 1 1 2 1 1 2 2 1 2 2 2 1 2 2 1 1 1 2 2 2 1 1 2 2 1
[1222] 1 1 2 2 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1
[1259] 1 1 2 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1
[1296] 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 2 2 1 1 1 1 1 1 1 1
[1333] 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1
[1370] 1 2 2 2 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 2 2 1 2
[1407] 1 1 1 1 1 2 1 1 2 1 2 2 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1
[1444] 1 1 1 1 1 1 2 2 2 1 1 2 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2
[1481] 1 2 2 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 2 2 2 1 1 1 1 1 1 2
[1518] 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2 1 1 1 1 2 1 1 1 1
[1555] 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 2 2 1 1 1 2 1 1 1 2 2 1 1 1 1 1
[1592] 1 1 1 1 1 1 1 2
table(cl_ward)
cl_ward
   1    2 
1114  485 
fviz_cluster(
  list(
    data = wine_scaled,
    cluster = cl_ward
  ),
  geom = "point",
  ellipse.type = "convex",
  main = "Cluster Hierarchical"
)

Model Hierarchical Clustering dibuat menggunakan metode Ward’s Linkage, yang menghasilkan dendrogram yang terbagi menjadi 2 cluster utama yang dipisahkan pada height sekitar 65-70. . Ini menunjukkan bahwa kedua cluster tersebut mempunyai karakteristik yang sangat berbeda. Hasil pemotongan dendrogram menggunakan cutree() dengan k = 2 menghasilkan Cluster 1 yang terdiri dari 1.114 data dan Cluster 2 yang terdiri dari 485 data dari total 1.599 observasi.

Visualisasi dengan PCA menunjukkan bahwa Cluster 1 (merah) mendominasi di sisi kiri dengan penyebaran yang lebih luas, sementara Cluster 2 (biru) berada di sisi kanan dengan penyebaran yang lebih rapat, dengan sedikit tumpang tindih di area tengah pada Dim1 (28.2%) dan Dim2 (17.5%).

Validasi (evaluasi) Cluster

sil_kmeans   <- silhouette(km_clust, dist_wine)
sil_ward     <- silhouette(cl_ward, dist_wine)

avg_sil_kmeans   <- mean(sil_kmeans[, 3])
avg_sil_ward     <- mean(sil_ward[, 3])

fviz_silhouette(sil_kmeans)
  cluster size ave.sil.width
1       1  590          0.12
2       2 1009          0.27

Validasi model K-Means menggunakan Silhouette menghasilkan rata-rata Silhouette Score yang didapat adalah 0.21, di mana Cluster 1 mendapatkan nilai 0.12 dan Cluster 2 mendapatkan nilai 0.27. Cluster 2 menunjukkan pemisahan yang lebih baik daripada Cluster 1, namun kedua nilai tersebut masih dianggap rendah karena berada di bawah 0.5.

fviz_silhouette(sil_ward)
  cluster size ave.sil.width
1       1 1114          0.19
2       2  485          0.16

Sementara itu, model Hierarchical Clustering dengan menggunakan Silhouette, diperoleh rata-rata sebesar 0.18, di mana Cluster 1 mendapat nilai 0.19 dan Cluster 2 mendapat nilai 0.16. Kedua cluster memiliki nilai yang cukup mirip tetapi keduanya tetap walaupun rendah, ini menunjukkan bahwa ada tumpang tindih antara cluster di dataset wine in

Kesimpulan

Dari perbandingan kedua metode, K-Means menunjukkan nilai Silhouette Score yang lebih tinggi (0.21 lebih besar dari 0.18), yang artinya K-Means membentuk kelompok yang lebih padat dan terpisah dengan baik dibandingkan Hierarchical Clustering. Meski begitu, kedua nilai ini masih dianggap rendah karena berada di bawah 0.5, yang menunjukkan bahwa ada tumpang tindih antara kelompok dalam dataset wine ini.

Membandingkan Hasil Kedua Metode

hasil_validasi <- data.frame(
  Metode               = c("K-Means Clustering", "HC - Ward's Linkage"),
  Avg_Silhouette_Score = round(c(avg_sil_kmeans, avg_sil_ward), 4),
  Keterangan           = ifelse(c(avg_sil_kmeans, avg_sil_ward) == max(avg_sil_kmeans, avg_sil_ward),
                                "TERBAIK", "-")
)
 
print(hasil_validasi)
               Metode Avg_Silhouette_Score Keterangan
1  K-Means Clustering               0.2137    TERBAIK
2 HC - Ward's Linkage               0.1834          -

Berdasarkan perbandingan antara kedua model, K-Means Clustering dipilih sebagai model yang paling baik karena memiliki nilai Average Silhouette Score tertinggi yaitu 0.2137, sementara Hierarchical Clustering Ward’s Linkage hanya mendapatkan nilai 0.1834. Ini berarti K-Means menciptakan kelompok yang lebih teratur dan terpisah dengan baik dalam dataset wine ini.

Karakteristik Tiap Cluster

K-Means Clustering

wine$Cluster <- km_wine$cluster

aggregate(. ~ Cluster,
          data = wine,
          FUN = mean)
  Cluster fixed acidity volatile acidity citric acid residual sugar  chlorides
1       1      9.922712        0.4139068   0.4628814       2.765763 0.09990000
2       2      7.382260        0.5944301   0.1587611       2.406095 0.08019623
  free sulfur dioxide total sulfur dioxide   density       pH sulphates
1            13.41017             39.38814 0.9976893 3.201847 0.7482373
2            17.31615             50.60753 0.9961955 3.375005 0.6054708
   alcohol  quality
1 10.60740 5.894915
2 10.31515 5.484638

Cluster 1 (590 data) adalah kelompok wine yang memiliki fixed acidity yang lebih tinggi (9,92), citric acid yang lebih tinggi (0,46), sulphates yang lebih tinggi (0,75), serta densitas yang lebih tinggi (0,9977). Selain itu, cluster ini memiliki volatile acidity yang lebih rendah (0,41) dan nilai pH yang lebih rendah (3,20). Rata-rata kualitas wine dari cluster ini sebesar 5,89, yang lebih tinggi dibandingkan cluster lainnya. Karakteristik ini menunjukkan bahwa Cluster 1 biasanya berisi anggur yang memiliki keasaman lebih tinggi dan kualitas yang lebih baik.

Cluster 2 (1.009 data) adalah kelompok wine yang mempunyai volatile acidity yang tinggi (0.59), free sulfur dioxide yang tinggi (17.32), total sulfur dioxide yang tinggi (50.61), dan pH yang tinggi (3.38). Namun, cluster ini memiliki fixed acidity yang rendah (7.38) dan citric acid yang rendah (0.16). Rata-rata kualitas wine dari cluster ini lebih rendah (5.48) jika dibandingkan dengan Cluster 1.

Hierarchial Clustering

wine$Cluster_HC <- cl_ward

aggregate(. ~ Cluster_HC,
          data = wine,
          mean)
  Cluster_HC fixed acidity volatile acidity citric acid residual sugar
1          1      7.733573        0.5873968   0.1872621       2.558079
2          2      9.665773        0.3909794   0.4632577       2.494536
   chlorides free sulfur dioxide total sulfur dioxide   density       pH
1 0.08231149            18.38959             54.64542 0.9965869 3.351813
2 0.09930722            10.09897             27.68454 0.9971137 3.217629
  sulphates  alcohol  quality  Cluster
1 0.6228905 10.22557 5.447935 1.846499
2 0.7391340 10.87643 6.068041 1.136082

Cluster 1 (1.114 data) adalah kelompok wine yang memiliki sifat dengan volatile acidity tinggi (0.59), free sulfur dioxide tinggi (18.39), total sulfur dioxide tinggi (54.65), dan pH yang juga tinggi (3.35). Namun, kelompok ini memiliki fixed acidity yang rendah (7.73) dan citric acid yang rendah (0.19). Rata-rata kualitas wine dalam kelompok ini lebih rendah (5.45) jika dibandingkan dengan Cluster 2.

Cluster 2 (485 data) adalah kelompok anggur dengan sifat yang menunjukkan fixed acidity tinggi (9.67), citric acid tinggi (0.46), sulphates tinggi (0.74), dan kadar alkohol tinggi (10.88). Meskipun begitu, kelompok ini memiliki volatile acidity yang rendah (0.39) dan total sulfur dioxide yang rendah (27.68). Rata-rata kualitas wine di kelompok ini lebih tinggi (6.07) dibandingkan dengan Cluster 1.