1 Proyecto_ Popularidad de canciones en Spotify

Integrantes

  • Candelas Juárez Diego
  • Domínguez Sánchez Oscar
  • Lira González Rosa Linda.
  • Ochoa Campos Ana Sofía
  • Pérez Rojas Alberto

2 Análisis de popularidad de canciones en Spotify

En este documento se presenta un análisis exploratorio de un conjunto de datos de Spotify que contiene información detallada por pista: nombre de la canción,artistas, popularidad y distintas características musicales (audio features),así como un género asignado a cada canción.

El objetivo de esta primera etapa es:

  • Describir y depurar el dataset.
  • Explorar cómo se distribuye la popularidad.
  • Analizar artistas y géneros con mayor éxito.
  • Identificar patrones musicales asociados a canciones más populares.
  • Explorar una segmentación por clusters basada en características de audio.

2.1 Descripción general y limpieza de datos

2.1.1 Cargar datos originales

## Rows: 114,000
## Columns: 21
## $ ...1             <dbl> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,…
## $ track_id         <chr> "5SuOikwiRyPMVoIQDJUgSV", "4qPNDBW1i3p13qLCt0Ki3A", "…
## $ artists          <chr> "Gen Hoshino", "Ben Woodward", "Ingrid Michaelson;ZAY…
## $ album_name       <chr> "Comedy", "Ghost (Acoustic)", "To Begin Again", "Craz…
## $ track_name       <chr> "Comedy", "Ghost - Acoustic", "To Begin Again", "Can'…
## $ popularity       <dbl> 73, 55, 57, 71, 82, 58, 74, 80, 74, 56, 74, 69, 52, 6…
## $ duration_ms      <dbl> 230666, 149610, 210826, 201933, 198853, 214240, 22940…
## $ explicit         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ danceability     <dbl> 0.676, 0.420, 0.438, 0.266, 0.618, 0.688, 0.407, 0.70…
## $ energy           <dbl> 0.4610, 0.1660, 0.3590, 0.0596, 0.4430, 0.4810, 0.147…
## $ key              <dbl> 1, 1, 0, 0, 2, 6, 2, 11, 0, 1, 8, 4, 7, 3, 2, 4, 2, 1…
## $ loudness         <dbl> -6.746, -17.235, -9.734, -18.515, -9.681, -8.807, -8.…
## $ mode             <dbl> 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,…
## $ speechiness      <dbl> 0.1430, 0.0763, 0.0557, 0.0363, 0.0526, 0.1050, 0.035…
## $ acousticness     <dbl> 0.0322, 0.9240, 0.2100, 0.9050, 0.4690, 0.2890, 0.857…
## $ instrumentalness <dbl> 1.01e-06, 5.56e-06, 0.00e+00, 7.07e-05, 0.00e+00, 0.0…
## $ liveness         <dbl> 0.3580, 0.1010, 0.1170, 0.1320, 0.0829, 0.1890, 0.091…
## $ valence          <dbl> 0.7150, 0.2670, 0.1200, 0.1430, 0.1670, 0.6660, 0.076…
## $ tempo            <dbl> 87.917, 77.489, 76.332, 181.740, 119.949, 98.017, 141…
## $ time_signature   <dbl> 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4,…
## $ track_genre      <chr> "acoustic", "acoustic", "acoustic", "acoustic", "acou…

2.1.2 Limpieza básica de nombres

spotify <- spotify_raw %>%
clean_names()

2.1.3 Eliminar columnas índice típicas si existen

spotify <- spotify %>%
select(-matches("^unnamed_0$|^x1$"), everything())

2.1.4 Renombrar columnas clave

spotify <- spotify %>%
rename(
artist_name = artists,
genre       = track_genre
)

2.1.5 Eliminar filas sin información clave

campos_clave <- c("track_id", "artist_name", "track_name", "popularity")
campos_clave_presentes <- intersect(names(spotify), campos_clave)

spotify <- spotify %>%
drop_na(all_of(campos_clave_presentes))

2.1.6 Eliminar duplicados por track_id + track_name

claves_dup <- intersect(names(spotify), c("track_id", "track_name"))

if (length(claves_dup) == 2) {
spotify <- spotify %>%
distinct(track_id, track_name, .keep_all = TRUE)
} else {
spotify <- spotify %>%
distinct(track_id, .keep_all = TRUE)
}

2.1.7 Crear duración en minutos si existe duration_ms

if ("duration_ms" %in% names(spotify)) {
spotify <- spotify %>%
mutate(duration_min = duration_ms / 60000)
}

2.1.8 Convertir popularidad a numérico por seguridad

