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)

  • shared on twitter, on Mar 2, 2021.
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")

YT views, likes and comments

# youtube views, likes and comments count 
# reference: Jenn Schilling (https://twitter.com/datasciencejenn/status/1367180974312751104/photo/1)

youtube %>% mutate(brand = ifelse(brand == "Hynudai", "Hyundai", brand)) %>%
ggplot(aes(x = view_count, 
                     y = like_count,
                     size = comment_count)) +
  geom_point(alpha = 0.7) +
  facet_wrap(~ brand,
             ncol = 2,
             strip.position = "left",
             scales = "free") + 
  theme_minimal() + 
  theme(strip.text.y.left = element_text(size = 10,angle = 0,vjust = 1,hjust = 1,face = "bold"),
        strip.placement = "outside", 
        plot.title.position="plot",
        panel.spacing.y = unit(0.5, "cm"),
        panel.spacing.x = unit(0.5, "cm")) + 
  labs(title = "Superbowl Ads 2000 to 2020",
       subtitle="Youtube videos view, like and comment count",
       y= "Like count",
       x= "View count",
       size="Comment count")

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=