Course Map

  1. Dive Deeper Into Data Wrangling & Exploration Tools
  2. Static Visualization Transformation/Interactive Plot
  3. Web Dashboard

Data Wrangling & Exploratory dengan dplyr

dplyr adalah package khusus yang mempermudah kita dalam melakukan data wrangling ataupun eksplorasi data. Berikut beberapa tahapan yang akan kita lakukan dalam melakukan data wrangling ataupun eksplorasi data.

  • Inspeksi data
  • Seleksi kolom
  • Filter baris
  • Membuat atau mengubah kolom
  • Agregasi data
  • Mengurutkan baris

Official Documentation & Cheatsheet dplyr: https://dplyr.tidyverse.org/

library(dplyr)

Membaca data

# Please type your code here
vids <-  read.csv(file = "data_input/youtubetrends_2023.csv")
vids

Penjelasan mengenai 16 kolom dalam dataframe:

  • trending_date: tanggal trending (format: YY.MM.DD)
  • title: judul video
  • channel_title: nama channel Youtube
  • category_id: kategori video
  • publish_time: tanggal upload video (format: YYYY-MM-DD-HH-MM-SS)
  • views: jumlah views dalam video tersebut
  • likes: jumlah likes dalam video tersebut
  • dislikes: jumlah dislikes dalam video tersebut
  • comment_count jumlah komentar
  • comment_disabled: apakah kolom komentar tidak diaktifkan
  • rating_disabled: apakah rating video tidak diaktifkan
  • video_error_or_removed: apakah video dihapus
  • publish_hour: jam video tersebut dipublish
  • publish_when: range video tersebut dipublish
  • publish_wday: hari video tersebut dipublish
  • timetotrend: rentan waktu video tersebut dari dipublish sampai menjadi trending

Grammar of data manipulation dplyr

Seleksi kolom

Tugas: Kita sebagai tim data diminta untuk mengambil data video youtube yang berisikan kolom trending_date dan category_id saja.

Cara base:

# Please run the code down below
vids[,c("trending_date", "category_id")]

Cara dplyr:

Fungsi yang akan digunakan adalah select()

Syntax: select(.data = nama_df, nama_kolom, nama_kolom2, nama_kolom_dst)

# Please type your code here
select(.data = vids, trending_date, category_id)

Filter baris

Tugas: Kita sebagai tim data diminta untuk mengambil data video youtube yang kategorinya adalah Music dan memiliki views lebih dari 100 juta.

Cara base:

# Please run the code down below
vids[vids$category_id == "Music" & vids$views > 100000000,]

Cara dplyr:

Fungsi yang akan digunakan adalah filter()

Syntax: select(.data = nama_df, kondisi/syarat)

# Please type your code here
filter(.data = vids, category_id == "Music" & views > 100000000)

Konsep Piping

Simbol %>% disebut sebagai piping, cara kerjanya adalah melanjutkan suatu proses ke proses lainnya secara sekuensial atau berurutan. Untuk lebih memahaminya, mari kita coba lihat perbandingan di bawah ini.

Sebagai contoh, kita memiliki data bunga iris yang memiliki 5 kolom sebagai berikut

head(iris)

Deskripsi kolom:

  • Sepal.Length: Panjang ukuran daun
  • Sepal.Width: Lebar ukuran daun
  • Petal.Length: Panjang ukuran bunga
  • Petal.Width: Lebar ukuran bunga
  • Species: Jenis spesies (setosa, versicolor, virginica)

Dari data tersebut, mari kita coba ambil kolom Sepal.Length dan Species saja. Selain itu kita juga hanya akan mengambil data species dengan kategori setosa saja.

Hasil tanpa piping:

select <- select(.data = iris, Sepal.Length, Species)
filter <- filter(.data = select, Species %in% 'setosa')

Hasil dengan piping:

iris %>% 
  select(Sepal.Length,  Species) %>% 
  filter(Species %in% 'setosa')

Shortcut Piping: CTRL/CMD + SHIFT + M

Inspeksi data

Inspeksi tipe data untuk membuktikan apakah fungsi read_csv() memang betul langsung mengubah tipe data yang tanggal atau tidak, sekaligus kita akan mencoba untuk mengecek tipe data apa saja yang belum sesuai.

Cara base:

