##
## 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
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
# 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)
ggplot2
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 trendingas.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()
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 bawahhigh
= 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 textsize
= untuk mengatur ukuran textnudge_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:
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 digunakanContoh:
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)
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
dipisahscales
= 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")
Business Case: Bagaimana trending dari konten dengan kategori (“Gaming” & “Music”) dari hari ke hari, dari bulan 11-12.
Hint:
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))
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:
Berikut adalah referensi-referensi lain dan website yang dapat memudahkan kita untuk mengekplorasi seputar data visualisasi di R: