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