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.
Official Documentation & Cheatsheet
dplyr
: https://dplyr.tidyverse.org/
Penjelasan mengenai 16 kolom dalam dataframe:
trending_date
: tanggal trending (format: YY.MM.DD)title
: judul videochannel_title
: nama channel Youtubecategory_id
: kategori videopublish_time
: tanggal upload video (format:
YYYY-MM-DD-HH-MM-SS)views
: jumlah views dalam video tersebutlikes
: jumlah likes dalam video tersebutdislikes
: jumlah dislikes dalam video tersebutcomment_count
jumlah komentarcomment_disabled
: apakah kolom komentar tidak
diaktifkanrating_disabled
: apakah rating video tidak
diaktifkanvideo_error_or_removed
: apakah video dihapuspublish_hour
: jam video tersebut dipublishpublish_when
: range video tersebut dipublishpublish_wday
: hari video tersebut dipublishtimetotrend
: rentan waktu video tersebut dari dipublish
sampai menjadi trendingdplyr
Tugas: Kita sebagai tim data diminta untuk mengambil data
video youtube yang berisikan kolom trending_date
dan
category_id
saja.
Cara base:
Cara dplyr:
Fungsi yang akan digunakan adalah select()
Syntax:
select(.data = nama_df, nama_kolom, nama_kolom2, nama_kolom_dst)
Tugas: Kita sebagai tim data diminta untuk mengambil data
video youtube yang kategorinya adalah Music
dan memiliki
views lebih dari 100 juta
.
Cara base:
Cara dplyr:
Fungsi yang akan digunakan adalah filter()
Syntax: select(.data = nama_df, kondisi/syarat)
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
Deskripsi kolom:
Sepal.Length
: Panjang ukuran daunSepal.Width
: Lebar ukuran daunPetal.Length
: Panjang ukuran bungaPetal.Width
: Lebar ukuran bungaSpecies
: 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:
Hasil dengan piping:
Shortcut Piping: CTRL/CMD + SHIFT + M
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:
#> '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()
#> 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?
Dari beberapa kolom yang tipe datanya belum sesuai mari kita coba ubah terlebih dahulu menjadi tipe yang lebih sesuai
Cara base:
Cara dplyr:
Fungsi yang akan digunakan adalah mutate()
Syntax:
mutate(nama_kolom = fungsi_merubah_tipe_data(nama_kolom))
#> [1] "trending_date" "title" "channel_title" "publish_time"
#> [5] "publish_when" "publish_wday"
Kita akan menambahkan beberapa kolom baru, yaitu:
likes_per_view
: likes per viewsdislikes_per_view
: dislikes per viewscomment_per_view
: comment_count per viewsCara base:
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()
Tugas: Ternyata pekerjaan kita masih belum selesai, kita diminta untuk menghitung rata-rata views video trending yang dimiliki oleh tiap channel YouTube
Cara base:
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
# Please type your code here
vids_agg <- vids_clean %>%
group_by(channel_title) %>%
summarise(mean = mean(views))
Disclaimer:
Tugas: Agar hasil agregasi untuk rata-rata views dari setiap trending video.
Cara base:
Cara dplyr:
Fungsi yang akan digunakan adalah arrange()
Syntax: arrange(nama_kolom_yang_mau_diurutkan)
###️ 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.
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 …
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
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.
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/
Tahapan pembuatan interactive plot menggunakan
plotly
:
ggplot()
ggplotly()
Business Question:
Buatlah analisis kategori video yang paling sering masuk ke dalam jajaran video trending!
# 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")
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
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()
# 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
:
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}"))
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")
tooltip = "text"
pada
ggplotly()
Business Question:
Dari kategori Gaming, lakukan analisis top 10 channel YouTube dengan rata-rata jumlah views tertinggi!
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)}"))
# 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")
Fungsi yang akan digunakan ggplotly()
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.
# 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)}"))
# 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()
Fungsi yang akan digunakan ggplotly()
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
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
Visual 2
Visual 3
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
.
Langkah membuat file Rmd dengan template flexdashboard:
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:
Referensi:
shiny Cheatsheet
: https://raw.githubusercontent.com/rstudio/cheatsheets/main/shiny.pdfshiny Gallery
: https://shiny.rstudio.com/gallery/shiny Input
Gallery: https://shiny.rstudio.com/gallery/widget-gallery.htmlshinyWidgets
: http://shinyapps.dreamrs.fr/shinyWidgets/shinydashboard
: https://rstudio.github.io/shinydashboard/