Dalam setiap project data science, tahap pengumpulan data atau Data Mining adalah salah satu tahap yang penting. Terdapat berbagai metode dalam data mining namun salah satu yang banyak digunakan adalah dengan API. Melalui API kita dapat mengakses dan mengambil data dari database yang dimiliki oleh perusahaan atau pihak tertentu. Pada project ini, kita akan mencoba mengambil data dari Youtube menggunakan Open API yang disediakan oleh Google API.
Google API adalah gabungan dari berbagai API yang dikembangkan oleh Google untuk memungkinkan adanya komunikasi antara Layanan Google dengan aplikasi atau layanan lain. Google menyediakan 4 API yang membolehkan kita untuk mengambil data dari YouTube:
Data yang didapatkan selanjutnya dapat dianalisis untuk mengetahui performa dan aktivitas dari video/channel tertentu.
Dalam R, kita dapat melakukan pengumpulan data dari keempat API tersebut secara langsung menggunakan package tuber! Berikut adalah tahapannya.
Untuk mengambil data dari Google API, pertama-tama kita perlu mendafarkan suatu aplikasi ke Google API. Kemudian kita perlu melakukan request id dan API key untuk aplikasi kita. Id dan API key diperlukan untuk mengautentikasi aplikasi kita sehingga dapat disambungkan dengan YouTube API. Berikut adalah tahapan detailnya:
Masuk ke https://console.developers.google.com/ dengan akun google Anda.
Arahkan kursor ke bagian Select a Project, buat project/aplikasi baru Anda.
Enable.Setelah ini Anda dapat kembali ke dashboard Google API (lihat gambar di bawah) dan 4 API tadi sudah ter-enable untuk dikoneksikan dengan aplikasi Anda. Anda akan diarahkan untuk membuat credentials.
Kembali ke tab Credentials dan buat credentials Anda.
Anda akan mendapatkan Client ID dan Client secret (token/key Anda).
Setelah mendapatkan client ID dan client secret, anda dapat mengerjakan tahapan-tahapan berikutnya di R.
Kita akan menggunakan package tuber yang memungkinkan kita berinteraksi dengan YouTube API.
#install.packages("tuber")
# library(tuber)
Kita akan mengautentikasi aplikasi kita menggunakan R:
# simpan client id and client secret di R environment
client_id <- "xxx"
client_secret <- "xxx"
# autentikasi aplikasi Anda
yt_oauth(app_id = client_id,
app_secret = client_secret)
pilih No pada pilihan di bawah:
Anda akan diarahkan ke web browser dan memilih akun yang Anda pakai untuk membuat aplikasi. Pilih allow, kemudian aplikasi Anda akan terautentikasi.
Setelah ini kita dapat mulai melakukan data mining/pengumpulan data di R.
Untuk mendapatkan data 1 video dapat digunakan fungsi get_stats() dan diperlukan video_id. Video id adalah karakter setelah tanda = pada URL.
# video id: oaJxsRGAUYs
stats <- get_stats(video_id="oaJxsRGAUYs")
stats
## $id
## [1] "oaJxsRGAUYs"
##
## $viewCount
## [1] "264"
##
## $likeCount
## [1] "7"
##
## $dislikeCount
## [1] "3"
##
## $favoriteCount
## [1] "0"
##
## $commentCount
## [1] "0"
command di atas menghasilkan:
gunakan fungsi get_video_details() untuk mendapatkan data yang lebih banyak:
vid_details <- get_video_details(video_id = "oaJxsRGAUYs")
Berikut adalah tags yang dapat digunakan untuk mengambil informasi video:
$items[[1]]$snippet$title$items[[1]]$id$items[[1]]$snippet$description$items[[1]]$snippet$channelTitle$items[[1]]$snippet$channelId$items[[1]]$snippet$categoryId$items[[1]]$snippet$tags$items[[1]]$snippet$publishedAtvid_details$items[[1]]$snippet$title
## [1] "60 Seconds Data Science | Episode 10 | Neural Network"
vid_details$items[[1]]$snippet$description
## [1] "Episode kali ini kita bakalan bahas Neural Network bareng Shello, Instructor Algoritma. Kalian tau gak kalo Neural Network itu memiliki cara kerja yang sama dengan otak manusia lho. Nah, mau tau contohnya apa aja? simak video selengkapnya ya! \n\nGo to our website for more programs we offer: https://www.algorit.ma\n\nFind Algoritma on social media:\nFacebook: https://www.facebook.com/TeamAlgoritma\nInstagram: https://www.instagram.com/teamalgoritma\nLinkedIn: https://www.linkedin.com/company/teamalgoritma\nTwitter: https://twitter.com/teamalgoritma"
vid_details$items[[1]]$snippet$tags
## [[1]]
## [1] "data science"
##
## [[2]]
## [1] "data science education"
##
## [[3]]
## [1] "kelas data"
##
## [[4]]
## [1] "what is data science"
##
## [[5]]
## [1] "what is machine learning"
##
## [[6]]
## [1] "data visualization"
##
## [[7]]
## [1] "machine learning"
##
## [[8]]
## [1] "algoritma data science"
vid_details$items[[1]]$snippet$publishedAt
## [1] "2019-10-25T11:00:14.000Z"
vid_details$items[[1]]$snippet$channelId
## [1] "UCCix0G-RLoRTenSFEGrQILQ"
Kita membutuhkan channel id untuk mendapatkan statistik atau performa dari channel tertentu:
channel_stats <- get_channel_stats(channel_id='UCCix0G-RLoRTenSFEGrQILQ')
Berikut adalah tags yang dapat digunakan untuk mengambil informasi video:
$id$snippet$title$snippet$description$snippet$publishedAt$snippet$country$statistics
$statistics$viewCount$statistics$commentCount$statistics$subscriberCount$statistics$videoCountchannel_stats$snippet$title
## [1] "Algoritma Data Science Education Center"
channel_stats$snippet$description
## [1] "Youtube Channel ini di kelola oleh Algoritma Data Science Education. Algoritma adalah provider training Data Science di Jakarta. Konten - konten yang di publish melalui website ini seputar kegiatan yang dilakukan Algoritma dan pengetahuan - pengetahuan \n mengenai Data Science."
channel_stats$statistics
## $viewCount
## [1] "33816"
##
## $commentCount
## [1] "0"
##
## $subscriberCount
## [1] "0"
##
## $hiddenSubscriberCount
## [1] TRUE
##
## $videoCount
## [1] "108"
comment <- get_comment_threads(filter = c(video_id = "iKnSd20OPcI"),
max_results = 50) # tentukan jumlah maksimal komentar yang diambil
comment <- comment %>%
mutate(textDisplay = as.character(textDisplay)) %>% # mengubah tipe data komentar
select(-c(2,4,5,6,8,9)) # membuang kolom yang tidak diperlukan
comment
Deskripsi kolom:
Kita akan mengambil data video ID dari dua scope: Playlist & semua video pada suatu Channel. Data video ID dapat digunakan untuk mengambil informasi statistik (performa) dan informasi detail untuk setiap video.
Playlist:
# mengambil data Playlist "60 Seconds Data Science" oleh Algoritma
# URL: https://www.youtube.com/watch?v=PpLvhDDke9E&list=PLajRxMual_D6Du4Z8vgCQ8fnWf74GMCBW
# playlistID: PLajRxMual_D6Du4Z8vgCQ8fnWf74GMCBW
playlist_60 <- get_playlist_items(filter = c(playlist_id = "PLajRxMual_D6Du4Z8vgCQ8fnWf74GMCBW"),
max_results = 50)
playlist_60 <- playlist_60[,5:6] # membuang kolom yang tidak diperlukan
head(playlist_60)
Semua Video:
list_vids <- list_channel_videos(channel_id = 'UCCix0G-RLoRTenSFEGrQILQ',
max_results = 200)
list_vids <- list_vids[,5:6] # membuang kolom yang tidak diperlukan
tail(list_vids)
Deskripsi kolom:
yt_keyword <- yt_search("algoritma") # masukan keyword Anda
yt_keyword <- yt_keyword[,c(1:5, 15)]
head(yt_keyword, 10)
Deskripsi kolom:
all_stats <- get_all_channel_video_stats(channel_id = "UCCix0G-RLoRTenSFEGrQILQ")
head(all_stats)
Deskripsi Kolom:
Kita dapat mengambil data statistik video dari berbagai channel bila memiliki data video IDs. Berikut adalah contohnya:
# data yt_keyword
head(yt_keyword)
# buat fungsi
get_all_stats <- function(id) {
get_stats(id)
}
ytkey_stats <- purrr::map_df(.x = as.vector(yt_keyword$video_id),
.f = get_all_stats)
ytkey_stats <- ytkey_stats %>%
rename(video_id = id)
head(ytkey_stats)
## Warning in as_regular_df(x): '.Random.seed[1]' is not a valid integer, so
## ignored
Menggabungkan data frame:
yt_research <- dplyr::left_join(yt_keyword, ytkey_stats)
head(yt_research, 20)
# trivia: temukan channel Anda!
yt_research %>%
filter(channelTitle == "Algoritma Data Science Education Center") %>%
select(title, description, everything())
Dari eksplorasi data di atas, ternyata terdapat 19 video dari channel Algoritma yang masuk dalam 645 video hasil pencarian YouTube dengan keyword “data science”!
Setelah selesai melakukan pengumpulan data, jangan lupa untuk menyimpan data Anda. Anda dapat menyimpannya dalam bentuk csv:
write.csv(yt_research, "yt_research.csv")
Terdapat berbagai fungsi lainnya yang dapat Anda explorasi dari package tuber! Berikut adalah artikel-artikel tambahan untuk membantu Anda bermain dengan tuber:
Selamat bereksperimen!
Mari kita coba eksplorasi data kita lebih lanjut dan menjawab beberapa pertanyaan bisnis di bawah!
Mari visualisasikan distribusi jumlah video tertampil per channel title yang ada:
# jumlah video/channel
vidall <- yt_research %>%
group_by(channelTitle) %>%
summarise(vid_count = n()) %>%
arrange(desc(vid_count))
summary(vidall$vid_count)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 1.466 1.000 19.000
dari hasil di atas, jumlah video yang muncul dari suatu channel YouTube sebanyak-banyaknya adalah 19 dan sedikit-sedikitnya adalah 1. Mari kita visualisasikan 15 channel tertinggi yang videonya tertampilkan pada query result.
# data aggregation
vidcount <- yt_research %>%
group_by(channelTitle) %>%
summarise(vid_count = n()) %>%
arrange(desc(vid_count)) %>%
head(15) %>%
mutate(text = paste("Counts: ", vid_count))
vidcount
# visualisasi
library(ggplot2)
ggplot(mapping = aes(x = reorder(channelTitle,vid_count), y = vid_count), data = vidcount) +
geom_col(aes(fill=vid_count)) +
coord_flip() +
geom_label(data = vidcount[1:5,], mapping = aes(label = vid_count)) +
labs(title = "Channel Frequency Appeared from 'Algoritma' Keyword",
subtitle = "per 4th of December 2019 in Indonesia",
x = "Channel Title",
y = "Video Appearence") +
theme_minimal() +
theme(legend.position = "none")
Ternyata Channel Algoritma Data Science Education Center menempati posisi pertama dari urutan channel yang videonya paling banyak tertampilkan di hasil pencarian YouTube dengan kata kunci “Algoritma”, dengan jumlah video yang cukup tinggi yaitu 19.
Kita juga dapat melihat video apa saja yang termasuk ke 19 video tersebut:
yt_research %>%
filter(channelTitle == "Algoritma Data Science Education Center") %>%
mutate(publishedAt = ymd_hms(publishedAt, tz = "Asia/Bangkok"),
title = as.character(title),
channelTitle = as.character(channelTitle),
viewCount = as.integer(viewCount),
likeCount = as.integer(likeCount),
dislikeCount = as.integer(dislikeCount),
commentCount = as.integer(commentCount)) %>%
select(title, viewCount, likeCount, dislikeCount, commentCount)
## Date in ISO8601 format; converting timezone from UTC to "Asia/Bangkok".
Hal ini berguna untuk mengetahui apakah terdapat faktor tertentu yang membuat suatu video tampil pada urutan-urutan lebih awal. Dalam data yang kita punya, data sudah terurut berdasarkan video yang pertama kali muncul pada hasil query. Selanjutnya kita tinggal menganalisis nilai-nilai statistik dari tiap video.
date <- "2019-12-04" # menyiapkan data untuk feature engineering; tanggal pengambilan data
# data aggregation
head50 <- yt_research %>%
head(50) %>%
select(2, 4, 6, 7:9, 11) %>%
mutate(publishedAt = ymd_hms(publishedAt, tz = "Asia/Bangkok"),
title = as.character(title),
channelTitle = as.character(channelTitle),
viewCount = as.integer(viewCount),
likeCount = as.integer(likeCount),
dislikeCount = as.integer(dislikeCount),
commentCount = as.integer(commentCount),
publishdate = as.Date(publishedAt),
currentdate = ymd(date),
sincepublished = currentdate-publishdate,
rank = c(1:50)) %>%
select(rank, viewCount, likeCount, dislikeCount, commentCount, sincepublished) %>%
rename("View Count" = viewCount,
"Like Count" = likeCount,
"Dislike Count" = dislikeCount,
"Comment Count" = commentCount,
"Days Since Published" = sincepublished)
library(tidyr)
head50_group <- head50 %>%
gather(key = "Label", value = "Count", -rank)
str(head50_group)
## 'data.frame': 250 obs. of 3 variables:
## $ rank : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Label: chr "View Count" "View Count" "View Count" "View Count" ...
## $ Count: num 62653 66033 2283 10482 14689 ...
ggplot(data = head50_group, mapping = aes(rank, Count)) +
geom_line(aes(col = Label)) +
facet_wrap(scales = "free_y", facets = c("Label"), nrow = 5) +
labs(title = "Video's Statistics vs Rank in a Query Result",
x = "Rank") +
theme_minimal() + theme(legend.position = "none")
Bila dilihat dari grafik di atas, tidak terlihat tren tertentu yang menunjukan bahwa nilai statistik video mempengaruhi ranking video yang muncul pertama kali pada query result. Kita dapat memastikan dengan melihat korelasi dari tiap nilai statistik terhadap ranking video.
# uji korelasi
cor(head50$rank, head50$'View Count')
## [1] -0.05019693
cor(head50$rank, head50$'Like Count')
## [1] -0.1017412
cor(head50$rank, head50$'Dislike Count')
## [1] 0.03547904
cor(head50$rank, head50$'Comment Count')
## [1] 0.1460736
cor(head50$rank, as.integer(head50$'Days Since Published'))
## [1] 0.002382519
Mari coba kita gunakan data yang lebih banyak (keseluruhan data).
vid_rank <- yt_research %>%
select(2, 4, 6, 7:9, 11) %>%
mutate(publishedAt = ymd_hms(publishedAt, tz = "Asia/Bangkok"),
title = as.character(title),
channelTitle = as.character(channelTitle),
viewCount = as.integer(viewCount),
likeCount = as.integer(likeCount),
dislikeCount = as.integer(dislikeCount),
commentCount = as.integer(commentCount),
publishdate = as.Date(publishedAt),
currentdate = ymd(date),
sincepublished = currentdate-publishdate,
rank = c(1:645)) %>%
select(rank, viewCount, likeCount, dislikeCount, commentCount, sincepublished) %>%
mutate(likeCount = ifelse(is.na(likeCount), 0, likeCount),
dislikeCount = ifelse(is.na(dislikeCount), 0, dislikeCount),
commentCount = ifelse(is.na(commentCount), 0, commentCount))
## Date in ISO8601 format; converting timezone from UTC to "Asia/Bangkok".
# uji korelasi
cor(vid_rank$rank, vid_rank$viewCount)
## [1] -0.001818042
cor(vid_rank$rank, vid_rank$likeCount)
## [1] -0.0006375529
cor(vid_rank$rank, vid_rank$dislikeCount)
## [1] 0.0001539818
cor(vid_rank$rank, vid_rank$commentCount)
## [1] -0.009094076
cor(vid_rank$rank, as.integer(vid_rank$sincepublished))
## [1] -0.1561542
Setelah analisis korelasi lebih lanjut, telah terbukti bahwa nilai-nilai yang kita analisis di atas tidak memengaruhi ranking video yang muncul pada query result. Mungkin terdapat faktor lain dan perlu dianalisis lebih lanjut, seperti nilai statistik dari channel video dan informasi lain seperti tags dan category dari tiap video.
Semoga sedikit analisis di atas dapat membantu Anda memulai langkah pertama membuat project data science menggunakan data YouTube!