Ilustrasi wine
Wine merupakan minuman beralkohol yang terbuat dari fermentasi anggur. Umumnya, wine memiliki kandungan kadar alkohol sebesar 6 - 21%. Wine telah diproduksi sejak ribuan tahun lalu. Saat ini, terdapat 5 negara penghasil wine terbesar di dunia, yaitu Italia, Spanyol, Prancis, Amerika Serikat dan Cina. Italia juga merupakan salah satu negara dengan tingkat konsumsi wine per orang paling tinggi di dunia.
Projek ini menggunakan dataset dari Kaggle yang berisi hasil analisis kandungan kimiawi dalam wine yang diproduksi di suatu wilayah di Italia. Projek ini bertujuan untuk membagi wine yang ada menjadi beberapa kluster berdasarkan kandungan kimiawinya.
library(tidyverse)
library(GGally)
library(factoextra)
library(FactoMineR)
<- read.csv("wine-clustering.csv")
wine ::paged_table(wine) rmarkdown
Terdapat 13 karakteristik kimiawi wine yang terdapat dalam dataset ini, meliputi:
* Alcohol
* Malic acid
* Ash
* Alcalinity of ash
* Magnesium
* Total phenols
* Flavanoids
* Nonflavanoid phenols
* Proanthocyanins
* Color intensity
* Hue
* OD280 of diluted wines
* Proline
Periksa apakah ada data yang missing.
anyNA(wine)
## [1] FALSE
Tidak terdapat nilai missing pada dataset ini, sehingga analisis dapat dilanjutkan.
summary(wine)
## Alcohol Malic_Acid Ash Ash_Alcanity
## Min. :11.03 Min. :0.740 Min. :1.360 Min. :10.60
## 1st Qu.:12.36 1st Qu.:1.603 1st Qu.:2.210 1st Qu.:17.20
## Median :13.05 Median :1.865 Median :2.360 Median :19.50
## Mean :13.00 Mean :2.336 Mean :2.367 Mean :19.49
## 3rd Qu.:13.68 3rd Qu.:3.083 3rd Qu.:2.558 3rd Qu.:21.50
## Max. :14.83 Max. :5.800 Max. :3.230 Max. :30.00
## Magnesium Total_Phenols Flavanoids Nonflavanoid_Phenols
## Min. : 70.00 Min. :0.980 Min. :0.340 Min. :0.1300
## 1st Qu.: 88.00 1st Qu.:1.742 1st Qu.:1.205 1st Qu.:0.2700
## Median : 98.00 Median :2.355 Median :2.135 Median :0.3400
## Mean : 99.74 Mean :2.295 Mean :2.029 Mean :0.3619
## 3rd Qu.:107.00 3rd Qu.:2.800 3rd Qu.:2.875 3rd Qu.:0.4375
## Max. :162.00 Max. :3.880 Max. :5.080 Max. :0.6600
## Proanthocyanins Color_Intensity Hue OD280
## Min. :0.410 Min. : 1.280 Min. :0.4800 Min. :1.270
## 1st Qu.:1.250 1st Qu.: 3.220 1st Qu.:0.7825 1st Qu.:1.938
## Median :1.555 Median : 4.690 Median :0.9650 Median :2.780
## Mean :1.591 Mean : 5.058 Mean :0.9574 Mean :2.612
## 3rd Qu.:1.950 3rd Qu.: 6.200 3rd Qu.:1.1200 3rd Qu.:3.170
## Max. :3.580 Max. :13.000 Max. :1.7100 Max. :4.000
## Proline
## Min. : 278.0
## 1st Qu.: 500.5
## Median : 673.5
## Mean : 746.9
## 3rd Qu.: 985.0
## Max. :1680.0
Terdapat perbedaan skala pada seluruh variabel, di mana terdapat variabel dengan nilai yang sangat tinggi, sehingga perlu dilakukan scaling pada dataset.
<- scale(wine) wine_z
Selanjutnya, mengingat seluruh variabel pada dataset ini merupakan variabel numerik, periksa bagaimana korelasi antar variabel.
ggcorr(wine, hjust = 1, label = T)
Terdapat beberapa variabel yang berkorelasi secara kuat dengan variabel lainnya. Apabila dataset ini digunakan untuk keperluan supervised learning, tingginya korelasi antar variabel dapat diatasi dengan feature extraction menggunakan Principal Component Analysis (PCA).
K-means merupakan sebuah algoritma yang berfungsi untuk membagi dataset menjadi beberapa kelompok yang tidak saling tumpang tindih (kluster), sesuai jumlah kelompok yang telah ditentukan. K-means clustering mencoba untuk membagi data ke dalam beberapa kelompok dengan menjaga jarak antar observasi pada tiap klusternya sekecil mungkin, sedangkan jarak antar klusternya sejauh mungkin.
Untuk menentukan jumlah kluster yang sesuai, kita dapat menggunakan elbow method.
fviz_nbclust(x = wine_z, FUNcluster = kmeans, method = "wss")
Dari hasil elbow method, terlihat bahwa 3 merupakan jumlah kluster yang paling baik, karena penambahan jumlah kluster tidak disertai dengan penurunan total within sum of square yang signifikan.
RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)
<- kmeans(x = wine_z, # data yang sudah dicleaning
wine_km centers = 3) # jumlah k (cluster yang diinginkan)
Berikut merupakan hasil clustering.
wine_km
## K-means clustering with 3 clusters of sizes 62, 51, 65
##
## Cluster means:
## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## 1 0.8328826 -0.3029551 0.3636801 -0.6084749 0.57596208 0.88274724
## 2 0.1644436 0.8690954 0.1863726 0.5228924 -0.07526047 -0.97657548
## 3 -0.9234669 -0.3929331 -0.4931257 0.1701220 -0.49032869 -0.07576891
## Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue
## 1 0.97506900 -0.56050853 0.57865427 0.1705823 0.4726504
## 2 -1.21182921 0.72402116 -0.77751312 0.9388902 -1.1615122
## 3 0.02075402 -0.03343924 0.05810161 -0.8993770 0.4605046
## OD280 Proline
## 1 0.7770551 1.1220202
## 2 -1.2887761 -0.4059428
## 3 0.2700025 -0.7517257
##
## Clustering vector:
## [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 1
## [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1
## [75] 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [112] 3 3 3 3 3 3 3 2 3 3 1 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [149] 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
##
## Within cluster sum of squares by cluster:
## [1] 385.6983 326.3537 558.6971
## (between_SS / total_SS = 44.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
$withinss wine_km
## [1] 385.6983 326.3537 558.6971
Kluster 2 memiliki jarak antar observasi yang paling dekat dibandingkan dengan ke 2 kluster lainnya.
$betweenss/wine_km$totss*100 wine_km
## [1] 44.77405
Besar rasio antara between sum of squares dan total sum of square adalah sebesar 44,77%, yang bermakna hampir separuh dari total sum of square berasal dari jarak antar kluster.
$iter wine_km
## [1] 2
Diperlukan 2 kali pengulangan hingga dihasilkan kluster yang stabil.
$size wine_km
## [1] 62 51 65
Terdapat 62 wine pada kluster 1, 51 wine pada kluster 2, dan 65 wine yang termasuk dalam kluster 3.
Selanjutnya, buat label kluster pada dataset awal sesuai hasil pembagian kluster.
$cluster <- wine_km$cluster wine
Periksa bagaimana karakteristik wine pada masing-masing kluster.
<- wine %>%
wine_profile group_by(cluster) %>%
summarise_all(.funs = "mean")
wine_profile
## # A tibble: 3 x 14
## cluster Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 13.7 2.00 2.47 17.5 108. 2.85
## 2 2 13.1 3.31 2.42 21.2 98.7 1.68
## 3 3 12.3 1.90 2.23 20.1 92.7 2.25
## # ... with 7 more variables: Flavanoids <dbl>, Nonflavanoid_Phenols <dbl>,
## # Proanthocyanins <dbl>, Color_Intensity <dbl>, Hue <dbl>, OD280 <dbl>,
## # Proline <dbl>
Dari hasil profiling, berikut merupakan karakteristik masing-masing kluster:
Kluster 1: kluster dengan kadar alkohol, magnesium, total phenols, proline paling tinggi Kluster 2: kluster dengan kandungan malic acid, ash alcanity, noflavanoid phenols, intensitas warna paling tinggi Kluster 3: kluster dengan rata-rata kandungan paling rendah
PCA atau Principal Component Analysis merupakan salah satu algoritma yang digunakan untuk dimensionality reduction, dengan tujuan untuk memperoleh dataset dengan dimensi lebih rendah, namun tetap mempertahankan informasi (varians) sebanyak mungkin.
<- PCA(wine %>% select(-cluster), scale.unit = TRUE, graph = F, ncp = 13) pca
Jumlah dimensi yang digunakan disesuaikan dengan jumlah variabel numerik pada dataset ini, yaitu 13.
plot.PCA(x = pca,
choix = "var")
Dari plot di atas, terlihat bahwa 2 dimensi pertama merangkum 50% lebih dari keseluruhan informasi. Variabel flavanoids, OD280, dan Hue merupakan variabel yang berkontribusi cukup tinggi terhadap dimensi 1. Sedangkan, alcohol, color intensity, dan ash memiliki kontribusi cukup tinggi terhadap dimensi 2.
Berikut merupakan tabel kontribusi tiap variabel terhadap masing-masing PC. Semakin tinggi nilai korelasi, semakin banyak informasi dari variabel yang dirangkum dalam dimensi tersebut.
<- dimdesc(pca)
dim as.data.frame(dim$Dim.1$quanti)
## correlation p.value
## Flavanoids 0.9174702 2.277174e-72
## Total_Phenols 0.8561367 2.412279e-52
## OD280 0.8160189 9.295759e-44
## Proanthocyanins 0.6799217 1.703326e-25
## Hue 0.6436621 3.325743e-22
## Proline 0.6220508 1.908845e-20
## Alcohol 0.3130934 2.088257e-05
## Magnesium 0.3080229 2.880155e-05
## Color_Intensity -0.1922360 1.014930e-02
## Ash_Alcanity -0.5191571 1.132941e-13
## Malic_Acid -0.5318847 2.176263e-14
## Nonflavanoid_Phenols -0.6476070 1.532702e-22
Sebagaimana terlihat dalam plot di atas, flavanoid, total phenols, dan OD820 merupakan 3 variabel yang paling banyak dirangkum oleh dimensi 1.
as.data.frame(dim$Dim.2$quanti)
## correlation p.value
## Color_Intensity 0.8374894 4.612471e-48
## Alcohol 0.7642573 2.320753e-35
## Proline 0.5766127 3.678262e-17
## Ash 0.4994461 1.278235e-12
## Magnesium 0.4734761 2.478447e-11
## Malic_Acid 0.3554317 1.124118e-06
## OD280 -0.2599338 4.584234e-04
## Hue -0.4412422 7.060723e-10
Sementara itu, color intensity, alcohol, dan proline merupakan 3 variabel yang paling berkontribusi terhadap dimensi 2.
Berikut merupakan banyak informasi (varians) yang dirangkum oleh masing-masing dimensi.
$eig pca
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 4.7058503 36.1988481 36.19885
## comp 2 2.4969737 19.2074903 55.40634
## comp 3 1.4460720 11.1236305 66.52997
## comp 4 0.9189739 7.0690302 73.59900
## comp 5 0.8532282 6.5632937 80.16229
## comp 6 0.6416570 4.9358233 85.09812
## comp 7 0.5510283 4.2386793 89.33680
## comp 8 0.3484974 2.6807489 92.01754
## comp 9 0.2888799 2.2221534 94.23970
## comp 10 0.2509025 1.9300191 96.16972
## comp 11 0.2257886 1.7368357 97.90655
## comp 12 0.1687702 1.2982326 99.20479
## comp 13 0.1033779 0.7952149 100.00000
Dimensi pertama menjelaskan paling banyak varians, yaitu sebesar 36,2%. Apabila dataset ini akan digunakan untuk keperluan supervised learning dan ingin mempertahankan 90% dari keseluruhan informasi, dapat digunakan 8 dimensi pertama, yang membuat kita dapat mengurangi 38% dari keseluruhan dimensi namun tetap mempertahankan hampir seluruh informasi.
PCA dapat dikombinasikan dengan hasil k-means clustering untuk melakukan visualisasi berdasarkan kluster sebagai berikut.
fviz_pca_ind(pca, col.ind = as.factor(wine$cluster))
Dari hasil visualisasi, terlihat bahwa kluster 3 terletak di bawah koordinat 0 dimensi 2, yang disebabkan karena rendahnya kadar kandungan color intensity pada wine dalam kluster tersebut. Variabel color intensity merupakan variabel yang paling berkontribusi pada dimensi 2.