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.