Clustering e Visualização de Dados: Aplicação em uma playlist do Spotify usando K-Means, t-SNE e PCA

Lara Galvani
Data Hackers
Published in
6 min readApr 12, 2020

Introdução

O objetivo desse artigo é demonstrar como coletar informações através da Web API do Spotify, agrupar músicas de acordo com a similaridade de suas features utilizando o K-Means e visualizar esses dados usando técnicas de redução de dimensionalidade com t-SNE e PCA.

Obtenção dos dados através da Web API do Spotify

Primeiramente, para que o projeto possa acessar os dados da API do Spotify, é preciso criar um “Client ID” em Spotify for Developers (Dashboard -> Log in -> Create a Client ID).

Instale e importe a biblioteca Spotipy, responsável por acessar o conteúdo disponibilizado pelo Spotify. Insira os dados obtidos ao final do processo de criação do Client ID em SPOTIPY_CLIENT_ID e SPOTIPY_CLIENT_SECRET.

Análise da playlist

Em “user” insira o seu nome de usuário. Para verificar as playlists presentes na na sua conta basta usar a chave de acesso aos dados do Spotify, representada pelo objeto “spotify” criado, como mostra a imagem acima.

Insira o ID da sua playlist em “chosen_playlist”. Em seguida, para agrupar as músicas e criar um Data Frame basta, novamente, usar o objeto “spotify”.

A análise da playlist foi feita a partir de informações de cada música , chamadas “Audio Features”, disponibilizadas pelo Spotify. Esses indicadores mostram o quão positiva a música soa, o quanto é apropriada para dançar, intensidade, sonoridade, entre outros aspectos. O Data Frame criado, como mostram as figuras abaixo, conta também com o nome, artista e id de cada música.

Analisando o heatmap abaixo, podemos verificar as correlações entre as features. As escolhidas foram “danceability”, “energy”, “speechiness”, ”acousticness”, “instrumentalness” e “valence”.

Como as features escolhidas já estavam normalizadas, não foi necessário realizar nenhuma transformação no conjunto de dados.

O gráfico abaixo mostra a relação entre as features e a média de seus valores. Podemos perceber que, de modo geral, a presença da feature “energy” é alta na playlist, evidenciando uma grande quantidade de músicas agitadas e barulhentas.

Aplicando algoritmos de Machine Learning

De modo a agrupar as músicas de acordo com a similaridade entre elas, o algoritmo usado foi o K-Means, o qual encontra e divide as instâncias em um número predefinido de clusters. O K-Means foi escolhido pelo fato de ter se ajustado melhor ao conjunto de dados, levando em consideração outros algoritmos de Clustering.

Basicamente, esse algoritmo define centros (de acordo com a quantidade “k” de clusters) e, para cada uma das instâncias, verifica qual o centróide mais próximo e calcula a média com base nesses agrupamentos.

Apesar de não ser o mais eficiente, o “Elbow Method” foi mais adequado para a situação e, dessa forma, foi usado para a definição do número de clusters.

Para determinar o número de clusters, é necessário selecionar o valor de “k” no ponto após o qual a distorção começa a diminuir de maneira linear. Analisando a imagem abaixo, é possível perceber que isso ocorre quando k=4. Portanto, trabalharemos com 4 clusters.

Usando o K-Means para treinar o modelo e prever o cluster de cada uma das músicas, obtemos os resultados apresentados abaixo.

Pelo fato de trabalharmos com 6 features, e considerando que cada feature representaria uma dimensão, não seria possível visualizar esses clusters. Para visualizar os dados agrupados, usaremos dois algoritmos: PCA e t-SNE. Estes são responsáveis por aplicar técnicas de redução de dimensionalidade e, dessa forma, possibilitar a visualização dos clusters em 2d.

O t-SNE, apresentado abaixo, procura preservar pequenas distâncias aos pares.

O PCA (Principal Component Analysis), apresentado abaixo, busca preservar grandes distâncias aos pares.

Quantidade de músicas em cada cluster

Insights:

  1. O “Cluster 0” é adequado para dançar, possui várias músicas acústicas e tem, predominantemente, faixas lentas. Este é o grupo onde estão presentes, em sua maioria, faixas mais tranquilas.
  2. O “Cluster 1” , apesar de ser o menos adequado para dançar, é o que conta com a maior quantidade de músicas agitadas e barulhentas. Muito provavelmente, as faixas de Rock/Pop Rock predominam neste grupo.
  3. O “Cluster 2” conta com músicas agitadas e estas nem sempre tendem a ser muito felizes. Apesar disso, é o grupo onde as faixas são mais adequadas para dançar.
  4. O “Cluster 3” é adequado para dançar, as músicas são predominantemente barulhentas e felizes. Este é o grupo onde as faixas tendem a ser mais alegres e agitadas.

Para ilustrar os insights citados acima, na figura abaixo estão as músicas presentes no Cluster 1, onde as faixas tendem a ser mais agitadas e barulhentas e, muito provavelmente, dos gêneros Pop Rock ou Rock.

Bônus: Testando modelos para prever o cluster de cada música

Após a etapa de clustering, o grupo de dados passou a ter uma classe, o que significa que agora podemos utilizar algum modelo para prever um rótulo para cada uma das instâncias.

Pelo fato do número de músicas em cada cluster não ser equilibrado, o SMOTE foi usado para fazer um balanceamento nos dados de treino, ou seja, distribuí-los mais uniformemente.

A validação cruzada foi usada para prever qual seria o modelo que melhor se ajustaria ao conjunto de dados. Foram testados os seguintes algoritmos:

  1. SVC (Support Vector Classification) com kernel linear
  2. Random Forest Classifier
  3. SVC (Support Vector Classification)
  4. K-Neighbors Classifier

A imagem acima nos mostra que, com uma média de 96,72% de acurácia, o algoritmo que mais se ajustou aos dados foi o SVC.

Após usar o SVC para treinar o modelo, obtivemos uma acurácia de 97,95%.

Conclusão

A partir de uma analisar dados extraídos da Web API do Spotify, foi possível agrupar músicas de acordo com a similaridade de suas features. Para realizar esse processo, o algoritmo utilizado foi o K-Means. Em seguida, no quesito de visualização, foram utilizados os algoritmos PCA e t-SNE que, através de técnicas de redução de dimensionalidade, possibilitaram a visualização dos dados em duas dimensões. Ao final desse processo, verificando a média das features de cada um dos clusters, tivemos insights sobre as músicas presentes em cada grupo.

Obrigada por ler e, caso queira, deixe seu feedback aqui ou no LinkedIn.

O código está disponível no meu Github.

--

--