Introduction
In just a few weeks the Eurovision 2016 song contest will be held again. There are 43 participants, two semi-finals on the 10th and 12th of May and a final on the 14th of May. It’s going to be a long watch in front of the television…. 🙂 Who is going to win? Well, you could ask experts, lookup the number of tweets on the different participants, count YouTube likes or go to bookmakers sites. On the time of writing Russia was the favorite among the bookmakers according to this overview of bookmakers.
Spotify data
As an alternative, I used Spotify data. There is a Spotify API which allows you to get information on Play lists, Artists, Tracks, etc. It is not difficult to extract interesting information from the API:
- Sign up for a (Premium or Free) Spotify account
- Register a new application on the ‘My Applications‘ site
- You will then get a client ID and a client Secret
In R you can use the httr library to make API calls. First, with the client ID and secret you need to retrieve a token, then with the token you can call one of the Spotify API endpoints, for example information on a specific artist, see the R code snippet below.
library(httr) clientID = '12345678910' secret = 'ABCDEFGHIJKLMNOPQR' response = POST( 'https://accounts.spotify.com/api/token', accept_json(), authenticate(clientID, secret), body = list(grant_type = 'client_credentials'), encode = 'form', verbose() ) mytoken = content(response)$access_token ## Frank Sinatra spotify artist ID artistID = '1Mxqyy3pSjf8kZZL4QVxS0' HeaderValue = paste0('Bearer ', mytoken) URI = paste0('https://api.spotify.com/v1/artists/', artistID) response2 = GET(url = URI, add_headers(Authorization = HeaderValue)) Artist = content(response2)
The content of the second response object is a nested list with information on the artist. For example url links to images, the number of followers, the popularity of an artist, etc.
Track popularity
An interesting API endpoint is the track API. Especially the information on the track popularity. What is the track popularity? Taken from the Spotify web site:
The popularity of the track. The value will be between 0 and 100, with 100 being the most popular. The popularity of a track is a value between 0 and 100, with 100 being the most popular. The popularity is calculated by algorithm and is based, in the most part, on the total number of plays the track has had and how recent those plays are.
I wrote a small R script to retrieve the track popularity every hour of each of the 43 tracks that participate in this years Eurovision song contest. The picture below lists the top 10 popular tracks of the song contest participants.
At the time of writing the the most popular track was “If I Were Sorry” by Frans (Sweden), which is placed on number three by the bookmakers.The least popular track was “The real Thing” by Highway (Montenegro), corresponding to the last place of the bookmakers.
There is not a lot of movement in the track popularity, it is very stable over time. Maybe when we get nearer to the song contest final in May we’ll see some more movement. I have also kept track of the number of followers that an artist has.There is much more movement here. See the figure below.
Everyday around 5 pm – 6 pm Frans gets around 10 to 12 new followers on Spotify! Artist may of course also lose some followers, for example Douwe Bob in the above picture.
Audio features and related artists
Audio features of tracks like loudness, dance-ablity, tempo etc, can also be retrieved from the API. A simple scatter plot of the 43 songs reveals loud and undancable songs. For example, Francesca Michielin (Italy), she is one of the six lucky artists that already has a place in the final!
Every artist on Spotify also has a set of related artist, this set can be retrieved from the API and can be viewed nicely in a network graph.
The green nodes are the 43 song contest participants. Many of them are ‘isolated’ but some of them are related to each other or connected through a common related artist.
Conclusion
I have created a small Eurovision 2016 Shiny app that summarizes the above information so you can see and listen for your self. We will find out how strong the Spotify track popularity is correlated with the final ranking of the Eurovision song contest on May the 14th!
Cheers, Longhow.
The Eurovision is such an endless source of great data science work, well done!
What package did you use for the network visualisation ? Interaction with the data table?
Would you be able to share the source code of your app?
Thanks!
LikeLike
Hello Stephane,
library visNetwork, this will support interaction in shiny. If you click on a node then you have the selected node.
See http://dataknowledge.github.io/visNetwork/
I’ll brush up some of the code then I can mail it to you, I still want to put some things on Github
Cheers,
Longhow
LikeLiked by 1 person
Hey ! That’s a nice app you have created, I’m still new at using R Shiny so this one really blew my mind. What package did you use to put songs on ?
Greetings from Lithuania !
LikeLike
Hi Lina,
I used the DT package to put data tables in a shiny app. You can then insert html tags in the data.table, like pictures of country flags, or audio preview
Then you must use escape = FALSE in the datatable function
Cheers,
Longhow
LikeLike
Wow, that is a really nice app. Very well done. I’m super impressed by the interactivity especially in the network. How did you made it possible to change the behaviour of the modules/ boxes (here: “Information of selected node”) based on user interaction within another module (the network). Any chance to get the code for this?
Thanks !
Jonas
LikeLike
This is great, how were you able to obtain the artist ID for specifically Frank Sinatra? Is there a glossary somewhere in the API?
LikeLike
The spotify API also contains a search
https://developer.spotify.com/web-api/search-item/
where you can find artists by name. The output contains (among other things) the artist ID
LikeLike
Longchow , Is it possible you can mail in the R code you created , Would be a great help
LikeLike
Hi,
Thanks for your reply
Code for the app can be found on GitHub
Cheers,
Longhow
LikeLike
Hey,
That’s a nice app!
Is the shiny code available? Or can you email it?
Great job anyway
LikeLike
Hi,
Thanks for your reply
Code for the app can be found on GitHub
Cheers,
Longhow
LikeLike
Hi,
Thanks for your reply
Code for the app can be found on GitHub
Cheers,
Longhow
LikeLike