## Rows: 89,740
## Columns: 22
## $ track_id         <chr> "5SuOikwiRyPMVoIQDJUgSV", "4qPNDBW1i3p13qLCt0Ki3A", "…
## $ artist_name      <chr> "Gen Hoshino", "Ben Woodward", "Ingrid Michaelson;ZAY…
## $ album_name       <chr> "Comedy", "Ghost (Acoustic)", "To Begin Again", "Craz…
## $ track_name       <chr> "Comedy", "Ghost - Acoustic", "To Begin Again", "Can'…
## $ popularity       <dbl> 73, 55, 57, 71, 82, 58, 74, 80, 74, 56, 74, 69, 52, 6…
## $ duration_ms      <dbl> 230666, 149610, 210826, 201933, 198853, 214240, 22940…
## $ explicit         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ danceability     <dbl> 0.676, 0.420, 0.438, 0.266, 0.618, 0.688, 0.407, 0.70…
## $ energy           <dbl> 0.4610, 0.1660, 0.3590, 0.0596, 0.4430, 0.4810, 0.147…
## $ key              <dbl> 1, 1, 0, 0, 2, 6, 2, 11, 0, 1, 8, 4, 7, 3, 2, 4, 2, 1…
## $ loudness         <dbl> -6.746, -17.235, -9.734, -18.515, -9.681, -8.807, -8.…
## $ mode             <dbl> 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,…
## $ speechiness      <dbl> 0.1430, 0.0763, 0.0557, 0.0363, 0.0526, 0.1050, 0.035…
## $ acousticness     <dbl> 0.0322, 0.9240, 0.2100, 0.9050, 0.4690, 0.2890, 0.857…
## $ instrumentalness <dbl> 1.01e-06, 5.56e-06, 0.00e+00, 7.07e-05, 0.00e+00, 0.0…
## $ liveness         <dbl> 0.3580, 0.1010, 0.1170, 0.1320, 0.0829, 0.1890, 0.091…
## $ valence          <dbl> 0.7150, 0.2670, 0.1200, 0.1430, 0.1670, 0.6660, 0.076…
## $ tempo            <dbl> 87.917, 77.489, 76.332, 181.740, 119.949, 98.017, 141…
## $ time_signature   <dbl> 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4,…
## $ genre            <chr> "acoustic", "acoustic", "acoustic", "acoustic", "acou…
## $ x1               <dbl> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,…
## $ duration_min     <dbl> 3.844433, 2.493500, 3.513767, 3.365550, 3.314217, 3.5…
## [1] 89740
## [1] 22

El archivo original contiene alrededor de 114 mil registros.Tras la depuración:

  • Se homogenizan los nombres de columnas en minúsculas con guiones bajos.
  • Se elimina la columna índice sin valor analítico (unnamed / x1).
  • Se descartan filas sin track_id, artist_name, track_name o popularity.
  • Se eliminan duplicados definidos por la combinación track_id + track_name.
  • Se crea la variable duration_min a partir de duration_ms.

El dataset resultante contiene decenas de miles de canciones y alrededor de 20 variables útiles para el análisis.

Para tener una primera referencia de la popularidad:

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0    19.0    33.0    33.2    49.0   100.0

Limitaciones del dataset

En esta versión del dataset no se cuenta con:

  • Fecha de lanzamiento de la canción (release_date).
  • Información geográfica (país o región).

Por lo tanto:

  • No es posible construir una serie temporal por año (por ejemplo, desde 2010).
  • Tampoco se pueden comparar preferencias entre países.

El análisis se centrará en patrones musicales (audio features), artistas y géneros, dejando el estudio temporal/geográfico como trabajo futuro.

2.2 Distribución de la popularidad

Se observa una barra muy alta en el valor de popularidad 0. Esto no es un error, sino evidencia de que muchas canciones en el catálogo prácticamente no reciben reproducciones o no han logrado tracción.

Para ver mejor la forma del resto de la distribución, se excluyen los casos con popularidad igual a 0:

En esta versión se aprecia que:

  • La mayoría de las canciones activas se concentran en popularidades aproximadamente entre 10 y 60.
  • La mediana ronda los 30–35 puntos.
  • Solo una fracción pequeña alcanza los niveles más altos (80–100).

Esto sugiere un catálogo con muchos temas de éxito medio y un grupo reducido de verdaderos “hits”, acompañado de un bloque importante de música casi invisible (popularidad 0).

2.3 Distribución de la duración

La mayor parte de las canciones:

  • Se encuentra entre 3 y 4.5 minutos.
  • Hay menos temas muy cortos (por debajo de 2 minutos).
  • También son menos frecuentes las canciones largas (más de 6 minutos).

Esto es consistente con el formato típico de “sencillo” comercial, pensado para escucha rápida y repetible.

2.4 Artistas con mayor popularidad promedio

En esta sección se estudia la popularidad a nivel de artista. Cuando hay colaboraciones, éstas aparecen en la columna artists separadas por punto y coma (Artista A; Artista B), por lo que primero se separan:

## # A tibble: 15 × 3
##    artist_single     n_canciones popularidad_promedio
##    <chr>                   <int>                <dbl>
##  1 Frank Ocean                21                 74.1
##  2 The Neighbourhood          27                 73.5
##  3 Stray Kids                 23                 72.6
##  4 Travis Scott               23                 72.3
##  5 The 1975                   23                 69.6
##  6 BLACKPINK                  43                 69.4
##  7 Eminem                     31                 68.8
##  8 AP Dhillon                 29                 68.6
##  9 Lil Tjay                   24                 68.6
## 10 Halsey                     37                 68.2
## 11 AC/DC                      28                 68.1
## 12 BTS                       165                 68.1
## 13 Farruko                    20                 68.0
## 14 Metallica                  29                 66.6
## 15 Lil Peep                   53                 66.3

Insight: Los artistas mejor posicionados combinan:una popularidad promedio alta, y un catálogo con un número considerable de canciones.

Es decir, no dependen únicamente de uno o dos éxitos aislados, sino que mantienen un nivel de desempeño consistente en varias pistas.

2.5 Factores musicales asociados al éxito

En esta sección se exploran las relaciones entre popularity y las principales características de audio provistas por Spotify: danceability, energy,loudness, acousticness, instrumentalness, valence, tempo, speechiness, liveness y duration_min.

2.5.1 Correlaciones de Pearson

##       popularity     danceability           energy         loudness 
##            1.000            0.064            0.014            0.072 
##     acousticness instrumentalness          valence            tempo 
##           -0.039           -0.127           -0.012            0.007 
##      speechiness         liveness     duration_min 
##           -0.047           -0.014           -0.023

También se puede visualizar de forma conjunta:

De forma general se observa que:

  • loudness y danceability tienden a correlacionar de forma positiva con la popularidad.
  • instrumentalness y, en menor medida, acousticness suelen asociarse de manera negativa con el éxito.
  • El resto de variables muestran relaciones suaves.

Las magnitudes no son muy altas, lo que indica que el éxito no depende sólo de la forma de la señal de audio.

2.5.2 Comparación por deciles de popularidad

## # A tibble: 2 × 7
##   decil_pop danceability energy loudness acousticness instrumentalness
##       <int>        <dbl>  <dbl>    <dbl>        <dbl>            <dbl>
## 1         1        0.553  0.579    -8.93        0.391           0.128 
## 2        10        0.596  0.639    -7.69        0.275           0.0732
## # ℹ 1 more variable: duration_min <dbl>

Al comparar el decil más bajo vs. el más alto de popularidad se suele observar que las canciones más exitosas:

  • Son algo más bailables y con mayor energía,
  • Presentan mayor loudness (más intensas en volumen),
  • Tienden a ser menos acústicas y menos instrumentales, y, en promedio, tienen una duración ligeramente menor.

2.6 Diferencias por meta-género

La columna genre contiene una gran cantidad de subgéneros específicos.Para simplificar el análisis se agrupan en cuatro meta-géneros:

  • Pop: distintos subtipos de pop (k-pop, j-pop, indie-pop, synth-pop, etc.).
  • Rock: variantes de rock, alt-rock, hard-rock, punk-rock, etc.
  • Hip-hop: subgénero hip-hop.
  • Other: el resto de géneros (ambient, anime, tango, study, etc.).
## # A tibble: 4 × 2
##   meta_genre n_canciones
##   <chr>            <int>
## 1 Hip-hop            842
## 2 Other            76529
## 3 Pop               7077
## 4 Rock              5292

2.6.1 Popularidad Promedio por meta-género

## # A tibble: 4 × 3
##   meta_genre n_canciones popularidad_prom
##   <chr>            <int>            <dbl>
## 1 Hip-hop            842             42.4
## 2 Other            76529             32.1
## 3 Pop               7077             42.2
## 4 Rock              5292             35.8

En general:

  • Pop y Hip-hop suelen concentrar las mayores popularidades promedio.
  • Rock y, especialmente, Other corresponden más a escenas de nicho.

###Contenido explícito por meta-género

  • El Hip-hop concentra la mayor proporción de canciones explícitas.
  • El Pop alcanza altos niveles de popularidad con contenido explícito muy bajo.
  • El grupo Other tiene un porcentaje intermedio de pistas explícitas.

2.6.2 Segmentación mediante Clustering (K-Means)

Para identificar “familias sonoras” más allá de las etiquetas de género, se aplica K-means con K = 4 sobre un subconjunto de audio features.

Además del análisis tradicional por género, resulta valioso identificar patrones sonoros directamente desde los datos, sin depender de etiquetas taxonómicas como “pop”, “rock” o “hip-hop”, que a menudo resultan inconsistentes, demasiado granulares o ambiguas entre plataformas. En Spotify, dos canciones etiquetadas como “pop” pueden tener perfiles energéticos completamente distintos, mientras que canciones de géneros diferentes pueden compartir un mismo “tipo” de sonido bailable, acústico, enérgico o ambiental.

Por esta razón, se implementa una segmentación no supervisada mediante K-means, cuyo objetivo es agrupar canciones exclusivamente con base en sus características acústicas y estructurales, permitiendo descubrir “familias sonoras” que representan estilos de producción reales utilizados en las recomendaciones musicales, los algoritmos de playlists y los sistemas de descubrimiento dentro de Spotify.

2.6.3 ¿Por qué K-means?

K-means es uno de los métodos más utilizados para:

  • identificar grupos en datos de alta dimensión,
  • capturar patrones latentes no explícitos en las etiquetas,
  • segmentar objetos similares por proximidad matemática.

En este caso permite agrupar canciones según audio features como energía, bailabilidad o intensidad acústica, ofreciendo una visión alternativa más centrada en el perfil sonoro real que en la definición de género.

2.6.4 ¿Por qué usar estas variables?

Se eligieron características que representan:

  • Ritmo y movimiento: danceability, tempo
  • Intensidad: energy, loudness
  • Naturaleza del sonido: acousticness, instrumentalness
  • Contenido estructural: speechiness, liveness
  • Duración y forma de la pista: duration_min
  • Estado emocional: valence

Estas variables permiten capturar dimensiones fundamentales del sonido: energía, organicidad, nivel de producción, emoción y estructura musical.

2.6.5 ¿Por qué K = 4?

Aunque existen múltiples técnicas para elegir el número óptimo de clusters (elbow method, silhouette score), se selecciona K = 4 porque:

  1. genera grupos suficientemente diferenciados sin sobresegmentar,
  2. permite interpretarlos fácilmente en términos musicales,
  3. produce tamaños de cluster equilibrados y significativos,
  4. coincide con patrones acústicos reconocidos en estudios de audio (p. ej., “acústico suave”, “pop/feel-good”, “alta energía”, “sonido en vivo”).

La segmentación no pretende definir géneros nuevos, sino capturar estilos sonoros funcionales, similares a los que utiliza Spotify para recomendaciones automáticas.

