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:
- Elle se fait ici, tout en bas en étant loggé sur son compte. (Merci le RGPD !)
- Plus d’explication là
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.
Pour aller plus loin:
- Analyzing Spotify songs data in R, a quick rundown
- Explore your activity on Spotify with R and “spotifyr”: How to analyze and visualize your streaming history and music tastes
- spotifyr sur Github
- Exploring the Spotify API with R A Tutorial for Beginners, by a Beginner
Enjoy !
- Merci pour votre lecture ! 😊👋
Anas EL KHALOUI