Wine: Analisis Kluster

Pengantar

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.

Analisis Data

Persiapan Data

Mempersiapkan Library

library(tidyverse)
library(GGally)
library(factoextra)
library(FactoMineR)

Mengimpor Dataset

wine <- read.csv("wine-clustering.csv")
rmarkdown::paged_table(wine)

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.

wine_z <- scale(wine)

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 Clustering

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.

Pembuatan Cluster

RNGkind(sample.kind = "Rounding")
## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)

wine_km <- kmeans(x = wine_z, # data yang sudah dicleaning
                 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"
wine_km$withinss
## [1] 385.6983 326.3537 558.6971

Kluster 2 memiliki jarak antar observasi yang paling dekat dibandingkan dengan ke 2 kluster lainnya.

wine_km$betweenss/wine_km$totss*100
## [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.

wine_km$iter
## [1] 2

Diperlukan 2 kali pengulangan hingga dihasilkan kluster yang stabil.

wine_km$size
## [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.

wine$cluster <- wine_km$cluster

Periksa bagaimana karakteristik wine pada masing-masing kluster.

wine_profile <- wine %>% 
  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

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 <- PCA(wine %>% select(-cluster), scale.unit = TRUE, graph = F, ncp = 13)

Jumlah dimensi yang digunakan disesuaikan dengan jumlah variabel numerik pada dataset ini, yaitu 13.

Kontribusi Variabel pada Masing-Masing Dimensi

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.

dim <- dimdesc(pca)
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.

pca$eig
##         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.

Kesimpulan

  • Kita dapat membagi dataset menjadi 3 buah kluster yang masing-masing memiliki kandungan kimiawi yang khas, dengan kluster 3 memiliki kadar kandungan kimiawi paling rendah di antara ketiganya.
  • PCA dapat digunakan pada dataset ini. Apabila ingin mempertahankan 90% dari keseluruhan informasi, dapat digunakan 8 dimensi pertama, yang bermakna mengurangi 38% dari keseluruhan dimensi. Dataset baru yang telah dikurangi dimensinya dapat digunakan untuk keperluan supervised learning, seperti klasifikasi.