# Please run the code down below
str(vids)
#> 'data.frame':    72397 obs. of  16 variables:
#>  $ trending_date         : chr  "2023-01-01" "2023-01-01" "2023-01-01" "2023-01-01" ...
#>  $ title                 : chr  "Peach Bowl: Ohio State Buckeyes vs. Georgia Bulldogs | Full Game Highlights" "If You Build It, I'll Pay For It!" "Fiesta Bowl: TCU Horned Frogs vs. Michigan Wolverines | College Football Playoff" "Dude Perfect vs. Luka Doncic (1-on-1)" ...
#>  $ channel_title         : chr  "ESPN College Football" "MrBeast Gaming" "ESPN College Football" "Dude Perfect" ...
#>  $ category_id           : chr  "Sports" "Gaming" "Sports" "Sports" ...
#>  $ publish_time          : chr  "2023-01-01 05:12:55" "2022-12-31 20:00:04" "2023-01-01 01:11:58" "2022-12-31 14:59:56" ...
#>  $ views                 : int  618494 3621512 500700 2811640 358177 2088464 1915097 663532 1454615 2706246 ...
#>  $ likes                 : int  7884 238494 4915 148481 2963 18234 24181 5130 32079 69895 ...
#>  $ dislikes              : int  0 0 0 0 0 0 0 0 0 0 ...
#>  $ comment_count         : int  2413 12935 2355 4543 654 1508 2711 776 3410 4231 ...
#>  $ comments_disabled     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ ratings_disabled      : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ video_error_or_removed: logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
#>  $ publish_hour          : int  5 20 1 14 5 20 0 13 20 4 ...
#>  $ publish_when          : chr  "12am to 8am" "3pm to 12am" "12am to 8am" "8am to 3pm" ...
#>  $ publish_wday          : chr  "Sunday" "Saturday" "Sunday" "Saturday" ...
#>  $ timetotrend           : int  0 1 0 1 0 1 0 1 2 1 ...

Cara dplyr:

Fungsi yang akan digunakan adalah glimpse()

# Please type your code here
vids %>% 
  glimpse()
#> Rows: 72,397
#> Columns: 16
#> $ trending_date          <chr> "2023-01-01", "2023-01-01", "2023-01-01", "2023…
#> $ title                  <chr> "Peach Bowl: Ohio State Buckeyes vs. Georgia Bu…
#> $ channel_title          <chr> "ESPN College Football", "MrBeast Gaming", "ESP…
#> $ category_id            <chr> "Sports", "Gaming", "Sports", "Sports", "News &…
#> $ publish_time           <chr> "2023-01-01 05:12:55", "2022-12-31 20:00:04", "…
#> $ views                  <int> 618494, 3621512, 500700, 2811640, 358177, 20884…
#> $ likes                  <int> 7884, 238494, 4915, 148481, 2963, 18234, 24181,…
#> $ dislikes               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
#> $ comment_count          <int> 2413, 12935, 2355, 4543, 654, 1508, 2711, 776, …
#> $ comments_disabled      <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE…
#> $ ratings_disabled       <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE…
#> $ video_error_or_removed <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE…
#> $ publish_hour           <int> 5, 20, 1, 14, 5, 20, 0, 13, 20, 4, 18, 16, 18, …
#> $ publish_when           <chr> "12am to 8am", "3pm to 12am", "12am to 8am", "8…
#> $ publish_wday           <chr> "Sunday", "Saturday", "Sunday", "Saturday", "Su…
#> $ timetotrend            <int> 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 2, 2, 2, 2, 2, 1,…

Kolom apa saja yang belum sesuai dari hasil inspeksi datanya?

Modifikasi tipe data & kolom

Modifikasti tipe data

Dari beberapa kolom yang tipe datanya belum sesuai mari kita coba ubah terlebih dahulu menjadi tipe yang lebih sesuai

Cara base:

# Please run the code down below
vids$category_id <- as.factor(vids$category_id)

Cara dplyr:

Fungsi yang akan digunakan adalah mutate()

Syntax: mutate(nama_kolom = fungsi_merubah_tipe_data(nama_kolom))

vids %>% 
  select(where(is.character)) %>% 
  names()
#> [1] "trending_date" "title"         "channel_title" "publish_time" 
#> [5] "publish_when"  "publish_wday"
# Please type your code here
library(lubridate)

vids_clean <- vids %>% 
  mutate_at(.vars = c("title", "category_id", "channel_title", "publish_when",  "publish_wday"), 
            .funs = as.factor) %>% 
  mutate(trending_date = ymd(trending_date),
         publish_time = ymd_hms(publish_time))

Modifikasti kolom

Kita akan menambahkan beberapa kolom baru, yaitu:

  • likes_per_view: likes per views
  • dislikes_per_view: dislikes per views
  • comment_per_view: comment_count per views

Cara base:

# Please run the code down below
vids$likes_views <- vids$likes / vids$views
vids %>% 
  head()

Cara dplyr:

Fungsi yang akan digunakan adalah mutate()

Syntax: mutate(nama_kolom_baru = metode penambahan kolom)

# Please type your code here
vids_clean <- vids_clean %>% 
  mutate(likes_views = likes/views)

vids_clean %>% 
  head()

Agregasi Data

Tugas: Ternyata pekerjaan kita masih belum selesai, kita diminta untuk menghitung rata-rata views video trending yang dimiliki oleh tiap channel YouTube

Cara base:

# Please run the code down below
aggregate(views ~ channel_title, data = vids_clean, FUN = mean)

Cara dplyr:

Pada dplyr, kita dapat melakukan aggregasi data menggunakan urutan fungsi berikut:

  • group_by(): melakukan pengelompokkan berdasarkan kolom tertentu, sehingga proses apapun setelahnya dilakukan berdasarkan pengelompokkan tersebut.
  • summarise(): menghitung nilai statistik tertentu.

Notes: Untuk kolom baru yang akan dibuat akan disimpan dengan nama kolom mean_views dan keseluruhan objeknya akan dismpan dengan nama vids_agg

vids_clean %>% 
  group_by(channel_title) %>% 
  summarise(mean(views ))
# Please type your code here
vids_agg <- vids_clean %>% 
  group_by(channel_title) %>% 
  summarise(mean = mean(views))

Disclaimer:

Mengurutkan baris

Tugas: Agar hasil agregasi untuk rata-rata views dari setiap trending video.

Cara base:

# Please run the code down below
vids_agg[order(vids_agg$mean_views, decreasing = T),]

Cara dplyr:

Fungsi yang akan digunakan adalah arrange()

Syntax: arrange(nama_kolom_yang_mau_diurutkan)

# Please type your code here
vids_agg %>% 
  arrange(-mean)

###️ Dive Deeper

Background: Lita saat ini adalah seorang Data Science Instructor di Algoritma. Lita ingin menjadi seorang YouTuber namun masih bingung terkait konten apa yang sebaiknya dibuat. Lita adalah seseorang yang ambisius karena ingin videonya sering masuk ke jajaran video trending.

  1. Dari cerita di atas, rekomendasikan kategori video apa yang sebaiknya Lita buat. Dengan kata lain, cari tahu banyaknya jumlah video yang trending dari setiap kategori video. Lalu, simpan ke objek bernama vids_count.

Hint: Untuk melakukan perhitungan count, fungsi yang digunakan adalah n()

# your code here
vids_count <- vids_clean %>% 
  group_by(category_id) %>% 
  summarize(Frekuensi = n()) %>% 
  arrange(-Frekuensi)

vids_count %>% 
  head()

Kategori dengan jumlah video trending terbanyak adalah …

  1. Berdasarkan rekomendasi kategori video di atas, Lita ingin mengetahui beberapa channel terkenal yang nantinya akan digunakan sebagai referensi channel yang akan dibuat. Dengan kata lain, cari tahu top 10 YouTube channel dengan jumlah views tertinggi pada kategori video tersebut.
vids_top_channel <- vids_clean %>% 
  filter(category_id %in% "Gaming") %>% 
  group_by(channel_title) %>% 
  summarise(sum_views = sum(views)) %>% 
  arrange(desc(sum_views)) %>%  
  top_n(10)

vids_top_channel

Static Visualization Transformation/Interactive Plot

Seiring bertambahnya data dalam kompleksitas dan ukuran, sering kali tim analis diberi tugas yang sulit untuk menyeimbangkan storytelling dengan hasil visualisasinya. Tim Analis juga ditugaskan untuk menemukan keseimbangan yang baik antara cakupan dan detail di bawah batasan grafik dan plot statis.

Harapannya dengan melakukan transformasi dari plot yang statis menjadi plot interaktif, kita sebagai tim analis dapat menyampaikan informasi yang lebih informatif dan menarik.

Interactive Plot dengan plotly

Packages plotly adalah salah satu package yang sangat dipuji dalam komunitas data science karena kapabilitas dan fleksibilitasnya untuk membantu kita dalam membuat visual interaktif dari objek ggplot.

Official Documentation plotly: https://plotly.com/r/

# install.packages("plotly")
library(plotly)

Tahapan pembuatan interactive plot menggunakan plotly:

  1. Formulasikan business question
  2. Persiapan data
  3. visualisasi statis dengan ggplot()
  4. Mengubah objek ggplot menjadi plotly dengan ggplotly()

Plot 1:

Business Question:

Buatlah analisis kategori video yang paling sering masuk ke dalam jajaran video trending!

  • Persiapan data
# Please type your code here
vids_count
  • Visualisasi Statis
# Please type your code here
library(ggplot2)

plot1 <- 
ggplot(data = vids_count, mapping = aes(x = Frekuensi, y = reorder(category_id, Frekuensi), fill = Frekuensi))+ 
  geom_col() +
  scale_fill_gradient(low = "red",
                    high = "black") +
labs(title = "Top YouTube Category by Count",
     x = "Total Count", 
     y = NULL) +
theme_light() +
theme(legend.position = "none") 

Silahkan tambahkan kode di bawah untuk mempercantik visual

scale_fill_gradient(low = "red",
                    high = "black") +
labs(title = "Top YouTube Category by Count",
     x = "Total Count", 
     y = NULL) +
theme_light() +
theme(legend.position = "none") 
  • Mengubah objek ggplot menjadi interaktif

Fungsi yang akan digunakan ggplotly() dan pada fungsi tersebut akan di-isi dengan nama variabel yang menyimpan visualisasi statis. Maka dari itu kita bisa menyimpan variabel

# Please type your code here
ggplotly(plot1)

Tooltip

Tooltip adalah informasi atau label yang ditampilkan ketika user meng-hover plot. Informasi yang akan ditampilkan adalah informasi yang diletakan pada bagian aes() di fungsi ggplot()

# install.packages("glue")
library(glue)
# contoh penggunaan fungsi glue dari library glue
nama <- c("Arkana","Lita", "Victor")
glue("Nama Instructor: {nama}")
#> Nama Instructor: Arkana
#> Nama Instructor: Lita
#> Nama Instructor: Victor

Tahapan dalam menambahkan tooltip:

  1. Pada tahapan persiapan data, tambahkan kolom berisi informasi tulisan pada tooltip. Fungsi glue() digunakan untuk menampilkan nilai pada kolom.
vids_count <- vids_clean %>% 
  group_by(category_id) %>% 
  summarize(Frekuensi = n()) %>% 
  arrange(-Frekuensi)
# Please type your code here
vids_count <- 
vids_clean %>% 
  group_by(category_id) %>% 
  summarize(Frekuensi = n()) %>% 
  arrange(-Frekuensi) %>% 
  mutate(label = glue("Category: {category_id}
                      Total Count: {Frekuensi}"))
  1. Membuat ulang visualisasi dengan menambahkan parameter text pada aes()
plot1 <- 
ggplot(data = vids_count, mapping = aes(x = Frekuensi, 
                                        y = reorder(category_id, Frekuensi), 
                                        fill = Frekuensi))+ 
  geom_col() +
  scale_fill_gradient(low = "red",
                    high = "black") +
labs(title = "Top YouTube Category by Count",
     x = "Total Count", 
     y = NULL) +
theme_light() +
theme(legend.position = "none") 
# Please type your code here
plot1 <- 
ggplot(data = vids_count, mapping = aes(x = Frekuensi, 
                                        y = reorder(category_id, Frekuensi), 
                                        fill = Frekuensi,
                                        text = label))+ 
  geom_col() +
  scale_fill_gradient(low = "red",
                    high = "black") +
labs(title = "Top YouTube Category by Count",
     x = "Total Count", 
     y = NULL) +
theme_light() +
theme(legend.position = "none") 
  1. Menambahkan parameter tooltip = "text" pada ggplotly()
# Please type your code here
ggplotly(plot1, tooltip = "text")

Plot 2:

Business Question:

Dari kategori Gaming, lakukan analisis top 10 channel YouTube dengan rata-rata jumlah views tertinggi!

  • Persiapan data
library(scales)

# Please type your code here
vids_top_channel <- vids_clean %>% 
  filter(category_id %in% "Gaming") %>% 
  group_by(channel_title) %>% 
  summarise(sum_views = sum(views)) %>% 
  arrange(desc(sum_views)) %>%  
  top_n(10) %>% 
  mutate(label = glue("Channel Title = {channel_title}
                       Total Views = {comma(sum_views)}"))
  • Visualisasi Statis
# Please type your code here


plot2 <- 
vids_top_channel %>% 
  ggplot(mapping = aes(x = sum_views, # x total views, y channel title
                       y = reorder(channel_title, sum_views),
                       text = label,
                       fill = sum_views)) +
  geom_col() +
  scale_fill_gradient(low = "red",
                      high = "black") +
  scale_x_continuous(labels = comma)+
  labs(title = "Top 10 Gaming Channel by Views",
       x = "Total Views",
       y = "") + 
  theme_minimal() +
  theme(legend.position = "none")
scale_fill_gradient(low = "red",
                      high = "black") +
scale_x_continuous(labels = comma)+
labs(title = "Top 10 Gaming Channel by Views",
     x = "Total Views",
     y = "") + 
theme_minimal() +
theme(legend.position = "none")
  • Mengubah objek ggplot menjadi interaktif

Fungsi yang akan digunakan ggplotly()

# Please type your code here
ggplotly(plot2, tooltip = 'text')

Plot 3:

Business Question:

Setelah menganalisis top 10 channel dari kategori video Gaming, kita ingin melihat aktivitas viewers pada kategori tersebut di setiap publish_hour. Tipe plot apa yang baiknya digunakan? Buatlah interactive plotnya.

  • Persiapan data
# Please type your code here
vids_trending_hour <- 
vids_clean %>% 
  filter(category_id %in% "Gaming") %>% 
  group_by(publish_hour) %>% 
  summarise(avg_views = mean(views)) %>% 
  ungroup() %>% 
  mutate(label = glue("Publish Hour: {publish_hour}
                      Average Views: {comma(avg_views)}"))
  • Visualisasi Statis
# Please type your code here
plot3 <- 
vids_trending_hour %>% 
  ggplot(mapping = aes(x = as.factor(publish_hour),
                       y = avg_views
                       )) +
  geom_line(group = 1, col = "red") +
  geom_point( aes(text = label)) +
  labs(title = "Average Views For Gaming Category Based On Publish Hour",
       x = "Publish Hour",
       y = "Average View") +
  theme_minimal()
  labs(title = "Average Views For Gaming Category Based On Publish Hour",
       x = "Publish Hour",
       y = "Average View") +
  theme_minimal()
  • Mengubah objek ggplot menjadi interaktif

Fungsi yang akan digunakan ggplotly()

# Please type your code here
ggplotly(plot3, tooltip = "text")

Web Dashboard

Sebelum mempelajari lebih lanjut mengenai Web Dashboard, silahkan pindahkan beberapa hal dari pembelajaran persiapan data dan pembuatan visual interaktif di atas ke beberapa chunk di bawah ini.

Library

library(dplyr)
library(lubridate)
library(ggplot2)
library(plotly)
library(glue)

Data Preparation

# Membaca data
vids <- read.csv("data_input/youtubetrends_2023.csv")

# Mengubah tipe data
vids_clean <- vids %>% 
  mutate_at(.vars = c("title", "category_id", "channel_title", "publish_when",  "publish_wday"), 
            .funs = as.factor) %>% 
  mutate(trending_date = ymd(trending_date),
         publish_time = ymd_hms(publish_time))

Visual 1

# Persiapan Data


# Pembuatan Visual Statis


# Mengubah Visual Statis menjadi Interaktif

Visual 2

# Persiapan Data


# Pembuatan Visual Statis


# Mengubah Visual Statis menjadi Interaktif

Visual 3

# Persiapan Data


# Pembuatan Visual Statis


# Mengubah Visual Statis menjadi Interaktif

Flexdashboard

Flex Dashboard adalah paket R yang mudah membuat dasbor fleksibel, menarik, dan interaktif”. Pembuatan dan penyesuaian dasbor dilakukan menggunakan R Markdown dengan format output flexdashboard::flex_dashboard.

# install.packages("flexdashboard")
library(flexdashboard)

Langkah membuat file Rmd dengan template flexdashboard:

  1. Pilih Menu File > New File > R Markdown
  2. Pada bagian “From Template”, pilih “Flex Dashboard”
  3. Klik tombol “OK”
  4. Simpan file Rmd dan beri nama file (bisa dengan shortcut CTRL + S)

Shiny

Shiny adalah packages dari RStudio, yang menyediakan framework aplikasi web untuk membuat aplikasi web interaktif (visualisasi) yang disebut “Shiny apps”. Kemudahan bekerja dengan Shiny telah mempopulerkannya di antara pengguna R. Aplikasi web ini menampilkan objek R dengan cantik (seperti plot, tabel, dll.) dan juga dapat di-deploy untuk memungkinkan diakses oleh siapa saja.

Shiny menyediakan widget yang memungkinkan untuk membangun aplikasi yang elegan dengan sedikit usaha.

Struktur aplikasi shiny dasar:

knitr::include_graphics(path = "assets/shiny architecture.png")

  • global.R: Untuk menyiapkan lingkungan aplikasi, misalnya, library, impor data dan persiapan data.
  • ui.R: User Interface (UI) untuk menampilkan input dan output.
  • server.R: Untuk memproses input dari user dan mengubahnya menjadi output.
# install.packages("shinydashboard")
library(shinydashboard)

Referensi: