# 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 10 kali.

Step 1: Membuat sebuah objek dengan nama trending_channel yang berisikan dataframe yang chanel title yang pernah trend setidaknya 10 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 10 kali setidaknya

# Please type your code down below
trending_channel <- trending_channel[trending_channel$Freq >= 10, ]
top10_trending_channel <- head(trending_channel[order(trending_channel$Freq, decreasing = T),], 10)

Step 3: Coba visualisasikan dengan geom_col

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

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

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

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 = top10_trending_channel, mapping = aes(y = reorder(Var1, Freq), x = 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 = top10_trending_channel, mapping = aes(y = reorder(Var1, Freq), 
                                                    x = Freq, 
                                                    fill = Freq)) +
  geom_col() +
  scale_fill_gradient(low = "red", high = "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 = top10_trending_channel, mapping = aes(y = reorder(Var1, Freq), 
                                                    x = Freq, 
                                                    fill = Freq)) +
  geom_col() +
  scale_fill_gradient(low = "red", high = "orange") +
  geom_text(mapping = aes(label = Freq), 
            color = "black", 
            size = 2, 
            nudge_x = 1) +
  theme(legend.position = "none")

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 + data: dataframe yang digunakan + FUN: fungsi matematis

# Please Type Your Code Down Below
vids.agg <- 
aggregate(
  x = channel_title ~ category_id + publish_when,
  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(data = vids.agg, mapping = aes(x = vid_count, y = reorder(category_id, vid_count), fill = publish_when)) + 
  geom_col(position = "dodge")

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
ggplot(data = 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("orange", "red", "yellow"))+
  geom_text(mapping = aes(label = vid_count, group = publish_when), 
            size = 2,
            position = position_dodge(width = 0.9),
            hjust = 0.01) 

1.3 Line chart

Business Case: Bagaimana trending dari konten dengan kategori Comedy, Education,dan Sciennce and Technology dari hari ke hari.

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.ces <- vids.unik[vids.unik$category_id %in% c("Gaming", "Entertainment", "Music"), ]

Step 3: Mari kita coba hitung kemunculan video yang trending dengan menggunkan fungsi table()

# Please run the code down below
vids.ces <- as.data.frame(table(vids.ces$trending_date, vids.ces$category_id))
vids.ces

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

# Please type your code down below
ggplot(data = vids.ces, mapping = aes(x = ymd(Var1) , y = Freq, color = Var2)) +
  geom_line()

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

# Please type your code down below
ggplot(data = vids.ces, mapping = aes(x = ymd(Var1) , y = Freq, color = Var2)) +
  geom_line() +
  geom_point()

Step 6: 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.ces, mapping = aes(x = ymd(Var1) , y = Freq, color = Var2)) +
  geom_line() +
  geom_point() +
  scale_x_date(date_breaks = "1 week",
               date_labels = "%W-%y")

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

1.4 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
# Tambahkan facet untuk scales = free_y
# Tambahkan facet untuk scales = free

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: