Data Visualization Exercise
TidyTuesday week 10: Superbowl Ads, data from FiveThirtyEight.
library(tidyverse)
library(ggsci)
library(ggtext)
library(colorspace)
# import data
youtube <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-03-02/youtube.csv')
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
.default = col_character(),
year = col_double(),
funny = col_logical(),
show_product_quickly = col_logical(),
patriotic = col_logical(),
celebrity = col_logical(),
danger = col_logical(),
animals = col_logical(),
use_sex = col_logical(),
view_count = col_double(),
like_count = col_double(),
dislike_count = col_double(),
favorite_count = col_double(),
comment_count = col_double(),
published_at = col_datetime(format = ""),
category_id = col_double()
)
ℹ Use `spec()` for the full column specifications.
dim(youtube)
[1] 247 25
Ad characteristics over the Years
youtube %>% select(5:11) %>% pivot_longer(1:7, names_to="cat") %>% group_by(cat, value) %>% tally() %>%
mutate(prop=round(n/247,3)) %>% filter(value!=FALSE)
youtube %>%
rename(Funny= funny,
`Show product quickly` = show_product_quickly,
Patriotic= patriotic,
Celebrity= celebrity,
Danger = danger,
Animals = animals,
`Use Sex` = use_sex) %>%
select(youtube_url, year, Funny,`Show product quickly`, Patriotic,Celebrity,Danger,Animals,`Use Sex`) %>%
pivot_longer(!1:2, names_to="cat") %>%
filter(value!="FALSE") %>%
group_by(year, cat) %>%
tally() %>%
mutate(prop=round(n/sum(n),3)) %>%
# plot
ggplot(aes(x=year, y= prop, fill=cat)) +
geom_col(alpha=0.8) + facet_wrap(~cat) +
scale_y_continuous(labels=scales::percent) +
scale_fill_futurama() +
theme_minimal() +
theme(legend.position="none",
panel.grid.minor=element_blank(),
strip.text=element_text(face="bold", size=12),
plot.title=element_text(face="bold",size=23, hjust=0.5, color="slategrey"),
plot.title.position="plot",
plot.caption=element_text(color="slategrey", size=9)) +
labs(y="Percentage", x="Year",
title="Characteristics of Superbowl Ads Over the Years",
subtitle="",
caption="TidyTuesday week 10 | Data from FiveThirtyEight")

# count of YT videos by brand
youtube %>% group_by(brand) %>% tally() %>%
mutate(brand=fct_recode(brand, "Hyundai" = "Hynudai"))
YT view count by year (2016 to 2020)
labeldf = youtube %>% select(year, brand, view_count) %>%
filter(!is.na(view_count)) %>% filter(year>2015) %>%
group_by(year) %>% top_n(1) %>% arrange(year) %>%
mutate(brand_vc = paste(brand,":",scales::comma(view_count),"views"))
Selecting by view_count
labeldf
youtube %>% filter(!is.na(view_count)) %>% filter(year>2015) %>%
ggplot(aes(x=factor(year), y= (view_count))) +
geom_jitter(aes(color=factor(year)), show.legend = FALSE, alpha=0.7, width=0.35, size=2.5) +
geom_text(data=labeldf, aes(x=factor(year), y=view_count, label=brand_vc, color=factor(year)), size=3.2, vjust=-1.5, show.legend = FALSE) +
scale_y_continuous(labels=scales::comma_format()) +
scale_color_futurama() +
theme_minimal() +
theme(plot.title=element_text(face="bold",size=32, hjust=0.5, color="slategrey"),
plot.title.position="plot",
plot.caption=element_text(color="slategrey", size=9)) +
labs(x="Year",
y="View Count",
title="Superbowl Ads Youtube View Count",
subtitle="",
caption="TidyTuesday week 10 | Data from FiveThirtyEight")

YT view count by brand
# youtube view count by brand
ylab = c(50,100,150)
youtube %>%
filter(!is.na(view_count)) %>%
ggplot(aes(x=brand, y=view_count)) +
geom_jitter(alpha=0.6, size=1.7, show.legend=FALSE) +
scale_y_continuous(labels = paste(ylab, "M"), breaks=10^6*ylab) +
theme_light() +
labs(x="Brand",y="View Count", subtitle= "Superbowl Ads 2000 to 2020", title= "Youtube View Count by Brand")

Youtube views by brand and year (2000 to 2020)
youtube %>%
filter(!is.na(view_count)) %>%
#filter(year>=2010) %>%
ggplot(aes(x=factor(year),y=brand)) +
geom_tile(aes(fill=view_count)) +
theme_minimal() +
scale_fill_continuous_sequential(palette="heat", na.value="black", trans="log10", labels=scales::comma) +
theme(legend.position="top",
panel.grid=element_blank(),
plot.title=element_text(face="bold"),
axis.text.x=element_text(angle=45),
legend.title = element_text(size=9)) +
guides(fill = guide_colorbar(title.position = "top",
title.hjust = .5,
barwidth = unit(20, "lines"),
barheight = unit(.5, "lines"))) +
labs(y="Brand",x="Year", subtitle="Superbowl Ads 2000 to 2020", title = "Youtube views by brand and year", fill="View Count")

LS0tCnRpdGxlOiAiU3VwZXJib3dsIEFkcyIKZGF0ZTogIjIwMjEvMDMvMDciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIERhdGEgVmlzdWFsaXphdGlvbiBFeGVyY2lzZSAKCltUaWR5VHVlc2RheV0oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheSkgd2VlayAxMDogW1N1cGVyYm93bCBBZHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvYmxvYi9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDMtMDIvcmVhZG1lLm1kKSwgZGF0YSBmcm9tIFtGaXZlVGhpcnR5RWlnaHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9maXZldGhpcnR5ZWlnaHQvc3VwZXJib3dsLWFkcykuCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dzY2kpCmxpYnJhcnkoZ2d0ZXh0KQpsaWJyYXJ5KGNvbG9yc3BhY2UpCmBgYAoKYGBge3J9CiMgaW1wb3J0IGRhdGEKeW91dHViZSA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAzLTAyL3lvdXR1YmUuY3N2JykKZGltKHlvdXR1YmUpCmBgYAoKCiMjIyBBZCBjaGFyYWN0ZXJpc3RpY3Mgb3ZlciB0aGUgWWVhcnMKKiBzaGFyZWQgb24gW3R3aXR0ZXJdKGh0dHBzOi8vdHdpdHRlci5jb20vbGVlb2xuZXkzL3N0YXR1cy8xMzY2Njc4MTcyNjUwMDc4MjEwL3Bob3RvLzEpLCBvbiBNYXIgMiwyMDIxCgpgYGB7cn0KeW91dHViZSAlPiUgc2VsZWN0KDU6MTEpICU+JSBwaXZvdF9sb25nZXIoMTo3LCBuYW1lc190bz0iY2F0IikgJT4lIGdyb3VwX2J5KGNhdCwgdmFsdWUpICU+JSB0YWxseSgpICU+JSAKICBtdXRhdGUocHJvcD1yb3VuZChuLzI0NywzKSkgJT4lIGZpbHRlcih2YWx1ZSE9RkFMU0UpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTR9CnlvdXR1YmUgJT4lIAogIHJlbmFtZShGdW5ueT0gZnVubnksCiAgICAgICAgIGBTaG93IHByb2R1Y3QgcXVpY2tseWAgPSBzaG93X3Byb2R1Y3RfcXVpY2tseSwKICAgICAgICAgUGF0cmlvdGljPSBwYXRyaW90aWMsCiAgICAgICAgIENlbGVicml0eT0gY2VsZWJyaXR5LAogICAgICAgICBEYW5nZXIgPSBkYW5nZXIsCiAgICAgICAgIEFuaW1hbHMgPSBhbmltYWxzLAogICAgICAgICBgVXNlIFNleGAgPSB1c2Vfc2V4KSAlPiUKICBzZWxlY3QoeW91dHViZV91cmwsIHllYXIsIEZ1bm55LGBTaG93IHByb2R1Y3QgcXVpY2tseWAsIFBhdHJpb3RpYyxDZWxlYnJpdHksRGFuZ2VyLEFuaW1hbHMsYFVzZSBTZXhgKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKCExOjIsIG5hbWVzX3RvPSJjYXQiKSAlPiUgCiAgZmlsdGVyKHZhbHVlIT0iRkFMU0UiKSAlPiUgCiAgZ3JvdXBfYnkoeWVhciwgY2F0KSAlPiUgCiAgdGFsbHkoKSAlPiUgCiAgbXV0YXRlKHByb3A9cm91bmQobi9zdW0obiksMykpICU+JQogICMgcGxvdAogIGdncGxvdChhZXMoeD15ZWFyLCB5PSBwcm9wLCBmaWxsPWNhdCkpICsgCiAgZ2VvbV9jb2woYWxwaGE9MC44KSArIGZhY2V0X3dyYXAofmNhdCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2ZpbGxfZnV0dXJhbWEoKSArIAogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHNpemU9MTIpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLHNpemU9MjMsIGhqdXN0PTAuNSwgY29sb3I9InNsYXRlZ3JleSIpLAogICAgICAgIHBsb3QudGl0bGUucG9zaXRpb249InBsb3QiLAogICAgICAgIHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoY29sb3I9InNsYXRlZ3JleSIsIHNpemU9OSkpICsgCiAgbGFicyh5PSJQZXJjZW50YWdlIiwgeD0iWWVhciIsCiAgICAgICB0aXRsZT0iQ2hhcmFjdGVyaXN0aWNzIG9mIFN1cGVyYm93bCBBZHMgT3ZlciB0aGUgWWVhcnMiLAogICAgICAgc3VidGl0bGU9IiIsCiAgICAgICBjYXB0aW9uPSJUaWR5VHVlc2RheSB3ZWVrIDEwIHwgRGF0YSBmcm9tIEZpdmVUaGlydHlFaWdodCIpCmBgYAoKCmBgYHtyfQojIGNvdW50IG9mIFlUIHZpZGVvcyBieSBicmFuZAp5b3V0dWJlICU+JSBncm91cF9ieShicmFuZCkgJT4lIHRhbGx5KCkgJT4lCiAgbXV0YXRlKGJyYW5kPWZjdF9yZWNvZGUoYnJhbmQsICJIeXVuZGFpIiA9ICJIeW51ZGFpIikpIApgYGAKCiMjIyBZVCB2aWV3IGNvdW50IGJ5IHllYXIgKDIwMTYgdG8gMjAyMCkKKiBzaGFyZWQgb24gW3R3aXR0ZXJdKGh0dHBzOi8vdHdpdHRlci5jb20vbGVlb2xuZXkzL3N0YXR1cy8xMzY2ODIwMTE0MTI1OTYzMjY3L3Bob3RvLzEpLCBvbiBNYXIgMiwgMjAyMS4gCgpgYGB7cn0KbGFiZWxkZiA9IHlvdXR1YmUgJT4lIHNlbGVjdCh5ZWFyLCBicmFuZCwgdmlld19jb3VudCkgJT4lCiAgZmlsdGVyKCFpcy5uYSh2aWV3X2NvdW50KSkgJT4lIGZpbHRlcih5ZWFyPjIwMTUpICU+JSAKICBncm91cF9ieSh5ZWFyKSAlPiUgdG9wX24oMSkgJT4lIGFycmFuZ2UoeWVhcikgJT4lCiAgbXV0YXRlKGJyYW5kX3ZjID0gcGFzdGUoYnJhbmQsIjoiLHNjYWxlczo6Y29tbWEodmlld19jb3VudCksInZpZXdzIikpCmxhYmVsZGYKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTR9CnlvdXR1YmUgJT4lIGZpbHRlcighaXMubmEodmlld19jb3VudCkpICU+JSBmaWx0ZXIoeWVhcj4yMDE1KSAlPiUKICBnZ3Bsb3QoYWVzKHg9ZmFjdG9yKHllYXIpLCB5PSAodmlld19jb3VudCkpKSArIAogIGdlb21faml0dGVyKGFlcyhjb2xvcj1mYWN0b3IoeWVhcikpLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBhbHBoYT0wLjcsIHdpZHRoPTAuMzUsIHNpemU9Mi41KSArIAogIGdlb21fdGV4dChkYXRhPWxhYmVsZGYsIGFlcyh4PWZhY3Rvcih5ZWFyKSwgeT12aWV3X2NvdW50LCBsYWJlbD1icmFuZF92YywgY29sb3I9ZmFjdG9yKHllYXIpKSwgc2l6ZT0zLjIsIHZqdXN0PS0xLjUsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hX2Zvcm1hdCgpKSArIAogIHNjYWxlX2NvbG9yX2Z1dHVyYW1hKCkgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixzaXplPTMyLCBoanVzdD0wLjUsIGNvbG9yPSJzbGF0ZWdyZXkiKSwKICAgICAgICBwbG90LnRpdGxlLnBvc2l0aW9uPSJwbG90IiwKICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGNvbG9yPSJzbGF0ZWdyZXkiLCBzaXplPTkpKSArCiAgbGFicyh4PSJZZWFyIiwKICAgICAgIHk9IlZpZXcgQ291bnQiLAogICAgICAgdGl0bGU9IlN1cGVyYm93bCBBZHMgWW91dHViZSBWaWV3IENvdW50IiwKICAgICAgIHN1YnRpdGxlPSIiLAogICAgICAgY2FwdGlvbj0iVGlkeVR1ZXNkYXkgd2VlayAxMCB8IERhdGEgZnJvbSBGaXZlVGhpcnR5RWlnaHQiKQoKYGBgCgojIyMgWVQgdmlldyBjb3VudCBieSBicmFuZApgYGB7cn0KeWxhYiA9IGMoNTAsMTAwLDE1MCkKeW91dHViZSAlPiUgCiAgZmlsdGVyKCFpcy5uYSh2aWV3X2NvdW50KSkgJT4lCiAgZ2dwbG90KGFlcyh4PWJyYW5kLCB5PXZpZXdfY291bnQpKSArIAogIGdlb21faml0dGVyKGFscGhhPTAuNiwgc2l6ZT0xLjcsIHNob3cubGVnZW5kPUZBTFNFKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwYXN0ZSh5bGFiLCAiTSIpLCBicmVha3M9MTBeNip5bGFiKSArCiAgdGhlbWVfbGlnaHQoKSArIAogIGxhYnMoeD0iQnJhbmQiLHk9IlZpZXcgQ291bnQiLCBzdWJ0aXRsZT0gIlN1cGVyYm93bCBBZHMgMjAwMCB0byAyMDIwIiwgdGl0bGU9ICJZb3V0dWJlIFZpZXcgQ291bnQgYnkgQnJhbmQiKQpgYGAKCgojIyMgWVQgdmlld3MsIGxpa2VzIGFuZCBjb21tZW50cyAKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTR9CiMgeW91dHViZSB2aWV3cywgbGlrZXMgYW5kIGNvbW1lbnRzIGNvdW50IAojIHJlZmVyZW5jZTogSmVubiBTY2hpbGxpbmcgKGh0dHBzOi8vdHdpdHRlci5jb20vZGF0YXNjaWVuY2VqZW5uL3N0YXR1cy8xMzY3MTgwOTc0MzEyNzUxMTA0L3Bob3RvLzEpCgp5b3V0dWJlICU+JSBtdXRhdGUoYnJhbmQgPSBpZmVsc2UoYnJhbmQgPT0gIkh5bnVkYWkiLCAiSHl1bmRhaSIsIGJyYW5kKSkgJT4lCmdncGxvdChhZXMoeCA9IHZpZXdfY291bnQsIAogICAgICAgICAgICAgICAgICAgICB5ID0gbGlrZV9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNvbW1lbnRfY291bnQpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGZhY2V0X3dyYXAofiBicmFuZCwKICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgc3RyaXAucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIpICsgCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUoc3RyaXAudGV4dC55LmxlZnQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLGFuZ2xlID0gMCx2anVzdCA9IDEsaGp1c3QgPSAxLGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHN0cmlwLnBsYWNlbWVudCA9ICJvdXRzaWRlIiwgCiAgICAgICAgcGxvdC50aXRsZS5wb3NpdGlvbj0icGxvdCIsCiAgICAgICAgcGFuZWwuc3BhY2luZy55ID0gdW5pdCgwLjUsICJjbSIpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC41LCAiY20iKSkgKyAKICBsYWJzKHRpdGxlID0gIlN1cGVyYm93bCBBZHMgMjAwMCB0byAyMDIwIiwKICAgICAgIHN1YnRpdGxlPSJZb3V0dWJlIHZpZGVvcyB2aWV3LCBsaWtlIGFuZCBjb21tZW50IGNvdW50IiwKICAgICAgIHk9ICJMaWtlIGNvdW50IiwKICAgICAgIHg9ICJWaWV3IGNvdW50IiwKICAgICAgIHNpemU9IkNvbW1lbnQgY291bnQiKQpgYGAKCgojIyMgWW91dHViZSB2aWV3cyBieSBicmFuZCBhbmQgeWVhciAoMjAwMCB0byAyMDIwKQoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CnlvdXR1YmUgJT4lCiAgZmlsdGVyKCFpcy5uYSh2aWV3X2NvdW50KSkgJT4lCiAgI2ZpbHRlcih5ZWFyPj0yMDEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9ZmFjdG9yKHllYXIpLHk9YnJhbmQpKSArIAogIGdlb21fdGlsZShhZXMoZmlsbD12aWV3X2NvdW50KSkgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXNfc2VxdWVudGlhbChwYWxldHRlPSJoZWF0IiwgbmEudmFsdWU9ImJsYWNrIiwgdHJhbnM9ImxvZzEwIiwgbGFiZWxzPXNjYWxlczo6Y29tbWEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InRvcCIsCiAgICAgICAgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OSkpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlLnBvc2l0aW9uID0gInRvcCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmhqdXN0ID0gLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gdW5pdCgyMCwgImxpbmVzIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IHVuaXQoLjUsICJsaW5lcyIpKSkgKwogIGxhYnMoeT0iQnJhbmQiLHg9IlllYXIiLCBzdWJ0aXRsZT0iU3VwZXJib3dsIEFkcyAyMDAwIHRvIDIwMjAiLCB0aXRsZSA9ICJZb3V0dWJlIHZpZXdzIGJ5IGJyYW5kIGFuZCB5ZWFyIiwgZmlsbD0iVmlldyBDb3VudCIpCmBgYAo=