Análise de dados de uma Playlist do Spotify com Python e Power BI

Gabriel Luz
Gabriel Luz
Published in
9 min readMay 13, 2019

Como obter insights usando uma das ferramentas mais usadas no mercado

Introdução

Nos últimos anos passamos a contar com uma imensidão de dados sendo gerados, processados e transformados em conhecimento útil. A facilidade de acesso a diversas fontes de dados também é um fenômeno que chama bastante atenção. Temos o Kaggle; portais governamentais de dados públicos, em 2018 o Google até lançou um buscadorexclusivo para a pesquisa de data sets.

No entanto, para algumas aplicações, é interessante contar com as APIs (Application Programming Interface). Empresas como o Google, Twitter, Slack e muitas outras, fornecem APIs para que desenvolvedores possam criar códigos para os seus produtos. E esses programas são ótimas fontes de dados.

O objetivo deste artigo é demonstrar como acessar a Web API do Spotify para obter dados de uma playlist e depois fazer algumas análises.

Obtenção dos dados

Minha ideia original era conectar a Web API do Spotify ao Power BI e depois, seguir com a construção da camada de visualização. No entanto, com essa conexão eu não consegui obter os dados que desejava, que são informações referente a minha própria conta no Spotify. Através do Power BI, o data set obtido era um agrupado de informações sobre todos os usuários do serviço de Streaming.

Para resolver esse problema, eu usei a linguagem Python. Essa ferramenta foi usada para extrair a informação que eu queria e em seguida, para gerar arquivos que serão importados para o Power BI. Os próximos parágrafos contém o passo-a-passo para obtenção dos dados.

Antes de enviar um request para a API, é preciso instalar (pip install) e importar a biblioteca Spotipy, responsável pela comunicação do Pyhton com o serviço do Spotify.

import spotipyimport spotipy.util as utilfrom spotipy.oauth2 import SpotifyClientCredentials

Para ter acesso a API, você precisa se cadastrar no site do Spotify dedicado a desenvolvedores. Basta você selecionar a opção “Create an App”, cadastrar as suas informações e no final do processo, você terá seu CLIENT_ID e CLIENT_SECRET. Ah, nas configurações do aplicativo não esqueça de colocar o website e Redirect URIs. Coloquei o link do blog mesmo mas você pode pôr o site google (https://www.google.com.br/).

Voltando ao código, a próxima etapa é colocar as suas credenciais, obtidas no cadastramento.

client_id= "SEU_CLIENT_ID"client_secret= "SEU_CLIENT_SECRET"redirect_uri='Exemplo: http://google.com/'

Em seguida precisamos criar um objeto (chamado sp) que será a chave de acesso à API, além de criar uma variável para o username da conta e para a playlist escolhida para a análise. Voce pode fazer isso com o seguinte código.

username='SEU_USUARIO_SPOTIFY'playlist = 'ID_DA_SUA_PLAYLIST'client_credentials_manager = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret)scope = 'user-library-read playlist-read-private'try:     token = util.prompt_for_user_token(username, scope,client_id=client_id, client_secret=client_secret, redirect_uri=redirect_uri)     sp=spotipy.Spotify(auth= token)except:    print('Token is not accesible for ' + username)

Para descobrir o ID da sua playlist, basta ir no aplicativo do Spotify e na opção de compartilhar, selecione “Copiar URI do Spotify”.

O ID será o código alfanumérico, como o exemplo:

Agora que temos os requisitos da API definidos, podemos extrair os dados. Para isso eu usei as seguintes funções, que encontrei neste repositório no github.

