La primera vez que escuche al mejor grupo de britpop debió ser en mis 15 años, con el disco What’s the Story (Morning Glory) y desde entonces no he parado de escucharlos, aunque después del 5 disco ya perdieron algo de su esencia.

Este post es un proyecto que tenía en mente luego de escuchar una de las charlas de R-Ladies donde analizaban las letras de Tylor Swift ( https://github.com/aaumaitre/taylor_swift ), la autora es una verdadera fanática de la cantante

Les comparto el código para que puedan replicar el análisis.

Descarga de las letras

Para descarga las letras se utiliza un librería genius, aquí cabe recalcar que a pesar de todos mis intentos no logré descargar todas las letras de los discos.

library(tidyverse) #Librería para manipulación de datos
library(genius) #Descarga de letra de canciones
library(tidytext) #Tratamiento de Texto
library(scales) #Manipulación de escalas en ggplot
library(widyr) #Correlaciones entre canciones
library(ggraph) #Análisis de redes
library(igraph) #Análisis de rede#Descargamos las letras de las cancionests1 <- genius_album(artist = "Oasis",album = "Definitely Maybe")%>%
  mutate(album = "Definitely Maybe")ts2 <- genius_album(artist = "Oasis",album = "(What’s the Story) Morning Glory?")%>%
  mutate(album = "(What’s the Story) Morning Glory?")ts3 <- genius_album(artist = "Oasis", album = "Be Here Now")%>%
  mutate(album = "Be Here Now")ts4 <- genius_album(artist = "Oasis", album = "The Masterplan")%>%
  mutate(album = "The Masterplan")ts5 <- genius_album(artist = "Oasis", album =  "Standing on the Shoulder of Giants")%>%
  mutate(album = "Standing on the Shoulder of Giants")ts6 <- genius_album(artist = "Oasis", album = "Heathen Chemistry")%>%
  mutate(album = "Heathen Chemistry")ts7 <- genius_album(artist = "Oasis", album = "Don’t Believe the Truth")%>%
  mutate(album = "Don’t Believe the Truth")ts2$album[ts2$album=="(What’s the Story) Morning Glory?"] <- "Whats the story"#Ponemos todo en el mismo dataframe
oasis <- rbind(ts1, ts2, ts3, ts4, ts5, ts6,ts7)
oasis <- na.omit(oasis) #elimino los NA al no descargar todas las letras se graban registros como NA

Palabras más utilizadas

Uno de los análisis más comunes es revisar la frecuencia de las palabras que se han utilizado.

Para poder lograr este gráfico, primero convertimos cada palabra de las canciones en una fila, siguiendo el concepto de “tidy data” y este proceso se llama “tokenización”

Un paso importante es eliminar las STOPWORD, de no hacerlo vamos a encontrarnos que las palabras más utilizadas son por ejemplo “the”, y en el caso de Oasis eliminé adicionalmente “yea,”na”,”naa” que encontramos frecuentemente en sus canciones.

#Tokenizando los datos
oasis_tok <- oasis %>%
  unnest_tokens(word, lyric)oasis_tok %>%
  count(word, sort = TRUE)tidy_oasis <- oasis_tok %>%
  anti_join(stop_words)tidy_oasis%>%  
  count(word, sort = TRUE)#elimino na | la | laa | yeahtidy_oasis <- tidy_oasis %>% filter (word != "na")
tidy_oasis <- tidy_oasis %>% filter (word != "la")
tidy_oasis <- tidy_oasis %>% filter (word != "laa")
tidy_oasis <- tidy_oasis %>% filter (word != "yeah")tidy_oasis %>%
  count(word, sort = TRUE) %>%
  top_n(15,n) %>% 
  ggplot(aes(reorder(word,n),n,label=word,fill=n))+
  geom_bar(stat="identity")+ coord_flip() +
  theme_minimal() + geom_label( colour = "white",size=5)+
  theme(plot.title = element_text(face = "bold", size = 13)) +
  theme(axis.text = element_text(size=11),axis.text.y = element_blank())+
  labs(
    x = NULL, y = "Número de veces mencionadas",
    title = "Palabras más usadas en las canciones de OASIS",
    caption = "\nSource: Data collected from Genius"
  )

Análisis de Sentimiento

Y la pregunta ¿ qué sentimientos expresan las canciones de Oasis ? ¿ positivas | negativas ?

Para realizar este análisis, utilizamos un diccionario llamada BING, que básicamente lo que haces tomar cada palabra y asignarle una etiqueta de “positivo” o “negativo”.

En este ejercicio graficamos el ranking de canciones por disco, desde la que usa más palabras “positivas”

oasis_sentiment <- tidy_oasis%>%
  inner_join(get_sentiments("bing"))%>% 
  count(album, track_title, sentiment) %>%
  spread(sentiment, n, fill = 0) %>%
  mutate(sentiment = positive - negative)#Orden de publicación de los discos:
oasis_order <- c("Definitely Maybe", "Whats the story",
                 "Be Here Now", "The Masterplan", "Standing on the Shoulder of Giants",
                 "Heathen Chemistry","Don’t Believe the Truth")
oasis_sentiment$album <- factor(oasis_sentiment$album, levels = oasis_order)
oasis_sentiment%>%
  ggplot(aes(reorder(track_title, sentiment), sentiment, fill = album)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~album, ncol = 3, scales = "free")+
  scale_fill_manual(values = c("black", "skyblue4", "yellow3", 
                               "gray61", "wheat2", "magenta3","snow3"))+
  labs(x = NULL,
       y = "Sentimento",
       title = "Ranking de canciones de Oasis por sentimiento(+ / - )",
       caption = "Roberto Esteves - @restevesd")+
  theme_minimal()+
  theme(plot.title = element_text(size = 13, hjust = 0.4, face = "bold"),
        axis.title.y = element_text(hjust = 0.05, size = 7, color = "grey40", angle = 0),
        axis.title.x =  element_text(size = 8, color = "grey40"),
        axis.text.x = element_text(size = 6.5, color = "grey40"),
        axis.text.y = element_text(size = 6.5, color = "grey40"), 
        strip.text = element_text(size = 9, color = "grey40", face = "bold"),
        plot.caption = element_text(size = 7.5, color = "grey40"))+
  coord_flip()

Sentimientos por disco

¿ Cuál es la canción más positiva ?

Relaciones entre las canciones

Un gráfico de redes representa interconexiones entre individuos. La presencia o ausencia de cada interconexión puede indicar si existe alguna relación entre cada par de individuos ( https://rpubs.com/arquez9512/613766 )

Para este análisis vamos a graficar las relaciones que hay entre canciones, en función de las palabras que se usaron en cada una.

oasis_cors <- tidy_oasis %>%
  pairwise_cor(track_title, word,sort=TRUE)oasis_corsset.seed(123)oasis_cors %>%
  filter(correlation > 0.13) %>%
  graph_from_data_frame() %>%
  ggraph(layout = "fr") +
  geom_edge_link( show.legend = FALSE) +
  geom_node_point(color = "lightblue", size = 5) +
  geom_node_text(aes(label = name), repel = TRUE, size = 3.5, color = "grey40") +
  theme_void()+
  ggsave("taymap.png", width = 15, height = 11)

La canción Listen Up es la que tiene la mayor coincidencia en el uso de palabras con la de más canciones

Si graficaramos toda la red de relaciones de las canciones, tomando en cuenta que si al menos tiene una palabra coincidente ya tienen una relación numérica, en el gráfico anterior se usaron relaciones > 0.13

cor.graph <- as_tbl_graph(oasis_cors, directed = FALSE)
ggraph(cor.graph) + 
  geom_edge_link() + 
  geom_node_point() +
  geom_node_text(
    aes(label = name), size = 3, repel = TRUE
  ) +
  theme_graph()

Relaciones entre todas las canciones de OASIS

Si ahora le agregamos como información en los nodos ( nombres de canción ) la información a los discos que pertenecen ( http://www.sthda.com/english/articles/33-social-network-analysis/136-network-analysis-and-manipulation-using-r/ )

# Creamos un dataframe con los nombres de los discos y las canciones
cars.group <- tibble(
  name = as.factor(oasis$track_title),
  album = as.factor(oasis$album)
) %>% unique()# Modificamos los datos de los nodos
cor.graph <- cor.graph %>%
  activate(nodes) %>%
  left_join(cars.group, by = "name") %>%
  rename(label = name)cor.graph1 <- cor.graph %>%
  activate(edges) %>% filter(correlation > 0.13) %>% 
  rename(weight = correlation)set.seed(1)
ggraph(cor.graph1,layout = "linear", circular = TRUE) + 
  geom_edge_arc(aes(colour = "album"))+
  geom_edge_link(aes(width = weight), alpha = 0.2) + 
  scale_edge_width(range = c(0.2, 1)) +
  geom_node_point(aes(color = album), size = 5) +
  geom_node_text(aes(label = label), size = 4, repel = TRUE) +
  theme_graph()

Relación entre las canciones

Con este llegamos al final del post, para todos los fanáticos de OASIS pueden enviarme sus conclusiones de lo expuesto y con gusto lo publicamos en el post.