1. Business Question

Saat ini semua orang pasti pernah menonton Youtube, bahkan lebih sering dibandingkan menonton Televisi di rumah. Perubahan pola ini menjadikan orang berlomba-lomba untuk membuat channel youtube. Banyak sekali channel youtube yang bermunculan dengan beragam isi dan informasi. Namun tidak semua channel youtube berhasil, banyak yang gagal di tengah jalan. Untuk itu banyak orang yang mencari cara bagaimana membangun channel youtube yang dapat menghasilkan banyak views.

Sebagai seorang data scientist, kita mendapatkan client yang ingin membuat channel youtube. Dalam membangun channel Youtube tersebut, client meminta insight bagaimana membuat channel Youtube yang trending. Melalui pendekatan ‘data-driven’ kita akan menjawab permasalahan bisnis berdasarkan data yang ada.

2. Load and Explore Data

Pada tahapan ini akan dilakukan loading library dan dataset yang disimpan ke dalam suatu variable untuk dilakukan pengolahan lebih lanjut serta explore dataset secara sekilas untuk mengetahui ukuran dataset yang kita gunakan.

2.1 Aktivasi packages

Melakukan aktivasi pada packages yang akan digunakan dalam tugas ini. Penggunaan library disesuaikan dengan kebutuhan.

library(tidyverse) # untuk memanipulasi dataframe
library(lubridate) #untuk manipulasi tipe data tanggal
library(ggplot2) # untuk visualisasi data
library(GGally)

2.2 Membaca CSV File

Membaca data CSV File yang ada. File ini merupakan kumpulan video trending di US per harinya sejak Juli 2022 hingga Desember 2022.

vid <- read.csv('data_input/USvideos_2022.csv')

insight:
- Data berhasil terbaca dan dimasukan ke dalam variable vid

2.3 Melihat Cuplikan data

Setelah file berhasil terbaca dan disimpan didalam variable vid, selanjutnya menggunakan fungsi head() dan tail() untuk melihat cuplikan 6 data teratas dan terbawah. Proses melihat sekilas ini diperlukan untuk mempercepat komputasi dibandingkan melihat keseluruhan data yang ada.

head(vid)
#>   trending_date
#> 1      22.01.07
#> 2      22.01.07
#> 3      22.01.07
#> 4      22.01.07
#> 5      22.01.07
#> 6      22.01.07
#>                                                                        title
#> 1                                                              so long nerds
#> 2                                                   Usher: Tiny Desk Concert
#> 3                                            I Delivered a Penny to MrBeast!
#> 4            Cardi B - Hot Shit feat. Kanye West & Lil Durk [Official Audio]
#> 5 Fivio Foreign, Queen Naija - What's My Name (Official Video) ft. Coi Leray
#> 6                      The Sims 4 High School Years: Official Reveal Trailer
#>      channel_title category_id         publish_time    views   likes dislikes
#> 1      Technoblade          20 2022-07-01T01:29:02Z 16846983 3253577        0
#> 2        NPR Music          10 2022-06-30T16:00:10Z  1157118   92134        0
#> 3      Ryan Trahan          24 2022-06-30T14:00:38Z  6528267  648436        0
#> 4          Cardi B          10 2022-07-01T04:00:15Z   348851   51411        0
#> 5 FivioForeignVEVO          10 2022-06-30T16:00:13Z   482194   43953        0
#> 6         The Sims          20 2022-06-30T15:00:12Z   863639   89547        0
#>   comment_count comments_disabled ratings_disabled video_error_or_removed
#> 1        572010             FALSE            FALSE                  FALSE
#> 2          7592             FALSE            FALSE                  FALSE
#> 3         75201             FALSE            FALSE                  FALSE
#> 4          6811             FALSE            FALSE                  FALSE
#> 5          2135             FALSE            FALSE                  FALSE
#> 6          7056             FALSE            FALSE                  FALSE
tail(vid)
#>       trending_date
#> 36795      22.31.12
#> 36796      22.31.12
#> 36797      22.31.12
#> 36798      22.31.12
#> 36799      22.31.12
#> 36800      22.31.12
#>                                                                                                   title
#> 36795                                                     Streaming in 2023 | Feels Like Home | Disney+
#> 36796                                                                   F1 Grid Does Secret Santa 2022!
#> 36797                          Twins Take Lie Detector Test *EXPOSED* | Ft. Merrell Twins & Rybka Twins
#> 36798                                                              Lies That Will DESTROY Your Trust...
#> 36799 KO and Rollins Take Down The Bloodline; Scare off Sami | WWE Raw Highlights 12/19/22 | WWE on USA
#> 36800                                       The Closing Ceremony DELIVERED! | FIFA World Cup Qatar 2022
#>             channel_title category_id         publish_time    views  likes
#> 36795         Disney Plus          22 2022-12-19T14:00:04Z  1491836  32069
#> 36796           FORMULA 1          17 2022-12-19T14:00:08Z  3243402 134608
#> 36797 Brooklyn and Bailey          24 2022-12-20T17:00:00Z   503431  23228
#> 36798          SocksReact          23 2022-12-20T21:47:29Z  1270017  29909
#> 36799          WWE on USA          17 2022-12-20T04:17:14Z   421607   7094
#> 36800                FIFA          17 2022-12-18T16:09:27Z 20078922 463039
#>       dislikes comment_count comments_disabled ratings_disabled
#> 36795        0          1890             FALSE            FALSE
#> 36796        0          5818             FALSE            FALSE
#> 36797        0           652             FALSE            FALSE
#> 36798        0          1362             FALSE            FALSE
#> 36799        0           562             FALSE            FALSE
#> 36800        0         21311             FALSE            FALSE
#>       video_error_or_removed
#> 36795                  FALSE
#> 36796                  FALSE
#> 36797                  FALSE
#> 36798                  FALSE
#> 36799                  FALSE
#> 36800                  FALSE

