PCA with Metallica

Music Data Mining

A tener en cuenta!


Artículo apto para todos aquellos que tengan una dosis de Metallica y Data Mining en sus venas…

Hablando de enserio, en este artículo estaré explorando datos extraídos de la API de Spotify del grupo musical Metallica. Lo interesante de esta base es que Spotify por medio de su API ofrece acceso a los datos que surgen como resultado del modelo que aplican para evaluar las características básicas de las canciones. Estas variables o features nos sirven de input para aplicar otros modelos, en este caso en particular voy a aplicar un PCA para reducir la dimensionalidad y analizar de forma gráfica la relación entre las características que evalúa el modelo de Spoti con las canciones y sus interrelaciones.
Comenzamos…

Exploratory Data Analysis (EDA)

Evolución de canciones/albumes (1983 - 2021)

Gcanciones <- metallica %>%
  group_by(album_release_year) %>%
  count() %>% ungroup() %>% 
  ggplot(aes(x = album_release_year,y = n,color = n)) +
  geom_line(show.legend = F,size = 1.5) +
  geom_point(show.legend = F,size=2.5) +
  labs(x="",y="",title = "Cantidad de canciones por año") +
  theme_ft_rc() + 
  scale_color_gradient(low = "lightgreen",high = "green4")
Gcanciones

Galbums <- metallica %>%
  distinct(album_release_year,album_name) %>%
  group_by(album_release_year) %>% 
  count() %>% ungroup() %>% 
  ggplot(aes(x = album_release_year,y = n,color = n)) +
  geom_line(show.legend = F,size=1.5) +
  geom_point(show.legend = F,size=2.5) +
  labs(x="",y="",title = "Cantidad de Albumes por año") +
  theme_ft_rc() +
  scale_color_gradient(low = "lightgreen",high = "green4")
Galbums

metallica %>%
  group_by(key_mode) %>%
  count() %>% 
  filter(n > 15) %>% 
  ggplot(aes(x = reorder(key_mode,n),y = n, label = n, fill = n)) + 
  geom_col(show.legend = F) + 
  geom_text(position = position_stack(0.5),color = "white") +
  coord_flip() +
  theme_ft_rc() + 
  labs(x="",y="",title = "Tonalidades más usada por la banda") +
  theme(axis.text.y = element_text(color = "white"))

Top 10 Tracks

Ahora veremos cuales son las canciones top 10 según Spotify y sus características:

danceability energy key loudness speechiness acousticness instrumentalness liveness valence tempo
Whiskey In The Jar 0.511 0.972 10 -3.751 0.0413 0.0000054 0.0010100 0.1900 0.532 132.970
Fuel 0.491 0.951 1 -3.775 0.0465 0.0000230 0.0035400 0.0424 0.555 106.948
Enter Sandman (Remastered) 0.566 0.834 6 -8.412 0.0298 0.0027700 0.0080000 0.0625 0.621 123.296
Sad But True (Remastered) 0.624 0.876 7 -6.005 0.0342 0.0009260 0.0016400 0.0561 0.453 89.240
The Unforgiven (Remastered) 0.531 0.583 7 -9.470 0.0256 0.0184000 0.0062400 0.2550 0.207 139.503
Nothing Else Matters (Remastered) 0.547 0.394 4 -9.793 0.0262 0.0522000 0.0000064 0.0795 0.170 142.370
One (Remastered) 0.438 0.687 7 -9.150 0.0619 0.0006680 0.0801000 0.4200 0.426 103.010
Master of Puppets (Remastered) 0.539 0.828 4 -9.108 0.0350 0.0006700 0.4210000 0.1540 0.562 105.250
For Whom The Bell Tolls (Remastered) 0.512 0.860 0 -6.145 0.0703 0.0063100 0.0052800 0.0652 0.258 117.909
Fade To Black (Remastered) 0.256 0.929 7 -6.667 0.1130 0.0031100 0.2010000 0.1100 0.278 113.470
pivot_data %>%
  ggplot(aes(x = name,y = value,group = track_name,fill = track_name)) +
  geom_col(position = position_dodge(),color="white")  +
  facet_wrap(~name,scales = "free") + 
  theme_ft_rc() + 
  labs(x="",y="", title="Metallica Top 10 tracks' features") +
  theme(legend.position = 'top')+
  scale_fill_viridis_d(option = "H")


Si observamos los resultados del modelo implementado por spotify tiene bastante sentido. Por ejemplo en Acousticness la canción que más sobresale es “Nothing else matters” en la que predomina fuertemente la guitarra acústica y tiene un ritmo bastante suave, por otro lado, tomando otra feature al azar, en energy tenemos a “Whisky in the jar” y “For whom the bells tolls” como las canciones más energicas entre el top 10.


Por si queres escuchar alguna de estas canciones te dejo los links aca abajo:

Nothing Else Matters
Whisky in the Jar

Correlaciones

Por medio de la correlación de Pearson observo el grado de asociación entre las variables para elegir finalmente las que seran incluidas en el modelo:

corPlot(metallica[,9:17], cex = 1,main = "Gráfico de Correlación",stars = T)

Finalmente por medio de una selección de variables nos quedamos con las siguientes, que serán aplicadas al PCA:

corPlot(df_final[,2:6], cex = 1.2,main = "Gráfico de Correlación",stars = T)

Análisis de Comoponentes Principales (PCA)

A continuación procedemos a reducir la dimensionalidad, estandarizando las variables para que evadir el efecto de las unidades de cada una de ellas.

pca_met <- prcomp(df_final[,2:ncol(df_final)], center=TRUE, scale=TRUE)
summary(pca_met)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5
## Standard deviation     1.6915 1.2335 0.70044 0.29336 0.20184
## Proportion of Variance 0.5722 0.3043 0.09812 0.01721 0.00815
## Cumulative Proportion  0.5722 0.8765 0.97464 0.99185 1.00000

Como resultado tenemos 5 Componentes pero nos interesa quedarnos con las dos primeras ya que acumulan un buen % de la varianza (87,65%).

fviz_pca_ind(pca_met,col.ind="cos2") +
  theme_ft_rc() + 
  ylim(c(-4,4)) +
  xlim(c(-4,3))

fviz_pca_var(pca_met,col.var="steelblue") +
  theme_ft_rc()

## Biplot

fviz_pca_biplot(pca_met,label = "all", col.ind="cos2",col.var="white") +
  theme_ft_rc() +
  ylim(c(-4,4)) +
  xlim(c(-4,3))


En este gráfico final “biplot” podemos observar como se relacionan las canciones con las principales features. Dado que el porcentaje obtenido en ambas componentes es bastante alto, podemos ver que el PCA nos resume de una manera confiable las relaciones existentes.


La historia no concluye aca (esto es como una serie de Netflix que no termina mas). Es importante agregar los resultados del PCA a nuestro dataset… puede ser un buen input para otros modelos…

Continuara…



Autor: Marcelo G. Gonzalez
Linktree