McDonald’s Menu Clustering Based Nutrition Facts using Unsupervised Learning

Background

Pada project kali ini kita akan bermain suatu role. Kita merupakan perkerja di salah satu tempat makan cepat saji paling populer yaitu McDonald’s. Tempat makan tersebut memiliki data informasi nutrisi dari semua menu yang disajikan. Data tersebut akan kita baca menggunakan fungsi read.csv. Dari data tersebut kita ingin melakukan klastering menu berdasarkan informasi nutrisinya. Kita akan memanfaatkan pengetahuan kita terkait PCA dan K-means Clustering untuk melakukan klastering.

Set-Up Library

Kita harus set-up library yang dibutuhkan terlebih dahulu:

Data Preprocessing and Exploratory Data Analysis

Load Data

Kita akan buka terlebih dahulu data yang sudah kita punya yaitu menu_mcd.csv. Data tersebut bisa kita dapatkan melalui Kaggle.

#>    Category              Item   Serving.Size Calories Calories.from.Fat
#> 1 Breakfast      Egg McMuffin 4.8 oz (136 g)      300               120
#> 2 Breakfast Egg White Delight 4.8 oz (135 g)      250                70
#> 3 Breakfast  Sausage McMuffin 3.9 oz (111 g)      370               200
#>   Total.Fat Total.Fat....Daily.Value. Saturated.Fat
#> 1        13                        20             5
#> 2         8                        12             3
#> 3        23                        35             8
#>   Saturated.Fat....Daily.Value. Trans.Fat Cholesterol
#> 1                            25         0         260
#> 2                            15         0          25
#> 3                            42         0          45
#>   Cholesterol....Daily.Value. Sodium Sodium....Daily.Value. Carbohydrates
#> 1                          87    750                     31            31
#> 2                           8    770                     32            30
#> 3                          15    780                     33            29
#>   Carbohydrates....Daily.Value. Dietary.Fiber Dietary.Fiber....Daily.Value.
#> 1                            10             4                            17
#> 2                            10             4                            17
#> 3                            10             4                            17
#>   Sugars Protein Vitamin.A....Daily.Value. Vitamin.C....Daily.Value.
#> 1      3      17                        10                         0
#> 2      3      18                         6                         0
#> 3      2      14                         8                         0
#>   Calcium....Daily.Value. Iron....Daily.Value.
#> 1                      25                   15
#> 2                      25                    8
#> 3                      25                   10
#>  [ reached 'max' / getOption("max.print") -- omitted 3 rows ]

Disini kita punya 24 kolom yang terdiri dari: Category adalah jenis category dari menu, Item adalah daftar menu yang ada di McD, dan beberapa informasi lainnya yang meliputi informasi nutrisinya.

Data Wrangling

#> Rows: 260
#> Columns: 24
#> $ Category                      <chr> "Breakfast", "Breakfast", "Breakfast", "…
#> $ Item                          <chr> "Egg McMuffin", "Egg White Delight", "Sa…
#> $ Serving.Size                  <chr> "4.8 oz (136 g)", "4.8 oz (135 g)", "3.9…
#> $ Calories                      <int> 300, 250, 370, 450, 400, 430, 460, 520, …
#> $ Calories.from.Fat             <int> 120, 70, 200, 250, 210, 210, 230, 270, 1…
#> $ Total.Fat                     <dbl> 13, 8, 23, 28, 23, 23, 26, 30, 20, 25, 2…
#> $ Total.Fat....Daily.Value.     <int> 20, 12, 35, 43, 35, 36, 40, 47, 32, 38, …
#> $ Saturated.Fat                 <dbl> 5, 3, 8, 10, 8, 9, 13, 14, 11, 12, 12, 1…
#> $ Saturated.Fat....Daily.Value. <int> 25, 15, 42, 52, 42, 46, 65, 68, 56, 59, …
#> $ Trans.Fat                     <dbl> 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, …
#> $ Cholesterol                   <int> 260, 25, 45, 285, 50, 300, 250, 250, 35,…
#> $ Cholesterol....Daily.Value.   <int> 87, 8, 15, 95, 16, 100, 83, 83, 11, 11, …
#> $ Sodium                        <int> 750, 770, 780, 860, 880, 960, 1300, 1410…
#> $ Sodium....Daily.Value.        <int> 31, 32, 33, 36, 37, 40, 54, 59, 54, 59, …
#> $ Carbohydrates                 <int> 31, 30, 29, 30, 30, 31, 38, 43, 36, 42, …
#> $ Carbohydrates....Daily.Value. <int> 10, 10, 10, 10, 10, 10, 13, 14, 12, 14, …
#> $ Dietary.Fiber                 <int> 4, 4, 4, 4, 4, 4, 2, 3, 2, 3, 2, 3, 2, 3…
#> $ Dietary.Fiber....Daily.Value. <int> 17, 17, 17, 17, 17, 18, 7, 12, 7, 12, 6,…
#> $ Sugars                        <int> 3, 3, 2, 2, 2, 3, 3, 4, 3, 4, 2, 3, 2, 3…
#> $ Protein                       <int> 17, 18, 14, 21, 21, 26, 19, 19, 20, 20, …
#> $ Vitamin.A....Daily.Value.     <int> 10, 6, 8, 15, 6, 15, 10, 15, 2, 6, 0, 4,…
#> $ Vitamin.C....Daily.Value.     <int> 0, 0, 0, 0, 0, 2, 8, 8, 8, 8, 0, 0, 0, 0…
#> $ Calcium....Daily.Value.       <int> 25, 25, 25, 30, 25, 30, 15, 20, 15, 15, …
#> $ Iron....Daily.Value.          <int> 15, 8, 10, 15, 10, 20, 15, 20, 10, 15, 1…
#> # A tibble: 24 x 1
#>    .                            
#>    <chr>                        
#>  1 Category                     
#>  2 Item                         
#>  3 Serving.Size                 
#>  4 Calories                     
#>  5 Calories.from.Fat            
#>  6 Total.Fat                    
#>  7 Total.Fat....Daily.Value.    
#>  8 Saturated.Fat                
#>  9 Saturated.Fat....Daily.Value.
#> 10 Trans.Fat                    
#> # … with 14 more rows

Dari hasil informasi di atas kita akan, ada beberapa kolom yang tidak perlu kita gunakan, maka kita ada cleansing data tersebut dengan membuang beberapa kolom yang tidak kita butuhkan.

#>                                  Calories Calories.from.Fat Total.Fat
#> Egg McMuffin                          300               120        13
#> Egg White Delight                     250                70         8
#> Sausage McMuffin                      370               200        23
#> Sausage McMuffin with Egg             450               250        28
#> Sausage McMuffin with Egg Whites      400               210        23
#> Steak & Egg McMuffin                  430               210        23
#>                                  Saturated.Fat Trans.Fat Cholesterol Sodium
#> Egg McMuffin                                 5         0         260    750
#> Egg White Delight                            3         0          25    770
#> Sausage McMuffin                             8         0          45    780
#> Sausage McMuffin with Egg                   10         0         285    860
#> Sausage McMuffin with Egg Whites             8         0          50    880
#> Steak & Egg McMuffin                         9         1         300    960
#>                                  Carbohydrates Dietary.Fiber Sugars Protein
#> Egg McMuffin                                31             4      3      17
#> Egg White Delight                           30             4      3      18
#> Sausage McMuffin                            29             4      2      14
#> Sausage McMuffin with Egg                   30             4      2      21
#> Sausage McMuffin with Egg Whites            30             4      2      21
#> Steak & Egg McMuffin                        31             4      3      26

Kemudian kita check apakah terdapat missing value atau tidak

#> [1] FALSE

Exploratory Data Analysis (EDA)

Kita akan check skala antar variabel

