Oh Superman where are you now?

Un modesto ejercicio de datos con esta banda que hacemos bien en disfrutar. Vamos a ver la proporción de temas en vivo que tocaron entre 1969 y 1992 en sus presentaciones de acuerdo a cuales pertenecen a la era de Peter Gabriel (hasta 1975) y los de Phil Collins posteriormente.

Librerías que vamos a usar.

library(rvest)
library(tidyverse)
library(ggplot2)
library(knitr)

Datos iniciales. Como ya los tengo los cargo por acá, anios son los años en los cuales Genesis tocó en vivo durante el período analizado.

anios <- c(1992,1987,1986,1984,1983,1982,1981,1980,1978,1977,1976,1975,1974,1973,1972,1971,1970,1969)

El scraping propiamente dicho. Voy a la página con la lista de años y voy leyendo lo que necesito, al final lo acumulo en el df de resultados.

df_resultados <- data.frame()

for(anio in anios){
 urldir <- paste0("https://www.setlist.fm/stats/genesis-1bd6b520.html?year=", anio)
  pagina <- read_html(urldir)
  df_result <- html_table(xml_child(xml_child(xml_child(xml_child(xml_child(xml_child(xml_child(xml_child(xml_child(xml_child(xml_child(xml_child(pagina, 2), 6), 3), 3), 1), 1), 2), 1), 2), 1), 2), 2))
  names(df_result) <- c("pos","cancion","veces")
  df_result <- df_result %>% filter(!is.na(veces))
  df_result$pos <- NULL
  df_result$cancion <- str_remove(df_result$cancion, "\n\n\nPlay Video\nstats")
  df_result$anio <- rep(anio, dim(df_result)[1])
  df_resultados <- rbind(df_resultados, df_result)
}
kable(head(df_resultados))
cancion veces anio
Land of Confusion 70 1992
No Son of Mine 70 1992
Dance on a Volcano 69 1992
Drum Duet 69 1992
Fading Lights 69 1992
Firth of Fifth 69 1992

Simplificando mucho digamos que todo lo que hizo Genesis hasta 1975 fue parte de la “era Gabriel” y de ahí en adelante es la “era Collins”. Filtramos los temas hasta el 75, los llevamos aparte y armamos un df con esos temas.

temas_gabriel <- df_resultados %>% filter(anio <= 1975)  %>% group_by(cancion) %>% summarize(first(cancion)) %>% select(cancion)
kable(head(temas_gabriel))
cancion
Anyway
Babies
Back in N.Y.C.
Black Sheep (SRC cover)
Broadway Melody of 1974
Build Me a Mountain

Con esta información podemos volver a nuestro df de resultados y ver en cada tema la era a la cual pertenece. Si el tema está en la lista de Gabriel se lo marca como tal, si no queda como Collins.

df_resultados <- df_resultados %>% 
  mutate(era = ifelse(cancion%in%temas_gabriel$cancion,"Gabriel", "Collins")) %>%
  group_by(anio, era) %>% summarize(veces = sum(veces))
kable(head(df_resultados))
anio era veces
1969 Gabriel 40
1970 Gabriel 37
1971 Gabriel 45
1972 Gabriel 228
1973 Gabriel 388
1974 Gabriel 891

Esto es lo que se denomina un df “long”. Podemos armar un ggplot sin amasijar más datos.

ggplot(df_resultados, aes(x = anio, y = veces, group = era, fill = era))+
  geom_area(position = "fill")+
  scale_y_continuous(labels = scales::percent)+
  theme(text = element_text(size=16))

Casi. Queda ese glitch feo de arriba. Abrimos el df con spread a una línea por año y transformamos todos los NA en 0.

df_resultados_wide <- spread(df_resultados, era, veces)
df_resultados_wide[is.na(df_resultados_wide)] <- 0
kable(head(df_resultados_wide))
anio Collins Gabriel
1969 0 40
1970 0 37
1971 0 45
1972 0 228
1973 0 388
1974 0 891

Reconstruimos el df de resultados original y vemos la diferencia.

df_resultados <- gather(df_resultados_wide, era, veces, Collins:Gabriel)
kable(head(df_resultados))
anio era veces
1969 Collins 0
1970 Collins 0
1971 Collins 0
1972 Collins 0
1973 Collins 0
1974 Collins 0
ggplot(df_resultados, aes(x = anio, y = veces, group = era, fill = era))+
  geom_area(position = "fill")+
  scale_y_continuous(labels = scales::percent)+
  ggtitle("Proporción de temas tocados en vivo de Genesis según era")+
  labs(x = "Año",
       y = "% temas en vivo de cada era",
       fill = "Era")+
  theme(text = element_text(size=16))

Una más y no pedimos más.

Podemos traer unos datos de ventas de discos para ver que tal le fue a Genesis en la etapa Collins. Entonces ventaseeuu son las ventas en los EEUU de los discos de Genesis (aproximado, en realidad son los números de producción pero bueno)

ventaseeuu <- data.frame(anio = c(1969,1971,1972,1973,1974,1976,1977,1978,1980,1981,1982,1983,1986,1991,1992),
                        ventas = c(1,77,112,163,182,210,500,1000,1000,2000,500,4000,6000,4000,2500))

Como ya tenemos el df en formato wide del punto anterior sólo vamos a calcular la proporción de los temas de Gabriel y agregarle la info de ventas.

df_resultados_wide <- df_resultados_wide %>% 
  mutate(propgabriel = Gabriel/(Collins + Gabriel)*100)
df_resultados_final <- merge(df_resultados_wide, ventaseeuu, by = "anio", all = TRUE)

Para no sobrecargar el área sólo voy a mostrar los temas de Gabriel como proporción. Sobre eso armo la línea con las ventas y la proyecto sobre el segundo eje y. No es una buena práctica dibujar con dos ejes pero como ejercicio se puede hacer.

ggplot(na.omit(df_resultados_final))+
  geom_area(aes(x = anio, y = propgabriel, fill = "% temas Gabriel"))+
  ggtitle("Proporción de temas tocados en vivo de Genesis de la era Gabriel \nvs. ventas discos de Genesis en EEUU 1969 - 1992")+
  geom_line(aes(x = anio, y = ventas/60, color = "Ventas discos EEUU (millones)"), size = 2)+
  scale_y_continuous(sec.axis = sec_axis(~ . *0.06, name = "Ventas discos (millones)\n"))+
  scale_color_manual(values = c("blue"))+
  labs(x = "Año",
       y = "% temas en vivo de la era Gabriel",
       fill = "",
       color = "")+
  theme(text = element_text(size=16))

Claro que esto no resuelve el planteo inicial pero evidentemente hay una sintonía mayor en las preferencias con Phil al mando. Bien por él y por quienes disfrutamos su música.

Como bonus vemos que se puede embeber un video de YouTube en Markdown de la siguiente forma.

<iframe width="560" height="315" src="https://www.youtube.com/embed/6wHqUOE16vo" frameborder="0" allowfullscreen></iframe>