Informasi masing-masing kolom :
trending_date: tanggal trending
title: judul video
channel_title: nama channel Youtube
category_id: kategori video
publish_time: tanggal upload video
views: jumlah views
likes: jumlah likes
dislikes: jumlah dislikes
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

insight :
- Diketahui bahwa dataset terdiri dari 36800 baris dan 12 kolom
- terdapat bermacam tipe data dalam masing-masing kolom
- terdapat banyak nilai 0 pada kolom dislike

3. Data Wrangling

Data wrangling merupakan tahapan persiapan sebelum melakukan tahapan lanjutan. Tahapan ini akan menjadikan dataset yang sebelumnya dianggap belum sesuai menurut format, tipe data dll diubah menjadi dataset yang siap digunakan. Tahapan ini terdiri dari beberapa hal yang disesuaikan dengan keadaan dataset.

3.1 Melihat Struktur Data

struktur data diperiksa guna melihat tipe data yang terbaca langsung oleh R Programming. Pada kenyataannya tipe data yang berhasil terbaca langsung tidak dapat secara langsung digunakan. Untuk itu harus diperiksa terlebih dahulu menggunakan berbagai fungsi seperti fungsi str() dan fungsi glimpse() dari tidyverse. Dalam hal ini digunakan fungsi glimpse() dikarenakan dapat melakukan komputasi yang lebih cepat dan susunan tampilan yang lebih rapih.

glimpse(vid)
#> Rows: 36,800
#> Columns: 12
#> $ trending_date          <chr> "22.01.07", "22.01.07", "22.01.07", "22.01.07",…
#> $ title                  <chr> "so long nerds", "Usher: Tiny Desk Concert", "I…
#> $ channel_title          <chr> "Technoblade", "NPR Music", "Ryan Trahan", "Car…
#> $ category_id            <int> 20, 10, 24, 10, 10, 20, 23, 20, 10, 27, 20, 10,…
#> $ publish_time           <chr> "2022-07-01T01:29:02Z", "2022-06-30T16:00:10Z",…
#> $ views                  <int> 16846983, 1157118, 6528267, 348851, 482194, 863…
#> $ likes                  <int> 3253577, 92134, 648436, 51411, 43953, 89547, 15…
#> $ dislikes               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
#> $ comment_count          <int> 572010, 7592, 75201, 6811, 2135, 7056, 9724, 12…
#> $ 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…
sapply(vid, n_distinct)
#>          trending_date                  title          channel_title 
#>                    183                   7237                   2741 
#>            category_id           publish_time                  views 
#>                     14                   6917                  36482 
#>                  likes               dislikes          comment_count 
#>                  31208                      1                  11771 
#>      comments_disabled       ratings_disabled video_error_or_removed 
#>                      2                      2                      1

insight :
- diketahui bahwa pada kolom dislikses semua isi data bernilai 0. hal tersebut dapat dibuktikan menggunakan fungsi n_distict dari tidyverse. Hal ini menunjukan kolom tersebut tidak memberikan informasi yang dibutuhkan. Hal tersebut juga disebabkan oleh pihak Youtube yang mematikan fitur dislikes yang menyebabkan data hanya bernilai 0.
- diketahui bahwa pada kolom video_error_or_removed semua nilai bernilai FALSE. Kolom ini tidak dapat memberikan informasi lebih karena keseluruhan isi bernilai sama.
-diketahui kolom trending_date dan publish_time memiliki tipe data yang belum sesuai. Hal tersebut disebabkan data tanggal masih dalam berbentuk tipe data character sehingga tidak dapat diolah informasi yang ada dari data tersebut.
- diketahui bahwa kolomcategory_id memiliki tipe data yang belum tepat, kolom ini akan dapat diolah dengan baik apabila diubah menjadi tipe data category karena memiliki nilai unique yang kecil dibandingkan total data yang dimiliki. Walaupun tipe data ini dinyatakan dalam bentuk angka namun masuk dalam jenis data ordinal.

