US Videos merupakan sebuah kumpulan data yang didalamnya terdapat beberapa kolom yang berisikan data mengenai judul video, nama channel dan kategori, jumlah likes, dislikes, komentar dan views, tanggal publikasi dan trending sampai ke kolom mengenai apakah video dihapus atau error, rating video dan kolom komentar tidak diaktifkan.

Here!

Steps

Input Data

vids <- read.csv("USvideos.csv")
head(vids)

Data Inspect and Cleaning

Inspect Data

Ada beberapa cara yang dapat digunakan untuk melihat data teratas dan data terbawah, kita dapat menggunakan ‘head’ dan ‘tail’.

head(vids)
tail(vids)

Data Cleaning

Kemudian pada bagian ini kita dapat mengetahui informasi terkait dari data yang kita miliki. Tentunya kita dapat menggunakan beberapa code diantaranya seperti berikut :

str(vids)
## 'data.frame':    13400 obs. of  12 variables:
##  $ trending_date         : chr  "17.14.11" "17.14.11" "17.14.11" "17.14.11" ...
##  $ title                 : chr  "WE WANT TO TALK ABOUT OUR MARRIAGE" "The Trump Presidency: Last Week Tonight with John Oliver (HBO)" "Racist Superman | Rudy Mancuso, King Bach & Lele Pons" "Nickelback Lyrics: Real or Fake?" ...
##  $ channel_title         : chr  "CaseyNeistat" "LastWeekTonight" "Rudy Mancuso" "Good Mythical Morning" ...
##  $ category_id           : int  22 24 23 24 24 28 24 28 1 25 ...
##  $ publish_time          : chr  "2017-11-13T17:13:01.000Z" "2017-11-13T07:30:00.000Z" "2017-11-12T19:05:24.000Z" "2017-11-13T11:00:04.000Z" ...
##  $ views                 : int  748374 2418783 3191434 343168 2095731 119180 2103417 817732 826059 256426 ...
##  $ likes                 : int  57527 97185 146033 10172 132235 9763 15993 23663 3543 12654 ...
##  $ dislikes              : int  2966 6146 5339 666 1989 511 2445 778 119 1363 ...
##  $ comment_count         : int  15954 12703 8181 2146 17518 1434 1970 3432 340 2368 ...
##  $ 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 ...

Kemudian setelah kita dapat mengetahui ada kolom apa saja dan tipe karakter seperti apa, maka kita dapat mengubahnya apabila tipe datanya belum sesuai. Pengubahan tipe data dari yang belum sesuai dapat dilakukan dengan cara seperti berikut :

Hasil Observasi tipe data - category_id -> diubah dari tipe chr menjadi factor - publish_time -> diubah dari tipe chr menjadi POSIXct - trending_date -> diubah dari tipe chr menjadi tanggal

Untuk mengubah atau memanipulasi data menjadi tanggal, kita dapat memanfaatkan library ‘lubridate’. Library ‘lubridate’ dapat dimanfaatkan untuk mengubah format datanya menjadi tanggal atau waktu

#install packages lubridate
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union

‘lubridate’ memiliki code yang berbeda dengan R, apabila kita menggunakan ‘lubridate’ maka kita hanya perlu untuk menyingkat format tanggalnya

ydm(head(vids$trending_date))
## [1] "2017-11-14" "2017-11-14" "2017-11-14" "2017-11-14" "2017-11-14"
## [6] "2017-11-14"
vids$trending_date <- ydm(vids$trending_date)
ymd_hms(head(vids$publish_time))
## [1] "2017-11-13 17:13:01 UTC" "2017-11-13 07:30:00 UTC"
## [3] "2017-11-12 19:05:24 UTC" "2017-11-13 11:00:04 UTC"
## [5] "2017-11-12 18:01:41 UTC" "2017-11-13 19:07:23 UTC"

Kemudian kita dapat mengubah lagi tipe data dalam kolom kategori menjadi factor

vids$category_id <- as.factor(vids$category_id)

Data Explanation

summary(vids)
##  trending_date           title           channel_title       category_id  
##  Min.   :2017-11-14   Length:13400       Length:13400       24     :3185  
##  1st Qu.:2017-11-30   Class :character   Class :character   10     :2021  
##  Median :2017-12-17   Mode  :character   Mode  :character   26     :1262  
##  Mean   :2017-12-17                                         23     :1215  
##  3rd Qu.:2018-01-03                                         22     :1076  
##  Max.   :2018-01-21                                         25     :1073  
##                                                             (Other):3568  
##  publish_time           views               likes            dislikes      
##  Length:13400       Min.   :      687   Min.   :      0   Min.   :      0  
##  Class :character   1st Qu.:    91096   1st Qu.:   1987   1st Qu.:     85  
##  Mode  :character   Median :   309796   Median :   8907   Median :    322  
##                     Mean   :  1234583   Mean   :  45662   Mean   :   3352  
##                     3rd Qu.:   996668   3rd Qu.:  29376   3rd Qu.:   1113  
##                     Max.   :149376127   Max.   :3093544   Max.   :1674420  
##                                                                            
##  comment_count       comments_disabled ratings_disabled video_error_or_removed
##  Min.   :      0.0   Mode :logical     Mode :logical    Mode :logical         
##  1st Qu.:    283.8   FALSE:13172       FALSE:13341      FALSE:13399           
##  Median :   1017.5   TRUE :228         TRUE :59         TRUE :1               
##  Mean   :   5982.4                                                            
##  3rd Qu.:   3362.2                                                            
##  Max.   :1361580.0                                                            
## 

