library("factoextra")
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
setwd("C:/Users/ASUS/Documents/SEMESTER 5/Data Mining")

Data Kualitas Wine

Kedua kumpulan data tersebut terkait dengan varian merah dan putih anggur Portugis “Vinho Verde”. Untuk lebih jelasnya, lihat referensi [Cortez et al., 2009]. Karena masalah privasi dan logistik, hanya variabel fisikokimia (input) dan sensorik (output) yang tersedia (misalnya, tidak ada data tentang jenis anggur, merek anggur, harga jual anggur, dll.). Kumpulan data ini dapat dilihat sebagai tugas klasifikasi atau regresi. Kelas-kelasnya teratur dan tidak seimbang (misalnya, terdapat lebih banyak anggur normal daripada anggur berkualitas baik atau buruk).. ## Metode K-means ## Prosedur penerapan K-means 1. Pre-processing data 2. Memilih banyaknya Cluster 3. Menerapkan K-means 4. Interprestasi cluster yang terbentuk

data_wine <- read.csv("winequality-red.csv")
head(data_wine)
dim(data_wine)
## [1] 1599   12

Pre-processing data

Peubah yang digunakan untuk menerapkan k-means adalah peubah fixed.acidity”, “volatile.acidity”, “citric.acid”, “residual.sugar”,“chlorides”, “free.sulfur.dioxide”, “total.sulfur.dioxide”,“density”, “pH”, “sulphates”, dan “alcohol”. Oleh karena itu peubah yang tidak kita gunakan akan kita hilangkan terlebih dahulu.

data_wine <- data_wine[, c("fixed.acidity", "volatile.acidity", "citric.acid", "residual.sugar", 
                            "chlorides", "free.sulfur.dioxide", "total.sulfur.dioxide",
                            "density", "pH", "sulphates", "alcohol")]
head(data_wine)

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 contoh(umur dan pendapatan).

data_wine_standardize <- scale(data_wine)
apply(data_wine_standardize,2,mean)
##        fixed.acidity     volatile.acidity          citric.acid 
##         3.518207e-16         1.841869e-16        -9.207575e-17 
##       residual.sugar            chlorides  free.sulfur.dioxide 
##        -1.156003e-16         6.639223e-17        -5.600528e-17 
## total.sulfur.dioxide              density                   pH 
##         3.789652e-17         2.413764e-14        -2.245475e-17 
##            sulphates              alcohol 
##         2.009076e-17         8.717304e-17
apply(data_wine_standardize,2,sd)
##        fixed.acidity     volatile.acidity          citric.acid 
##                    1                    1                    1 
##       residual.sugar            chlorides  free.sulfur.dioxide 
##                    1                    1                    1 
## total.sulfur.dioxide              density                   pH 
##                    1                    1                    1 
##            sulphates              alcohol 
##                    1                    1

Jika kita perhatikan rata-rata dan simpangan baku peubah setelah distandarisasimendekati nol dan satu. Note: Dalam tahapan pre-processing data, kita menyiapkan data agar metode kmeans bisa diterapkan secara maksimal. Dua hal yang umumnya dilakukan pada tahap ini adalah memilih peubah yang digunakan dan melakukan standarisasi peubah.

Memilih banyaknya cluster

Umumnya, banyaknya cluster dapat ditentukan dengan menggunakan beberapa kriteria statistik, seperti koe sien silhouette dan WSS atau (Within Sum of Square).Kriteria koe sien silhouette dihitung berdasarkan jarak antar amatan. Koesien ini mengukur seberapa dekat suatu amatan dengan amatan lain yang berada di cluster yang sama (dikenal sebagai ukuran cohesion) dibandingkan dengan jarak terhadap amatan lain yang berada di cluster berbeda (dikenal sebagai ukuran separation). Koesien yang nilainya semakin besar menunjukkan bahwa cluster yang terbentuk sudah sesuai.Kriteria WSS merupakan kriteria yangmenghitung keragamaan dalam cluster yang terbentuk. Semakin kecil keragaman dalam cluster yang terbentuk menunjukkan bahwa cluster yang terbentuk sudah sesuai.Dengan menggunakan kriteria tersebut, kita bisa membandingkan banyaknya cluster yang paling sesuai pada data yang kita sedang analisis. Dalam R, fungsi fviz_nbclust daripackage factoextra dapat digunakan untuk memilih banyaknya cluster.

 #complete 
fviz_nbclust(data_wine_standardize,FUNcluster = hcut,method = "silhouette", 
             hc_method = "complete",hc_metric = "euclidean")

#average 
fviz_nbclust(data_wine_standardize,FUNcluster = hcut,method = "silhouette", 
             hc_method = "average",hc_metric = "euclidean")

#centroid 
fviz_nbclust(data_wine_standardize,FUNcluster = hcut,method = "silhouette", 
             hc_method = "centroid",hc_metric = "euclidean")

 #ward 
fviz_nbclust(data_wine_standardize,FUNcluster = hcut,method = "silhouette", 
             hc_method = "ward.D",hc_metric = "euclidean")

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

Berdasarkan kedua kriteria tersebut, banyaknya cluster terbaik yang dipilih berbeda. Jika demikian, banyaknya cluster bisa ditentukan berdasarkan kemudahan interpretasi cluster yang terbentuk. Pada tulisan ini kita akan menggunakan 4 cluster saja. Note: secara default banyaknya cluster 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 cluster terbaik, maka selajutnya kita akan menerapkan metode kmenas untuk mendapatkan label cluster pada setiap amatan. Fungsi eclust dari package factoextra digunakan untuk menerpkan metode kmeans.

Pada fungsi eclust , kita cukup memasukan data yang sebelum distandarisasi, karena dalam fungsi tersebut terdapat argumen stand , yang jika diatur stand=TRUE secara otomatis data yang kita gunakan akan distandarisasi.

kmeans_wine <- eclust(data_wine,stand = TRUE,FUNcluster = "kmeans",k=8,graph = F)
kmeans_wine$cluster
##    [1] 5 5 5 6 5 5 5 5 5 1 5 1 3 2 7 7 7 4 5 4 7 7 2 5 5 5 5 2 5 5 5 5 7 1 5 5 5
##   [38] 2 5 1 1 7 4 2 5 3 7 2 5 7 5 5 5 7 7 5 2 1 5 5 7 7 5 5 5 5 5 5 2 5 5 7 7 5
##   [75] 7 2 2 5 5 7 5 4 7 4 8 5 4 5 7 5 7 4 4 5 3 3 5 5 5 5 5 5 5 5 5 5 4 5 7 7 5
##  [112] 7 7 2 5 2 5 5 5 7 5 5 5 5 7 7 5 5 5 5 7 3 3 5 5 5 5 5 7 7 5 5 3 5 3 7 3 7
##  [149] 5 2 8 4 7 7 1 1 1 1 5 7 5 5 5 1 1 7 7 5 5 4 5 5 5 3 5 5 5 5 5 5 5 4 5 5 5
##  [186] 7 7 5 7 7 7 5 7 5 5 7 5 6 3 3 2 7 5 5 5 6 6 7 7 2 8 5 2 7 5 1 5 5 5 7 7 7
##  [223] 5 5 7 7 4 5 7 5 3 5 7 5 5 5 5 5 5 5 4 6 7 6 6 5 5 5 5 5 2 5 2 7 5 7 2 5 4
##  [260] 2 7 5 5 7 6 2 5 8 5 6 7 6 6 5 1 7 5 6 2 2 6 4 5 2 7 7 6 7 5 6 5 4 2 5 6 6
##  [297] 7 5 5 5 5 2 5 5 7 6 5 2 2 2 6 7 7 7 7 8 7 7 7 7 7 7 5 7 1 1 6 2 6 2 2 2 7
##  [334] 5 3 6 8 7 6 6 6 2 2 2 6 7 3 6 2 5 6 5 5 6 7 3 6 2 6 6 7 7 6 6 6 2 6 6 6 2
##  [371] 7 2 8 7 6 6 6 2 6 7 2 6 2 2 7 5 7 5 7 2 3 6 2 7 6 6 1 6 6 5 1 8 6 6 5 2 2
##  [408] 6 2 6 7 7 5 2 7 1 2 7 6 5 7 3 5 2 5 3 3 5 2 6 2 7 2 6 6 6 7 6 6 5 6 6 6 2
##  [445] 3 5 6 2 5 6 6 4 5 2 8 6 2 7 2 6 2 5 2 7 6 2 2 8 6 7 6 2 6 2 2 2 2 2 2 5 1
##  [482] 2 6 6 2 2 2 2 6 2 7 8 8 7 1 2 5 7 2 7 5 1 1 2 2 2 2 6 7 6 6 7 6 2 2 1 6 6
##  [519] 2 7 2 7 7 7 7 7 7 7 7 2 2 6 6 8 2 2 2 5 6 6 7 2 5 6 6 7 5 2 6 2 5 2 2 3 6
##  [556] 6 6 6 6 6 6 7 7 7 6 6 5 5 2 3 6 3 2 2 6 6 2 7 7 2 6 6 6 6 7 5 6 7 3 2 7 7
##  [593] 7 6 5 1 6 6 5 6 5 6 5 6 7 5 2 7 6 3 7 6 5 2 4 7 7 6 6 6 7 7 2 8 5 5 5 5 5
##  [630] 7 5 2 5 5 7 5 7 7 5 2 2 7 2 7 2 5 5 5 8 1 6 7 6 2 2 7 6 6 5 5 5 5 5 2 6 7
##  [667] 2 6 2 6 7 5 7 5 2 2 2 5 7 2 6 5 7 5 7 5 5 5 5 2 5 7 4 7 7 3 5 5 7 6 7 5 5
##  [704] 7 5 5 5 5 5 2 7 7 5 5 7 5 5 5 5 5 5 7 5 7 5 5 5 5 5 3 4 5 5 7 5 5 5 5 7 5
##  [741] 5 7 5 6 6 5 7 7 5 5 5 5 7 5 4 3 3 5 5 7 7 5 5 5 5 5 7 7 7 5 7 7 7 2 2 5 5
##  [778] 5 2 7 5 5 7 5 5 2 2 7 7 7 7 7 5 5 8 6 7 8 2 2 7 5 3 5 5 8 8 8 5 2 5 6 2 8
##  [815] 6 2 2 8 5 5 5 3 5 5 5 5 8 5 3 3 5 3 7 7 5 5 8 8 2 5 2 5 7 7 2 5 5 5 5 5 2
##  [852] 2 7 7 7 3 7 8 2 3 5 3 5 5 5 5 8 8 3 3 3 3 7 8 2 8 5 3 7 5 5 3 8 5 7 5 5 8
##  [889] 3 1 7 5 2 5 5 3 8 3 8 5 8 5 5 5 5 7 7 3 3 8 8 1 2 2 8 8 3 1 7 3 2 7 3 1 8
##  [926] 7 7 7 8 8 5 5 7 5 5 8 8 6 8 3 8 8 2 2 8 2 2 8 8 8 8 8 8 8 8 2 2 2 3 5 8 5
##  [963] 5 8 8 8 2 7 8 5 2 2 2 8 8 7 7 7 8 2 2 5 3 2 2 5 8 7 5 2 5 7 7 7 7 5 3 3 5
## [1000] 3 8 2 8 8 7 8 8 8 8 7 8 2 5 5 5 2 8 8 8 5 2 2 5 8 5 5 8 3 7 5 3 5 5 5 5 2
## [1037] 8 5 8 8 5 5 8 1 8 3 5 7 2 2 7 4 3 8 7 7 2 7 2 2 2 8 8 2 5 5 3 2 2 7 8 1 7
## [1074] 5 1 7 2 2 2 1 8 1 7 8 7 7 2 8 6 6 8 8 3 8 5 2 5 2 8 2 8 8 3 8 8 3 8 8 5 6
## [1111] 5 3 8 2 3 5 5 5 8 3 8 3 3 2 3 8 8 3 7 7 5 7 8 5 8 8 2 2 7 7 7 8 8 8 7 8 5
## [1148] 2 8 8 8 3 5 2 3 5 8 3 8 2 2 2 8 5 5 4 2 8 8 8 2 3 2 7 7 3 3 3 3 8 8 8 7 5
## [1185] 7 8 3 8 7 5 8 5 8 5 5 5 7 5 8 7 5 8 8 1 8 8 8 7 8 8 5 7 5 2 2 8 7 8 2 8 2
## [1222] 2 7 2 6 7 7 5 3 7 8 7 7 2 3 1 5 3 5 3 7 7 8 7 1 5 5 5 8 3 3 7 5 5 5 3 7 5
## [1259] 3 3 4 3 7 5 8 5 5 2 7 3 3 3 3 7 5 7 8 5 7 8 7 7 5 7 8 2 8 3 7 7 5 7 3 5 7
## [1296] 7 7 3 3 5 3 3 8 8 7 7 7 3 7 7 7 3 5 7 7 7 3 2 7 4 7 3 8 8 8 8 8 8 5 7 7 7
## [1333] 5 5 5 3 5 5 5 5 5 5 5 5 6 5 3 5 5 3 7 3 5 5 5 5 5 3 1 2 2 5 2 5 3 5 5 7 7
## [1370] 5 4 8 4 7 5 7 5 3 5 5 5 5 7 7 7 7 5 5 5 7 3 5 5 7 7 5 5 7 5 5 7 7 8 2 2 8
## [1407] 2 3 8 3 3 8 2 7 2 5 2 8 5 7 5 7 3 5 2 2 8 8 5 8 8 7 3 5 1 1 7 3 5 7 8 7 5
## [1444] 3 7 7 5 5 7 8 8 2 3 7 6 3 3 7 8 8 7 5 5 5 7 7 7 3 7 5 5 3 8 3 1 3 1 3 5 2
## [1481] 3 2 2 8 5 5 5 3 3 3 8 3 3 7 5 5 7 3 5 3 5 7 5 8 8 5 5 8 2 8 7 5 5 3 5 5 8
## [1518] 3 2 5 3 5 8 7 5 5 5 5 7 7 3 5 5 7 3 5 3 3 3 7 3 8 3 2 8 5 5 3 6 8 5 5 3 5
## [1555] 3 5 5 3 1 7 7 7 5 5 5 3 8 5 5 3 8 3 7 3 1 8 8 3 3 3 8 3 3 7 8 8 8 3 3 1 3
## [1592] 3 3 5 3 3 3 3 8
kmeans_wine$centers
##   fixed.acidity volatile.acidity citric.acid residual.sugar   chlorides
## 1   -0.18857827     -0.051566914  0.40008716     4.24343185  0.20625325
## 2    0.80955355     -0.741265755  0.88471134    -0.06902883 -0.01772547
## 3   -1.15420272      0.525702588 -0.99524582    -0.22645047 -0.41913885
## 4    0.09538646      0.002199115  1.18118314    -0.38975023  5.78295058
## 5   -0.45727349      0.660679526 -0.84357776    -0.20022763 -0.05588116
## 6    2.15406562     -0.454988733  1.44734318     0.27507562  0.04886576
## 7   -0.08307253      0.074148722  0.04147444    -0.10125972 -0.03025283
## 8   -0.15291178     -1.038546752  0.57552742    -0.20725075 -0.34942088
##   free.sulfur.dioxide total.sulfur.dioxide     density          pH   sulphates
## 1          1.58937177            1.7416784  1.03507819 -0.19448751  0.08530535
## 2         -0.66539380           -0.6380229  0.38921381 -0.54485139  0.30986218
## 3          0.33326698           -0.1174709 -1.35286412  1.33653184 -0.13010773
## 4         -0.04950011            0.5101700  0.18001552 -1.73524868  3.66226647
## 5         -0.45792966           -0.4212037 -0.01924555  0.36770972 -0.39956795
## 6         -0.39207817           -0.3151087  1.57200450 -1.29178658  0.40062982
## 7          0.96607165            1.2009235  0.22167873 -0.12372199 -0.21624443
## 8         -0.12768975           -0.4297860 -0.99324496 -0.02450573  0.27778655
##       alcohol
## 1 -0.31532027
## 2  0.14745355
## 3  1.26449348
## 4 -0.86945926
## 5 -0.49029731
## 6 -0.05581428
## 7 -0.59594251
## 8  1.20029092

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

