Featured image of post Analyser ses goûts musicaux grâce à l'API Spotify

Analyser ses goûts musicaux grâce à l'API Spotify

Et si on regardait ses pratiques musicales d'un peu plus près ? goûts, habitudes, artistes, styles, tout y passe :)

Bonjour !

J’ai demandé par curiosité il y a quelques mois l’accès à mes données Spotify.

J’utilise ce service depuis plusieurs années, et j’étais curieux d’analyser mon écoute pour voir si j’y trouve des patterns intéressants. Ce fut l’occasion pour moi de découvrir le package R spotifyr qui fait que les tâches de récupération de données deviennent un jeu d’enfant ! je vais parler de ce super package ici, en illustrant les possibilités avec des graphiques interactifs générés avec plotly et ggplot2.

Je simplifie les traitements de données grâce aux packages du tidyverse, absolument incontournables et extrêmement puissants & flexibles.

I. Deux manières complémentaires de récupérer ses données

1. Fichiers d’historique Spotify

La demande d’accès est simple et rapide:

On reçoit ensuite un zip avec des tas de fichiers JSON qu’on peut alors lire et analyser avec l’outil de son choix.
La réception peut prendre jusqu’à 30j. En pratique, c’est plutôt une semaine.

2. Accès à l’API

Nécessite l’obtention de deux “clés”:

  • SPOTIFY_CLIENT_ID
  • SPOTIFY_CLIENT_SECRET

Concrètement, il faut créer une nouvelle app à cet endroit.
Plus d’explications par ici

L’accès API permet d’accéder à une masse de données assez incroyable sur son écoute, mais également sur tout artiste, style, ou morceau de musique présent sur la plateforme Spotify.

II. Récupération & analyse:

On commence par charger les libraires dont on aura besoin pour la suite :

# pacman permet simplement de loader plusieurs paquets d'un coup :)
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
  jsonlite,
  lubridate, gghighlight,spotifyr,tidyverse,knitr,ggplot2,plotly, dplyr)

1. Analyse à partir de l’historique Spotify (zip)

Je lis les fichiers JSON StreamingHistory (source fichier zip fourni par Spotify, préalablement téléchargé et décompressé), qui contiennent mon historique d’écoute que je concatène :

hist0 <- fromJSON("/Users/anas/Downloads/MyData/StreamingHistory0.json", flatten = TRUE)
hist1 <- fromJSON("/Users/anas/Downloads/MyData/StreamingHistory1.json", flatten = TRUE)
hist2 <- fromJSON("/Users/anas/Downloads/MyData/StreamingHistory2.json", flatten = TRUE)

streamHistory  <- rbind(rbind(hist0,hist1),hist2)

Le fichier comprend 21024 lignes et ressemble à cela:

head(streamHistory) %>%
  kable()
endTime artistName trackName msPlayed
2020-06-25 22:50 Parcels Myenemy 24618
2020-07-12 07:49 Henri Texier Les Là-Bas 1602
2020-07-12 07:49 Bonobo Kerala 1416
2020-07-12 07:49 Lucien & The Kimono Orchestra Sp2500 2321
2020-07-12 07:49 Jimmy Smith Got My Mojo Workin’ 2043
2020-07-12 07:49 Jamie xx Sleep Sound 2066

à partir de là, beaucoup de tâches exploratoires sont possibles:

En sommant le temps passé à écouter chaque artiste, je peux par exemple facilement savoir lesquels ont été les plus écoutés

Connaître les heures d’écoute intensive:

Même choses, en ajoutant la dimension “jour de la semaine”:

Vu autrement:

2. Regardons à présent ce que peut nous offrir l’API Spotify

La première étape est de s’authentifier auprès de l’API pour être ensuite capable de l’interroger. Pour ce faire, il faut créer des variables d’environnement content SPOTIFY_CLIENT_ID et SPOTIFY_CLIENT_SECRET que tu as récupéré dans ton compte Spotify, puis utiliser la fonction get_spotify_access_token() pour établir une connexion:

Sys.setenv(SPOTIFY_CLIENT_ID = 'ton_token_personnel')
Sys.setenv(SPOTIFY_CLIENT_SECRET = 'ton_token_personnel')
access_token <- get_spotify_access_token()

A partir de là, nous avons accès à une palette de données assez incroyable, qui donne un bon aperçu de la qualité et de la puissance de l’infrastructure data de Spotify.

Pour moi, la grande richesse de cette API réside dans le fait qu’elle donne accès aux audio features. En effet, tout morceau présent sur Spotify est décrit et représenté par un tas de métriques numériques le décrivant comme par exemple: Danceability, Valence, Energy, Tempo, Loudness, Speechiness, Instrumentalness, Liveness, Acousticness. Ces features numériques permettant de calculer des distances entre morceaux, elle ouvre un large spectre d’analyses. Un autre aspect est la “générosité” de cette API. Elle est en effet extrêmement riche en données, rapide et très réactive.

Voici une petite sélection de fonctions que j’ai trouvé amusantes à utiliser, et tu trouveras l’intégralité des fonctions documentées ICI :

1. get_my_top_artists_or_tracks() : récupérer ses articles ou titres les plus écoutés

Exemples d’utilisation:

get_my_top_artists_or_tracks(type = 'artists',
                             time_range = 'medium_term',
                             limit = 30) %>%
    sample_n(5) %>%
    select(.data$name, .data$genres, .data$popularity,.data$followers.total ) %>%
    rowwise %>%
    mutate(genres = paste(.data$genres, collapse = ', ')) %>%
    ungroup %>%
    kable()
name genres popularity followers.total
Steely Dan album rock, art rock, classic rock, country rock, folk rock, mellow gold, psychedelic rock, rock, roots rock, soft rock, yacht rock 69 1552750
Supertramp album rock, art rock, classic rock, glam rock, mellow gold, piano rock, progressive rock, rock, soft rock 71 2451963
The Dø french indie pop, french indietronica, french rock, rock independant francais 55 330795
Ben Böhmer 67 234303
St Germain downtempo, electronica, jazztronica, nu jazz 55 239451
get_my_top_artists_or_tracks(type = 'tracks',
                             time_range = 'medium_term',
                             limit = 50) %>%
    sample_n(10) %>%
    mutate(
        artist.name = map_chr(artists, function(x) x$name[1])
        ) %>%
    select(name, artist.name, album.name) %>%
    kable()
name artist.name album.name
Lovely Rita - Remastered 2009 The Beatles Sgt. Pepper’s Lonely Hearts Club Band (Remastered)
Amphetamine Annie Canned Heat The Best Of Canned Heat
Fixing A Hole - Remastered 2009 The Beatles Sgt. Pepper’s Lonely Hearts Club Band (Remastered)
Brain Damage - 2011 Remastered Version Pink Floyd The Dark Side Of The Moon (2011 Remastered Version)
Within You Without You - Remastered 2009 The Beatles Sgt. Pepper’s Lonely Hearts Club Band (Remastered)
Time - 2011 Remastered Version Pink Floyd The Dark Side Of The Moon (2011 Remastered Version)
Lost For Words - 2011 Remaster Pink Floyd The Division Bell (2011 Remastered Version)
Sgt. Pepper’s Lonely Hearts Club Band - Remastered 2009 The Beatles Sgt. Pepper’s Lonely Hearts Club Band (Remastered)
Pigs On The Wing (Pt. 2) - 2011 Remastered Version Pink Floyd Animals (2011 Remastered Version)
Good Morning Good Morning - Remastered 2009 The Beatles Sgt. Pepper’s Lonely Hearts Club Band (Remastered)

2. get_artist_audio_features() : récupérer les features audio de tous les morceaux d’un artiste

Regardons quels sont les 10 morceaux les plus “dansables” d’un groupe:

dance <- get_artist_audio_features("Salut C'est Cool")

dance %>%
    arrange(-danceability) %>%
    select(.data$track_name, .data$danceability) %>%
    head(10) %>%
    unique() %>%
    kable()
track_name danceability
1 Voilà - Etienne de Crécy Remix 0.913
2 Canon des peurs 0.876
3 Simulateur de pêche 0.863
5 Menu - DJ Furax Acid Remix 0.861
6 14-01-2019 0.838
7 Vision - Laid Back Remix 0.821
8 Le cassoulet 0.819
9 Des formes et des couleurs 0.815

3. get_my_followed_artists() : récupérer les artistes auxquels on est abonné

get_my_followed_artists() %>%
    head() %>%
    kable()

4. get_my_playlists() : lister toutes ses playlists

Ce qui nous intéresse aussi, ce sont les URI de playlists, ressemblant à cela: spotify:playlist:3CnZy12b7GPl4aKy5vMfym. C’est surtout la dernière partie qui nous sera utile (après les deuxièmes “:”)

5. get_playlist_audio_features() : récupérer les audio features des morceaux d’une playlist (dont on a récupéré l’identifiant grâce à la précédente fonction)

playlist_username <- 'Username Spotify du propriétaire de la playlist'
playlist_uri <- c("Identifiant issu de l'URI de la playlist récupéré précédemment")
playlist_AudioFeatures <- get_playlist_audio_features(playlist_username, playlist_uri)

Morceaux peu populaires de la playlist:

plot <- playlist_AudioFeatures %>% sample_n(50) %>%
  group_by(track.popularity) %>%
  filter(track.popularity <= 5) %>%
  ggplot(aes(x = track.name, y = track.popularity)) +
  geom_col() +
  labs(x= "Morceau", y= "Popularité") +
  ggtitle("Morceaux peu populaires") + theme(axis.text.x = element_text(angle = 90))

ggplotly(plot)

6. get_my_saved_tracks() : récupérer les données des morceaux de la playlist “Titres likés”

myFavoriteTracks <- ceiling(get_my_saved_tracks(include_meta_info = TRUE)[['total']] / 50) %>%
  seq() %>%
  map(function(x) {
    get_my_saved_tracks(limit = 50, offset = (x - 1) * 50)
  }) %>%
  reduce(rbind) 

Je peux ensuite afficher les artistes les plus présents:

Voici pour la petite démo. Il est possible d’aller beaucoup plus loin, en faisant une classification non supervisée des morceaux qu’on aime pour essayer de dégager des thématiques correspondant à un “mood” ou à un moment de la journée. Les méthodes d’analyse en composante principale peuvent également être utilisées pour creuser le sujet de manière super intéressante.

Généré avec Hugo
Thème Stack conçu par Jimmy