#>     Calories      Calories.from.Fat   Total.Fat       Saturated.Fat   
#>  Min.   :   0.0   Min.   :   0.0    Min.   :  0.000   Min.   : 0.000  
#>  1st Qu.: 210.0   1st Qu.:  20.0    1st Qu.:  2.375   1st Qu.: 1.000  
#>  Median : 340.0   Median : 100.0    Median : 11.000   Median : 5.000  
#>  Mean   : 368.3   Mean   : 127.1    Mean   : 14.165   Mean   : 6.008  
#>  3rd Qu.: 500.0   3rd Qu.: 200.0    3rd Qu.: 22.250   3rd Qu.:10.000  
#>  Max.   :1880.0   Max.   :1060.0    Max.   :118.000   Max.   :20.000  
#>    Trans.Fat       Cholesterol         Sodium       Carbohydrates   
#>  Min.   :0.0000   Min.   :  0.00   Min.   :   0.0   Min.   :  0.00  
#>  1st Qu.:0.0000   1st Qu.:  5.00   1st Qu.: 107.5   1st Qu.: 30.00  
#>  Median :0.0000   Median : 35.00   Median : 190.0   Median : 44.00  
#>  Mean   :0.2038   Mean   : 54.94   Mean   : 495.8   Mean   : 47.35  
#>  3rd Qu.:0.0000   3rd Qu.: 65.00   3rd Qu.: 865.0   3rd Qu.: 60.00  
#>  Max.   :2.5000   Max.   :575.00   Max.   :3600.0   Max.   :141.00  
#>  Dietary.Fiber       Sugars          Protein     
#>  Min.   :0.000   Min.   :  0.00   Min.   : 0.00  
#>  1st Qu.:0.000   1st Qu.:  5.75   1st Qu.: 4.00  
#>  Median :1.000   Median : 17.50   Median :12.00  
#>  Mean   :1.631   Mean   : 29.42   Mean   :13.34  
#>  3rd Qu.:3.000   3rd Qu.: 48.00   3rd Qu.:19.00  
#>  Max.   :7.000   Max.   :128.00   Max.   :87.00

Pada hasil summary tersebut kita bisa melihat bahwa antar variabel memiliki skala yang berbeda (dilihat dari nilai min dan max pada tiap variabel). Maka dari itu kita perlu melakukan scaling terhadap variabel yang kita punya. Kita akan melakukan scaling pada proses pembuatan model yang akan kita lakukan setelah ini.

Kemungkinan untuk Principle Component Analysis (PCA)

Selanjutnya, kita ingin melihat korelasi dari variabel numerik yang kita punya, mengingat seluruh variabel pada dataset ini merupakan variabel numerik. Apabila antar variabel memiliki korelasi yang tinggi maka kita dapat mengurangi dimensi atau jumlah variabel menggunakan PCA.

Terdapat beberapa variabel yang berkorelasi secara kuat dengan variabel lainnya. Dari hasil tersebut kita bisa simpulkan bahwa kita akan melakukan pengurangan dimensi menggunakan PCA.

PCA dapat dilakukan pada data ini untuk menghasilkan data non-multikolinearitas, sekaligus untuk mengurangi dimensi data dan menyimpan informasi sebanyak mungkin. Hasil analisis ini dapat dimanfaatkan lebih lanjut untuk tujuan klasifikasi dengan komputasi yang lebih rendah.

Clustering

Sebelum melakukan clustering, kita akan melakukan scale terlebih dahulu untuk menyamakan skala data kita:

#>     Calories       Calories.from.Fat   Total.Fat       Saturated.Fat    
#>  Min.   :-1.5327   Min.   :-0.9939   Min.   :-0.9971   Min.   :-1.1289  
#>  1st Qu.:-0.6587   1st Qu.:-0.8375   1st Qu.:-0.8300   1st Qu.:-0.9410  
#>  Median :-0.1177   Median :-0.2119   Median :-0.2228   Median :-0.1893  
#>  Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  
#>  3rd Qu.: 0.5483   3rd Qu.: 0.5701   3rd Qu.: 0.5691   3rd Qu.: 0.7502  
#>  Max.   : 6.2918   Max.   : 7.2954   Max.   : 7.3092   Max.   : 2.6292  
#>    Trans.Fat       Cholesterol          Sodium        Carbohydrates    
#>  Min.   :-0.475   Min.   :-0.6296   Min.   :-0.8591   Min.   :-1.6758  
#>  1st Qu.:-0.475   1st Qu.:-0.5723   1st Qu.:-0.6728   1st Qu.:-0.6140  
#>  Median :-0.475   Median :-0.2285   Median :-0.5299   Median :-0.1184  
#>  Mean   : 0.000   Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  
#>  3rd Qu.:-0.475   3rd Qu.: 0.1152   3rd Qu.: 0.6399   3rd Qu.: 0.4479  
#>  Max.   : 5.351   Max.   : 5.9592   Max.   : 5.3797   Max.   : 3.3149  
#>  Dietary.Fiber         Sugars           Protein       
#>  Min.   :-1.0402   Min.   :-1.0259   Min.   :-1.1674  
#>  1st Qu.:-1.0402   1st Qu.:-0.8254   1st Qu.:-0.8173  
#>  Median :-0.4023   Median :-0.4157   Median :-0.1171  
#>  Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.0000  
#>  3rd Qu.: 0.8734   3rd Qu.: 0.6477   3rd Qu.: 0.4955  
#>  Max.   : 3.4249   Max.   : 3.4372   Max.   : 6.4468

