Certains producteurs affirment être sûrs de pouvoir prédire les chansons qui deviendront des hits. J’ai décidé de creuser le sujet, et de voir si les données / metadata des chansons pouvaient répondre à la question suivante.

Peut-on savoir si une chanson va devenir un hit, grâce à ses metadata?

PRÉSENTATION

Pour répondre à cette question, j’ai utilisé les modèles de prédiction de Machine Learning appliqués à un jeu de donné obtenu sur Kaggle: Spotify Audio Features.

Ce dataset provient de la base de données se Spotify et regroupe 116 000 chansons. Chacune de ces chansons dispose de 17 caractéristiques (liste non exhaustive) : Danceability (chanson propice à la dance), Acousticness, Energy, Duration_ms (durée de la chanson), Loudness (intensité sonore de la chanson), Tempo de la chanson etc.

Ici la variable cible est Popularity, soit prédire la popularité d’une chanson sur la plateforme.

ANALYSE DU DATASET

Par chance, le dataset était très propre. Une vérification des valeurs nulles montre qu’il n’y a rien à faire de ce côté.

RÉPARTITION DE LA POPULARITÉ

La première chose à faire est d’observer la répartition des valeurs de popularité des chansons du dataset.

Après import des librairies Pandas, Matplotlib et du dataset, nous pouvons afficher les premières visualisations.

La popularité est notée de 0 à 100, avec une gross répartition autour de 25 pts. Voyons la répartition en histogramme pour plus de précision.

Nous avons en réalité énormément de chansons pour lesquelles la popularité est égale à 0. J’ai donc décidé de supprimer ces lignes du jeu de données car ces valeurs ne me semblent pas représentatives.

NETTOYAGE DU DATASET

En continuant mon analyse, je me suis rendu compte que certaines chansons avaient des valeur de durée extrêmes qui n’étaient pas représentatives d’une chansons (durée > 1h). Il s’agit de bandes sons de relaxation par exemple, qui sont également distribuées sur Spotify. J’ai donc décidé de filtrer mon jeu de données sur les chansons dont la durée était < 1Million de ms (env. 16 min 30).

Le tempo ne peut également pas avoir une valeur nulle, donc ces chansons seront supprimées.

Parmi la liste des caractéristiques disponibles, certaines ne sont pas pertinentes pour notre analyse. Je pense notamment aux colonnes “track_name”, et “track_id” qui sont des valeurs uniques pour chaque ligne du dataset.

L’utilisation de la colonne “artist_name” n’est également pas pertinente ici car la répartition n’est pas du tout homogène et le poids de chaque artiste est complètement disproportionné dans le jeu de données.

Ces 3 colonnes vont donc être supprimées du dataset.

Au final, le modèle de données que nous allons utiliser comporte 104 499 lignes (chansons), pour lesquelles nous disposons de 13 caractéristiques différentes:

Acousticness, Danceability, Energy, Liveness, Key, Duration_ms, Loudness, Mode, Tempo, Time_signature, Valence, Instrumentalness, Speechiness

Ces deux derniers items sont très colinéaires. C’est d’ailleurs précisé dans la documentation de l’API Spotify. L’Instrumentalness sera donc retirée de l’étude pour respecter le principe de non colinéarité.

CHOIX DU MODÈLE

Nous essayons ici d’estimer si une chanson sera un “hit” ou non. Pour cela, nous prenons le parti de considérer que si une chanson obtient un score de popularité supérieur à 70/100, alors c’est un hit. Il existe plusieurs modèles de classification mais la régression logistique sera utilisée ici.

Une première analyse nous montre une excellent précision du modèle.

Accuracy = 0.9876076555023924

En revanche, en analysant la matrice de confusion, on comprend mieux pourquoi.

En réalité, aucun hit n’a été prédit.

Cela est compréhensible car très peu de chansons sont des hits dans notre test set (moins de 1,5%).

Par défaut, le modèle décide qu’il faut au moins 50% de chance qu’un événement se produise pour prédire qu’il arrivera.

Il faut donc se pencher sur la probabilité prédite pour chaque résultat pour affiner le résultat.

Avant cela, réfléchissons à ce que l’on veut monitorer. L’idéal est de se tromper le moins possible lorsque l’on prévoit qu’une chanson va être un hit.

Je cherche donc à avoir le taux de “hit correctement prédit” le plus élevé possible.

Afin de déterminer quelle sera la probabilité optimale à appliquer au modèle, j’ai créé une boucle qui en teste un maximum entre 0 et 12%, et qui stocke le résultat dans un array que je pourrais étudier par la suite.

Le graphe montre très nettement que:

  • Au dela de 12% (de predict_proba), le nombre de hits prédit passe à 0.
  • Si l’on restreint la valeur de la probabilité, on a des pics à chaque fois qu’un nouveau hit est prédit.
  • Le modèle devient intéressant en dessous de 6% de probabilité des prédictions.

Je recherche donc la valeur de la probabilité (<6%) pour laquelle la précision est la plus élevée. J’ai modifié la boucle avec un range(600) et calculé le max suivant.

La précision est un peu moins bonne qu’au début (96%), mais au moins, nous avons plusieurs hits qui sont prédits correctement.

CONCLUSION

Ce modèle est loin d’être parfait. Même si sa précision est très bonne (dû au nombre élevé de Non-hits), il présente un fort taux d’erreur sur les prédictions.

Si un artiste présente sa chanson au modèle et qu’il lui prédit un hit, cela n’a que 5% de chances d’arriver.

C’est en partie dû au jeu de données qui regroupe des chansons de tous styles, et de toutes époques. Je n’avais pas de critères de genre, ou d’année pour essayer de spécialiser mon modèle sur des catégories de chansons.

C’est donc un modèle universel, forcément moyennement performant sur l’ensemble du catalogue musical mondial.