##   danceability    energy   loudness acousticness instrumentalness   valence
## 1    0.6835163 0.6808842  -6.947467   0.27416992       0.04818248 0.6673618
## 2    0.4863282 0.7960817  -6.201090   0.08013378       0.24735446 0.3214720
## 3    0.4429974 0.2624816 -15.257297   0.78700198       0.35481031 0.2804993
## 4    0.5261470 0.7424079  -7.826490   0.36892371       0.07259345 0.4914465
##      tempo speechiness  liveness duration_min cluster
## 1 119.0471  0.08939412 0.1649978     3.495594       0
## 2 135.8091  0.07764190 0.1919843     4.392866       1
## 3 108.6499  0.05105336 0.1599314     3.594917       2
## 4 120.0430  0.21172729 0.7431011     3.901993       3
## # A tibble: 4 × 4
##   cluster_k4 n_canciones popularidad_prom pct_total
##        <int>       <int>            <dbl>     <dbl>
## 1          1       37164             34.4     41.4 
## 2          2       27156             33.4     30.3 
## 3          3       18458             30.4     20.6 
## 4          4        6962             33.4      7.76
## # A tibble: 16 × 3
##    cluster_k4 meta_genre porcentaje
##         <int> <chr>           <dbl>
##  1          1 Hip-hop           100
##  2          1 Other             100
##  3          1 Pop               100
##  4          1 Rock              100
##  5          2 Hip-hop           100
##  6          2 Other             100
##  7          2 Pop               100
##  8          2 Rock              100
##  9          3 Hip-hop           100
## 10          3 Other             100
## 11          3 Pop               100
## 12          3 Rock              100
## 13          4 Hip-hop           100
## 14          4 Other             100
## 15          4 Pop               100
## 16          4 Rock              100

Clusters en el plano danceability–energy

Clusters en el plano loudness–acousticness

Centroides en el plano danceability–energy

2.6.6 ¿Qué aporta al análisis?

Este enfoque permite:

  • entender qué tipo de sonido domina entre las canciones del dataset,
  • observar relaciones entre estilos sonoros y popularidad,
  • comparar si estos clusters son consistentes con los meta-géneros del análisis previo,
  • identificar grupos que representan nichos acústicos específicos (ambient, acústico, en vivo) que no se aprecian fácilmente con el análisis por género.

En síntesis, el clustering complementa al análisis de géneros mostrando que, en plataformas modernas, el “tipo de sonido” o sound profile es tan importante como la etiqueta de género para explicar patrones de reproducción y preferencias del usuario.

2.7 Problemas encontrados y lecciones

Durante el análisis se identificaron varios retos de datos:

  • Ausencia de fecha de lanzamiento y país.
  • Concentración fuerte en popularidad 0 que sesga la distribución.
  • Algunas duraciones extremas que distorsionan histogramas si no se recorta el eje.
  • Necesidad de agrupar subgéneros para hacer manejable el análisis.
  • Estos puntos orientan mejoras futuras en la recolección y preparación de datos.

2.8 Resumen de insights clave

Algunos hallazgos centrales del EDA son:

  • Desigualdad en el catálogo: una fracción importante de canciones tiene popularidad 0, mientras que el resto se concentra en valores medios. Pocas Pistas concentran el éxito masivo.
  • Perfil típico de los temas exitosos: las canciones más populares tienden a ser algo más bailables, con mayor energía e intensidad sonora, menos acústicas y menos instrumentales, y ligeramente más cortas.
  • Rol del género: Pop y Hip-hop se asocian con mayor popularidad promedio; Rock y el grupo Other agrupan escenas más de nicho.
  • Contenido explícito concentrado: el Hip-hop presenta la mayor proporción de etiquetas explícitas, mientras que el Pop logra altos niveles de éxito con muy poco contenido de este tipo. -Familias sonoras más allá del género: el clustering revela cuatro grupos de canciones con perfiles acústicos bien diferenciados, lo que sugiere que el “tipo de sonido” (energía, mood, intensidad) es tan relevante como la etiqueta de género en la forma en que se consume música en plataformas de streaming.

3 Modelo predictivo: Estimación de la popularidad a partir de características acústicas

Después de realizar el análisis exploratorio de datos (EDA), surge una pregunta central para este proyecto: ¿es posible predecir el nivel de popularidad de una canción únicamente a partir de sus características musicales?

En el EDA identificamos que la popularidad está influenciada por múltiples dimensiones: el artista, el género musical, la visibilidad editorial dentro de Spotify y tendencias socioculturales. Sin embargo, también observamos patrones acústicos consistentes entre las canciones más exitosas: mayor energía, mayor intensidad sonora (loudness), menor carácter acústico y niveles moderados de bailabilidad.

Aunque estas relaciones son relativamente débiles de forma individual —como lo muestran las correlaciones—, podrían interactuar entre sí de manera no lineal. Por ello, esta sección del proyecto busca cuantificar qué tanto pueden las características internas del audio explicar o predecir la popularidad de una canción.

El propósito del modelo predictivo no es construir un sistema de recomendación ni predecir hits musicales en un contexto real, ya que factores externos como el marketing del artista, su base de fans o la inclusión en playlists oficiales tienen un impacto enorme en el éxito. Más bien, este ejercicio pretende:

  1. Evaluar cuánto aporta la señal acústica a la popularidad, aislando la música de factores externos.
  2. Comparar modelos lineales y no lineales para entender qué tipo de relación existe entre las características musicales y el éxito medido por Spotify.
  3. Identificar qué variables acústicas tienen mayor importancia predictiva dentro de un modelo multivariable.
  4. Proveer un marco cuantitativo que complemente los hallazgos del EDA.