Menentukan Jumlah Klaster Optimal

Sebelum kita melakukan analisis klaster, kita akan perlu menentukan jumlah kluster yang optimal. Dalam metode clustering, kita berusaha untuk meminimalhkan total jumlah kuadrat dalam klaster (WSS) yang artinya jarak minimum antara oengamatan dalam klaster yang sama. Untuk mencari jumlah klaster yang optimum, kita dapat menggunakan tiga metode: metode elbow, metode siluet, dan statistik gap. Kita akan menentukan jumlah klaster berdasarkan suara terbanyak.

Metode Elbow

Untuk menentukan berapa K yang diperlukan dalam pemodelan, kita akan gunakan elbow method dimana kita memilih cluster area di area siku. Kita akan menggunakan fungsi fviz_nbclust() dari package factoextra.

> Ditentukan K = 3, karena dari 3 ke 4 tidak terjadi penurunan yang signifikan

Metode Silluet

Metode Silluet mengukur koefisien siluet, dengan menghitung rata-rata jarak intra-cluster dan rata-rata jarak cluster terdekat untuk setiap observasi, jumlah k didapatkan dengan memilih nilai siluet tertinggi. Untuk membuat grafik metode siluet kita bisa menggunakan fungsi fviz_nbclust() dari package factoextra.

Ditentukan K = 3

Metode Statistik Gap

Metode Statistik Gap untuk menentukan K yang optimum. Metode ini membandingkan total dalam variasi intra-cluster untuk nilai k yang berbeda dengan nilai yang diharapkan dibawah distribusi nol dari data. Nilai K klaster yang optimum akan menjadi nilai yang memaksimalhkan Statistik Gap. Untuk membuat grafik metode siluet kita bisa menggunakan fungsi fviz_nbclust() dari package factoextra.

Dari beberapa metode yang kita gunakan, dapat disimpulkan bahwa nilai k yang optimum adalah:

K = 3

K-means

Setelah kita mendapatkan jumlah K = 3 yang optimum kita akan membuat model:

Setelah kita membuat modelnya, kita lihat beberapa nilai yang dihasilkan dari k-means

Banyaknya pengulangan (iterasi) algoritma k-means sampai dihasilkan cluster yang stabil

#> [1] 3

Banyaknya observasi pada tiap cluster

#> [1]  29 148  83

Letak pusat cluster/centroid, biasa digunakan untuk profiling cluster

#>     Calories Calories.from.Fat  Total.Fat Saturated.Fat  Trans.Fat Cholesterol
#> 1  1.5213054         1.8563825  1.8598357     1.4305108  0.6097670   1.9190204
#> 2 -0.6508404        -0.6470182 -0.6456527    -0.6845010 -0.4671461  -0.4429799
#> 3  0.6289942         0.5051037  0.5014623     0.7207389  0.6199324   0.1193907
#>       Sodium Carbohydrates Dietary.Fiber      Sugars    Protein
#> 1  1.9280331     0.4539910     1.3572930 -0.73976049  1.6754815
#> 2 -0.5578578    -0.4221697    -0.3980390 -0.05998558 -0.5659686
#> 3  0.3210843     0.5941611     0.2355213  0.36543277  0.4237878

Label cluster untuk setiap observasi

#>                     Egg McMuffin                Egg White Delight 
#>                                3                                2 
#>                 Sausage McMuffin        Sausage McMuffin with Egg 
#>                                3                                1 
#> Sausage McMuffin with Egg Whites             Steak & Egg McMuffin 
#>                                3                                1

Goodness of Fit

Kebaikan hasil clustering dapat dilihat dari 3 nilai:

  • Within Sum of Squares ($withinss): jumlah jarak kuadrat dari tiap observasi ke centroid tiap cluster.
  • Between Sum of Squares ($betweenss): jumlah jarak kuadrat terbobot dari tiap centroid ke rata-rata global. Dibobotkan berdasarkan banyaknya observasi pada cluster.
  • Total Sum of Squares ($totss): jumlah jarak kuadrat dari tiap observasi ke rata-rata global.