Interprestasi cluster yang terbentuk

Berdasarkan nilai rata-rata dari $centers , berikut adalah interpretasinya

Kluster 1:

Memiliki tingkat fixed.acidity yang rendah. Tingkat volatile.acidity yang rendah hingga sedang. Kandungan citric.acid yang sedang hingga tinggi. Tingkat residual.sugar yang tinggi. Tingkat chlorides yang sedang hingga tinggi.

Kluster 2: Memiliki tingkat fixed.acidity yang sedang hingga tinggi. Tingkat volatile.acidity yang rendah hingga sedang. Kandungan citric.acid yang sedang hingga tinggi. Tingkat residual.sugar yang rendah hingga sedang. Tingkat chlorides yang rendah.

Kluster 3: Memiliki tingkat fixed.acidity yang rendah hingga sedang. Tingkat volatile.acidity yang tinggi. Kandungan citric.acid yang rendah hingga sedang. Tingkat residual.sugar yang rendah hingga sedang. Tingkat chlorides yang rendah hingga sedang.

Kluster 4: Memiliki tingkat fixed.acidity yang sedang. Tingkat volatile.acidity yang rendah hingga sedang. Kandungan citric.acid yang tinggi. Tingkat residual.sugar yang sedang hingga tinggi. Tingkat chlorides yang sangat tinggi.