Para ello se implementarán dos modelos:

  • Regresión lineal múltiple, que sirve como línea base y permite medir relaciones lineales entre variables.

    La regresión lineal múltiple es:

    • simple,
    • interpretable,
    • rápida,
    • fácil de entrenar,
    • un excelente modelo base (baseline).

    Sirve para responder: “¿Hay una relación lineal entre las características acústicas y la popularidad?”

  • Random Forest, un modelo no lineal y de ensamble que puede capturar interacciones complejas entre características acústicas.

    Random Forest es un modelo de árboles de decisión en ensamble. Es ideal cuando:

    • Las relaciones entre variables no son lineales,
    • existen interacciones complejas,
    • no queremos asumir una forma funcional (linealidad, normalidad, etc.).

    Basado en el EDA:

    • la relación entre danceability y popularidad NO es lineal, tiene curvas, puntos óptimos;
    • acousticness tiene una relación inversa pero no lineal;
    • energy, loudness e instrumentalness tienen patrones mixtos;

    Por eso un modelo no lineal tiene mayor probabilidad de capturar estas relaciones reales.

El rendimiento de ambos modelos se evaluará mediante métricas estándar como RMSE, MAE y R², y se analizarán las variables que más contribuyen a las predicciones.

3.1 Preparación del dataset para el modelado

Antes de entrenar cualquier modelo predictivo es necesario preparar el conjunto de datos para asegurar que las características utilizadas sean consistentes, comparables y apropiadas para los algoritmos seleccionados.

En particular, para este proyecto:

  1. Seleccionamos únicamente variables acústicas y la variable objetivo (popularity), ya que el análisis busca medir qué tanto contribuyen las características internas del audio al éxito de una canción, excluyendo factores externos como artista, género o marketing.

  2. Eliminamos cualquier observación con valores faltantes en las variables relevantes, de modo que los modelos no tengan que imputar valores ni enfrentar problemas de inconsistencia.

  3. Convertimos las columnas a formatos numéricos cuando es necesario, ya que la mayoría de los modelos de regresión y ensambles requieren entradas continuas o numéricas.

  4. Realizamos un train-test split (70%-30%), separando datos de entrenamiento y evaluación para medir el desempeño real del modelo y evitar sobreajuste.

Esta preparación garantiza que los modelos se entrenen bajo condiciones controladas y que sus métricas reflejen su capacidad real para generalizar.

set.seed(123)  # reproducibilidad

# Seleccionar las variables relevantes
vars_modelo <- c(
  "popularity", "danceability", "energy", "loudness",
  "acousticness", "instrumentalness", "valence",
  "speechiness", "liveness", "tempo", "duration_min"
)

# Filtrar solo las columnas que existen en el dataset
vars_existentes <- intersect(vars_modelo, names(spotify))

model_data <- spotify %>%
  select(all_of(vars_existentes)) %>%
  drop_na()              # eliminar posibles NA restantes

# Partición: 70% para entrenamiento, 30% para prueba
n <- nrow(model_data)
train_idx <- sample(seq_len(n), size = 0.7 * n)

train <- model_data[train_idx, ]
test  <- model_data[-train_idx, ]

# Confirmar dimensiones
dim(train)
## [1] 62817    11
dim(test)
## [1] 26923    11

3.2 Modelo base: Regresión lineal múltiple

La regresión lineal múltiple es uno de los modelos más utilizados como punto de partida en tareas de predicción. Su propósito es evaluar si existe una relación lineal entre un conjunto de variables explicativas (en este caso, las características acústicas) y una variable objetivo (la popularidad).

Este modelo tiene varias ventajas relevantes para nuestro análisis:

  • Es interpretable, permitiendo observar qué variables aumentan o disminuyen la popularidad, así como la magnitud del efecto lineal.
  • Sirve como línea base (baseline) para comparar si modelos más avanzados justifican su complejidad adicional.
  • Permite detectar problemas de multicolinealidad o relaciones débiles entre variables.

Sin embargo, la regresión lineal asume que la relación entre las variables es perfectamente lineal, lo cual rara vez ocurre en datos musicales. El EDA mostró claramente relaciones no lineales en variables como danceability, energy y acousticness. Por ello, no esperamos que este modelo obtenga un desempeño alto, pero sí nos permitirá cuantificar hasta qué punto las características acústicas aportan señal predictiva en un enfoque lineal.

# Entrenar el modelo lineal múltiple
mod_lm <- lm(popularity ~ ., data = train)

summary(mod_lm)
## 
## Call:
## lm(formula = popularity ~ ., data = train)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -42.137 -13.753   0.167  14.795  61.111 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       36.857291   0.819291  44.987  < 2e-16 ***
## danceability      10.309197   0.566722  18.191  < 2e-16 ***
## energy            -2.534654   0.649783  -3.901 9.60e-05 ***
## loudness           0.099915   0.028078   3.558 0.000373 ***
## acousticness      -1.748680   0.371703  -4.705 2.55e-06 ***
## instrumentalness  -9.126088   0.302622 -30.157  < 2e-16 ***
## valence           -8.280710   0.389604 -21.254  < 2e-16 ***
## speechiness      -12.541892   0.761212 -16.476  < 2e-16 ***
## liveness           0.922705   0.447513   2.062 0.039226 *  
## tempo              0.007166   0.002814   2.547 0.010883 *  
## duration_min      -0.247015   0.047595  -5.190 2.11e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 20.27 on 62806 degrees of freedom
## Multiple R-squared:  0.03185,    Adjusted R-squared:  0.03169 
## F-statistic: 206.6 on 10 and 62806 DF,  p-value: < 2.2e-16
# Predicción sobre datos de prueba
pred_lm <- predict(mod_lm, newdata = test)

# Cálculo de métricas
rmse_lm <- sqrt(mean((test$popularity - pred_lm)^2))
mae_lm  <- mean(abs(test$popularity - pred_lm))
r2_lm   <- cor(test$popularity, pred_lm)^2

rmse_lm
## [1] 20.24464
mae_lm
## [1] 16.63952
r2_lm
## [1] 0.02856227

3.2.1 Interpretación del modelo lineal

El modelo de regresión lineal múltiple muestra resultados estadísticamente significativos, pero con una capacidad predictiva muy limitada. Algunas variables presentan relaciones esperadas:

  • danceability es el predictor lineal positivo más fuerte, lo que indica que canciones más bailables tienden a ser más populares.
  • instrumentalness, speechiness y valence muestran coeficientes negativos relativamente grandes, sugiriendo que las canciones instrumentales, con mucho contenido hablado o con tono muy positivo tienden a asociarse con una menor popularidad.
  • acousticness también presenta una relación negativa, lo que coincide con la prevalencia de producciones modernas más electrónicas o procesadas.
  • Variables como loudness, tempo y liveness tienen efectos positivos pequeños, reflejando tendencias sutiles observadas en el EDA.

Aunque varios coeficientes son significativos, el desempeño global del modelo es bajo. El R² obtenido (≈ 0.028) indica que solo alrededor del 3% de la variabilidad en la popularidad puede explicarse mediante relaciones lineales con las características acústicas. Las métricas de error (MAE ≈ 16.6 y RMSE ≈ 20.2) confirman que el modelo se equivoca con frecuencia por un amplio margen. Esto sugiere que la popularidad está influida principalmente por factores externos al audio, como marketing, visibilidad editorial, fandoms o tendencias culturales.

En conjunto, el modelo lineal funciona adecuadamente como baseline, pero sus limitaciones justifican el uso de un modelo no lineal más robusto, capaz de capturar interacciones complejas entre variables acústicas.

3.3 Modelo no lineal: Random Forest

Dado que el modelo lineal mostró un desempeño limitado, resulta necesario emplear un método capaz de capturar relaciones no lineales y potenciales interacciones entre características acústicas. En este sentido, el algoritmo Random Forest es una alternativa particularmente adecuada, ya que combina múltiples árboles de decisión entrenados sobre subconjuntos aleatorios de datos y variables para generar predicciones más robustas y estables.

Random Forest es un modelo de ensamble que tiene varias ventajas relevantes:

  1. Captura relaciones no lineales, lo cual es esencial en datos musicales, ya que variables como energy, danceability o acousticness muestran patrones no lineales en el EDA.
  2. Maneja interacciones complejas sin necesidad de especificarlas explícitamente, a diferencia de la regresión lineal.
  3. Es robusto al ruido y al sobreajuste debido al proceso de bootstrap y la aleatorización en la selección de variables.
  4. Ofrece una estimación confiable de importancia de variables, permitiendo identificar cuáles características acústicas aportan más señal predictiva.

A pesar de estas ventajas, Random Forest también presenta limitaciones: su interpretación es menos transparente que la del modelo lineal y, aunque mejora la capacidad predictiva, no resuelve el hecho de que la popularidad también depende de factores externos al audio (artista, marketing, playlists oficiales, tendencias sociales, etc.). Sin embargo, es un excelente modelo para evaluar qué tanto puede predecirse un “hit” únicamente desde la forma del sonido.

library(randomForest)

set.seed(123)

mod_rf <- randomForest(
  popularity ~ .,
  data = train,
  ntree = 400,     # más árboles = modelo más estable
  mtry = 3,        # nº de variables probadas en cada división
  importance = TRUE
)

mod_rf
## 
## Call:
##  randomForest(formula = popularity ~ ., data = train, ntree = 400,      mtry = 3, importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 400
## No. of variables tried at each split: 3
## 
##           Mean of squared residuals: 321.3741
##                     % Var explained: 24.26
# Predicción sobre datos de prueba
pred_rf <- predict(mod_rf, newdata = test)

# Métricas de desempeño
rmse_rf <- sqrt(mean((test$popularity - pred_rf)^2))
mae_rf  <- mean(abs(test$popularity - pred_rf))
r2_rf   <- cor(test$popularity, pred_rf)^2

rmse_rf
## [1] 17.80519
mae_rf
## [1] 13.72055
r2_rf
## [1] 0.2494069
varImpPlot(mod_rf, main = "Importancia de variables (Random Forest)")

El modelo Random Forest muestra una mejora muy significativa respecto al modelo de regresión lineal. Mientras que el modelo lineal sólo lograba explicar alrededor del 3% de la variabilidad en la popularidad, el Random Forest alcanza un R² de 0.249 (24.9%), lo cual representa una mejora de más de ocho veces en capacidad explicativa. Esta cifra es notablemente alta si se considera que la popularidad musical depende en gran medida de factores externos al audio —como la visibilidad del artista, campañas de marketing, presencia en playlists editoriales o viralidad en redes sociales— elementos que no están presentes en el dataset.

Las métricas de error también mejoran de manera considerable: el RMSE disminuye de 20.24 a 17.80 y el MAE baja de 16.64 a 13.72, lo cual indica que el modelo reduce de forma apreciable la diferencia promedio entre la predicción y la popularidad real.

Este desempeño confirma que las características acústicas contienen una fracción relevante de la señal que determina el éxito de una canción. En particular, el modelo asigna alta importancia a variables como loudness, energy, danceability, speechiness e instrumentalness, coherentes con los patrones observados en el EDA. Canciones más intensas, más bailables, menos acústicas y con mayor presencia vocal tienden a obtener niveles más altos de popularidad.

Aun así, con un 75% de la variabilidad sin explicar, los resultados dejan claro que el éxito musical depende de otros factores sociales, culturales y comerciales que trascienden las propiedades del audio. En síntesis, el Random Forest demuestra que el sonido sí aporta información útil para predecir la popularidad, pero está lejos de ser el único elemento determinante.

3.4 Modelo adicional: XGBoost

Como extensión del análisis, se incorpora un modelo basado en Gradient Boosting utilizando la librería XGBoost. Este tipo de modelo es uno de los enfoques más utilizados y competitivos en problemas de predicción sobre datos tabulares, debido a su capacidad para:

  • Capturar relaciones altamente no lineales.
  • Modelar interacciones complejas entre variables.
  • Incluir regularización para evitar sobreajuste.
  • Lograr un excelente compromiso entre sesgo y varianza.

A diferencia de Random Forest (que promedia árboles entrenados en paralelo), XGBoost construye árboles de forma secuencial, donde cada árbol nuevo corrige los errores de los anteriores. Esto le permite ajustar patrones más finos en los datos y, en muchos casos, obtener un desempeño ligeramente superior.

En este proyecto, el objetivo de usar XGBoost no es reemplazar completamente al Random Forest, sino evaluar si un modelo de boosting puede explicar una fracción mayor de la variabilidad de la popularidad a partir de las mismas características acústicas.

library(xgboost)

# 1) Preparar matrices numéricas para XGBoost
x_train <- as.matrix(select(train, -popularity))
y_train <- train$popularity

x_test  <- as.matrix(select(test, -popularity))
y_test  <- test$popularity

dtrain <- xgb.DMatrix(data = x_train, label = y_train)
dtest  <- xgb.DMatrix(data = x_test,  label = y_test)

# 2) Definir hiperparámetros básicos
params <- list(
  objective = "reg:squarederror",  # regresión
  eta = 0.09,                       # learning rate
  max_depth = 15,                   # profundidad de los árboles
  subsample = 0.8,                 # muestreo de filas
  colsample_bytree = 0.8,          # muestreo de columnas
  eval_metric = "rmse"
)

set.seed(123)

# 3) Entrenamiento del modelo XGBoost
mod_xgb <- xgb.train(
  params = params,
  data = dtrain,
  nrounds = 400,                   # número de iteraciones/árboles
  watchlist = list(
    train = dtrain,
    test = dtest
  ),
  verbose = 0                      # 0 = silencioso, 1 = muestra progreso
)

mod_xgb
## ##### xgb.Booster
## raw: 59.4 Mb 
## call:
##   xgb.train(params = params, data = dtrain, nrounds = 400, watchlist = list(train = dtrain, 
##     test = dtest), verbose = 0)
## params (as set within xgb.train):
##   objective = "reg:squarederror", eta = "0.09", max_depth = "15", subsample = "0.8", colsample_bytree = "0.8", eval_metric = "rmse", validate_parameters = "TRUE"
## xgb.attributes:
##   niter
## callbacks:
##   cb.evaluation.log()
## # of features: 10 
## niter: 400
## nfeatures : 10 
## evaluation_log:
##   iter train_rmse test_rmse
##  <num>      <num>     <num>
##      1  35.968349  36.09438
##      2  33.571101  33.84272
##    ---        ---       ---
##    399   3.633014  18.38746
##    400   3.631894  18.38710
# Predicciones sobre el conjunto de prueba
pred_xgb <- predict(mod_xgb, newdata = dtest)

# Métricas
rmse_xgb <- sqrt(mean((y_test - pred_xgb)^2))
mae_xgb  <- mean(abs(y_test - pred_xgb))
r2_xgb   <- cor(y_test, pred_xgb)^2

rmse_xgb
## [1] 18.3871
mae_xgb
## [1] 13.69158
r2_xgb
## [1] 0.2191468
importance_xgb <- xgb.importance(
  model = mod_xgb,
  feature_names = colnames(x_train)
)

print(importance_xgb)
##              Feature       Gain      Cover  Frequency
##               <char>      <num>      <num>      <num>
##  1:     danceability 0.11865921 0.10731803 0.20952734
##  2:         loudness 0.11005671 0.12730340 0.10934991
##  3:     duration_min 0.10730479 0.11892057 0.07738975
##  4:           energy 0.10690012 0.07803141 0.13674575
##  5:            tempo 0.10035262 0.13653385 0.08222695
##  6:          valence 0.09937331 0.08854160 0.08303900
##  7:     acousticness 0.09759094 0.09369232 0.09012385
##  8:      speechiness 0.09441945 0.09241951 0.07583361
##  9:         liveness 0.08812112 0.08931005 0.07286926
## 10: instrumentalness 0.07722174 0.06792927 0.06289458
xgb.plot.importance(importance_xgb, top_n = 10, main = "Importancia de variables (XGBoost)")

3.5 Comparación de modelos

resumen_modelos <- tibble::tibble(
  modelo = c("Regresión lineal", "Random Forest", "XGBoost"),
  RMSE   = c(rmse_lm, rmse_rf, rmse_xgb),
  MAE    = c(mae_lm,  mae_rf,  mae_xgb),
  R2     = c(r2_lm,   r2_rf,   r2_xgb)
)

resumen_modelos
## # A tibble: 3 × 4
##   modelo            RMSE   MAE     R2
##   <chr>            <dbl> <dbl>  <dbl>
## 1 Regresión lineal  20.2  16.6 0.0286
## 2 Random Forest     17.8  13.7 0.249 
## 3 XGBoost           18.4  13.7 0.219

La comparación entre los tres modelos entrenados se resume en la siguiente tabla:

  • Regresión lineal: RMSE ≈ 20.24, MAE ≈ 16.64, R² ≈ 0.03
  • Random Forest: RMSE ≈ 17.81, MAE ≈ 13.72, R² ≈ 0.25
  • XGBoost: RMSE ≈ 18.39, MAE ≈ 13.69, R² ≈ 0.22

La regresión lineal funciona únicamente como una línea base: explica menos del 3% de la variabilidad de la popularidad y presenta errores medios elevados, lo que confirma que las relaciones lineales son claramente insuficientes en este contexto.

Los dos modelos no lineales (Random Forest y XGBoost) mejoran de forma importante el desempeño, reduciendo el error y aumentando el R² a valores alrededor de 0.22–0.25.

Entre ellos, el Random Forest obtiene el mejor equilibrio entre error y capacidad explicativa, con el menor RMSE y el mayor R² (≈0.25), por lo que se considera el mejor modelo del conjunto.

El modelo XGBoost, incluso tras ajustar hiperparámetros como max_depth, eta, subsample y colsample_bytree, no logra superar de manera consistente al Random Forest. Esto sugiere que el límite actual de desempeño no está en el algoritmo, sino en la cantidad de información que las características acústicas pueden aportar sobre la popularidad. En otras palabras, los modelos ya están capturando casi toda la señal disponible en estas variables, y el resto de la variabilidad se debe a factores externos al audio (artista, marketing, playlists editoriales, viralidad, etc.) que no están incluidos en el dataset.

4 Conclusiones

El análisis realizado permite comprender de manera integral cómo se comporta la popularidad de las canciones en Spotify desde una perspectiva basada en características musicales internas. Si bien el éxito comercial depende de múltiples factores externos (como el artista, el marketing o las playlists editoriales), este estudio demuestra que las propiedades acústicas influyen en una fracción significativa del desempeño de una canción dentro de la plataforma.

4.1 Conclusiones del EDA

El análisis exploratorio reveló varios patrones relevantes:

  • La distribución de la popularidad es altamente asimétrica: una gran proporción de canciones tiene popularidad muy baja (incluyendo un volumen notable en popularidad 0), mientras que solo una pequeña fracción alcanza niveles altos.

  • Las canciones más exitosas suelen presentar características acústicas específicas: mayor energía, mayor intensidad sonora (loudness), niveles moderados-altos de danceability y menor contenido instrumental o acústico.

  • A nivel de artista, la popularidad muestra patrones consistentes: artistas contemporáneos de alta visibilidad (como Olivia Rodrigo, Bad Bunny o Ariana Grande) mantienen un rendimiento elevado de forma sostenida en su catálogo.

  • A nivel de género, los meta-géneros Pop y Hip-hop concentran las popularidades promedio más altas, mientras que géneros más especializados (chill, rock alternativo, ambient, anime) presentan menores niveles y mayor dispersión.

  • El clustering basado en características acústicas permitió identificar “familias sonoras” independientes de los géneros tradicionales, revelando grupos coherentes como música acústica suave, música de alta energía, pop bailable o sonidos en vivo.

Estas observaciones confirman que, aunque el género y el artista influyen fuertemente en la popularidad, las características acústicas también reflejan patrones estructurales relevantes.

4.2 Conclusiones del modelo predictivo

Se evaluaron tres enfoques: regresión lineal, Random Forest y XGBoost.

  • La regresión lineal explica menos del 3% de la variabilidad de la popularidad, lo que indica que las relaciones lineales son insuficientes para capturar la complejidad del fenómeno.

  • El Random Forest logra una mejora considerable, alcanzando un R² cercano al 25% y reduciendo notablemente el error (RMSE y MAE). Esto demuestra que las relaciones entre audio features y popularidad son mayormente no lineales.

  • El modelo XGBoost, aun tras ajuste de hiperparámetros, obtiene un desempeño comparable pero ligeramente inferior al Random Forest. Esto refuerza la idea de que los modelos ya están capturando casi toda la señal disponible en las características acústicas.

En términos prácticos, los modelos permiten concluir que las propiedades del audio aportan información valiosa pero limitada, explicando entre una cuarta y una quinta parte del éxito de una canción. El resto depende de factores externos no incluidos en el dataset.

4.3 Limitaciones del estudio

Este análisis presenta varias limitaciones importantes:

  • El dataset no incluye variables como fecha de lanzamiento, país, sello discográfico, campañas promocionales o presencia en playlists oficiales, todos los cuales influyen fuertemente en la popularidad.

  • No se cuenta con métricas de seguimiento temporal que permitan identificar crecimiento, viralidad o tendencias a lo largo del tiempo.

  • La popularidad medida en un momento específico puede estar afectada por eventos externos (estreno reciente, viralidad temporal, colaboraciones).

  • Los modelos predictivos se construyen únicamente con variables acústicas, lo cual limita su capacidad explicativa.

4.4 Líneas de trabajo futuro

Para mejorar la capacidad predictiva y la riqueza del análisis, sería deseable:

  • Incorporar información adicional como año de lanzamiento, playlists editoriales, seguidores del artista o historial de reproducciones.

  • Integrar señales externas como métricas de redes sociales, tendencias virales o patrones de descubrimiento del usuario.

  • Explorar arquitecturas más avanzadas basadas en espectrogramas (CNNs) o en embeddings de audio extraídos con modelos como VGGish o YAMNet.

  • Analizar la evolución temporal de la popularidad para distinguir entre éxitos sostenidos y viralidades efímeras.

En conjunto, el estudio muestra que las características acústicas sí contienen una señal predictiva relevante, pero que el fenómeno del éxito musical es mucho más amplio y multidimensional, combinando elementos culturales, sociales y de industria. Este análisis constituye una base sólida para continuar explorando la intersección entre música, datos y aprendizaje automático.