#> [1] 424.7873 427.1858 607.8647
#> [1] 1389.162
#> [1] 1459.838
  • Clustering yang “baik”:

  • WSS semakin rendah: jarak observasi di 1 kelompok yang sama semakin rendah, artinya tiap cluster memiliki karakteristik yang semakin mirip (WSS ~ 0)

  • Tujuan: WSS semakin kecil dan Jumlah cluster juga kecil

  • \(\frac{BSS}{TSS}\) mendekati 1, karena kelompok hasil clustering semakin mewakili persebaran data yang sesungguhnya

#> [1] 0.4875964
  • Tujuan: BSS/TSS ~1 dan jumlah cluster kecil

Interpretasi / Cluster Profiling

Kita akan masukkan hasil clustering ke data mcd_clean yang sudah kita punya:

#>                                  Calories Calories.from.Fat Total.Fat
#> Egg McMuffin                          300               120        13
#> Egg White Delight                     250                70         8
#> Sausage McMuffin                      370               200        23
#> Sausage McMuffin with Egg             450               250        28
#> Sausage McMuffin with Egg Whites      400               210        23
#> Steak & Egg McMuffin                  430               210        23
#>                                  Saturated.Fat Trans.Fat Cholesterol Sodium
#> Egg McMuffin                                 5         0         260    750
#> Egg White Delight                            3         0          25    770
#> Sausage McMuffin                             8         0          45    780
#> Sausage McMuffin with Egg                   10         0         285    860
#> Sausage McMuffin with Egg Whites             8         0          50    880
#> Steak & Egg McMuffin                         9         1         300    960
#>                                  Carbohydrates Dietary.Fiber Sugars Protein
#> Egg McMuffin                                31             4      3      17
#> Egg White Delight                           30             4      3      18
#> Sausage McMuffin                            29             4      2      14
#> Sausage McMuffin with Egg                   30             4      2      21
#> Sausage McMuffin with Egg Whites            30             4      2      21
#> Steak & Egg McMuffin                        31             4      3      26
#>                                  cluster
#> Egg McMuffin                           3
#> Egg White Delight                      2
#> Sausage McMuffin                       3
#> Sausage McMuffin with Egg              1
#> Sausage McMuffin with Egg Whites       3
#> Steak & Egg McMuffin                   1

Selanjutnya kita akan melakukan profiling dengan cara summarise data:

#> # A tibble: 3 x 12
#>   cluster Calories Calories.from.Fat Total.Fat Saturated.Fat Trans.Fat
#>   <fct>      <dbl>             <dbl>     <dbl>         <dbl>     <dbl>
#> 1 1           734.             364.      40.6          13.6    0.466  
#> 2 2           212.              44.4      4.99          2.36   0.00338
#> 3 3           519.             192.      21.3           9.84   0.470  
#> # … with 6 more variables: Cholesterol <dbl>, Sodium <dbl>,
#> #   Carbohydrates <dbl>, Dietary.Fiber <dbl>, Sugars <dbl>, Protein <dbl>

Atau kita bisa gunakan cara berikut untuk mempermudah melakukan profiling:

#> # A tibble: 11 x 3
#>    name              cluster_min_val cluster_max_val
#>    <chr>                       <int>           <int>
#>  1 Calories                        2               1
#>  2 Calories.from.Fat               2               1
#>  3 Carbohydrates                   2               3
#>  4 Cholesterol                     2               1
#>  5 Dietary.Fiber                   2               1
#>  6 Protein                         2               1
#>  7 Saturated.Fat                   2               1
#>  8 Sodium                          2               1
#>  9 Sugars                          1               3
#> 10 Total.Fat                       2               1
#> 11 Trans.Fat                       2               3

Profiling:

  • Cluster 1: Cluster ini terdiri dari menu mcd yang cenderung memiliki jumlah Kalori, kolesterol, serat, protein, lemak jenuh, garam yang tinggi
  • Cluster 2: Cluster ini terdiri dari menu mcd yang cenderung rendah kalori, karbohidrat, kolesterol, serat, protein, lemak jenuh, garam, dan lemak trans.
  • Cluster 3: Cluster ini terdiri dari menu mcd yang cenderung tinggi karbohidrat, gula, dan lemak trans.

Visualisasi Clustering

Kita akan memvisualisasikan hasil clustering tersebut, denga menggunakan fungsi fviz_cluster()