3.2 Menghapus Kolom

Berdasarkan insight sebelumnya, kolom dislikses dan kolom video_error_or_removed tidak akan digunakan atau dihapuskan karena kolom ini tidak memiliki variasi data yang baik sehingga tidak memberikan informasi yang representatif sehingga jika dipaksa digunakan akan mengurangi kualitas data yang digunakan. Untuk itu akan dihapus menggunakan cara subsetting dimana kita dapat mengakses baris dan kolom memanfaatkan elemen/indeks.

vid <- vid[,-c(8,12)] # indeks kolom ke-8 dan kolom ke-12

insight:
- kolom dislikses dan kolom video_error_or_removed dihapus, sehingga total kolom pada dataframe vid berubah dari 12 kolom menjadi 10 kolom

3.3 Mengubah Tipe Data

Dari insight yang diperoleh sebelumnya, terdapat 2 buah kolom yang dianggap belum memiliki tipe data yang sesuai yaitu kolom trending_date, publish_time dan kolom category_id. Berikut tahapan untuk mengubah tipe data kedua kolom tersebut.

3.3.1 Ubah Tipe Data Character ke Tipe Data Datetime

Untuk mengubah suatu tipe data menjadi tipe data datetime dapat dilakukan dengan dua cara yaitu menggunakan fungsi as.Date() yang merupakan funsgi R Base atau menggunakan library lubridate. Pada kali ini yang akan digunakan adalah library lubridate karena kemudahan yang diberikannya (tanpa menggunakan string format ).

Pada kolom trending_date

head(vid$trending_date,n=1)
#> [1] "22.01.07"
tail(vid$trending_date,n=1)
#> [1] "22.31.12"



Pada kolom publish_time

head(vid$publish_time,n=1)
#> [1] "2022-07-01T01:29:02Z"
tail(vid$publish_time,n=1)
#> [1] "2022-12-18T16:09:27Z"

insight:
- diketahui bahwa kedua kolom tanggal diatas memiliki susunan tanggal yang berbeda pada kolom trending_date susunannya YY-DD-MM, sementara pada kolom publish_time susunannya YYYY-MM-DD HH:MM:SS
- diketahui pada kolom publish_time memiliki tambahan informasi waktu
- kedua kolom tersebut tidak dapat diubah menjadi tipe data datetime sekaligus karena perbedaan susunan


Ubah kolom trending_date ke tipe data datettime

vid$trending_date <- ydm(vid$trending_date)

Ubah kolom publish_time ke tipe data datettime

vid$publish_time <- ymd_hms(vid$publish_time, tz = 'America/New_York') #tz= timezone wilayah yang digunakan

insight:
- Kolom trending_date dan kolom publish_time sudah memiliki tipe data yang sesuai yaitu tipe data datetime sehingga dapat digali informasi yang lebih jauh khususnya mengenai waktu dari data ini.

3.3.2 Ubah Tipe Data Numeric ke Categoric

Kolom category_id ketika pertama kali terbaca oleh R Programming merupakan kolom dengan tipe data numeric. Hal tersebut tidak sesuai karena kolom tersebut memiliki nilai unique yang sangat sedikit. Dari informasi dataset yang diperoleh diketahui nilai tersebut adalah urutan dari kategori video yang dibuat oleh Youtube sehingga data ini lebih tepat digunakan sebagai data categorical karena merupakan data ordinal. Berikut tahapan pengubahannya,

Untuk mengubah data tersebut tidak dapat dilakukan secara langsung menggunakan as.factor(), tetapi diubah dahulu menjadi tipe data caharacter menggunakan fungsi as.character() dan disesuaikan menurut judul masing-masing kategori video sehingga setiap angka yang ada merepentasikan nama kategori videonya. Untuk menjalankan hal ini diperlukan perulangan untuk melakukankomputasi yang cepat.

Perulangan pada R dapat menggunakan fungsi sapply() yaitu fungsi yang akan menjalankan suatu fungsi didalamnya ke tiap baris dan kolom secara bersamaan dan menghasilkan susunan data vektor. Untuk fungsi didalamnya gunakan fungsi swicth() yaitu fungsi yang akan membuat pilihan berdasarkan kondisi yang di input, jika pilihan tidak tersedia (kondisi tidak sesuai) maka akan menghasilkan nilai null atau nilai default.

#ubah menjadi tipe data character
vid$category_id <- sapply(as.character(vid$category_id), switch, 
                           "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")

#ubah menjadi tipe data categorical
vid$category_id <- as.factor(vid$category_id)

insight:
- kolom category_id sudah diubah menjadi menjadi tipe data yang dianggap sesuai yaitu tipe data categorical yang mengandung informasi masing-masing nama category video nya.

3.4 Feature Engineering

Feature engineering adalah tahapan dimana kita membuat kolom baru berdasarkan data dari kolom-kolom yang tersedia. Tahapan ini sangat dipengaruhi oleh business problem yang ingin diselesaikan. Hal tersebut disebabkan dari tujuan dilakukannya tahapan ini akan memberikan informasi tambahan untuk eksplorasi data selanjutnya.

Pada Business Question sebelumnya kita diminta mengetahui pola-pola bagaimana suatu channel youtube mampu menjadi trending. Salah satu hal yang ingin diperoleh insight nya adalah pola waktu, kapan waktu yang tepat untuk publish video sehingga ditonton oleh banyak orang yang berpotensi menjadikannya trending. Untuk itu kita perlu mengolah informasi waktu tambahan dari data yang sudah ada, dimana data bertipe datetime diolah sehingga tiap video kita ketahui kapan di publish dan pola jumlah penonton dari jam publish tersebut.

3.4.1 Membuat Kolom Baru publish_hour

Dari kolom publish_time yang memiliki informasi waktu hingga satuan detik, diambil informasi dalam satuan jam untuk memperoleh pola publish video dan disimpan ke dalam kolom publish_hour.

vid$publish_hour <- hour(vid$publish_time)
head(vid, n=10)
#>    trending_date
#> 1     2022-07-01
#> 2     2022-07-01
#> 3     2022-07-01
#> 4     2022-07-01
#> 5     2022-07-01
#> 6     2022-07-01
#> 7     2022-07-01
#> 8     2022-07-01
#> 9     2022-07-01
#> 10    2022-07-01
#>                                                                              title
#> 1                                                                    so long nerds
#> 2                                                         Usher: Tiny Desk Concert
#> 3                                                  I Delivered a Penny to MrBeast!
#> 4                  Cardi B - Hot Shit feat. Kanye West & Lil Durk [Official Audio]
#> 5       Fivio Foreign, Queen Naija - What's My Name (Official Video) ft. Coi Leray
#> 6                            The Sims 4 High School Years: Official Reveal Trailer
#> 7                          No one can stop me from buying weird ads (not even you)
#> 8                                                  100 Kills = $500,000 Challenge!
#> 9  Five Nights At Freddy's SB Song - This Comes From Inside - The Living Tombstone
#> 10                    The Riddle That Seems Impossible Even If You Know The Answer
#>           channel_title   category_id        publish_time    views   likes
#> 1           Technoblade        Gaming 2022-06-30 21:29:02 16846983 3253577
#> 2             NPR Music         Music 2022-06-30 12:00:10  1157118   92134
#> 3           Ryan Trahan Entertainment 2022-06-30 10:00:38  6528267  648436
#> 4               Cardi B         Music 2022-07-01 00:00:15   348851   51411
#> 5      FivioForeignVEVO         Music 2022-06-30 12:00:13   482194   43953
#> 6              The Sims        Gaming 2022-06-30 11:00:12   863639   89547
#> 7           Drew Gooden        Comedy 2022-06-29 14:03:14  1800522  152049
#> 8        MrBeast Gaming        Gaming 2022-06-29 13:30:08  4726069  250088
#> 9  The Living Tombstone         Music 2022-06-30 13:00:11   744652  126774
#> 10           Veritasium     Education 2022-06-30 08:20:58  1203832   85248
#>    comment_count comments_disabled ratings_disabled publish_hour
#> 1         572010             FALSE            FALSE           21
#> 2           7592             FALSE            FALSE           12
#> 3          75201             FALSE            FALSE           10
#> 4           6811             FALSE            FALSE            0
#> 5           2135             FALSE            FALSE           12
#> 6           7056             FALSE            FALSE           11
#> 7           9724             FALSE            FALSE           14
#> 8          12864             FALSE            FALSE           13
#> 9          11237             FALSE            FALSE           13
#> 10          8245             FALSE            FALSE            8

insight:
- hasil dari code diatas akan menghasikan kolom baru publish_hour yang berisi informasi jam publish video

3.4.2 Membuat Kolom Baru publish_when

kolom publish_hour yang sudah dibuat, hasilnya akan dikategorikan menjadi 3 yaitu 12am to 8am, 9am to 4pm dan5pm to 12am melalui IF-Else.

# x = data
pw <- function(x){ 
    if(x < 8){
      x <- "12am to 7am" # video dengan publish_hour antara tengah malam hingga jam 7 pagi
    }else if(x >= 8 & x < 16){
      x <- "8am to 3pm" # video jam 8 pagi hingga jam 3 sore
    }else{
      x <- "4pm to 12am" # video jam 4 sore sampai tengah malam
    }
}
# gunakan `sapply()` untuk aplikasi ke seluruh baris
vid$publish_when <- sapply(vid$publish_hour, FUN = pw)

# ubah ke factor
vid$publish_when <- as.factor(vid$publish_when)

head(vid)
#>   trending_date
#> 1    2022-07-01
#> 2    2022-07-01
#> 3    2022-07-01
#> 4    2022-07-01
#> 5    2022-07-01
#> 6    2022-07-01
#>                                                                        title
#> 1                                                              so long nerds
#> 2                                                   Usher: Tiny Desk Concert
#> 3                                            I Delivered a Penny to MrBeast!
#> 4            Cardi B - Hot Shit feat. Kanye West & Lil Durk [Official Audio]
#> 5 Fivio Foreign, Queen Naija - What's My Name (Official Video) ft. Coi Leray
#> 6                      The Sims 4 High School Years: Official Reveal Trailer
#>      channel_title   category_id        publish_time    views   likes
#> 1      Technoblade        Gaming 2022-06-30 21:29:02 16846983 3253577
#> 2        NPR Music         Music 2022-06-30 12:00:10  1157118   92134
#> 3      Ryan Trahan Entertainment 2022-06-30 10:00:38  6528267  648436
#> 4          Cardi B         Music 2022-07-01 00:00:15   348851   51411
#> 5 FivioForeignVEVO         Music 2022-06-30 12:00:13   482194   43953
#> 6         The Sims        Gaming 2022-06-30 11:00:12   863639   89547
#>   comment_count comments_disabled ratings_disabled publish_hour publish_when
#> 1        572010             FALSE            FALSE           21  4pm to 12am
#> 2          7592             FALSE            FALSE           12   8am to 3pm
#> 3         75201             FALSE            FALSE           10   8am to 3pm
#> 4          6811             FALSE            FALSE            0  12am to 7am
#> 5          2135             FALSE            FALSE           12   8am to 3pm
#> 6          7056             FALSE            FALSE           11   8am to 3pm

insight:
- hasil dari code diatas akan menghasikan kolom baru publish_when yang berisi informasi kategori waktu

3.4.2 Membuat Kolom Baru publish_wday

Selain mencari informasi waktu dalam bentuk jam, dilakukan juga pengambilan informasi waktu dalam hari. Untuk mendapatkan informasi terkait hari gunakan library lubridate

vid$publish_wday <- wday(vid$publish_time, 
                     label = T, # label nama hari/tidak
                     abbr = F) # label disingkat/tidak

3.5 Missing Values

Missing value merupakan nilai yang tidak ada dalam dataset. Kehadiran missing value akan menjadikan interpretasi data menjadi bias karena tidak memiliki informasi apapun sehingga perlu dihilangkan. Sebelum menghapus missing values, kita perlu medeteksi keberadaan missing value sebelumnya. Untuk mendeteksi gunakan fungsi anyNA() yang akan menghasilkan nilai TRUE apabila terdapat missing value didalam suatu dataset.

anyNA(vid)
#> [1] FALSE
colSums(is.na(vid))
#>     trending_date             title     channel_title       category_id 
#>                 0                 0                 0                 0 
#>      publish_time             views             likes     comment_count 
#>                 0                 0                 0                 0 
#> comments_disabled  ratings_disabled      publish_hour      publish_when 
#>                 0                 0                 0                 0 
#>      publish_wday 
#>                 0

insight :
- Pada dataset yang digunakan tidak ditemukan adanya missing values

3.6 Duplikasi Data

Duplikasi data merupakan keadaan dimana suatu data dalam satu baris memiliki nilai yang sama. Duplikasi data dalam penangananya disesuaikan dengan kebutuhan. Dalam hal ini, duplikasi data dilakukan dengan medeteksi judul video trending yang ada pada kolom title yang duplikat, kemudian memilih data pertama dari duplikasi yang terjadi.

sum(duplicated(vid$title))
#> [1] 29563
vid_unique <- vid[!duplicated(vid$title),] 

insight :
- Pada dataset yang digunakan terdapat 29563 judul video yang duplikat
- Menghilangkan duplikasi dengan hanya memilih data pertama saja dari setiap duplikasi judul

4. Exploratory Data Analysis

Setelah dataset dianggap sudah clean, dimana tipe data sudah sesuai, tidak ada missing value dll. Selanjutnya masuk ke tahapan Exploratory Data Analysis. Dalam tahapan ini akan dilakukan eksplorasi data untuk menggali insight lebih dalam sehingga diperoleh wawasan tambahan dalam menyelesaikan business problem.

4.1 Deskriptif Statistik

Deskriptif Statistika digunakan dalam EDA untuk melihat gambaran keseluruhan data, khususnya pada data numeric. Untuk menggunakan statistika deskriptif dapat menggunakan fungsi summary() atau fungsi skim() dari library skimr. Dalam hal ini digunakan fungsi skimr() karena mampu memberikan ringkasan statistik secara komprehensif dibandingkan fungsi summary().

library(skimr)
skim(vid_unique[,sapply(vid, is.numeric)])
Data summary
Name vid_unique[, sapply(vid, …
Number of rows 7237
Number of columns 4
_______________________
Column type frequency:
numeric 4
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
views 0 1 1133442.71 2387022.96 0 295940 537590 1116865 57458228 ▇▁▁▁▁
likes 0 1 65832.06 196877.98 0 12634 24953 55707 4924852 ▇▁▁▁▁
comment_count 0 1 5235.47 27196.95 0 950 1857 3829 1078921 ▇▁▁▁▁
publish_hour 0 1 13.17 5.49 0 10 13 17 23 ▂▃▇▇▅

insight :
- dari variable numeric yang tersedia, data publish_hour memiliki distribusi cenderung normal dilihat dari mean dan median, sementara kolom lainnya memiliki distribusi condong ke kanan.
- kolom views menjadi kolom yang memiliki informasi data yang paling beragam diantara kolom lainnya

4.2 Exploring and Visualizing Data

Pada tahapan ini dilakukan pencarian insight baru melalui analisis satu variable (analisis univariate), analisis banyak variable (analisis multivariate) dan eksplorasi lanjutan dengan menjawa berbagai business questionya.

4.2.1 Univariate Analysis

Tahapan ini dilakukan analisis pada masing-masing variable yang dipilih, sebagaimana dibawah ini.

1. Frequency Publish Video per Hours

ggplot( data = vid_unique,
        mapping = aes(x = publish_hour)) +
  geom_histogram(binwidth=1, fill = 'red', color ='black') +
  labs(title = "Histogram of Frequency Publish Video per Hours", x = "Hours", y = "Frequency")

insight:
-diketahui bahwa video yang trending paling banyak di publish pada jam 10 - 15 sore

1. Frequency Publish Video per Days

ggplot( data = vid_unique,
        mapping = aes(x = publish_wday)) +
  geom_bar(fill = 'red',color ='black') +
  labs(title = "Histogram of Frequency Publish Video per Hours", x = "Hours", y = "Frequency")

insight:
- diketahui bahwa hari Friday dan Sunday menjadi hari yang paling banyak vide trending dipublish. namun perbedaannya tidak begitu signifikan artinya tidak ada pengaruh hari apa video dipublish untuk menjadi trending.

4.2.2 Multivariate Analysis

Tahapan ini merupakan melihat hubungan yang terjadi antar variable yang ada. Hubungan tersebut dinyatakan dalam bentuk perhitungan korelasi. Walaupun perhitungan korelasi tidak menyatakan sebab akibat namun banyak digunakan untuk interpretasi kesamaan pola yang ada dari masing-masing kolom. Untuk perhitungan korelasi dilakukan dengan menggunakan fungsi ggpairs() dari library GGally yang mampu memberikan nilai korelasi dan distribusi pada masing-masing kolom numerik dalam satu tampilan.

ggpairs(vid_unique[,c(6,7,8,11)])

insight:
- diketahui bahwa kolom likes, kolom views dan kolom comment_count memiliki korelasi yang kuat, artinya ada pola yang sama dari kedua nilai tersebut, sementara kolom publish_hour memiliki korelasi yang lemah dengan kolom numeric lainnya

4.2.3 Exploring

Salah satu cara terbaik untuk melakukan Exploratory Data Analysis yaitu melakukan eksplorasi data yang mampu menjawab pertanyaan bisnis atau permasalahan bisnis. Untuk itu berbagai pertanyaan dituliskan dan dijawab dengan menelusuri data yang ada.

Business Question 1

  1. Sebagai seorang konsultan media sosial, saya ditugaskan untuk membantu seorang klien yang ingin memulai karir sebagai youtuber. Salah satu pertanyaan pertamanya adalah pada jam berapa saya harus publish supaya diminati? Apakah waktu jam publish video akan mempengaruhi jumlah likes ratio (likes/views) yang diperoleh?
# buat kolom likes_view
vid_unique$likes_view <- vid_unique$likes / vid_unique$views
# visualisasi data
ggplot(data = vid_unique,
       mapping = aes(x = as.factor(publish_hour),
                     y = likes_view)) +
  geom_boxplot(fill = "red") +
  labs( title = 'Boxplot of Likes-View Youtube Video per Hours',
        x = 'Hours',
        y = 'Likes / View')

insight:
- pada umumnya Likes ratio terbanyak terdapat di jam 00:00 mengacu pada median data
- akan tetapi ada kemungkinan akan mendapatkan like sangat tinggi apabila di publish pada jam 10:00 mengacu pada data outlier yang paling tinggi.
- Jam 05:00 menjadi jam yang memiliki variasi likes tertinggi mengacu dari lebar boxplot
- dari data diatas rekomendasi jam publish bergantung pada profil calon youtuber, Jam 00:00 menjadi jam terbaik untuk publish video karena umumnya jam tersebut terjadi likes ratio tertinggi. Namun jika ingin calon youtuber tersebut berani dalam mengambil keputusan untuk mendapatkan likes ratio tertinggi maka publish video jam 05:00 menjadi opsi terbaik.

Business Question 2

  1. Salah satu konten yang akan dipublish memiliki target audiens yang tertarik pada category “Howto and Style”, “Pets and Animals”, dan “Travel and Events”. Saya ingin melihat hubungan likes/view dan comments/view dari video dengan ketiga category tersebut. Agar dapat mengetahui karakteristik tertentu dari masing-masing kategori.
# buat kolom comment_view
vid_unique$comments_view <- vid_unique$comment_count/vid_unique$views
# melakukan subsetting pada kategori tertentu
vid_cat <- vid_unique[vid_unique$category_id %in% c("Howto and Style","Pets and Animals", "Travel and Events"),]
# hapus level yang tidak ada pada data
vid_cat$category_id <- droplevels(vid_cat$category_id)

# cek level
levels(vid_cat$category_id)
#> [1] "Howto and Style"   "Pets and Animals"  "Travel and Events"
#melakukan visualisasi data
ggplot( data = vid_cat,
        mapping = aes(x = likes_view,
                      y = comments_view,
                      color = category_id))+
  geom_point() +
  labs( x = "Likes Ratio",
        y = "Comments Ratio")

insight:
- pada pola scatter plot diatas terlihat bahwa variable comments dan likes memliki korelasi positif namun cenderung lemah
- terdapat video yang memiliki Likes yang tinggi namun Comment sedikit seperti video dalam kategori ‘Pets and Animals’
- terdapat video yang memiliki comment yang banyak namun Likes sedikit seperti video dalam kategori ‘Howto & Style’
- dari data diatas diketahui bahwa tidak ada pola hubungan yang kuat antara Likes dengan Comments


Business Question 3

  1. Kita juga berencana untuk kolaborasi dengan channel YouTube yang sering muncul dalam pencarian video trending! Adakah channel YouTube yang memiliki video trending >= 10? Channel YouTube mana yang baik untuk jadi rekan kolaborasi?
# melakukan agregasi data
vid_top10_channel <- 
vid_unique |> 
  group_by(channel_title) |> 
  summarise(Frequency = n()) |> 
  filter (Frequency >= 10) |> 
  arrange(-Frequency) |> 
  head(10)
# melakukan visualisasi data 
ggplot(data = vid_top10_channel,
       mapping = aes(x = Frequency, 
                     y = reorder(channel_title,Frequency)))+
  geom_col(aes(fill = Frequency))+
  scale_fill_gradient(low="red", high="black") +
  labs(title = "Trending Video Channel of YouTube US 2022",
       x = "Frequency of Trending",
       y = NULL) +
  theme_minimal() +
  theme(legend.position = "none")

insight:
- Dari grafik diatas diketahui bahwa channel youtube paling sering trending adalah NFL, Fox Soccer dan NBA

  1. Business Question: Apakah kategori yang memiliki paling banyak video trending? Pada jam berapa kebanyakan video trending dari kategori tersebut dipublish?
# melakukan agregasi data
vid_top10_cat <- 
vid_unique |> 
  group_by(category_id) |> 
  summarise(Frequency = n()) |> 
  arrange(-Frequency) |> 
  head(10)
#melakukan visualisasi data
ggplot(data = vid_top10_cat,
       mapping = aes(x = Frequency, 
                     y = reorder(category_id,Frequency)))+
  geom_col(aes(fill = Frequency))+
  scale_fill_gradient(low="red", high="black") +
  labs(title = "Trending Categories of YouTube US 2022",
       x = "Video Count",
       y = NULL) +
  theme_minimal() +
  theme(legend.position = "none")

insight:
- Dari grafik diatas diketahui bahwa Kategori video youtube paling sering trending adalah gamming, entertainment dan music
- Meskipun banyak channel Sports yang sering trending, namun channel gamming terbanyak dalam hal trending. Hal tersebut dikarenakan banyaknya channel youtube yang ada dibandingkan channel categories sports.

5. Conclusion

Untuk membuat suatu channel youtube yang trending ada beberapa hal yang perlu diperhatikan, yaitu :

1. Pemilihan Kategori Youtube Channel

Pemilihan kategori channel menjadi hal yang penting untuk menjadikan suatu channel Youtube video trending. Jika mengacu dari data yang ada maka membangun channel untuk kategori gamming, Entertainment, Music dan sports adalah category youtube yang memiliki proporsi diatas 10% yang menguasai youtube video trending. Untuk itu direkomendasikan memilih kategori tersebut dalam membuat channel youtube.

prop_cat <- round(prop.table(vid_top10_cat$Frequency)*100,2)
name_cat <- head(as.character(vid_top10_cat$category_id),n=10)
proporsi_category_youtube <- data.frame(name_cat, prop_cat)
proporsi_category_youtube
#>                  name_cat prop_cat
#> 1                  Gaming    24.34
#> 2           Entertainment    20.08
#> 3                   Music    15.16
#> 4                  Sports    13.96
#> 5        People and Blogs     8.62
#> 6                  Comedy     4.43
#> 7      Film and Animation     4.06
#> 8       News and Politics     3.58
#> 9  Science and Technology     2.95
#> 10              Education     2.82

insight:
- kategori gaming, entertainment, dan music adalah 3 kategori paling trending di Youtube
- pembuatan channel youtube dengan memilih salah satu category teratas adalah salah satu opsi dalam menarik views yang besar secara proporsional

2. Pemilihan Referensi Youtube Channel

Setelah menentukan category Youtube yang dipilih (misal: categroy gaming), maka selanjutnya kita perlu menjadikan beberapa channel gaming terurtama pada channel yang banyak trending sebagai rujukan dan referensi dalam pengembangan channel youtube. Hal ini perlu untuk mengetahui gambaran umum terhadap hal-hal atau isi konten yang diinginkan para views, bahkan potensi untuk kolaborasi antar channel ke depannya.

vid_unique |> 
  filter(category_id == "Gaming") |> 
  group_by(channel_title) |> 
  summarise(total_trending = n()) |> 
  arrange(-total_trending) |> 
  head(n=5)
#> # A tibble: 5 × 2
#>   channel_title      total_trending
#>   <chr>                       <int>
#> 1 Clash of Clans                 17
#> 2 Genshin Impact                 17
#> 3 PM7                            16
#> 4 The Game Theorists             16
#> 5 aCookieGod                     16

insight:
- Yotube Channel Clash of Clans, Genshin Impact dan PM7 adalah Yotube channel yang sering memperoleh trending Youtube
- Membuat konten Youtube channel dengan merujuk kesalah satu youtube channel yang sudah besar berpotensi akan mendapatkan potensi jumlah penonton yang besar

3. Pemilihan Waktu Pubish

Dalam pemilihan waktu publish video, ada dua hal yang perlu diperhatikan yaitu pada hari apa sebaiknya di publish dan pada jam berapa ?. mengacu pada hasil tahapan EDA yang sudah dilakukan sebelumnya diketahui bahwa,

Berdasarkan Hari

publish_wday_game <- 
vid_unique |> 
  filter(category_id == "Gaming") |> 
  group_by(publish_wday) |> 
  summarise(n = n())|> 
  arrange(-n)
ggplot( data = publish_wday_game,
        mapping = aes(x = publish_wday,
                      y = n)) +
  geom_bar(stat = "sum",
           fill = 'red')+ 
  theme_minimal()+
  labs(title = "Frequency Publish Video per Days in Gaming Category", x = "Days", y = "Frequency")

insight:
- pada youtube videos category gaming publish video trending terbanyak dilakukan pada saturday dan tuesday

Berdasarkan Jam

publish_hour_game <- 
vid_unique |> 
  filter(category_id == "Gaming") |> 
  group_by(publish_hour) |> 
  summarise(n = n()) |> 
  arrange(-n)
ggplot(data = publish_hour_game,
       mapping = aes( x= publish_hour,
                      y = n))+
  geom_line(col = "red")+
  labs(x = "Hours",
       y = "Total Trending")+
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(title = "Frequency Publish Video per Hours in Gaming Category", x = "Hours", y = "Frequency")

insight:
- publish video terbanyak dilakukan pada jam 10.00 - 15.00
- Direkomendasikan untuk publish video dilakukan pada Saturday atau Tuesday antara jam 10:00 hingga 15:00