# Import Library
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(ggplot2)
# Read Data 
vids <- read.csv("data_input/USvideos_2023.csv")

# Change Data Type
vids$trending_date <- ymd(vids$trending_date)
## Warning: 44200 failed to parse.
vids$publish_time <- ymd_hms(vids$publish_time)

# Extract DateTime Data
vids$publish_day <- wday(vids$publish_time, label = T, abbr = F)
vids$publish_hour <- hour(vids$publish_time)
vids$publish_date <- date(vids$publish_time)
vids$time_to_trend <- as.numeric (vids$trending_date - vids$publish_date)

# Add New Column
vids$publish_when <- 
case_when(
  vids$publish_hour <= 8 ~ "12am to 8am",
  vids$publish_hour > 8 & vids$publish_hour <= 15 ~ "8am to 3pm",
  vids$publish_hour >= 16 ~ "3pm to 12am"
)

# Change Category Id
vids$category_id <- 
case_when(vids$category_id == "1"  ~ "Film and Animation",
          vids$category_id == "2"  ~ "Autos and Vehicles", 
          vids$category_id == "10" ~ "Music", 
          vids$category_id == "15" ~ "Pets and Animals", 
          vids$category_id == "17" ~ "Sports",
          vids$category_id == "19" ~ "Travel and Events", 
          vids$category_id == "20" ~ "Gaming", 
          vids$category_id == "22" ~ "People and Blogs", 
          vids$category_id == "23" ~ "Comedy",
          vids$category_id == "24" ~ "Entertainment", 
          vids$category_id == "25" ~ "News and Politics",
          vids$category_id == "26" ~ "Howto and Style", 
          vids$category_id == "27" ~ "Education",
          vids$category_id == "28" ~ "Science and Technology", 
          vids$category_id == "29" ~ "Nonprofit and Activism",
          vids$category_id == "43" ~ "Shows")

# Select First Trend Video Title
vids.unik <- 
distinct(.data = vids, 
         title,
         .keep_all = T)

1 Grammar of Graphics with ggplot2

1.1 Bar chart

Business Case: Sebagai seorang Data Analyst kita ingin menganalisa channel yang yang sering menjadi trending, tolak ukur sebuah channel sering menjadi trending adalah pernah masuk ke trend setidaknya 30 kali.

Step 1: Membuat sebuah objek dengan nama trending_channel yang berisikan dataframe yang chanel title yang pernah trend setidaknya 30 kali

Hint:

  • table() adalah fungsi yang dapat dimanfaatkan untuk menghitung berapa kali chaneel tersebut menjadi trending
  • as.data.frame() adalah fungsi yang dapat dimanfaatkan untuk mengubah list menjadi dataframe
# Please type your code down below
trending_channel <- as.data.frame(table(vids.unik$channel_title))

Step 2: Melakukan conditional subseting hanya untuk channel yang pernah trending 30 kali setidaknya

# Please type your code down below
trending_channel <- trending_channel[trending_channel$Freq >= 30, ]

Step 3: Coba visualisasikan dengan geom_col

# Please type your code down below
ggplot(data = trending_channel, mapping = aes(x = Freq, y = Var1)) +
  geom_col()

Step 4: Coba kita switch antara kolom x & y pada parameter aes()

# Please type your code down below

Step 5: Menambahkan parameter reorder() disumbu y

  • reorder() adalah sebuh parameter yang dapat dimanfaatkan untuk mengurutkan freq
# Please type your code down below
ggplot(data = trending_channel, mapping = aes(x = Freq, y = reorder(Var1, Freq))) +
  geom_col()

Step 6: Mengubah warna dalam plot dengan menabahkan fungsi scale_fill_gradient()

  • scale_fill_gradient() adalah sebuah fungsi untuk meberikan gradasi warna pada setiap bar dalam geom_col(), parameter yang dapat digunakan adalah
    • low = parameter untuk warna yang paling bawah
    • high = parameter untuk warna yang paling atas
# Please type your code down below
ggplot(data = trending_channel, mapping = aes(x = Freq, y = reorder(Var1, Freq), fill = Freq)) +
  geom_col() +
  scale_fill_gradient(high = "red", low = "orange")

Step 7: Menambahkan geom_text()

  • geom_text() adalah sebuah fungsi untuk memberikan keteragan angka didalam bar plot
    • color = Untuk memberikan warna ke text
    • size = untuk mengatur ukuran text
    • nudge_x = untuk mengatur orientasi sumbu x
