Data yang digunakan pada projek ini merupakan data Starbucks Coffee Company Beverage Nutrition Information yang bersumber dari TidyTuesday untuk LBB: Programming for Data Science.
Pada kesempatan kali ini untuk importing data menggunakan
library readr.
library(readr)Fungsi yang digunakan dari library readr adalah
read_csv untuk mengimpor data dengan ekstensi CSV dari
halaman github tidytuesday.
sbux <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-12-21/starbucks.csv')Setelah memasukan data ke dalam variabel sbux, pelru
dilakukan pengecekan dari data set yang di import. Fungsi yang akan
digunakan adalah head() untuk melihat 6 baris pertama dan
tail() untuk melihat 6 baris terakhir.
head(sbux)tail(sbux)Kita dapat mengetahui informasi jumlah baris dan kolom dengan fungsi
ncol() dan nrow().
ncol(sbux)#> [1] 15
nrow(sbux)#> [1] 1147
Selanjutnya perlu dilakukan pengecekan tipe data dari
dataset tersebut menggunakan fungsi class() untuk satu
kolom secara satu per satu.
class(sbux$product_name)#> [1] "character"
untuk melihat struktur dataset secara keseluruhan dapat menggunakan
fungsi str()
str(sbux)#> spec_tbl_df [1,147 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
#> $ product_name : chr [1:1147] "brewed coffee - dark roast" "brewed coffee - dark roast" "brewed coffee - dark roast" "brewed coffee - dark roast" ...
#> $ size : chr [1:1147] "short" "tall" "grande" "venti" ...
#> $ milk : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ whip : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ serv_size_m_l : num [1:1147] 236 354 473 591 236 354 473 591 236 354 ...
#> $ calories : num [1:1147] 3 4 5 5 3 4 5 5 3 4 ...
#> $ total_fat_g : num [1:1147] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 ...
#> $ saturated_fat_g: num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ trans_fat_g : chr [1:1147] "0" "0" "0" "0" ...
#> $ cholesterol_mg : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ sodium_mg : num [1:1147] 5 10 10 10 5 10 10 10 5 5 ...
#> $ total_carbs_g : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ fiber_g : chr [1:1147] "0" "0" "0" "0" ...
#> $ sugar_g : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ caffeine_mg : num [1:1147] 130 193 260 340 15 20 25 30 155 235 ...
#> - attr(*, "spec")=
#> .. cols(
#> .. product_name = col_character(),
#> .. size = col_character(),
#> .. milk = col_double(),
#> .. whip = col_double(),
#> .. serv_size_m_l = col_double(),
#> .. calories = col_double(),
#> .. total_fat_g = col_double(),
#> .. saturated_fat_g = col_double(),
#> .. trans_fat_g = col_character(),
#> .. cholesterol_mg = col_double(),
#> .. sodium_mg = col_double(),
#> .. total_carbs_g = col_double(),
#> .. fiber_g = col_character(),
#> .. sugar_g = col_double(),
#> .. caffeine_mg = col_double()
#> .. )
#> - attr(*, "problems")=<externalptr>
Deskripsi Kolom:
Tidak lupa juga kita harus mengecek apakah dataset ini memiliki null
value atau tidak menggunakan gabungan fungsi is.na() dan
colSums()
colSums(is.na(sbux))#> product_name size milk whip serv_size_m_l
#> 0 0 0 0 0
#> calories total_fat_g saturated_fat_g trans_fat_g cholesterol_mg
#> 0 0 0 0 0
#> sodium_mg total_carbs_g fiber_g sugar_g caffeine_mg
#> 0 0 0 0 0
Dari beberapa fungsi yang sudah digunakan pada sebelumnya kita dapat mengetahui informasi-informasi terkait dataset sbux sebagai berikut:
Berdasarkan fungsi nrow() dan ncol()
dataset sbux memiliki jumlah baris sebanyak 1147 baris dan 15
kolom.
Dari deskripsi kolom dan hasil fungsi str() kita
dapat menentukan kolom mana perlu di rubah tipe data nya. Kolom yang
perlu dilakukan perubahan tipe data sebagai berikut:
character ->
factor dikarenakan berisi data kategoricharacter ->
factor dikarenakan berisi data ketegoridouble ->
factor pada kolom ini berisi informasi menggunakan tipe
susu yang digunakan dalam bentuk angkadouble ->
factorhanya berisi informasi 0 jika tidak
menggunakan whip cream dan 1 jika menggunakan
whip creamcharacter ->
numeric karena berisi informasi jumlah dari trans fatcharacter ->
numeric karena berisi informasi jumlah dari fiberDataset sbux tidak memiliki null value jika dilihat dari
hasil fungsi is.na() dan colSums()
Pada tahap data inspection kita menemukan beberapa hal atau perubahan terkait dataset sbux sebelum dilakukan analisa lebih lanjut terhadap data ini.
Kolom product_name akan dilakukan format ulang dalam penulisan character untuk memudahkan kita kedepannya ketika ingin melakukan pengelompokan untuk kolom category. Disini akan menggunakan library baru yaitu stringr
library(stringr)berikut adalah format penulisan yang lama:
head(sbux$product_name)#> [1] "brewed coffee - dark roast"
#> [2] "brewed coffee - dark roast"
#> [3] "brewed coffee - dark roast"
#> [4] "brewed coffee - dark roast"
#> [5] "brewed coffee - decaf pike place roast"
#> [6] "brewed coffee - decaf pike place roast"
Kita akan merubah semua value pada kolom product_name
menjadi proper case menggunakan fungsi str_to_title()
sbux$product_name <- str_to_title(sbux$product_name)
head(sbux$product_name)#> [1] "Brewed Coffee - Dark Roast"
#> [2] "Brewed Coffee - Dark Roast"
#> [3] "Brewed Coffee - Dark Roast"
#> [4] "Brewed Coffee - Dark Roast"
#> [5] "Brewed Coffee - Decaf Pike Place Roast"
#> [6] "Brewed Coffee - Decaf Pike Place Roast"
unique(sbux$milk)#> [1] 0 1 2 5 3 4
unique(sbux$whip)#> [1] 0 1
Nilai pada kolom milk ini memiliki arti sebagai berikut:
0 adalah none1 adalah nonfat2 adalah 2%3 adalah soy4 adalah coconut5 adalah wholesedangkan pada kolom whip memiliki arti:
0 adalah without whip cream1 adalah with whip creamMaka dari itu kita akan mengganti dari data berupa angka menjadi tipe susu yang digunakan menggunakan fungsi `replace``
sbux$milk <- sbux$milk %>%
replace(sbux$milk == 0, 'none') %>%
replace(sbux$milk == 1, 'nonfat') %>%
replace(sbux$milk == 2, '2%') %>%
replace(sbux$milk == 3, 'soy') %>%
replace(sbux$milk == 4, 'coconut') %>%
replace(sbux$milk == 5, 'whole')
sbux$whip <- sbux$whip %>%
replace(sbux$whip == 0, 'without whip cream') %>%
replace(sbux$whip == 1, 'with whip cream')Berikut adalah hasil setelah dilakukan replace() pada
kolom milk dan whip
unique(sbux$milk)#> [1] "none" "nonfat" "2%" "whole" "soy" "coconut"
unique(sbux$whip)#> [1] "without whip cream" "with whip cream"
Pada tahap ini kita akan melakukan pengelompokan manual berdasarkan data mentah berupa PDF maka dari itu kita akan membuat list dari tiap category yang ingin kita buat
List product_name untuk kategori Coffee
cat_coffee <- c('Brewed Coffee - Dark Roast',
'Brewed Coffee Traveler - Dark Roast',
'Brewed Coffee - Decaf Pike Place Roast',
'Brewed Coffee - Medium Roast',
'Brewed Coffee Traveler - Decaf Pike Place Roast',
'Brewed Coffee Traveler - Medium Roast',
'Brewed Coffee - True North Blend Blonde Roast',
'Brewed Coffee Traveler - True North Blend Blonde Roast',
'Caffè Misto',
'Clover Brewed Coffee - Dark Roast',
'Clover Brewed Coffee - Light Roast',
"Clover Brewed Coffee - Light Roast",
'Clover Brewed Coffee - Medium Roast',
'Iced Coffee',
'Iced Coffee With Milk',
'Cold Brewed Coffee',
'Vanilla Sweet Cream Cold Brew')List product_name untuk kategori Espresso
cat_espresso <- c('Caffè Americano',
'Iced Caffè Americano',
'Caffè Latte',
'Iced Caffè Latte',
'Caffè Mocha',
'Iced Caffè Mocha',
'Cappuccino',
'Caramel Macchiato',
'Iced Caramel Macchiato',
'Cinnamon Dolce Latte',
'Espresso',
'Iced Espresso',
'Espresso Con Panna',
'Espresso Macchiato',
'Flat White',
'Latte Macchiato',
'Skinny Cinnamon Dolce Latte',
'Iced Skinny Cinnamon Dolce Latte',
'Skinny Mocha',
'Iced Skinny Mocha',
'Starbucks Doubleshot On Ice',
'White Chocolate Mocha',
'Iced White Chocolate Mocha',
'Espresso - Caffè Americano',
'Espresso - Iced Caffè Americano')List product_name untuk kategori Tea
cat_tea <- c('Iced Black Tea',
'Iced Black Tea Lemonade',
'Chai Tea Latte',
'Iced Chai Tea Latte',
'Earl Grey Brewed Tea',
"Emperor's Clouds And Mist Brewed Tea",
'English Breakfast Black Brewed Tea',
'English Breakfast Black Tea Latte',
'Green Tea Latte',
'Iced Green Tea Latte',
'Iced Green Tea',
'Iced Green Tea Lemonade',
'Jade Citrus Mint Brewed Tea',
'London Fog Tea Latte',
'Iced Mango Black Tea',
'Iced Mango Black Tea Lemonade',
'Mint Majesty Brewed Tea',
'Oprah Chai Herbal Brewed Tea',
'Oprah Cinnamon Chai Brewed Tea',
'Oprah Cinnamon Chai Latte',
'Iced Oprah Cinnamon Chai Latte',
'Passion Tango Brewed Tea',
'Iced Passion Tango tea',
'Iced Passion Tango Tea Lemonade',
'Peach Iced Green Tea',
'Peach Iced Green Tea Lemonade',
'Peach Tranquility Brewed Tea',
'Youthberry Brewed Tea',
"Iced Passion Tango Tea")List product_name untuk kategori Refresher
cat_refresher <- c('Cool Lime Starbucks Refreshers',
'Very Berry Hibiscus Starbucks Refreshers')List product_name untuk kategori Smoothies
cat_smoothies <- c('Chocolate Smoothie',
'Orange Mango Smoothie',
'Strawberry Smoothie')List product_name untuk kategori Frappuccino Blended
Coffee
cat_frappuccino_blended_coffee <- c('Caffè Vanilla Frappuccino Blended',
'Caramel Frappuccino Blended',
'Coffee Frappuccino Blended',
'Espresso Frappuccino Blended',
'Java Chip Frappuccino Blended',
'Mocha Frappuccino Blended')List product_name untuk kategori Frappuccino Light
Blended Coffee
cat_frappuccino_light_blended_coffee <- c('Caffè Vanilla Frappuccino Light',
'Caramel Frappuccino Light',
'Coffee Frappuccino Light',
'Espresso Frappuccino Light',
'Java Chip Light Frappuccino',
'Mocha Light Frappuccino')List product_name untuk kategori Frappuccino Blended
Crème
cat_frappucino_blended_crème <- c('Blended Strawberry Lemonade',
'Chai Crème Frappuccino Blended',
'Double Chocolaty Chip Crème Frappuccino Blended',
'Green Tea Crème Frappuccino Blended',
'Oprah Cinnamon Chai Crème Frappuccino Blended',
'Strawberries & Crème Frappuccino Blended',
'Vanilla Bean Crème Frappuccino Blended')List product_name untuk kategori Hot Chocolate &
Other
cat_hot_chocolate_other <- c('Caramel Apple Spice',
'Hot Chocolate',
'Lemonade',
'Milk',
'Skinny Hot Chocolate',
'White Hot Chocolate')List product_name untuk kategori Add-Ons
cat_add_ons <- c('Protein & Fibre Powder',
'Matcha Green Tea Powder',
'Espresso Shot')Untuk mempermudah dalam pembuatan kolom kita akan menggunakan library dplyr
library(dplyr)Keuntungan dalam penggunaan library dplyr adalah kita bisa
menggunakan piping (%>%) yang akan di kombinasikan dengan
fungsi mutate()
sbux <- sbux %>%
dplyr::mutate(category = case_when(
product_name %in% cat_coffee ~ 'Coffee',
product_name %in% cat_espresso ~ 'Espresso',
product_name %in% cat_tea ~ 'Tea',
product_name %in% cat_refresher ~ 'Refersher',
product_name %in% cat_smoothies ~ 'Smoothies',
product_name %in% cat_frappuccino_blended_coffee ~ 'Frappuccino Blended Coffee',
product_name %in% cat_frappuccino_light_blended_coffee ~ 'Frappuccino Light Blended Coffee',
product_name %in% cat_frappucino_blended_crème ~ 'Frappucino Blended Crème',
product_name %in% cat_hot_chocolate_other ~ 'Hot Chocolate & Other',
product_name %in% cat_add_ons ~ 'Add-Ons'))Selanjutnya adalah melakukan pengecekan kembali apakah di kolom
category yang baru saja dibuat sudah terisi semua dengan
menggunakaan fungsi sum() dan is.na()
sum(is.na(sbux$category))#> [1] 4
Melakukan subsetting untuk 4 baris yang masih mengandung null value
sbux[is.na(sbux$category),]Dikarenakan produk Clover Brewed Coffee - Light Roast
termasuk kategori Coffee maka kita akan mengisi 4 baris
tersebut dengan kategori tersebut.
sbux$category[is.na(sbux$category)] = 'Coffee'Dilakukan pengecekan kembali apakah sudah terisi semua
sum(is.na(sbux$category))#> [1] 0
Langkah terakhir adalah pengecekan secara keseluruhan dataset
menggunakan fungsi str() kembali untuk melihat apakah sudah
sesuai transformasi data yang kita ingin kan
str(sbux)#> tibble [1,147 × 16] (S3: tbl_df/tbl/data.frame)
#> $ product_name : chr [1:1147] "Brewed Coffee - Dark Roast" "Brewed Coffee - Dark Roast" "Brewed Coffee - Dark Roast" "Brewed Coffee - Dark Roast" ...
#> $ size : chr [1:1147] "short" "tall" "grande" "venti" ...
#> $ milk : chr [1:1147] "none" "none" "none" "none" ...
#> $ whip : chr [1:1147] "without whip cream" "without whip cream" "without whip cream" "without whip cream" ...
#> $ serv_size_m_l : num [1:1147] 236 354 473 591 236 354 473 591 236 354 ...
#> $ calories : num [1:1147] 3 4 5 5 3 4 5 5 3 4 ...
#> $ total_fat_g : num [1:1147] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 ...
#> $ saturated_fat_g: num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ trans_fat_g : chr [1:1147] "0" "0" "0" "0" ...
#> $ cholesterol_mg : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ sodium_mg : num [1:1147] 5 10 10 10 5 10 10 10 5 5 ...
#> $ total_carbs_g : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ fiber_g : chr [1:1147] "0" "0" "0" "0" ...
#> $ sugar_g : num [1:1147] 0 0 0 0 0 0 0 0 0 0 ...
#> $ caffeine_mg : num [1:1147] 130 193 260 340 15 20 25 30 155 235 ...
#> $ category : chr [1:1147] "Coffee" "Coffee" "Coffee" "Coffee" ...
Menggunakan fungsi dim() untuk melihat jumlah baris dan
kolom
dim(sbux)#> [1] 1147 16
Dapat dilihat bahwa kita sudah berhasil menambahkan 1 kolom category
Sebelum kita melakukan perubahan tipe data lebih baiknya kita
memeriksa tipe data sebelum dilakukan perubahan dengan
class()
class(sbux$product_name) #> [1] "character"
class(sbux$size) #> [1] "character"
class(sbux$milk) #> [1] "character"
class(sbux$whip) #> [1] "character"
class(sbux$trans_fat_g) #> [1] "character"
class(sbux$fiber_g)#> [1] "character"
class(sbux$category)#> [1] "character"
Untuk melakukan perubahan tipe data kita akan meggunakan fungsi
as.factor() dan as.numeric() untuk kolom
berikut:
character ->
factorcharacter ->
factordouble ->
factordouble ->
factorcharacter ->
numericcharacter ->
numericcharacter ->
factorsbux$product_name <- as.factor(sbux$product_name)
sbux$size <- as.factor(sbux$size)
sbux$milk <- as.factor(sbux$milk)
sbux$whip <- as.factor(sbux$whip)
sbux$trans_fat_g <- as.numeric(sbux$trans_fat_g)
sbux$fiber_g <- as.numeric(sbux$fiber_g)
sbux$category <- as.factor(sbux$category)Kita dapat melihat apakah sudah terubah dengan benar menggunakan
class() kembali
class(sbux$product_name) #> [1] "factor"
class(sbux$size) #> [1] "factor"
class(sbux$milk) #> [1] "factor"
class(sbux$whip) #> [1] "factor"
class(sbux$trans_fat_g) #> [1] "numeric"
class(sbux$fiber_g)#> [1] "numeric"
class(sbux$category)#> [1] "factor"
Pada bagian ini kita akan mencoba mencari insight-insight dari
dataset sbux, kita dapat menggunakan fungsi summary() untuk
menampilkan five-number summary
summary(sbux)#> product_name size milk
#> Iced Caffè Mocha : 60 grande :334 2% :190
#> Caffè Mocha : 40 venti :320 coconut:190
#> Cinnamon Dolce Latte : 40 tall :318 none :165
#> Hot Chocolate : 40 short :123 nonfat :222
#> White Chocolate Mocha: 40 trenta : 21 soy :190
#> White Hot Chocolate : 40 doppio : 7 whole :190
#> (Other) :887 (Other): 24
#> whip serv_size_m_l calories total_fat_g
#> with whip cream :283 Min. : 0.0 Min. : 0.0 Min. : 0.000
#> without whip cream:864 1st Qu.:354.0 1st Qu.:130.0 1st Qu.: 1.000
#> Median :473.0 Median :220.0 Median : 4.500
#> Mean :461.3 Mean :228.4 Mean : 6.186
#> 3rd Qu.:591.0 3rd Qu.:320.0 3rd Qu.:10.000
#> Max. :887.0 Max. :640.0 Max. :28.000
#>
#> saturated_fat_g trans_fat_g cholesterol_mg sodium_mg
#> Min. : 0.000 Min. :0.0000 Min. : 0.00 Min. : 0.0
#> 1st Qu.: 0.200 1st Qu.:0.0000 1st Qu.: 0.00 1st Qu.: 70.0
#> Median : 2.500 Median :0.0000 Median : 5.00 Median :135.0
#> Mean : 3.881 Mean :0.1212 Mean :15.24 Mean :139.7
#> 3rd Qu.: 7.000 3rd Qu.:0.2000 3rd Qu.:30.00 3rd Qu.:200.0
#> Max. :20.000 Max. :2.0000 Max. :75.00 Max. :370.0
#>
#> total_carbs_g fiber_g sugar_g caffeine_mg
#> Min. : 0.00 Min. :0.0000 Min. : 0.00 Min. : 0.00
#> 1st Qu.:20.00 1st Qu.:0.0000 1st Qu.:18.00 1st Qu.: 30.00
#> Median :37.00 Median :0.0000 Median :34.00 Median : 75.00
#> Mean :37.72 Mean :0.8657 Mean :34.99 Mean : 91.86
#> 3rd Qu.:53.00 3rd Qu.:1.0000 3rd Qu.:49.00 3rd Qu.:150.00
#> Max. :96.00 Max. :9.0000 Max. :89.00 Max. :475.00
#>
#> category
#> Espresso :399
#> Tea :225
#> Frappucino Blended Crème :183
#> Frappuccino Blended Coffee:120
#> Hot Chocolate & Other : 96
#> Coffee : 80
#> (Other) : 44
Untuk menjawab pertanyaan ini kita akan melakukan conditional
subsetting dengan memasukan nilai kalori tertinggi dari hasil fungsi
summary() sebesar 640 kcal
sbux[sbux$calories == 640,]Jawaban : Produk yang memiliki nilai kalori tertinggi sebesar 640 kcal adalah kombinasi White Hot Chocolate - Venti - Whole Milk - With Whip Cream
Sama dengan pertanyaan sebelumnya kita akan melakukan condtional
subsetting, tetapi kita akan menggunakan fungsi tambahan
max() untuk mendapatkan nilai maksimumnya
sbux[sbux$caffeine_mg == max(sbux$caffeine_mg),]Jawaban : Produk yang memiliki nilai kafein tertinggi sebesar 475 mg adalah kombinasi Brewed Coffee: True North Blend Blonde Roast - Venti
Kita akan menggunakan fungsi xtabs() untuk menampilkan
jumlah kandungan gula setiap kategori, selanjutnya akan menggunakan
fungsi as.data.frame untuk merubah hasil dari fungsi xtabs
menjadi data frame
Jawaban:
as.data.frame(xtabs(formula = sugar_g ~ category, data = sbux))Untuk mendapatkan jawaban tersebut akan lebih jika menggungakan
fungsi aggregate()
Jawaban:
aggregate(formula = calories~category, data = sbux, FUN = 'mean')