Data Manipulation

Pada tahap ini kita dapat melakukan manipulasi pada data yang kita miliki.

Kita dapat membuat kolom-kolom yang diperlukan terlebih dahulu apabila belum tersedia seperti membuat kolom publish date, kolom time to trend dan kolom publish when

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 <- vids$trending_date - vids$publish_date

Kemudian, kita dapat melanjutkan membuat kolom baru bernama publish when namun sebelumnya kita perlu untuk mengkategorikan jam

Kita dapat mengkategorikan publish_hour menjadi 3 kategori:

  • 12am to 7am (fajar)
  • 7am to 4pm (jam kerja)
  • 4pm to 12am (senja)
convert_hour <- function(x){
  
  if (x >= 0 & x <= 8) { 
    x <- "12am to 8am"
  }
  else if (x > 8 & x <= 15) {
    x <- "8am to 3pm"
  }
  else {
    x <- "3pm to 12am"
  }
  
  # memberikan output
  return(x)
}

Cek output untuk 1 observasi

convert_hour(17)
## [1] "3pm to 12am"
vids$publish_when <- sapply(vids$publish_hour, convert_hour)
head(vids)

Setelah membuat kolom-kolom terbaru, kita dapat mengecek kembali data yang kita miliki

Apabila kita mengambil pada seluruh observasi maka kita dapat menggunakan ‘sapply’ dan mengubah tipe data `vids$category_id’ menjadi chr

Notes : ‘sapply’ merupakan salah satu fungsi yang dimiliki R

vids$category_id <- sapply(X = as.character(vids$category_id), # Data
                           FUN = switch, # Function
                           
                           # Glossary atau kamus
                           "1" = "Film and Animation",
                           "2" = "Autos and Vehicles", 
                           "10" = "Music", 
                           "15" = "Pets and Animals", 
                           "17" = "Sports",
                           "19" = "Travel and Events", 
                           "20" = "Gaming", 
                           "22" = "People and Blogs", 
                           "23" = "Comedy",
                           "24" = "Entertainment", 
                           "25" = "News and Politics",
                           "26" = "Howto and Style", 
                           "27" = "Education",
                           "28" = "Science and Technology", 
                           "29" = "Nonprofit and Activism",
                           "43" = "Shows")

vids

Kemudian kita perlu untuk mengubah tipe data `vids$category_id’ menjadi factor

vids$category_id <- as.factor(vids$category_id)
head(vids)

Kemudian apabila kita ingin mengambil satu observasi untuk setiap judulnya maka kita dapat membuat sebuah data baru untuk dapat mengetahui judul video uniknya

vids[order(vids$title),]

Sebelum kita dapat melihat jadwal postingan yang tepat dari data ‘vids unik’, kita dapat mengecek kembali data yang kita miliki, apabila masih ada yang perlu untuk diubah maka dapat diubah terlebih dahulu

Hal yang dapat dilakukan pertama kali adalah dengan mengubah urutan pada kolom trending_date agar dapat ditampilkan berurutan

trending_date <- vids[order(vids$trending_date),]

Kemudian kita dapat membuat kolom baru yaitu kolom ‘engagement’ dan ‘likes per view’ agar mempermudah kita untuk dapat mengidentifikasi kapan jadwal posting yang tepat

index_unik <- match(unique(trending_date$title), trending_date$title)
vids.unik <- trending_date[index_unik, ]
head(vids.unik)
vids.unik$likes_per_view <- vids.unik$likes/vids.unik$views
vids.unik$comment_per_view <- vids.unik$comment_count / vids.unik$views

Setelah memastikan data yang kita miliki sudah lengkap dan tepat maka kita dapat membuat visualisasi yang dapat dilakukan dengan 2 cara, yaitu dapat dilakukan dengan base R atau menggunakan ‘ggplot’. Kita dapat melakukan visualisasi dengan menggunakan base R terlebih dahulu

boxplot(likes_per_view ~ publish_hour, data = vids.unik)

Jawaban: Sebaiknya melakukan upload video pada jam 0 atau 12 malam, ataupun pada jam 18 karena memiliki nilai median yang tinggi

Dari base R pun kita dapat memanfaatkan fungsi ‘plot()’. Setiap plot yang dihasilkan dengan menggunakan plot() maka dapat berubah menyesuaikan dengan tipe data yang akan dimasukkan tergantung juga dari ada berapa variabel dengan tipe data seperti apa

