Bot or Not: Detectando robôs no Twitter

E aí, galeris?

Desculpa o sumiço, início de semestre da faculdade é sempre correria mas pra compensar trouxe esse post supimpa ensinando a analisar usuários com comportamento automatizados no Twitter, os famosos bots, usando o pacote TweetBotOrNot disponibilizado 15 dias atrás pelo Michael Wayne Kearney, @kearneymw no Twitter. Além de mostrar como usar o pacote, coloquei nesse post uma análise que fiz de 83 mil usuários participantes dos movimentos de SDV (Segue de  Volta), especificamente os criados pela usuária @detremura.

No Twitter, atualmente, somos 330 milhões de usuários ativos mensalmente no mundo todo, e a quantidade exata de bots é desconhecida.. O Twitter afirma que contas falsas ou spammers representam apenas 5% dos seus usuários ativos. No entanto, um número de pesquisadores acredita que o número real pode ser tão alto quanto 15% (neste momento, quase 50 milhões de contas). Seja 5% ou 15%, a necessidade de estratégias para a detecção de bots no Twitter é crucial para garantir a credibilidade e segurança dos serviços que usam o Twitter como fonte de dados.

O pacote TweetBotOrNot utiliza deep learning para analisar metadados de usuários e tweets e classificar o comportamento como sendo um robô ou não. Dentre alguns aspectos analisados estão, a nível de usuário, descrição do perfil(bio), localização, número de seguidores e amigos, etc. e a nível de tweets estão número de hashtags, menções, letras maiúsculas, etc. No modelo padrão, que utiliza modelos de regressão generalizada reforçada,  a precisão de acerto em classificar bots é de 93,53% e de 95,32% para classificar os não bots. O pacote pode ser acessado no github do Kearney. No final do post coloquei  algumas críticas sobre esse pacote.

Nesse tutorial será usado 7 pacotes, além do TweetBotOrNot:

  • devtools: esse pacote está sendo usado nesse tutorial para baixar o pacote principal, TweetBotOrNot, direto do github do autor, uma vez que por ser muito novo ainda não se encontra nos repositórios oficiais do R;
  • rtweet: Esse pacote também é de criação do Kearney e voltado apra extração de dados do Twitter. Por ser do mesmo autor, o pacote TweetBotOrNot e rtweet estão intimamente ligados;
  • lubridate: Pacote de manipulação de dados, principlamente voltado para séries temporais;
  • plotly: Pacote de visualização de dados de forma interativa (vou tentar usar ele mais vezes aqui no blog).
  • tidyr : Manipulação de dados
  • graphTweets e igraph: criação e manipulação de dados do tipo grafo.

 

 

Como teste inicial, coloquei alguns usuários, sendo alguns bots, que eu gosto de seguir para classificar usando o pacote. A função TweetBotOrNot()  usada abaixo busca pelos dados desses usuários, usando como padrão os 100 últimos tweets e os dados de perfil, e retorna a probabilidade dele ser um bot. 

 

 

Na análise que fiz, adotei que perfis com mais de 50% de probabilidade são bots. Encontrei alguns falsos negativos, como o caso do @randomGraphs (vale a pena dar uma olhada no github desse bot), devido as característica de postagem mais humanas que ele possui e por isso abaixo de 50%, mas é um bot. 

Quanto maior a quantidade de dados disponibilizada para a classificação, maior acurácia terá o resultado final. Pensando nisso, o Kearney utilizou a função get_timelines()  do pacote rtweet para dar mais insumos de análise a função TweetBotOrNot() . Usando a get_timelines()  é possível sair do default de 100 tweets por usuário aumentando até 3200, máximo permitido pela API do Twitter. 

 

 

Para grande quantidade de verificações, o Kearney criou um argumento fast = TRUE , esse argumento aumenta o número de usuários analisados, saindo de 180 a cada 15 minutos para 90 mil. Isso acontece porque nesse modo só os metadados de perfil são usados (excluindo a análise de padrão de tweets). Mas é aquilo ~ nada é de graça ~ aumenta-se a quantidade de verificação e perde-se a acurácia, caindo para 91.9%. 

 

 

Buscando popularizar o pacote e levar ele para não programadores, o próprio Kearney criou uma página que roda o pacote online, onde é possível inserir o usuário e ter a classificação.

 

 

 

Eu descobri o pacote TweetBotOrNot quando estava fazendo a busca por metodologias de análise, que suportassem uma quantidade grande de inputs de dados, e que fosse possível fazer no meu humilde computador pessoal. A ideia era sair um artigo acadêmico disso, mas acabou virando esse post. Como objeto de estudo, escolhi as hashtags criadas pela usuária @detremura. Essas hashtags estão aparecendo nos trending topics do Twitter todo santo dia e desconfiei desse fôlego longo que essa ‘campanha’ tem, a ponto de durar anos. Uma das hipóteses era de que essa usuária usava bots para alavancar a hashtag e aumentar o seu capital social dentro e fora da plataforma, o que já acontece na forma de entrevistas, troca de mensagens com famosos e ganhado um status de influenciadora.

 

 

Para extrair os dados, usei a função Map(), agregado com a função search_tweets(), do pacote rtweet, para buscar as hashtags de cada dia. A busca pode ser feita também usando um formato mais simples, como o exemplo da busca pela hashtag #DeixaElaTrabalhar.

 

 

Fiquei durante um mês realizando a mesma busca semanalmente. No final, obtive um dataframe com um pouco mais de 1 milhão de tweets ou, para ser mais exato, 1.005.900 tweets. Esse dataframe tornou-se a minha base de análise inicial.

Eu estou aprendendo a programar sozinho, logo, eu aprendo ao estilo POG – Programação Orientada a Gambiarra. Aqui eu usei o POG para colocar os dados no fuso horário brasileiro (-3 horas do meridiano). Fiz uma visualização por dia dos dados que estavam na minha base.

 

 

 

Para entender de forma mais minuciosa, fiz a visualização por faixa horária também.

 

 

Para compreender a participação de cada usuário, criei um dataframe de contagem que me retorna quantos tweets de cada usuário estão na base. No final, obtive a participação de 83.017 usuários.

 

 

Bateu aquela curiosidade pra saber se a @detremura era a participante que mais interagia dentro das hashtags, então criei essa visualização que me fornece o usuário mais ativo e o seu comportamento de participação por hora.

 

 

Como resultado obtive:

 

 

Percebe-se que esse usuário tem maior atividade pela parte da manhã, com pico às 8 horas. 

Para saber a quantidade de bots dentro da base, usei a função TweetBotOrNot() , juntamente com o argumento fast = TRUE, para saber a probabilidade de cada usuário ser ou não bot. Note que eu usei o user id como instrumento de busca, essa escolha foi feita devido a um comportamento dos usuários monitorados dessa hashtag que é a modificação constante de screen name. Para melhor visualização, criei um gráfico separando as probabilidade em decil. Acima de 50% de chances estão em vermelho.

 

 

Abaixo o gráfico gerado:

 

 

Usando a função TweetBotOrNot()  foi possivel estabelecer que 52.7% desses usuários são bots.

Como eu gosto muito de estudar análise de redes, vi que seria bem interessante usar a metodologia aplicada para observar as interações dos usuários, bots ou não. Sendo assim, usei a função get_timelines()  para buscar esses dados. O Kearney, maravilhoso ele, trabalhou na criação dessa função que ajuda na extração de timelines de muitos usuários.

 

 

De posse dos dados das 100 ultimas interações de cada usuário, criei uma função que separa em duas colunas, uma de quem tweetou e outra de quem foi citado no tweet. No final, foi gerado um arquivo graphml, que foi aberto no Gephi e depois de aplicado todos algoritmos me trouxe ainda mais informação sobre esses usuários.

 

 

No Gephi, gerei essa rede:

 

Essa rede ficou confusa, mas os pontos principais são:

  • Do lado direito, em azul e rosa, temos os bots e os usuários super engajados, tendo os maiores graus de saída (usuários que mais tweetam). No cluster azul fica claro a participação de bots da língua inglesa;
  • No centro, em verde, temos a @detremura e vários outros usuários que são responsáveis por iniciar o movimento todo dia. O interessante é que por serem referência acabam tento os maiores graus de entrada, ou seja, são os usuários mais citados/mencionados;
  • A @detremura é a usuária mais mencionada na rede;
  • Em roxo e preto, temos os usuários que acabam sendo levados para a conversa, o @Whindersson é o usuário mais mencionado do cluster roxo. Esses dois clusters tem a maioria dos seus nós com grau de saída zero.

Para uma análise mais aprofundada, valeria a pena olha os clusters com mais atenção, importar os dados de bot ou não para dentro do Gephi, separar pelos usuários que falam apenas em português, determinar a taxa de troca de screen name, utilizar o modo padrão ao invés do modo fast na classificação, dentre outras questões (algumas até metodológicas). 

Ao meu ver, o pacote TweetBotOrNot tem uma grande perda ao só usar os metadados, claro que isso aumenta a facilidade de análise, mas o uso de dados extraídos do conteúdo do tweet poderiam aumentar ainda mais a acurácia, algo como análise de co-ocorrência, estrutura de sentenças e outros recursos de PNL, número total de palavras, contagens de caracteres, imagens e vídeos, etc. poderiam ser usados para determinar a similaridade de uma conta entre bots e não-bots – em vez de confiar essencialmente na similaridade de metadados. A comunidade já está estudando o pacote e percebendo um número relevante de falsos positivos e falsos negativos entre as probabilidades, acho que a crítica que fiz acima poderia diminuir esse número. 

É isso galera, obrigado pela paciência de ler até aqui e espero que esse tutorial posso ajudar vocês.

Qualquer crítica, sugestão ou ideias é só colocar nos comentários abaixo!

Escrito por Janderson Toth

Sou o Janderson, 25 anos, graduando em Estudos de Mídia/UFF e pesquisador em análise de dados na Diretoria de Análises de Políticas Públicas da FGV(DAPP). Vivo fazendo tutorias, me perco nos animes e meu super-herói favorito é o John Constantine. Sou igual a um Pokémon: cada dia evoluindo mais!