Kluster 5: Memiliki tingkat fixed.acidity yang rendah hingga sedang. Tingkat volatile.acidity yang sedang hingga tinggi. Kandungan citric.acid yang rendah hingga sedang. Tingkat residual.sugar yang rendah hingga sedang. Tingkat chlorides yang rendah hingga sedang.

Kluster 6: Memiliki tingkat fixed.acidity yang sangat tinggi. Tingkat volatile.acidity yang rendah hingga sedang. Kandungan citric.acid yang tinggi. Tingkat residual.sugar yang tinggi. Tingkat chlorides yang rendah.

Kluster 7: Memiliki tingkat fixed.acidity yang sedang hingga tinggi. Tingkat volatile.acidity yang rendah hingga sedang. Kandungan citric.acid yang rendah hingga sedang. Tingkat residual.sugar yang sedang hingga tinggi. Tingkat chlorides yang sedang hingga tinggi.

Kluster 8: Memiliki tingkat fixed.acidity yang sedang hingga tinggi. Tingkat volatile.acidity yang sangat tinggi. Kandungan citric.acid yang sedang hingga tinggi. Tingkat residual.sugar yang rendah hingga sedang. Tingkat chlorides yang rendah hingga sedang.

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 cluster yang terbentuk.

aggregate(data_wine,by =list(cluster=kmeans_wine$cluster),FUN = mean)
fviz_cluster(kmeans_wine)

pca_wine <- prcomp(data_wine_standardize)
pca_wine$rotation
##                              PC1          PC2         PC3          PC4
## fixed.acidity         0.48931422  0.110502738 -0.12330157  0.229617370
## volatile.acidity     -0.23858436 -0.274930480 -0.44996253 -0.078959783
## citric.acid           0.46363166  0.151791356  0.23824707  0.079418256
## residual.sugar        0.14610715 -0.272080238  0.10128338  0.372792562
## chlorides             0.21224658 -0.148051555 -0.09261383 -0.666194756
## free.sulfur.dioxide  -0.03615752 -0.513566812  0.42879287  0.043537818
## total.sulfur.dioxide  0.02357485 -0.569486959  0.32241450  0.034577115
## density               0.39535301 -0.233575490 -0.33887135  0.174499758
## pH                   -0.43851962 -0.006710793  0.05769735  0.003787746
## sulphates             0.24292133  0.037553916  0.27978615 -0.550872362
## alcohol              -0.11323207  0.386180959  0.47167322  0.122181088
##                              PC5         PC6         PC7         PC8
## fixed.acidity        -0.08261366 -0.10147858  0.35022736 -0.17759545
## volatile.acidity      0.21873452 -0.41144893  0.53373510 -0.07877531
## citric.acid          -0.05857268 -0.06959338 -0.10549701 -0.37751558
## residual.sugar        0.73214429 -0.04915555 -0.29066341  0.29984469
## chlorides             0.24650090 -0.30433857 -0.37041337 -0.35700936
## free.sulfur.dioxide  -0.15915198  0.01400021  0.11659611 -0.20478050
## total.sulfur.dioxide -0.22246456 -0.13630755  0.09366237  0.01903597
## density               0.15707671  0.39115230  0.17048116 -0.23922267
## pH                    0.26752977  0.52211645  0.02513762 -0.56139075
## sulphates             0.22596222  0.38126343  0.44746911  0.37460432
## alcohol               0.35068141 -0.36164504  0.32765090 -0.21762556
##                               PC9        PC10         PC11
## fixed.acidity        -0.194020908  0.24952314 -0.639691452
## volatile.acidity      0.129110301 -0.36592473 -0.002388597
## citric.acid           0.381449669 -0.62167708  0.070910304
## residual.sugar       -0.007522949 -0.09287208 -0.184029964
## chlorides            -0.111338666  0.21767112 -0.053065322
## free.sulfur.dioxide  -0.635405218 -0.24848326  0.051420865
## total.sulfur.dioxide  0.592115893  0.37075027 -0.068701598
## density              -0.020718675  0.23999012  0.567331898
## pH                    0.167745886  0.01096960 -0.340710903
## sulphates             0.058367062 -0.11232046 -0.069555381
## alcohol              -0.037603106  0.30301450  0.314525906