Analizando dados de grupos de WhatsApp com python

Matheus Ricardo dos Santos
5 min readNov 5, 2020

Este artigo é uma demonstração de como extrair os dados de uma conversa no WhatsApp e como processá-los utilizando ferramentas do python para obter informções relevantes.

1. Introdução

Antes de começarmos a análise é importante ressaltar que os passos utilizados foram originalmente desenvolvidos por kurasaiteja em um notebook Jupyter. Durante a aplicação dos passos também serão feitas propostas de melhorias com o objetivo de aprimorar a recupeção e visalização dos dados.

O formato dos dados que serão utilizados é referente ao formato exportado pelo aplicativo android do WhatsApp. No entanto, também é possível realizar a análise com os dados exportados por dispositivos IOS neste outro notebook do Kurasaiteja.

2. Exportação dos dados

Para recuperar os dados de uma conversa no WhatsApp basta selecionar a opção ‘Exportar chat’ no canto superior direito do chat. Logo após, você deve selecionar a opção de exportação sem mídia.

O resultado será um arquivo de texto em que cada linha diz respeito a uma mensgem no seguinte formato:

mm/dd/yy, hh:mm - username: conteúdo da mensagem

3. Pré-processamento para a utilização do pandas

Precisamos extrair as informações relevantes de cada linha antes de passar diretamente os dados brutos para o pandas. Para isso, é necessária a criação de uma função capaz de recuperar a data, a hora, o nome do autor e o conteúdo de cada mensagem.

O notebook utilizado como base para a nossa análise já possui uma função capaz de realizar esta ação.

No entanto, ela não é capaz de recuperar o nome do autor quando existe o caractere ‘:’ no conteúdo da mensagem. Isso ocorre devido ao s.plit(‘:’) na função FindAuthor e ao if len(s) == 2.

Para corrigir este problema vamos adicionar um regex para recuperar apenas o nome do autor na função FindAuthor e mudar um pouco a função getDataPoint:

O regex adicionado faz um match com todos os caracteres do início da string até encontrar o primeiro ‘:’.

Após esta correção podemos aplicar a função getDataPoint em cada linha do arquivo de texto e salvar cada output em um array que será convertido para DataFrame. Este passo está disponível e bem comentado no notebook com a análise original.

4. Resultados

O grupo utilizado para a realização da análise foi um grupo de contexto familiar com 24 participantes. Os nomes e números das pessoas não serão expostos nos resultados obtidos.

O primeiro resultado é referente ao número de mensagens exportadas. Ao longo de 2 meses foram enviadas 881 mensagens, 285 imagens/videos, 1752 emojis e 8 links.

Para a contagem dos links o regex utilizado no notebook foi alterado:

# inicialmente recuperava apenas sites com início http
(https?://\S+)
# adicionados outros padrões de url que iniciam com www ou terminam com .com
(https?://\S+)|(www.\S+)|([a-z.]+?.com)

Outro resultado interessante é com relação aos emojis mais utilizados:

  1. 👏🏻 com 741 ocorrências
  2. 😘 com 141 ocorrências
  3. 🎉 com 68 ocorrências
  4. 😂 com 66 ocorrências
  5. 🎂 com 65 ocorrências
  6. 😍 com 52 ocorrências
  7. 🤣 com 35 ocorrências

Isto nos mostra que a maioria dos emojis são utilizados em contexto de mensagens de felicitações por aniversários ou realizações pessais. Os outros emojis mais frequêntes são emojis de conversas mais descontraídas e amigáveis, o que condiz com o contexto familiar.

Também foi analisada a freqência das mensagens em cada dia da semana:

Podemos ver que sexta feira é o dia em que as pessoas mais enviam mensagens no grupo. Isto pode indicar que neste dias as pessoas possuem mais tempo para interagir e, até mesmo, se encontrar pessoalmente.

Para analisar a hora com maior frequência de mensagens precisamos antes fazer uma pequena melhoria no algoritmo do notebook. O código inicial para plotar o gráfico leva em conta os minutos das postagens, isto pode desbalancear o gráfico pois raramente mensagens são enviadas no mesmo minuto todos os dias. Portanto, foi aplicado um regex para recuperar apenas a hora do padrão hh:mm.

# código inicial
messages_df['Time'].value_counts().head(10).plot.barh()
# código alterado
messages_df['Time'].apply(lambda x: re.search(r'^([0-9]+):', x).group(1)).value_counts().head(10).plot.barh()

Podemos ver que a maioria das mensagens são enviadas às 8 e 9 horas. Isto faz muito sentido pois em grupos de contexto familiar normalmente as pessoas enviam mensagens de bom dia no horário em que acordam.

A última análise é referente a uma núvem de palavras gerada pelas palavras mais frequêntes nas mensagens. Nesta parte também é possível fazer uma melhoria no código inicial do notebook.

Basicamente, existem muitas preposições, artigos e pronomes que são bastante recorrentes na mensagens e que podem ‘poluir’ a núvem de palavras. Sem a melhoria no código obtemos esta núvem:

Podemos ver que a núvem possui muitas palavras que não são significativas. Vamos então melhorar parte de seu algoritmo com um regex que elimina palavras de até três letras:

# concatena todas as mensagens e remove as palavras com até três caracteres
" ".join(review for review in messages_df.Message.apply(lambda x: re.sub(r'\b\w{1,3}\b', '', x)))

O resultado após a melhoria é bem mais significativa:

Com base na núvem percebemos que as mensagens são majoritariamente de teor religioso e sentimental com várias felicitações de aniversário.

Uma observação interessante é o ‘Fique Casa’ no canto superior esquedo que é uma marca desse período de pandemia e isolamento sócial.

--

--