Kemudian bagaimana apabila kita ingin mengetahui ada berapa Likes per views tertinggi yang juga memiliki Dislikes per views yang tinggi dari beberapa category seperti Gaming & Travel and Events?

client <- vids.unik[vids.unik$category_id %in% c("Gaming", "Travel and Events"), ]
head(client)
client$dislikes_per_view <- client$dislikes/client$views
client$category_id <- droplevels(client$category_id)


plot(x = client$likes_per_view, 
     y = client$dislikes_per_view, 
     col = client$category_id) 
legend("topright", 
       fill = 1:3, 
       legend = levels(client$category_id) 
       )

Kita juga dapat memanfaatkan fungsi ‘ggplot’ apabila ingin menemukan top 10 youtuber dari kategori sebelumnya maka kita dapat melakukan agregasi terlebih dahulu kemudian mengurutkan data yang dimiliki

data_agg <- aggregate(likes_per_view ~ channel_title + category_id, 
                      data = client, FUN = mean)

vids_urut <- data_agg[order(data_agg$likes_per_view, decreasing = T), ]

data_viz <- head(vids_urut, 10)

Setelah itu kita dapat membuat visualisasinya

library(ggplot2)
library(ggthemes)
library(scales)
ggplot(data = data_viz, 
       mapping = aes(x = likes_per_view,
                     y = reorder(channel_title, likes_per_view))) +
  geom_col(mapping = aes(fill = category_id)) +
  geom_text(aes(label = round(likes_per_view,2),
            x = likes_per_view/2), 
            size = 3) +
  labs(x = "Likes per View",
       y = NULL,
       title = "Top 10 channel title",
       subtitle = "from Gaming and Travels",
       fill = "Category") + 
  scale_fill_manual(values = c("maroon", "slateblue4", "lightblue2")) +
  scale_y_discrete(labels = wrap_format(25)) + 
  scale_x_continuous(breaks = seq(0, 0.15, 0.03)) + 
  theme_economist_white()+
  theme(plot.title = element_text(hjust = 0.3, colour="black"),
        plot.subtitle = element_text(hjust = 0.3, colour = "brown"),
        legend.title = element_text(hjust = 0.5, colour = "snow4"),
        legend.background = element_rect(fill="snow"),
        legend.text = element_text(size = 7),
        panel.background = element_rect(fill = "lightblue"),
        plot.background = element_rect(fill = "snow"),
        axis.text.y = element_text(size = 7))

Kita juga dapat membuat sebuah visualisais untuk dapat melihat hubungan antar Likes per View dengan Dislikes per View

vids.unik$dislikes_per_view <- vids.unik$dislikes/vids.unik$views

Kemudian kita dapat melakukan visualisasinya

ggplot(data = vids.unik, mapping = aes(x = likes_per_view,
                                       y = comment_per_view,
                                       size = dislikes_per_view)) +
  geom_point(col = "maroon", alpha = 0.5) +
  geom_smooth(show.legend = F) +
  labs(title = "Hubungan Likes per View dengan Dislikes per View",
       x = "Likes per View",
       y = "Comments per View",
       size = "Dislikes per View") +
  theme_minimal()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Kita juga dapat memanfaatkan fungsi lainnya seperti berikut untuk dapat membuat visualisasi dari data yang ingin dilihat

ggplot(data = client, mapping = aes(x = likes_per_view,
                                       y = comment_per_view,
                                       size = dislikes_per_view)) +
  geom_point(col = "hotpink", alpha = 0.5) +
  #geom_smooth(show.legend = F) +
  facet_wrap(~category_id) +
  labs(title = "Hubungan Likes per View dengan Comments per View",
       x = "Likes per View",
       y = "Comments per View",
       size = "Dislikes per View") +
  theme_minimal() +
  theme(legend.position = "none")

Explanatory Text and Business Problem

Setiap data tentunya perlu untuk diolah melalui beberapa tahap terlebih dahulu yang nantinya dapat digunakan untuk menjawab pertanyan-pertanyaan bisnis dari klien.

Pada data US Videos yang telah kita olah sebelumnya, kita dapat mengetahui bahwa terdapat waktu-waktu tertentu untuk dapat melakukan publikasi video, publikasi dapat dilakukan jam 12 malam atau jam 6 sore. Kemudian apabila kita ingin melihat hanya pada beberapa hasil observasi, kita juga dapat mengetahui posisi teratasnya. Seperti kita dapat mengetahui posisi Youtuber teratas pada kategori Gaming diduduki oleh DanAndPhilGAMES, pada kategori Travel and Events diduduki oleh Cloth Map. Lalu kita juga dapat menjawab pertanyaan yang ingin diketahui seperti apakah likes per view dan comment per view berhubungan dengan dislikes per viewnya. Kemudian kita juga dapat melihat hubungan tiap kategori Gaming dan Travel and Events berdasarkan Comment per View dan Likes per Viewnya.