import argparseimport pprintimport sysimport osimport subprocessimport jsonimport spotipyimport spotipy.util as utilimport pandas as pdfrom spotipy.oauth2 import SpotifyClientCredentialsclient_credentials_manager = SpotifyClientCredentials()def get_playlist_content(username, playlist_id, sp):    offset = 0    songs = []    while True:       content = sp.user_playlist_tracks(username, playlist_id, fields=None,limit=100, offset=offset, market=None)       songs += content['items']       if content['next'] is not None:         offset += 100       else:         break    with open('{}-{}'.format(username, playlist_id), 'w') as outfile:json.dump(songs, outfile)def get_playlist_audio_features(username, playlist_id, sp):    offset = 0    songs = []    items = []    ids = []    while True:       content = sp.user_playlist_tracks(username, playlist_id, fields=None, limit=100, offset=offset, market=None)       songs += content['items']       if content['next'] is not None:         offset += 100       else:         break    for i in songs:        ids.append(i['track']['id'])    index = 0    audio_features = []    while index < len(ids):         audio_features += sp.audio_features(ids[index:index + 50])         index += 50     features_list = []     for features in audio_features:         features_list.append([features['energy'], features['liveness'],         features['tempo'], features['speechiness'],         features['acousticness'], features['instrumentalness'],         features['time_signature'], features['danceability'],         features['key'], features['duration_ms'],         features['loudness'], features['valence'],         features['mode'], features['type'],         features['uri']])     df = pd.DataFrame(features_list, columns=['energy', 'liveness',         'tempo', 'speechiness',         'acousticness', 'instrumentalness',         'time_signature', 'danceability',         'key', 'duration_ms', 'loudness',         'valence', 'mode', 'type', 'uri'])    df.to_csv('{}-{}.csv'.format(username, playlist_id), index=False)def get_user_playlist(username, sp):    playlists = sp.user_playlists(username)    for playlist in playlists['items']:       print("Name: {}, Number of songs: {}, Playlist ID: {} ".format(playlist['name'].encode('utf8'),       playlist['tracks']['total'],       playlist['id']))

Com esse código, obtemos dois arquivos. Um deles é um Json com dados sobre a Playlist escolhida:

Importante destacar que o arquivo não vem organizado dessa forma, mas com somente um linha. Para deixar no formato padrão de Json, basta você copiar o conteúdo para um formatador online, como esse, e fazer o download do arquivo resultante.

O outro arquivo é o que contém as audio features, ou seja, características de cada música, como sonoridade (loudness) e dancibilidade (danceability). Abaixo você encontra a explicação tirada do site da Web API do Spotify para de cada uma das audio features usadas.

  • key: The estimated overall key of the track. Integers map to pitches using standard
  • acousticness: A confidence measure from 0.0 to 1.0 of whether the track is acoustic. 1.0 represents high confidence the track is acoustic.
  • danceability: Danceability describes how suitable a track is for dancing based on a combination of musical elements including tempo, rhythm stability, beat strength, and overall regularity. A value of 0.0 is least danceable and 1.0 is most danceable.
  • energy: Energy is a measure from 0.0 to 1.0 and represents a perceptual measure of intensity and activity. Typically, energetic tracks feel fast, loud, and noisy. For example, death metal has high energy, while a Bach prelude scores low on the scale. Perceptual features contributing to this attribute include dynamic range, perceived loudness, timbre, onset rate, and general entropy.
  • instrumentalness: Predicts whether a track contains no vocals. “Ooh” and “aah” sounds are treated as instrumental in this context. Rap or spoken word tracks are clearly “vocal”. The closer the instrumentalness value is to 1.0, the greater likelihood the track contains no vocal content. Values above 0.5 are intended to represent instrumental tracks, but confidence is higher as the value approaches 1.0.
  • liveness:Detects the presence of an audience in the recording. Higher liveness values represent an increased probability that the track was performed live. A value above 0.8 provides strong likelihood that the track is live.
  • loudness: The overall loudness of a track in decibels (dB). Loudness values are averaged across the entire track and are useful for comparing relative loudness of tracks. Loudness is the quality of a sound that is the primary psychological correlate of physical strength (amplitude). Values typical range between -60 and 0 db.

Em relação ao arquivo csv contendo as audio features, precisamos tomar um cuidado na hora de importar para o Power BI. Precisamos converter de csv para tipo Excel (xlsx) e substituir os pontos separadores de decimal por vírgulas, pois é dessa forma que o Power BI processa números decimais.

Visualização de dados e Análise

Com os arquivos devidamente tratados, nossos dados estão prontos para a camada de construção das visualizações. Para isso, vamos usar o software Power BI. Para quem não conhece, essa aplicação foi lançada em 2015 pela Microsoft e rapidamente se transformou em líder no mercado de Business Intelligence, muito disso devido a trabalhar com o conceito de Sel-Service BI de forma prática e simples.

Voce pode acessar o dashboard construído através desse link:

https://app.powerbi.com/view?r=eyJrIjoiZmQzYzU4NWEtNTAyZi00NWJiLWE4MzgtY2RlZjc0ZDlkYWMyIiwidCI6IjhlZWNhNDA0LWE0N2QtNDU1NS1hMmQ0LTBmMzYxOTA0MWM5YyJ9

A seguir você pode conferir o resultado de maneira estática (o Power BI permite interação com os gráficos desenvolvidos).

Através do link disponibilizado anteriormente você pode acessar o dashboard e alterar os filtros. Na imagem acima, podemos ver a segunda aba do arquivo, contendo os dados descritivos da playlist. Temos dois gráfico com a funcionalidade de ranking, um para os artistas e outro para os álbuns. Ambos foram criados baseando-se na quantidade de músicas existem na base. Fica claro que a banda Guns N’ Roses e seu álbum mais famoso, Appetite for Destruction, são os mais frequentes.

Clicando sobre o nome de um álbum especifico (dentro do gráfico), a foto de capa dele será renderizada em um dos visuais.

No resto da página temos dois indicadores, duração média das músicas e a popularidade média delas. Ainda temos um gráfico mostrando a data de lançamento das músicas presentes na playlist. Podemos ver uma concentração nos anos 1980 e 2000 (o álbum Appetite for Destruction foi lançado em 1987).

A terceira página foi dedicada a análise das audio features.

O primeiro componente a destacar é o filtro de Artista ou Banda. Todos os gráficos da página são sujeitos a alterações proporcionadas por esse filtro. Na imagem acima, todos os artistas e bandas estão selecionados.

Analisando o gráfico de barras da parte de baixo da página, encontramos os valores médios de audio features para as músicas presentes na playlist. Surpreendentemente, as features com maiores médias foram as referente a energy e danceability. Para uma playlist majoritariamente de Rock foi um pouco de supresa né? 😀

Em relação a variedade da playlist, eu investiguei como as músicas de cada playlist são semelhantes ou diferentes. Por exemplo, uma playlist muito variada significa que o usuário tem muitas músicas de diferentes gêneros. O oposto disso, é uma playlist em que todas as músicas pertencem ao mesmo gênero. Temos que um desvio padrão alto diz que as audio features das minhas músicas não são semelhantes, significando que, por exemplo, poderia ter muitas músicas em que o valor da instrumentalidade é muito alto, além de músicas onde o mesmo valor é realmente baixo. Olhando para o primeiro gráfico de barras podemos analisar essa questão.

Mais uma vez temos uma surpresa, o desvio padrão não foi muito alto, indicando variedade na playlist. A principio pode parecer estranho, por conta de um único gênero musical presente, no caso, o Rock. No entanto, na playlist existem músicas calmas como Patience do Guns N’ Roses e With or Without do U2 bem como as mais agitadas do AC/DC e Linkin Park. Isso pode explicar a variedade detectada no gráfico.

Por último, temos dois gráficos de dispersão do lado direito da página. Através deles podemos analisar correlações entre as audio features. Avaliando a distribuição dos pontos e comparando com a imagem baixo, podemos concluir que existe algum grau de correlação positiva entre as audio features em destaques, no caso: energy, danceability e loudness.

Conclusão

Neste breve artigo eu quis variar um pouco e mostrar um processo de análise de dados partindo, não de um data set pronto, mas do acesso a uma API e do tratamento dos seus registros. Também quis introduzir o Power BI, que é uma poderosa ferramenta de visualização de dados. Através de etapas simples conseguimos tirar conclusões interessantes a partir dos dados.

Se quiser fazer o mesmo processo com sua playlist e esbarrar em alguma dificuldade, conte com a minha ajuda!

Abraço!

Referências

Para a produção desse pequeno projeto, eu tive como base os seguintes artigos do ótimo blog Toward Data Science:

--

--

Gabriel Luz
Gabriel Luz

Estudante de engenharia eletrônica, aspirante a cientista de dados e apaixonado por tecnologia.