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.

Carry out a numeric summary.

#Cargar librerías
library(psych)
library(tidyverse)
library(ggcorrplot)
#Leer archivo
spotify <- read.csv("SpotifyTop2018_40_V2-2.csv")
#Previsualización
head(spotify)
#Resumen estadístico
summary(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:

  • La mayoría de las canciones son bastante bailables, con un promedio de danceability de ~0.72.
  • Los niveles de energía también son altos (media ~0.66), predominando canciones intensas y animadas.
  • El loudness se concentra alrededor de -5.8 dB, típico de música producida para radio/streaming.

Correlation analysis

# 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.

Create scatterplots for all variable pairs.

# 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

  • Energy vs Loudness: Se observa un patrón positivo claro; canciones más enérgicas tienden a sonar más fuertes.
  • Danceability vs Valence: Relación ascendente moderada; lo más bailable suele percibirse como más positivo/feliz.
  • Energy vs Valence: Existe una tendencia positiva; canciones con mayor energía transmiten emociones más alegres.
  • Duration vs Danceability: Se aprecia una ligera relación negativa; canciones más largas no son necesariamente más bailables.
  • Tempo vs Danceability: No hay un patrón definido, aunque la dispersión sugiere que un mayor ritmo no implica automáticamente más bailabilidad.
  • Resto de pares: La mayoría presentan nubes de puntos dispersas, lo que indica que no hay relaciones lineales fuertes, aunque sí se pueden detectar outliers.

Carry out box plots and show atypical values.

# 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.

What are the most relevant associations between variables?

  1. Energy ↔︎ Loudness

Fuerte correlación positiva (~0.66).

Las canciones con mayor energía tienden también a sonar más fuertes.

  1. Danceability ↔︎ Valence

Correlación positiva moderada (~0.47).

Las canciones más bailables suelen percibirse como más felices o positivas.

  1. Energy ↔︎ Valence

Correlación positiva moderada (~0.46).

Las canciones más intensas transmiten emociones más alegres.

  1. Duration_ms ↔︎ Danceability

Correlación negativa moderada (~ -0.30).

Las canciones más largas tienden a ser menos bailables.

  1. Tempo ↔︎ Danceability / Liveness

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.