Clustering com dados do Spotify

Clustering, que consiste no agrupamento de conjuntos de dados semelhantes, é um sistema de recomendação muito utilizado por gigantes da internet, como a Amazon, Netflix e o Spotify, para entregar as melhores recomendações aos seus usuários.

--

Uma das plataformas de streaming, sistema que consiste em não precisar baixar o conteúdo em seu celular ou computador para utilizá-lo, mais usadas no mundo, o Spotify reúne músicas e poadcasts dos mais variados estilos e temas.

Lançado em 2008, o Spotify é plataforma em que o usuário assina, com um valor em torno de R$ 15,00 mensais, e pode ouvir e fazer o download de quantas músicas quiser, para ouvir em qualquer momento do dia.

Além das músicas, atualmente existem diversos poadcasts disponíveis, tanto para quem quer ouvir a previsão do seu signo, quanto se atualizar com as notícias do mundo ou aprender inglês.

Sistemas de recomendação

Um dos sistemas de recomendação mais utilizados no mundo, a clustering consiste no agrupamento de dados semelhantes, sejam músicas, filmes ou até pessoas, como é o caso da recomendação de amigos no Facebook.

Um exemplo disso são as recomendações da Netflix. Repare que após assistir a um filme de faroeste, irão surgir várias recomendações de filmes desse estilo, pois o algoritmo entende que por você ter assistido esse filme, irá gostar de filmes parecidos.

Um ponto positivo disso é que quanto mais filmes você assiste, mais o algoritmo vai se aprimorando e conhecendo o seu gosto. O ponto negativo é que às vezes fica difícil sair dessa “bolha”, como quando vai escolher um filme e sempre aparecem as mesmas recomendações.

O algoritmo

Para fazer a separação desses dados em vários grupos, também chamados de clusters, utilizaremos o algoritmo K-Means. Ele funciona calculando a distância dos pontos, que no caso do Spotify são as músicas, até os centroides. Assim, o ponto vai pertencer ao centroide mais próximo dele.

No GIF acima podemos notar que existem três clusters: vermelho, azul e verde. O K-Means dispõe esses pontos de uma maneira que os dados fiquem distribuídos de maneiras iguais, tendo a quantidade de pontos de cada cluster bem próximas umas das outras.

Só temos que tomar cuidado com duas coisas ao usar esse método:

  • Os dados precisam estar todos na mesma escala.
  • O algoritmo não define a quantidade de clusters, nós que precisamos defini-los.

Dados

Usaremos como dataset um conjunto de dados obtido algum tempo atrás a partir da API do Spotify, com as 300 músicas mais tocadas no Brasil na época. Com essa API também é possível pegar os dados de uma playlist que você mesmo criou, com seus artistas e músicas favoritos.

Caso queira saber o passo a passo de como pegar esses dados, aconselho essa publicação aqui, que além de mostrar como conectar na API, faz uma análise desses dados no Power BI, facilitando muito a visualização. Recomendo também a leitura do material disponibilizado pelo próprio Spotify, no Spotify for Developers.

Agora vamos conhecer nosso dataset:

Dicionário de variáveis

Antes de trabalharmos com esses dados, precisamos conhecer as suas variáveis. Devido à quantidade de campos, irei elencar apenas alguns:

  • Artist_name: Nome do artista.
  • Track_name: Nome da música.
  • Track_id: ID da música.
  • Popularity: Popularidade da música, que varia de 0 até 100.
  • Danceability: Esse campo define o quão dançável é a música. Varia de 0 até 1, menos e mais dançável, respectivamente.
  • Energy: Energia que varia de 0.0 até 1.0, representa o quão intensa é a música. Um death metal terá uma energia maior que um samba romântico, por exemplo.
  • Speechiness: Detecta o quão falada é a música. Quanto mais próxima de 1, mais falada ela é. Um poadcast teria um valor mais próximo a 1, por exemplo.
  • Acousticness: Uma medida de confiança de 0.0 a 1.0 para saber se a faixa é acústica. 1.0 representa alta confiança de que a faixa é acústica.
  • Instrumentalness: Prevê se uma faixa não contém vocais. Os sons “ooh” e “aah” são tratados como instrumentais neste contexto. Faixas de rap ou palavra falada são claramente “vocais”. Quanto mais próximo o valor da instrumentalidade estiver de 1.0, maior será a probabilidade de a faixa não conter conteúdo vocal.
  • Liveness: Detecta a presença de um público na gravação. Um valor acima de 0.8 fornece uma grande probabilidade de que a faixa esteja ao vivo.
  • Valence: Uma medida de 0.0 a 1.0 que descreve a positividade musical transmitida por uma faixa. Faixas com alta valência soam mais positivas (por exemplo, feliz, alegre, eufórico), enquanto faixas com baixa valência soam mais negativas (por exemplo, triste, deprimido, com raiva).
  • Tempo: O tempo estimado geral de uma faixa em batidas por minuto (BPM).
  • Duration_ms: A duração da faixa em milissegundos.

Escala dos dados

Para trabalharmos com o algoritmo K-Means precisamos nos certificar que os dados estão todos na mesma escala, pois como trabalha com a distância entre pontos, é altamente sensível.

Então, iremos colocar todos os dados em uma escala entre 0 e 1, utilizando a ferramenta MinMaxScaler. Essa técnica também pode ser utilizada para diminuir o impacto de outliers.

O primeiro passo para isso, é criar um novo dataframe somente com as variáveis numéricas, que iremos chamar de “df_num”, e depois usar o seguinte comando:

Onde teremos algo parecido com isso:

Repare que todos os números estão entre 0 e 1, que é o nosso objetivo.

Quantidade de clusters

Um dos métodos mais utilizados para sabermos a quantidade de separações/clusters que teremos é o Elbow Method — Método do Cotovelo, em tradução livre — que compara a distância média entre cada ponto e o centro do cluster.

Nesse projeto não irei entrar a fundo na explicação do método. Caso queira conhecer um pouco mais sobre ele, recomendo dar uma olhada aqui.

Basicamente, queremos pegar a quantidade de clusters que tenha o menor WCSS (within-clusters sum-of-squares) possível. Repare que quando passamos de um para dois clusters, o WCSS varia consideravelmente, mas conforme vamos aumentando a quantidade, essa variação diminui.

Para ajudar na nossa análise, vamos analisar a diferença entre os WCSS, usando o seguinte comando:

Como a diferença a partir de 6 clusters é muito pequena, vamos utilizar essa quantidade.

Depois de instanciar nosso modelo, definir a quantidade de clusters e configurar a imagem em 3D, teremos o seguinte resultado:

Previsões

Agora que já temos definido a quantidade de clusters e suas separações, precisamos concatenar esse resultado com a tabela que se encontram os nomes das músicas e seus artistas responsáveis.

A definição das clusters são dispostas da seguinte maneira:

Sendo assim, precisamos juntar com o nosso primeiro conjunto de dados e suas respectivas linhas. Após fazer isso, podemos verificar como uma das clusters ficou, nesse caso a número 1:

Note que nessa cluster ficaram músicas e artistas mais voltados para o sertanejo e forró, o que faz sentido pelo estilo das músicas.

Resultado final

Agora que conseguimos fazer a separação das músicas, podemos encerrar esse pequeno projeto. Caso queira ver como ficou o resultado final, com todas as separações e músicas, disponibilizei nesse link, no plotly.

Muito obrigado por estar aqui acompanhando esse pequeno projeto, nos vemos no próximo. Não esqueça de deixar seus “aplausos” e qualquer dúvida pode me chamar no LinkedIn ou Instragram.

Até a próxima!

--

--