Integrantes
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:
## 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…
## 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:
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:
Por lo tanto:
El análisis se centrará en patrones musicales (audio features), artistas y géneros, dejando el estudio temporal/geográfico como trabajo futuro.
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:
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).
La mayor parte de las canciones:
Esto es consistente con el formato típico de “sencillo” comercial, pensado para escucha rápida y repetible.
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.
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.
## 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.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.
## # 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:
La columna genre contiene una gran cantidad de subgéneros específicos.Para simplificar el análisis se agrupan en cuatro meta-géneros:
## # A tibble: 4 × 2
## meta_genre n_canciones
## <chr> <int>
## 1 Hip-hop 842
## 2 Other 76529
## 3 Pop 7077
## 4 Rock 5292
## # 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:
###Contenido explícito por meta-género
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.
K-means es uno de los métodos más utilizados para:
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.
Se eligieron características que representan:
danceability,
tempoenergy,
loudnessacousticness,
instrumentalnessspeechiness,
livenessduration_minvalenceEstas variables permiten capturar dimensiones fundamentales del sonido: energía, organicidad, nivel de producción, emoción y estructura musical.
Aunque existen múltiples técnicas para elegir el número óptimo de clusters (elbow method, silhouette score), se selecciona K = 4 porque:
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
Este enfoque permite:
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.
Durante el análisis se identificaron varios retos de datos:
Algunos hallazgos centrales del EDA son:
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:
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:
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:
Basado en el EDA:
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.
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:
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.
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.
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.
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
## [1] 26923 11
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:
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.
##
## 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
## [1] 16.63952
## [1] 0.02856227
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:
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.
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:
energy,
danceability o acousticness muestran patrones
no lineales en el EDA.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
## [1] 13.72055
## [1] 0.2494069
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.
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:
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
## [1] 13.69158
## [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
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:
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.
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.
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.
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.
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.
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.