# Please type your code down below
ggplot(data = trending_channel, mapping = aes(x = Freq, y = reorder(Var1, Freq), fill = Freq)) +
  geom_col() +
  scale_fill_gradient(high = "red", low = "orange") +
  geom_text(mapping = aes(label = Freq), color= "white")

Insight:

1.2 Multivariate Plot

Multivariate plot adalah sebuah plot yang digunakan untuk menampilkan nilai dari beragam variabel secara bersamaan.

Business Case: Kita ingin mengetahui banyaknya video trending yang di-publish berdasarkan kategorinya (category_id) dan waktu publish-nya (publish_when).

Step 1: Melakukan aggregasi untuk mengetahui banyaknya jumlah video trending berdasarkan kategori

Parameter dari fungsi aggregate: + x: formula -> kolom_yang_dihitung ~ dikelompokan_berdasarkan_kolom_1 + dikelompokan_berdasarkan_kolom_2 + etc + data: dataframe yang digunakan + FUN: fungsi matematis

# Please Type Your Code Down Below
vids_agg <- aggregate(
  channel_title ~ category_id + publish_when, # formula 
  data = vids.unik,
  FUN = length
)

# memperbaiki nama kolom
names(vids_agg) <- c("category_id", "publish_when", "vid_count")
head(vids_agg)

Step 2: Mari visualisasi dataframe yang sudah dibuat menjadi long format

Pada fungsi geom_col() ada sebuah parameter yang bernama position dan didalam postion itu bisa memasukan sebuah value bernama dodge.

# Please Type Your Code Down Below
ggplot(vids_agg, mapping = aes(x = vid_count, y = reorder(category_id, vid_count), fill = publish_when)) +
  geom_col(position = "dodge") 

Pada fungsi geom_col() ada sebuah parameter yang bernama position dan didalam postion itu bisa memasukan sebuah value bernama fill.

Step 3: Mengubah warna dalam plot dengan menabahkan fungsi scale_fill_manual()

  • scale_fill_manual() adalah sebuah fungsi untuk meberikan gradasi warna pada setiap bar dalam geom_col(), parameter yang dapat digunakan adalah
    • values = parameter untuk menentukan warna apa saja yang akan digunakan

Contoh: scale_fill_manual(values = c("orange", "red"))

# Please Type Your Code Down Below
# Please Type Your Code Down Below
ggplot(vids_agg, mapping = aes(x = vid_count, y = reorder(category_id, vid_count), fill = publish_when)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("red", "orange", "yellow")) +
  geom_text(mapping = aes(label = vid_count, group = publish_when), 
            size = 2,
            position = position_dodge(width = 0.9),
            hjust = 0.01) 

1.3 Faceting

Memplotkan variabel di panel terpisah, sehingga visual menjadi lebih jelas. Fungsi yang dapat digunakan adalah facet_wrap()

Parameter yang bisa digunakan pada fungsi facet_wrap()

  • facets = parameter yang menentukan kolom apa yang mau dipisah
  • scales = ada 3 value yang bisa diisi pada parameter ini yaiut free_x, free_y & free

Contoh: facet_wrap(facets = ~ name, scales = "free_x")

# Tambahkan facet untuk scales = free_x
ggplot(vids_agg, mapping = aes(x = vid_count, y = reorder(category_id, vid_count), fill = publish_when)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("red", "orange", "yellow")) +
  geom_text(mapping = aes(label = vid_count, group = publish_when), 
            size = 2,
            position = position_dodge(width = 0.9),
            hjust = 0.01) +
  facet_wrap(facets = ~publish_when, scales = "free_x")

# Tambahkan facet untuk scales = free_y
ggplot(vids_agg, mapping = aes(x = vid_count, y = reorder(category_id, vid_count), fill = publish_when)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("red", "orange", "yellow")) +
  geom_text(mapping = aes(label = vid_count, group = publish_when), 
            size = 2,
            position = position_dodge(width = 0.9),
            hjust = 0.01) +
  facet_wrap(facets = ~publish_when, scales = "free_y")

# Tambahkan facet untuk scales = free
ggplot(vids_agg, mapping = aes(x = vid_count, y = reorder(category_id, vid_count), fill = publish_when)) +
  geom_col(position = "dodge") +
  scale_fill_manual(values = c("red", "orange", "yellow")) +
  geom_text(mapping = aes(label = vid_count, group = publish_when), 
            size = 2,
            position = position_dodge(width = 0.9),
            hjust = 0.01) +
  facet_wrap(facets = ~publish_when, scales = "free")

1.4 Line chart

Business Case: Bagaimana trending dari konten dengan kategori (“Gaming” & “Music”) dari hari ke hari, dari bulan 11-12.

Hint:

  • Pada kasus ini kita akan menggunakan objek vids

Step 1: Mari kita persiapkan datanya dengan conditional subseting dengan memanfaatkan %in%

# Please run the code down below
vids_gm <- vids.unik[vids.unik$category_id %in% c("Gaming", "Music") & vids.unik$trending_date > "2023-11-01", ]

Step 2: Mari kita coba hitung kemunculan video yang trending dengan menggunkan fungsi aggregate()

# Please run the code down below
vids_gm <- 
aggregate(
  x = channel_title ~ category_id + trending_date ,
  data = vids_gm,
  FUN = length
)

Step 3: Mari kita buat plotnya dengan menggunakan geom_line()

# Please type your code down below
ggplot(data = vids_gm, mapping = aes(x = trending_date, y = channel_title, color = category_id))+
  geom_line() 

Step 4: Mari kita buat plotnya dengan menggunakan geom_point()

# Please type your code down below
ggplot(data = vids_gm, mapping = aes(x = trending_date, y = channel_title, color = category_id))+
  geom_line() +
  geom_point()

Step 5: Mengatur sumbu X dengan menggunakan fungsi scale_x_date()

Parameter yang dapat digunakan: - date breaks = ...days ... week ...month - date_labels = format tanggal

Contoh: scale_x_date(date_breaks = "1 week", date_labels = "%m-%d")

# Please type your code down below
ggplot(data = vids_gm, mapping = aes(x = trending_date, y = channel_title, color = category_id))+
  geom_line() +
  geom_point() +
  scale_x_date(date_breaks = "1 week", date_labels = "%m-%d")

Step 6: Mengatur sumbu X dengan menggunakan fungsi scale_y_continous()

Parameter yang dapat digunakan: - breaks(seq(..,..,..))

Contoh: scale_y_continuous(breaks = seq(3, 27, 3))

# Please type your code down below
ggplot(data = vids_gm, mapping = aes(x = trending_date, y = channel_title, color = category_id))+
  geom_line() +
  geom_point() +
  scale_x_date(date_breaks = "1 week", date_labels = "%m-%d") +
  scale_y_continuous(breaks = seq(0, 15, 1))

2 [Opt] Interactive Map with leaflet

Kita dapat membuat interactive map dengan bantuan package leaflet. Leaflet sendiri adalah open-source JavaScript library untuk pembuatan interactive maps.

Contoh sederhana:

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

# get icon
ico <- makeIcon(
    iconUrl = "https://algorit.ma/wp-content/uploads/2017/07/logo_light_trans.png",
    iconWidth=177/2, iconHeight=41/2
)

# make dummy data
set.seed(418)
loca <- data.frame(lat=runif(5, min = -6.24, max=-6.23),
                   lng=runif(5, min=106.835, max=106.85))

# check data
loca
# create a leaflet map widget
map1 <- leaflet()

# add tiles from open street map
map1 <- addTiles(map1)

# add markers
map1 <- addMarkers(map1, data = loca, icon=ico)

map1
# prepare pop-up
pops <- c(
    "<h3>Algoritma Main HQ</h3><p>Visit us here!</p>",
    "<strong>Algoritma Business Campus</strong>", 
    "<h3>In-Construction</h3><p>New Secondary Campus</p>",
    "<strong>Secondary Campus</strong>",
    "<strong>The Basecamp (business-school)</strong>"
)
# make new leaflet
map2 <- leaflet()
map2 <- addTiles(map2)
map2 <- addMarkers(map2, data = loca, icon=ico, popup = pops)

map2

Berikut adalah website dan referensi yang dapat mempermudah pemahaman kita mengenai leaflet:

3 Further Readings

Berikut adalah referensi-referensi lain dan website yang dapat memudahkan kita untuk mengekplorasi seputar data visualisasi di R: