<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Brenda Souza</title>
    <description>The latest articles on Forem by Brenda Souza (@breudes).</description>
    <link>https://forem.com/breudes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F611432%2F58efbc46-200c-46f6-8bd4-26b04cacd4b6.png</url>
      <title>Forem: Brenda Souza</title>
      <link>https://forem.com/breudes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/breudes"/>
    <language>en</language>
    <item>
      <title>Análise de Rede: Playlists do Spotify</title>
      <dc:creator>Brenda Souza</dc:creator>
      <pubDate>Wed, 02 Feb 2022 02:32:20 +0000</pubDate>
      <link>https://forem.com/breudes/analise-de-rede-playlists-do-spotify-3dg0</link>
      <guid>https://forem.com/breudes/analise-de-rede-playlists-do-spotify-3dg0</guid>
      <description>&lt;p&gt;Análises de rede e visualização de gráficos usando Python e Gephi&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivo
&lt;/h2&gt;

&lt;p&gt;Realizar uma análise de redes utilizando como base o conteúdo estudado na disciplina de Análise de Redes, no curso de Bacharelado em Tecnologia da Informação (&lt;a href="https://www.metropoledigital.ufrn.br/portal/" rel="noopener noreferrer"&gt;IMD/UFRN&lt;/a&gt;), ministrada pelo o professor &lt;a href="https://github.com/ivanovitchm" rel="noopener noreferrer"&gt;Ivanovitch Silva&lt;/a&gt;. O conteúdo tem como foco o estudo de hubs e estudo de caso de rede direcionada e de co-ocorrência, explorando métricas globais, distribuição de centralidade e decomposição em cores da rede — tradução livre do inglês — núcleos da rede.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tecnologias Utilizadas
&lt;/h2&gt;

&lt;p&gt;Utilizamos o ambiente (em nuvem) chamado &lt;a href="https://colab.research.google.com/" rel="noopener noreferrer"&gt;Google Colaboratory&lt;/a&gt; (ou apenas Colab), para as análises de rede, e também o programa &lt;a href="https://gephi.org/" rel="noopener noreferrer"&gt;Gephi&lt;/a&gt;, para realizar o deploy da rede gerada. Em relação às análises no Colab, utilizamos a linguagem de programação &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, junto com algumas bibliotecas associadas a ela. Segue a lista das bibliotecas usadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pandas&lt;/li&gt;
&lt;li&gt;Matplotlib&lt;/li&gt;
&lt;li&gt;NetworkX&lt;/li&gt;
&lt;li&gt;Numpy&lt;/li&gt;
&lt;li&gt;Nxviz&lt;/li&gt;
&lt;li&gt;Json&lt;/li&gt;
&lt;li&gt;Scipy&lt;/li&gt;
&lt;li&gt;Seaborn&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Base de Dados
&lt;/h2&gt;

&lt;p&gt;Foi utilizada como base de dados um dataset disponibilizado por &lt;a href="https://github.com/vaslnk" rel="noopener noreferrer"&gt;Jack Vasylenko&lt;/a&gt;, com mil playlists criadas na plataforma de streaming de música Spotify. Cada playlist possui informações sobre ela mesma, e sobre cada música presente nela, porém, focaremos apenas em:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;nome do artista&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URI do artista (indicador que refere-se ao artista, um identificador)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;o nome da playlist em que o artista foi encontrado.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este dataset utilizado na verdade é parte de um dataset maior, utilizado em um projeto onde uma inteligência artificial é treinada para gerar recomendações de músicas, feito pelo o Vasylenko e seu time, para ver mais sobre o projeto deles &lt;a href="https://github.com/vaslnk/Spotify-Song-Recommendation-ML" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tratamento de Dados
&lt;/h2&gt;

&lt;p&gt;O tratamento de dados que realizamos foi apenas o ajuste no nome de artistas que possuíam $$, este caractere é reconhecido no Google Colab como grafia LaTeX e não era reconhecido na parte de gerar o grafo então não era possível salvar o nó com a relação artista e playlist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criação do Grafo
&lt;/h2&gt;

&lt;p&gt;Para gerar o grafo, consideramos que gostaríamos de gerar uma rede de coocorrência, logo, tínhamos três variáveis chaves para considerar: nome do artista, nome da música e nome do álbum. Na perspectiva de música, o artista — neste caso, o nome dele — pareceu ser a variável mais rentável para uma análise de redes com músicas, certo? Então estabelecemos uma relação entre artista e playlist onde a música dele foi adicionada, em outras palavras, definimos uma existência combinada entre artista e playlist.&lt;/p&gt;

&lt;p&gt;Sendo assim, primeiro criamos os nós com as 3 variáveis selecionadas: nome de artista, uri do artista e nome da playlist; nesta etapa, nos certificamos que não houvesse nós duplicados.&lt;br&gt;
Depois, seguimos para criar os edges (ou traduzido do inglês: vértices), que são as conexões entre estes nós. &lt;/p&gt;

&lt;p&gt;Essas conexões podem existir entre um nó e ele mesmo ou um nó e outro nó distinto, por isso, podemos atribuir uma pontuação ao nó de acordo com a quantidade de ligações ele possuí — isso é o que chamamos de o peso de um nó.&lt;/p&gt;

&lt;p&gt;E, por cada relação entre os nós ser uma relação distinta, consideramos que este grafo é um grafo direcionado, em outras palavras, cada vértice possui valor único nesta perspectiva. Ao final da criação do grafo, é possível receber todas essas informações contabilizadas: um grafo direcionado com 9722 nós e 48088 vértices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9q1d4astbxda05x2up0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9q1d4astbxda05x2up0.png" alt="Grafo direcionado gerado e contabilizado." width="551" height="202"&gt;&lt;/a&gt;&lt;br&gt;
Grafo direcionado gerado e contabilizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métricas Globais
&lt;/h2&gt;

&lt;p&gt;Este estudo de rede é realizado com análises que utilizam métricas de distância, conectividade e centralidade. As métricas de distância e conectividade são: excentricidade, periferia, diâmetro e raio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Excentricidade e demais métricas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05c2vx20dcwwoh1rapqt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05c2vx20dcwwoh1rapqt.png" alt="Excentricidade, imagem gerada no Colab." width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Excentricidade, imagem gerada no Colab.&lt;/p&gt;

&lt;p&gt;A excentricidade é a distância máxima de um nó a todos os outros nós da rede. Numa rede de 9722 nós, uma excentricidade máxima, também chamada de diâmetro, de 42, quer dizer que a rede está bem conectada, e uma excentricidade mínima, também chamada de raio, com o valor 18, nos diz que a rede também é bem dispersa, além disso, o grupo com maior excentricidade, a periferia, é composto por somente um artista, com o nome de Mother Mabel Carter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Além das medidas de distância e conectividade, temos outras métricas, as de centralidade compõe o assunto de distribuição da rede. São elas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralidade de Grau (Degree Centrality)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A centralidade de grau assina para cada nó um valor entre 0 e 1 sobre a conectividade do nó, se ele estiver conectado a todos os outros nós, quer dizer que ele tem o maior grau e portanto, uma centralidade de grau máxima. Se não estiver conectado a nenhum nó, o grau dele é 0, portanto, a centralidade de grau dele tem o valor mínimo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzh5dh22b04l7q3yx27ky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzh5dh22b04l7q3yx27ky.png" alt="Centralidade de Grau, imagem gerada no Colab." width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Centralidade de Grau, imagem gerada no Colab.&lt;/p&gt;

&lt;p&gt;Nesse caso, a rede mantém no geral uma homogeneidade e o grau de centralidade não é algo muito variado, ou seja, mesmo Drake com valor de 5,9% de centralidade de grau, o artista mais escutado, atinge comunidades pontuais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralidade de Aproximação (Closeness Centrality)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma medida média de proximidade de um artista a todos os outros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwzuag6xnrs00yj9rvuv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwzuag6xnrs00yj9rvuv.png" alt="Centralidade de Proximidade, imagem gerada no Colab." width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Centralidade de Proximidade, imagem gerada no Colab.&lt;/p&gt;

&lt;p&gt;Aqui já é possível perceber diferenças entre os nós na rede, artistas que não tem um grau de conectividade tão alto conseguem se destacar, por exemplo, The Chainsmokers, que não chega nem ao Top 10 artistas com mais conexões, chega a ser o terceiro em centralidade de proximidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralidade de Intermediação (Betweennes Centrality)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma medida que observa a posição em que o artista está, no caminho mais curto, para todos os outros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuvcw1mu5pcn42y04j6o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuvcw1mu5pcn42y04j6o.png" alt="Centralidade de Intermediação, imagem gerada no Colab." width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Centralidade de Intermediação, imagem gerada no Colab.&lt;/p&gt;

&lt;p&gt;Novamente, assim como a centralidade de grau, a rede é bem homogênea com relação a essa métrica, com destaques para The Rolling Stones, que pouco aparece, ou não aparece, nas outras métricas, porém aqui aparece no Top 10.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralidade de Autovetor (Eigenvector Centrality)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma medida que observa o quão “importante” ou quão conectado estão os “vizinhos” daquele artista.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9383qnbn16yn7ampcs4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9383qnbn16yn7ampcs4c.png" alt="Centralidade de Autovetor, imagem gerada no Colab." width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Centralidade de Autovetor, imagem gerada no Colab.&lt;/p&gt;

&lt;p&gt;Apesar do grafo parecer homogêneo a escala consegue entregar que essa métrica vai superior a 20%. Somente cinco artistas passam 10% nessa métrica, são eles Drake, Rihanna, Kanye West, Chris Brown e Beyoncé. O destaque dessa métrica vai para Miley Cyrus que não obteve métricas expressivas até então, mas entrou dessa vez no Top 10.&lt;/p&gt;

&lt;h2&gt;
  
  
  Análise Bivariada
&lt;/h2&gt;

&lt;p&gt;É uma análise feita com 2 métricas: grau e centralidade de aproximação (Closeness Centrality).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcxlyzxntxgg794a4fb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcxlyzxntxgg794a4fb1.png" alt="Análise Bivariada, imagem gerada no Colab." width="800" height="637"&gt;&lt;/a&gt;&lt;br&gt;
Análise Bivariada, imagem gerada no Colab.&lt;/p&gt;

&lt;p&gt;Na relação de grau e centralidade de aproximação é possível concluir que os nós mais próximos da rede têm, na verdade, menos conexões.&lt;/p&gt;

&lt;h2&gt;
  
  
  Análise Multivariada
&lt;/h2&gt;

&lt;p&gt;Essa é uma análise com múltiplas análises, feitas cada uma com 2 métricas — essas métricas são o grau do nó, já mencionado muito por aqui, e as métricas que envolvem centralidade. Ao todo foram gerados 16 gráficos, relacionando 4 métricas já citadas aqui (Centralidade de Grau, Centralidade de Aproximação, Centralidade Autovetor e Centralidade de Intermediação).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh3xnvu4a422xq72i8vf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmh3xnvu4a422xq72i8vf.png" alt="Multivariada, imagem gerada no Colab." width="800" height="638"&gt;&lt;/a&gt;&lt;br&gt;
Multivariada, imagem gerada no Colab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Análise Decomposição da Rede 2 k-cores mais profundos
&lt;/h2&gt;

&lt;p&gt;A análise de decomposição pode ser comparada, por meio de analogia, a uma cebola e suas camadas, a rede possui camadas de nós e vértices que se conectam entre essas camadas. Nesta parte focamos em analisar o núcleo da rede, mais precisamente, as últimas duas camadas dessa rede.&lt;/p&gt;

&lt;p&gt;No grafo gerado encontramos que o seu núcleo era a trigésima oitava camada encontrada, e sua penúltima camada sendo a trigésima sétima. Para obter o núcleo teríamos que realizar a retirada da chamada “casca”: para obter a camada 38, teríamos que remover todos os nós que tinham menos que 37 conexões (vértices).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd7ngjs90o3raahhdhtm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjd7ngjs90o3raahhdhtm.png" alt="2 k-cores, imagem gerada no Colab." width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
2 k-cores, imagem gerada no Colab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rede gerada via Gephi
&lt;/h2&gt;

&lt;p&gt;A imagem da rede foi feito no Gephi e a rede foi gerada considerando 5 (cinco) hierarquias: Cluster, Coeficiente de Cluster, Grau, Grau de Entrada e Grau de Saída, seguindo esta ordem. &lt;/p&gt;

&lt;p&gt;As medidas de centralidade de intermediação são baixas, ou seja, mesmo o nó mais conectado faz parte de poucos caminhos mais curtos de um nó a outro nó da rede.&lt;/p&gt;

&lt;p&gt;Dessa forma, a rede está bem distribuída e com poucas conexões para fora da comunidade (cluster), o que era esperado de algo tão pessoal como o gosto musical, a tendência é que determinadas pessoas escutem as mesma músicas, ou o mesmo estilo, durante um período de tempo e se elas escutam algo como música Gospel, dificilmente elas iriam escutar Heavy Metal.&lt;/p&gt;

&lt;p&gt;De forma geral, existem três grupos que conseguem “quebrar” as barreiras dos clusters, o grupo em rosa, marrom e verde claro, o grupo em rosa majoritariamente uma comunidade formada por artistas de rap, o grupo em verde claro, rock alternativo, pop e estilos mais lentos, assim como o grupo em marrom que compõe com artistas pop norte-americanos. Esses fariam parte do chamado mainstream musical.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fla0ergifyfla6l763l3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fla0ergifyfla6l763l3p.png" alt="Versão interativa (online) da rede criada." width="800" height="498"&gt;&lt;/a&gt;&lt;br&gt;
Versão interativa (online) da rede criada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore a rede!
&lt;/h2&gt;

&lt;p&gt;Acessar a versão interativa da rede, que colocamos no &lt;a href="https://github.com/paulovanzo/networks/tree/main/Spotify-playlist" rel="noopener noreferrer"&gt;Github&lt;/a&gt;, é uma boa forma de consolidar o estudo que trouxemos neste artigo. Além de ser uma boa visualização do todo, é bom explorar os grupos e membros pertinentes na rede. &lt;a href="https://paulovanzo.github.io/networks/network/" rel="noopener noreferrer"&gt;Confira&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Como esperado de algo pessoal e personalizado, a rede é bem distribuída e de maneira geral, um artista só será escutado por pessoas que escutam outros artistas de gêneros com alguma ligação, nesse caso, houveram algumas exceções como pode ser observado ao pegar os 2 k-core mais profundos da rede, existe um núcleo de artistas que são escutados por quase todo perfil de pessoa no Spotify.&lt;/p&gt;

&lt;p&gt;Este post foi feito como parte de uma atividade avaliativa da disciplina de Análise de Redes. Outros diversos assuntos podem ser analisados utilizando as ferramentas e assuntos que utilizamos aqui.&lt;/p&gt;

&lt;p&gt;Caso deseje, é possível acessar o projeto no &lt;a href="https://github.com/paulovanzo/networks/tree/main/Spotify-playlist" rel="noopener noreferrer"&gt;Github&lt;/a&gt;. Espero que tenha gostado deste post!&lt;/p&gt;

&lt;h2&gt;
  
  
  Autores
&lt;/h2&gt;

&lt;p&gt;Este post, gráficos e códigos utilizados foram feitos por &lt;a href="https://github.com/breudes" rel="noopener noreferrer"&gt;Brenda Silva&lt;/a&gt; e &lt;a href="https://github.com/paulovanzo" rel="noopener noreferrer"&gt;Paulo Vanzolini&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;O post foi originalmente postado no &lt;a href="https://medium.com/@paulovanzolinimouradasilva/an%C3%A1lise-de-rede-playlists-do-spotify-b2806ccd8ea5" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>networkanalysis</category>
      <category>python</category>
      <category>spotify</category>
    </item>
    <item>
      <title>Contagem de Tweets com Python</title>
      <dc:creator>Brenda Souza</dc:creator>
      <pubDate>Wed, 15 Sep 2021 22:51:37 +0000</pubDate>
      <link>https://forem.com/breudes/contagem-de-tweets-com-python-2df9</link>
      <guid>https://forem.com/breudes/contagem-de-tweets-com-python-2df9</guid>
      <description>&lt;p&gt;A API do Twitter é uma ferramenta (do próprio Twitter) que permite ao usuário ter acesso aos tweets produzidos em tempo real, esses tweets podem ser filtrados e analisados conforme o objetivo da pessoa que está utilizando a ferramenta. Neste artigo falaremos sobre contagem de tweets utilizando a API e a linguagem de programação Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conta de Desenvolvedor
&lt;/h2&gt;

&lt;p&gt;Mas antes de utilizar a API, é preciso checar se: 1. Você possui uma conta no Twitter; 2. Você possui perfil de desenvolvedor. Para ter esse perfil é necessário solicitar ao Twitter, solicite &lt;a href="https://developer.twitter.com/en/apply-for-access" rel="noopener noreferrer"&gt;aqui&lt;/a&gt; caso não o tenha.&lt;/p&gt;

&lt;p&gt;Após ter acesso ao seu perfil de desenvolvedor, um painel como este será apresentado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmawrvwmds2dc7jofssjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmawrvwmds2dc7jofssjz.png" alt="Painel inicial do perfil de desenvolvedor." width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para utilizar a API é necessário criar um projeto e uma aplicação vinculada ao projeto. Após a criação do projeto, você terá suas chaves de autenticação. E uma tela como esta mostrará tais chaves: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F00bvskj01w8rhzi64pde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F00bvskj01w8rhzi64pde.png" alt="Painel com chaves de autenticação de um projeto." width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, guarde suas chaves de autenticação e vamos utilizar a API!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conexão com a API
&lt;/h2&gt;

&lt;p&gt;Como dito no título deste artigo, utilizaremos Python. Caso não possua Python instalado em sua máquina, existem duas opções comuns para utilizá-lo: 1. Baixar o Python no &lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;site oficial&lt;/a&gt; e instalar na sua máquina; 2. Caso não queira instalar o Python, também é possível utilizá-lo via &lt;a href="https://colab.research.google.com/" rel="noopener noreferrer"&gt;Google Colab&lt;/a&gt;, basta ter uma conta Google para isso. &lt;/p&gt;

&lt;p&gt;Certas bibliotecas precisam ser importadas via Python, são elas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt; &lt;span class="c1"&gt;# módulo que realiza requisições HTTP/HTTPS
&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="c1"&gt;# módulo para manuseio de objetos json
&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="c1"&gt;# módulo para manuseio de datas e horas
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na ordem que foi mostrado: Requests é um módulo que fazer requisições HTTP/HTTPS; Json é um módulo para manuseio de objetos no formato JSON; Datetime é um módulo para manuseio de datas e horas.&lt;/p&gt;

&lt;p&gt;Agora, precisamos utilizar a chave de autenticação chamada de Bearer Token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="n"&gt;bearer_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XXXXXXXXXXXXXXXXXXXXXXXXXX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para utilizá-la na requisição é necessário criar um cabeçalho com a chave. Neste exemplo, implementamos uma função que cria o cabeçalho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="c1"&gt;# gera o cabeçalho para a requisição com o bearer token
&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bearer_oauth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bearer_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida definir palavras-chave e a query para a requisição. Vale ressaltar que para contagem de tweets, utilizamos o endpoint da API chamado de Tweet Counts, para saber mais sobre ele acesse &lt;a href="https://developer.twitter.com/en/docs/twitter-api/tweets/counts/introduction" rel="noopener noreferrer"&gt;este link&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;O endpoint Tweet Counts é utilizado dado esta URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.twitter.com/2/tweets/counts/recent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, um exemplo de palavras chave e query (consulta) para requisição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="c1"&gt;# palavras-chave
&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vacina covid-19&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
 &lt;span class="c1"&gt;# query 
&lt;/span&gt; &lt;span class="n"&gt;query_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, faremos a requisição à API, e para isso implementamos uma função que realiza a requisição e retorna a resposta em formato JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="c1"&gt;# conecta com o endpoint e retorna a reposta em formato JSON 
&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;connect_to_endpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bearer_oauth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status da requisição: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

      &lt;span class="c1"&gt;# caso ocorra algum erro, uma exceção é lançada
&lt;/span&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="c1"&gt;# retorna o resultado em formato JSON
&lt;/span&gt;      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, basta imprimir a resposta da requisição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;connect_to_endpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esses resultados temos a contagem de tweets por palavras-chave. Esses resultados podem ser analisados, até mesmo responder esta pergunta: quantos tweets foram produzidos, nas últimas 24 horas, sobre o Covid-19?&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Espero que tenha gostado deste artigo, a API do Twitter permite ao usuário fazer muitas coisas interessantes como, por exemplo, análise dos dados presentes nos tweets acessados. Este artigo foi feito com base &lt;a href="https://github.com/breudes/contagem-de-tweets" rel="noopener noreferrer"&gt;neste projeto&lt;/a&gt; que eu implementei para uma disciplina da faculdade.&lt;/p&gt;

&lt;p&gt;É possível utilizar essa API por meio de diferentes tecnologias, Python foi apenas a tecnologia que achei mais confortável para isso.&lt;/p&gt;

&lt;p&gt;Recomendo &lt;a href="https://dev.to/lisandramelo/buscando-tweets-com-a-api-do-twitter-3g1b"&gt;esse artigo&lt;/a&gt;, também relacionado a API do Twitter. Até a próxima! &lt;/p&gt;

</description>
      <category>python</category>
      <category>http</category>
      <category>twitter</category>
      <category>api</category>
    </item>
  </channel>
</rss>