Product Recommender

Kasus

Apabila ada pelanggan yang sedang diet ingin membeli "McChicken" dari category “Chicken & Fish”` namun sedang habis. Kira-kira menu apa yang dapat direkomendasikan?

#>           Calories Calories.from.Fat Total.Fat Saturated.Fat Trans.Fat
#> McChicken      360               140        16             3         0
#>           Cholesterol Sodium Carbohydrates Dietary.Fiber Sugars Protein cluster
#> McChicken          35    800            40             2      5      14       2
#>                 Category
#> McChicken Chicken & Fish
#>                                          Calories Calories.from.Fat Total.Fat
#> Premium Grilled Chicken Classic Sandwich      350                80         9
#> McChicken                                     360               140        16
#> Buffalo Ranch McChicken                       360               150        16
#> Chicken McNuggets (4 piece)                   190               110        12
#> Chicken McNuggets (6 piece)                   280               160        18
#>                                          Saturated.Fat Trans.Fat Cholesterol
#> Premium Grilled Chicken Classic Sandwich             2         0          65
#> McChicken                                            3         0          35
#> Buffalo Ranch McChicken                              3         0          35
#> Chicken McNuggets (4 piece)                          2         0          25
#> Chicken McNuggets (6 piece)                          3         0          40
#>                                          Sodium Carbohydrates Dietary.Fiber
#> Premium Grilled Chicken Classic Sandwich    820            42             3
#> McChicken                                   800            40             2
#> Buffalo Ranch McChicken                     990            40             2
#> Chicken McNuggets (4 piece)                 360            12             1
#> Chicken McNuggets (6 piece)                 540            18             1
#>                                          Sugars Protein cluster       Category
#> Premium Grilled Chicken Classic Sandwich      8      28       2 Chicken & Fish
#> McChicken                                     5      14       2 Chicken & Fish
#> Buffalo Ranch McChicken                       5      14       2 Chicken & Fish
#> Chicken McNuggets (4 piece)                   0       9       2 Chicken & Fish
#> Chicken McNuggets (6 piece)                   0      13       2 Chicken & Fish
#>  [ reached 'max' / getOption("max.print") -- omitted 1 rows ]

Principal Component Analysis (PCA)

#> 
#> Call:
#> PCA(X = mcd_clean %>% select(-c(Category, cluster)), graph = F) 
#> 
#> 
#> Eigenvalues
#>                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
#> Variance               6.532   2.272   0.776   0.567   0.381   0.275   0.099
#> % of var.             59.378  20.659   7.058   5.158   3.464   2.500   0.898
#> Cumulative % of var.  59.378  80.037  87.095  92.252  95.717  98.216  99.114
#>                        Dim.8   Dim.9  Dim.10  Dim.11
#> Variance               0.077   0.020   0.000   0.000
#> % of var.              0.698   0.182   0.003   0.003
#> Cumulative % of var.  99.812  99.994  99.997 100.000
#> 
#> Individuals (the 10 first)
#>                                                                   Dist    Dim.1
#> Egg McMuffin                                                  |  3.110 |  0.854
#> Egg White Delight                                             |  2.284 | -0.365
#> Sausage McMuffin                                              |  2.231 |  0.869
#> Sausage McMuffin with Egg                                     |  3.769 |  2.447
#> Sausage McMuffin with Egg Whites                              |  2.384 |  1.235
#>                                                                  ctr   cos2  
#> Egg McMuffin                                                   0.043  0.075 |
#> Egg White Delight                                              0.008  0.026 |
#> Sausage McMuffin                                               0.044  0.152 |
#> Sausage McMuffin with Egg                                      0.352  0.421 |
#> Sausage McMuffin with Egg Whites                               0.090  0.268 |
#>                                                                Dim.2    ctr
#> Egg McMuffin                                                  -1.928  0.629
#> Egg White Delight                                             -1.726  0.504
#> Sausage McMuffin                                              -1.634  0.452
#> Sausage McMuffin with Egg                                     -1.975  0.660
#> Sausage McMuffin with Egg Whites                              -1.748  0.517
#>                                                                 cos2    Dim.3
#> Egg McMuffin                                                   0.384 |  0.254
#> Egg White Delight                                              0.571 |  0.869
#> Sausage McMuffin                                               0.536 |  0.437
#> Sausage McMuffin with Egg                                      0.275 | -0.114
#> Sausage McMuffin with Egg Whites                               0.538 |  0.503
#>                                                                  ctr   cos2  
#> Egg McMuffin                                                   0.032  0.007 |
#> Egg White Delight                                              0.374  0.145 |
#> Sausage McMuffin                                               0.095  0.038 |
#> Sausage McMuffin with Egg                                      0.006  0.001 |
#> Sausage McMuffin with Egg Whites                               0.126  0.045 |
#>  [ reached getOption("max.print") -- omitted 5 rows ]
#> 
#> Variables (the 10 first)
#>                                                                  Dim.1    ctr
#> Calories                                                      |  0.952 13.881
#> Calories.from.Fat                                             |  0.965 14.256
#> Total.Fat                                                     |  0.964 14.239
#> Saturated.Fat                                                 |  0.868 11.544
#> Trans.Fat                                                     |  0.516  4.077
#>                                                                 cos2    Dim.2
#> Calories                                                       0.907 |  0.245
#> Calories.from.Fat                                              0.931 | -0.095
#> Total.Fat                                                      0.930 | -0.096
#> Saturated.Fat                                                  0.754 |  0.259
#> Trans.Fat                                                      0.266 |  0.494
#>                                                                  ctr   cos2  
#> Calories                                                       2.633  0.060 |
#> Calories.from.Fat                                              0.399  0.009 |
#> Total.Fat                                                      0.403  0.009 |
#> Saturated.Fat                                                  2.946  0.067 |
#> Trans.Fat                                                     10.756  0.244 |
#>                                                                Dim.3    ctr
#> Calories                                                       0.137  2.415
#> Calories.from.Fat                                             -0.072  0.673
#> Total.Fat                                                     -0.071  0.649
#> Saturated.Fat                                                 -0.238  7.322
#> Trans.Fat                                                     -0.518 34.581
#>                                                                 cos2  
#> Calories                                                       0.019 |
#> Calories.from.Fat                                              0.005 |
#> Total.Fat                                                      0.005 |
#> Saturated.Fat                                                  0.057 |
#> Trans.Fat                                                      0.268 |
#>  [ reached getOption("max.print") -- omitted 5 rows ]

Pada proses PCA, kita dapat mempertahankan beberapa komponen utama yang informatif dari dataset untuk melakukan pengurangan dimensi. Dengan melakukan PCA, kita dapat mengurangi dimensi sekaligus menyimpan informasi sebanyak mungkin.

Lebih dari 70% variance dapat dijelaskan hanya dengan 2 dimensi, dengan nilai dimensi pertama dapat menjelaskan sebesar 60% dari total variance.

Kita dapat mempertahankan 95% informasi dari data kita dengan menggunakan 5 dimensi (PC1-PC5), yang artinya kita membuang 50% dimensi data kita.

#>                                       Dim.1     Dim.2      Dim.3      Dim.4
#> Egg McMuffin                      0.8542589 -1.928032  0.2535154 -1.2778533
#> Egg White Delight                -0.3651617 -1.725823  0.8686092  0.8077132
#> Sausage McMuffin                  0.8688641 -1.633744  0.4368079  0.2900929
#> Sausage McMuffin with Egg         2.4465622 -1.974722 -0.1137537 -1.5924887
#> Sausage McMuffin with Egg Whites  1.2350324 -1.747931  0.5034754  0.4589424
#> Steak & Egg McMuffin              2.8346604 -1.307211 -1.3642619 -0.3237176
#>                                       Dim.5 type
#> Egg McMuffin                     1.86049884    3
#> Egg White Delight                0.74803820    2
#> Sausage McMuffin                 0.11856552    3
#> Sausage McMuffin with Egg        1.18988011    1
#> Sausage McMuffin with Egg Whites 0.05788616    3
#> Steak & Egg McMuffin             2.44931502    1

Visualisasi PCA dan Hasil Kmeans Clustering

Kesimpulan

Dari hasil unsupervised learning yang sudah kita lakukan diatas, dapat kita simpulkan:

  • Kita dapat memisahkan data kita menjadi setidaknya 3 cluster berdasarkan semua fitur numerik,
  • Pengurangan dimensi dapat dilakukan pada data ini dengan tujuan mengurangi beban komputasi. Dari 11 PC yang ada kita bisa menggunakan 5 PC saja dengan tetap mempertahankan 95,7% informasi.