En este análisis trabajamos con el dataset
SpotifyTop2018_40_V2.csv, el cual contiene las 40 canciones
más populares de 2018, junto con sus características musicales.
#Cargar librerías
library(psych)
library(tidyverse)
library(ggcorrplot)
#Leer archivo
spotify <- read.csv("SpotifyTop2018_40_V2-2.csv")
#Previsualización
head(spotify)## X danceability energy loudness
## Length:40 Min. :0.2580 Min. :0.3910 Min. :-9.211
## Class :character 1st Qu.:0.6805 1st Qu.:0.5643 1st Qu.:-7.077
## Mode :character Median :0.7500 Median :0.6590 Median :-5.930
## Mean :0.7192 Mean :0.6619 Mean :-5.846
## 3rd Qu.:0.8175 3rd Qu.:0.7725 3rd Qu.:-4.624
## Max. :0.9220 Max. :0.9090 Max. :-3.093
## speechiness acousticness instrumentalness liveness
## Min. :0.02320 Min. :0.000282 Min. :0.000e+00 Min. :0.02150
## 1st Qu.:0.04955 1st Qu.:0.030800 1st Qu.:0.000e+00 1st Qu.:0.09527
## Median :0.10550 Median :0.121500 Median :3.220e-06 Median :0.11200
## Mean :0.12129 Mean :0.184621 Mean :3.695e-03 Mean :0.17713
## 3rd Qu.:0.14450 3rd Qu.:0.227500 3rd Qu.:4.325e-05 3rd Qu.:0.29475
## Max. :0.51600 Max. :0.847000 Max. :1.340e-01 Max. :0.55200
## valence tempo duration_ms time_signature
## Min. :0.0967 Min. : 77.17 Min. : 95467 Min. :3.00
## 1st Qu.:0.2875 1st Qu.: 95.04 1st Qu.:189856 1st Qu.:4.00
## Median :0.4375 Median :122.53 Median :212904 Median :4.00
## Mean :0.4679 Mean :122.11 Mean :205646 Mean :3.95
## 3rd Qu.:0.6332 3rd Qu.:140.59 3rd Qu.:226983 3rd Qu.:4.00
## Max. :0.9310 Max. :191.70 Max. :268867 Max. :4.00
✅ Observaciones
A partir de los resúmenes estadísticos se pueden destacar los siguientes puntos:
# Seleccionar solo columnas numéricas
spotify_num <- spotify %>% select(where(is.numeric))
# Calcular matriz de correlación
cor_matrix <- cor(spotify_num, use = "pairwise.complete.obs")
# Mostrar matriz redondeada
round(cor_matrix, 3)## danceability energy loudness speechiness acousticness
## danceability 1.000 -0.053 -0.043 0.207 0.016
## energy -0.053 1.000 0.666 -0.035 -0.269
## loudness -0.043 0.666 1.000 -0.282 -0.081
## speechiness 0.207 -0.035 -0.282 1.000 0.097
## acousticness 0.016 -0.269 -0.081 0.097 1.000
## instrumentalness -0.102 0.159 0.080 -0.132 -0.151
## liveness -0.031 -0.082 -0.050 -0.226 -0.156
## valence 0.471 0.466 0.402 0.060 0.175
## tempo -0.301 0.005 -0.034 0.018 -0.064
## duration_ms -0.305 -0.035 0.012 -0.145 -0.297
## time_signature 0.269 0.234 -0.033 0.225 -0.007
## instrumentalness liveness valence tempo duration_ms
## danceability -0.102 -0.031 0.471 -0.301 -0.305
## energy 0.159 -0.082 0.466 0.005 -0.035
## loudness 0.080 -0.050 0.402 -0.034 0.012
## speechiness -0.132 -0.226 0.060 0.018 -0.145
## acousticness -0.151 -0.156 0.175 -0.064 -0.297
## instrumentalness 1.000 -0.046 -0.131 0.255 -0.072
## liveness -0.046 1.000 -0.108 -0.281 -0.116
## valence -0.131 -0.108 1.000 -0.241 -0.273
## tempo 0.255 -0.281 -0.241 1.000 -0.175
## duration_ms -0.072 -0.116 -0.273 -0.175 1.000
## time_signature 0.040 -0.091 0.303 0.056 -0.272
## time_signature
## danceability 0.269
## energy 0.234
## loudness -0.033
## speechiness 0.225
## acousticness -0.007
## instrumentalness 0.040
## liveness -0.091
## valence 0.303
## tempo 0.056
## duration_ms -0.272
## time_signature 1.000
# Heatmap de correlaciones
ggcorrplot(cor_matrix,
hc.order = TRUE,
type = "lower",
lab = TRUE,
lab_size = 3,
outline.color = "white",
ggtheme = ggplot2::theme_minimal(),
colors = c("#4575b4", "white", "#d73027")) +
ggplot2::labs(title = "Spotify Top 2018 - Correlation Heatmap")✅ Observaciones - Existe una fuerte correlación positiva entre energy y loudness (~0.66). Canciones más enérgicas tienden a sonar más fuertes.
Danceability y valence se relacionan de manera positiva (~0.47). Lo más bailable suele percibirse como más positivo/feliz.
Energy y valence también se asocian positivamente (~0.46), lo que indica que canciones intensas tienden a generar emociones alegres.
# Solo columnas numéricas
spotify_num <- spotify %>% dplyr::select(where(is.numeric))
# Matriz de dispersión con suavizado
panel.smooth2 <- function(x, y, ...) {
points(x, y, pch = 16, cex = 0.7, col = rgb(0,0,0,0.4))
lines(stats::lowess(x, y, f = 2/3, iter = 3), lwd = 2)
}
pairs(spotify_num,
pch = 16,
cex = 0.6,
col = rgb(0,0,0,0.35),
lower.panel = panel.smooth2,
upper.panel = NULL,
main = "Scatterplots: todas las variables numéricas")✅ Observaciones
# Seleccionamos solo las columnas numéricas
spotify_num <- spotify %>% dplyr::select(where(is.numeric))
# Convertir a formato largo
spotify_long <- spotify_num %>%
pivot_longer(cols = everything(), names_to = "variable", values_to = "valor")
# Boxplots con facet_wrap
ggplot(spotify_long, aes(x = variable, y = valor, fill = variable)) +
geom_boxplot(outlier.color = "red", outlier.shape = 16, outlier.size = 2, alpha = 0.7) +
facet_wrap(~ variable, scales = "free", ncol = 4) +
theme_minimal() +
theme(legend.position = "none",
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
labs(title = "Boxplots de características musicales (Spotify Top 2018)",
subtitle = "Los puntos rojos indican valores atípicos (outliers)")✅ Observaciones
Los boxplots permiten observar que la mayoría de las variables del dataset de Spotify se concentran en rangos bien definidos, pero también aparecen valores atípicos (outliers) que destacan por su diferencia con respecto al resto de las canciones. En particular, variables como speechiness, instrumentalness y liveness presentan outliers claros, reflejando canciones con mucha voz hablada, instrumentales puras o grabaciones en vivo. También en duration_ms y tempo se identifican canciones notablemente más largas, cortas, rápidas o lentas que el promedio. Estos casos especiales son relevantes porque representan estilos poco comunes y pueden influir en el análisis de correlaciones o en futuros modelos de recomendación musical.
Fuerte correlación positiva (~0.66).
Las canciones con mayor energía tienden también a sonar más fuertes.
Correlación positiva moderada (~0.47).
Las canciones más bailables suelen percibirse como más felices o positivas.
Correlación positiva moderada (~0.46).
Las canciones más intensas transmiten emociones más alegres.
Correlación negativa moderada (~ -0.30).
Las canciones más largas tienden a ser menos bailables.
Asociaciones negativas (~ -0.30 y -0.28).
Un tempo más rápido no implica necesariamente que la música sea más bailable ni que tenga mayor sensación de estar en vivo.
Las asociaciones más relevantes se encuentran entre energy, loudness y valence, ya que en conjunto describen la intensidad, volumen y positividad emocional de la música. Estas variables resultan especialmente útiles para sistemas de recomendación, pues reflejan cómo los oyentes perciben el “sentir” de una canción.