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>