Analyser une playlist Spotify avec R

Je ne sais pas ce que vous avez fait lors de l’annonce du confinement, mais personnellement, j’ai pris deux décisions absolument majeures :
  1. Augmenter mon forfait Netflix
  2. Passer à un abonnement Spotify Family !
Et mi-avril j’ai créée une playlist sur Spotify, que j’ai nommée, avec beaucoup d’originalité, “Confinement”, bien évidemment !La semaine dernière, en discutant avec un ami, je me suis demandée s’il était possible d’analyser cette playlist sous R, pour essayer de la caractériser.J’ai fait quelques recherches, et j’ai trouvé le package `Rspotify`, qui permet, à partir de R,  se connecter à son compte spotify, et de récupérer plein d’informations comme :
  • la liste de nos playlists
  • la listes des musiques de chaque playlist
  • une listes d’infos pour chaque musique (artiste, sa note de popularité, le tempo, la dansablité, la positivité des paroles, etc…)
Pour avoir une vision globale de ma playlist, j’ai ensuite réalisé un dashboard (avec le package flexdasboard, comme présenté dans l’article Comment faire un dashboard avec R ? )
Voici ce que ça donne :
Je vais vous montrer, en pas à pas, comment j’ai procédé pour obtenir les données.

Remarque : Je ne pense pas qu’il faille nécessairement disposer d’un compte premium pour ça, mais je n’ai pas vérifié.

Aide mémoire off'R 😉

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.

Etapes préliminaires sur Spotify

La première chose à faire est d’aller sur la page d’accueil de Spotify et de vous connecter à votre compte.

Ensuite scrollez la page vers le bas, et allez sur l’élément `Developpeurs` du menu `communautés`:

Puis allez sur l’onglet “Dashboard” (en haut)

Et cliquez sur le bouton “CREATE AN APP”.

Donnez un nom (j’ai appelé la mienne blog_slr2), décrivez votre application (j’ai écrit “dashboard pour playlist” ), et cochez les deux cases.

Ensuite cliquez sur le bouton “EDIT SETTINGS”, puis:

  • entrez une adresse dans la partie `website` (je pense que vous pouvez écrire n’importe quoi).
  • écrivez `http://localhost:1410` dans la partie Redirects URls (c’est indispensable).

Puis cliquez sur l’application, vous allez accéder à :

  • votre “client ID”
  • votre “client secret”

Etapes préliminaires sur R

Pour que R puisse communiquer avec Spotify, il est nécessaire, d’établir une autorisation d’accès. Cela nécessite d’employer la fonction `spotifyOAuth()`, comme ceci :
library(Rspotify)
keys <- spotifyOAuth(app_id="blog_slr2",
client_id="0c368.....",
client_secret="48bae72....") 

Préparer les données à analyser

Récupérer le nom des playlists

Pour récupérer le nom et l’identifiant de mes playlists, j’ai utilisé la fonction `getPlaylists()`, avec, en argument, mon nom d’utilisateur spotify (cdv04), comme ceci :
my_playlists <- getPlaylists("cdv04",token=keys)
## Auto-refreshing stale OAuth token
my_playlists

> my_playlists
                       id                                  name           ownerid
1  5em3kNfkcyDBTiTSUUyEEg     Le kit de survie De Barbara Butch         118423851
2  0stfauWdNBNRCxjwzwFzkM                      post_confinement             cdv04
3  2y4ncIWocQjzdLAZjJc1Wv                           Confinement             cdv04
4  37i9dQZF1DWUF3bcja4I8P                  Le ménage en musique           spotify
5  37i9dQZF1DXdrln2UyZD7F                      La vie est belle           spotify
6  3NpfFRm9NFvcWAjuSi9sly           Pour chanter sous la douche   alexandremoxhet
7  37i9dQZF1DX720GaRlTmKS                 Concentration Maximum           spotify
8  7d3xqiNDoDPCmR3fYg3Jpz                           Automne2018             cdv04
9  37i9dQZF1DX8685vIIepKh                      Garde la pêche !           spotify
10 37i9dQZF1DWVAWlq3l00p0                           Top Variété           spotify
11 2ijbsOFT3nSeBRZ8qIAvFn                                   L's             cdv04
12 73NpxXOj79ZwqUXWUJ9TBh Glenn Gould Variaciones Goldberg 1981 nestorjimenezruiz
13 2PMydNsusPsslhkScbkKqa                            avril 2018             cdv04
   tracks
1      53
2       2
3      54
4      50
5      60
6      21
7     215
8       4
9      50
10     50
11      8
12     33
13     22 

Récupérer l'identifiant d'une playlist

J’ai ensuite stocké l’identifiant de ma playlist “Confinement” dans l’objet `pl_Confinement_id` :
library(tidyverse)
pl_Confinement_id <- my_playlists %>%
filter(name=="Confinement") %>%
pull(id)

pl_Confinement_id
## [1] "2y4ncIWocQjzdLAZjJc1Wv" 

Récupérer les pistes d'une playlist

Pour cela, j’ai utilisé la fonction getPlaylistSongs(), en indiquant en argument :
  • mon nom d’utilisateur
  • l’identification de la playlist
  • la clé d’autorisation de connexion à mon compte Spotify
Confinement_songs <- getPlaylistSongs("cdv04",pl_Confinement_id,token=keys)
head(Confinement_songs)
                                   tracks                     id
1                    Mourir vieux (avec toi) 7EwK4HWRAunokum0nNo7il
2              Sugar (feat. Francesco Yates) 5tf1VVWniHgryyumXyJM7w
3 This Girl (Kungs Vs. Cookin' On 3 Burners) 1A8j067qyiNwQnZT0bzUpZ
4                        Changes - Radio Mix 2SdMEke7JCBEo8t60iyw2r
5                            Want to Want Me 7oGZAicScQt96OAW4AruYy
6                                    bad guy 2Fxmhks0bxGSBdJ92vM42m
  popularity        artist                        artist_full
1         54       Tim Dup                            Tim Dup
2         77  Robin Schulz Robin Schulz feat. Francesco Yates
3         78         Kungs   Kungs feat. Cookin' On 3 Burners
4         62 Faul & Wad Ad           Faul & Wad Ad feat. PNAU
5         77  Jason Derulo                       Jason Derulo
6         89 Billie Eilish                      Billie Eilish
               artist_id                                     album
1 2Ksaxtwx8hMgjUkzIoGDXE Mélancolie heureuse - Nouvelle impression
2 3t5xRXzsuZmMDkQzgOX35S                                     Sugar
3 7keGfmQR4X5w0two1xKZ7d                                    Layers
4 6HUm6AHJE0oisACMN6NNJ5                                   Changes
5 07YZf4WDAMNwqr4jfgOZ8y                           Everything Is 4
6 6qqNVTkY8uBg9cP3Jd7DAH  WHEN WE ALL FALL ASLEEP, WHERE DO WE GO?
                album_id
1 1qXI0l7V93M0KCinTOZwcW
2 5XyJzEROSmup2TcWmVjTIt
3 66KCBRiOFSs9bki2A15WlB
4 5T513gBStZcClfbKCRkE9E
5 59eUYETmE1zi31ESb3SUkI
6 0S0KGZnfBGSIssfF54WSJh 

Récupération des informations des pistes de la playlist

La fonction getFeatures() permet d’accéder à de nombreuses informations telles que:
  • acousticness (entre 0 et 1)
  • danceability (entre 0 et 1)
  • duration_ms
  • energy (entre 0 et 1)
  • instrumentalness(entre 0 et 1)
  •  key(tonalité)
  • mode (mineur ou majeur)
  • liveness( entre 0 et 1)
  • loudness (-60 db et 0 db)
  •  speechiness (spoken words, entre 0 et 1)
  • tempo (bpm)
  • valence (positivité musicale, entre 0 et1)
Cette fonction `getFeatures()`, ne peut prendre en argument qu’un seul numéro d’identification. Afin d’obtenir les informations de toutes les musiques de la playlist, j’ai donc employé une boucle `for()`. A chaque itération je récupère les informations de la musique concernée dans un objet temporaire (appelé tmp), puis je colle les informations avec les informations des musiques précédentes en utilisant la fonction `bind_rows()`, comme expliqué dans cet article.
# initialisation de la table qui contiendra les données
Confinement_features <- data.frame()

for (i in 1 : nrow(Confinement_songs))
{
    tmp <- getFeatures(Confinement_songs$id[i], token=keys)
    Confinement_features<-bind_rows(Confinement_features, tmp) 
} 

Voici les premières lignes de la table obtenue :

head(Confinement_features)

                      id danceability energy key loudness mode speechiness
1 7EwK4HWRAunokum0nNo7il        0.787  0.797   7   -6.760    1      0.0994
2 5tf1VVWniHgryyumXyJM7w        0.636  0.815   5   -5.098    0      0.0581
3 1A8j067qyiNwQnZT0bzUpZ        0.792  0.717   0   -4.759    0      0.0393
4 2SdMEke7JCBEo8t60iyw2r        0.772  0.700   1   -7.285    1      0.0332
5 7oGZAicScQt96OAW4AruYy        0.775  0.680   0   -5.508    0      0.0629
6 2Fxmhks0bxGSBdJ92vM42m        0.701  0.425   7  -10.965    1      0.3750
  acousticness instrumentalness liveness valence   tempo duration_ms
1      0.48500         3.39e-05   0.1040   0.794 105.958      199120
2      0.01850         0.00e+00   0.1630   0.636 123.063      219043
3      0.09270         3.59e-05   0.2260   0.466 121.985      195547
4      0.00585         4.90e-01   0.0745   0.426 126.017      202173
5      0.00906         0.00e+00   0.1090   0.656 114.025      207719
6      0.32800         1.30e-01   0.1000   0.562 135.128      194088
  time_signature                                  uri
1              4 spotify:track:7EwK4HWRAunokum0nNo7il
2              4 spotify:track:5tf1VVWniHgryyumXyJM7w
3              4 spotify:track:1A8j067qyiNwQnZT0bzUpZ
4              4 spotify:track:2SdMEke7JCBEo8t60iyw2r
5              4 spotify:track:7oGZAicScQt96OAW4AruYy
6              4 spotify:track:2Fxmhks0bxGSBdJ92vM42m
                                                      analysis_url
1 https://api.spotify.com/v1/audio-analysis/7EwK4HWRAunokum0nNo7il
2 https://api.spotify.com/v1/audio-analysis/5tf1VVWniHgryyumXyJM7w
3 https://api.spotify.com/v1/audio-analysis/1A8j067qyiNwQnZT0bzUpZ
4 https://api.spotify.com/v1/audio-analysis/2SdMEke7JCBEo8t60iyw2r
5 https://api.spotify.com/v1/audio-analysis/7oGZAicScQt96OAW4AruYy
6 https://api.spotify.com/v1/audio-analysis/2Fxmhks0bxGSBdJ92vM42m 

Ajout des informations complémentaires

Pour que la table de données Confinement_features soit plus lisible, j’ai préféré récupérer certaines infos contenues dans la table Confinement_songs, telles que :

  • le nom de la chanson (variable tracks)
  • son id spotify
  • le nom de l’artiste
  • la popularité de l’artiste

Avant de récupérer le nom des chansons, j’en ai raccourci certains :

Confinement_songs$tracks[3] <- "This Girl"
Confinement_songs$tracks[7] <- "Sweet Dreams"
Confinement_songs$tracks[10] <- "Can't Hold Us"
Confinement_songs$tracks[19] <- "Feels"
Confinement_songs$tracks[23] <- "One Kiss"
Confinement_songs$tracks[25] <- "Speechless"
Confinement_songs$tracks[27] <- "My Life Is Going On"
Confinement_songs$tracks[29] <- "Djon maya maï"
Confinement_songs$tracks[31] <- "One Day"
Confinement_songs$tracks[44] <- "Prayer In C"
Confinement_songs$tracks[48] <- "Another Brick In The Wall" 
Puis j’ai récupéré les informations qui m’intéressaient, et réalisé une jointure avec la fonction left_joint pour ajouter ces informations à la table Confinement_features :
Confinement_songs_tracks <- Confinement_songs %>% 
    select(tracks, id, artist, popularity)

# ajout du nom des songs
Confinement_features <- Confinement_features %>% 
    left_join(Confinement_songs_tracks) %>% 
    select(id,tracks, artist,popularity, everything() 

Exportation des données

Une fois les données préparées, je les ai exportées sous la forme d’un fichier csv. Pour cela, j’ai d’abord créé un dossier `data_output`, et j’ai exporté les données dans ce dossier de mon projet R. Le but de cette exportation est de pouvoir, ensuite, lors de la phase du dashboard, pouvoir facilement les importer.
dir.create("data_output")
write.csv2(Confinement_features, here::here("data_output","Confinement_features.csv"), row.names = FALSE) 

Dashboard

Ensuite, j’ai procédé à l’analyse de la playlist, en réalisant un dashboard, à l’aide du package `flexdasboard`.

Remarque : si vous ne visualisez rien, changer de navigateur (firefox par exemple).

Pour cela, j’ai commencé par ouvrir un template flexdashboard, comme décrit ici.

Voici des copies écran des différentes parties du dashboard:

L'en-tête

Chunck set up et importation des données

Page Analyse

Les boxes de la première ligne

La jauge de la seconde ligne

Les loliplots de la troisième ligne

Les plots de l'ACP de la quatrième ligne

Le dendrogramme de classification hiérarchique

Page data

J’espère que cet article vous donnera envie d’essayer d’analyser vos propres playlists.

N’hésitez pas à me dire, en commentaire, si vous souhaitez plus d’article de data analyse/data sciences,  comme celui-ci

Si cet article vous a plu, ou vous a été utile, et si vous le souhaitez, vous pouvez soutenir ce blog en faisant un don sur sa page Tipeee 🙏

Image par Maret Hosemann de Pixabay

3 réponses

  1. Très intéressant, j’ai appliqué le code R en utilisant mon compte Spotify et il fonctionne très bien. Merci de votre publication 🙂

    Clément Bély

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.