Objetivo

Este mini-report é uma brincadeira com os dados de um grupo de Chat WhatsApp da Rede CsF. O código provavelmente deve servir para qualquer grupo, fique a vontade para re-utiliza-lo! A ideia de analise surgiu ao ver um artigo de 2014 que utiliza Excel e outros recursos. Então fiz uma versão equivalente completamente em R :) Enjoy!

Pre-Processamento

Definição de tema dos gráficos.

library(ggplot2)
library(scales)
science_theme = theme(
    panel.background=element_blank(), 
    axis.line=element_blank(),
    text = element_text(size=15, family="Interstate"),
    axis.text.x = element_text(hjust = 0, size=15,color="black"), 
    axis.text.y = element_text(hjust = 0, size=15,color="black"), 
    axis.title.y=element_text(size=15), 
    axis.title.x=element_text(size=15),
    axis.ticks = element_line(colour=NA),
    panel.grid.major = element_line(colour = 'gray', linetype = 'dashed'),
    panel.grid.minor = element_line(colour = NA),  
    panel.background = element_rect(colour = 'white'))

rotate = theme(axis.text.x = element_text(angle = 90,hjust=1))

remove_vertical_lines <-  theme( # remove the vertical grid lines
           panel.grid.major.x = element_blank() ,
           # explicitly set the horizontal lines (or they will disappear too)
           panel.grid.major.y = element_line( size=.1, color="black" )
    ) 

Dados

O arquivo de texto de entrada é o enviado por e-mail usando o aplicativo do WhatsApp. Daqui é separado os delimitadores de data, hora e nome.

zuera <- readLines("~/Desktop/whatsapp_dados_zueira.txt",encoding="UTF-8")
trabalho <- readLines("~/Desktop/whatsapp_dados.txt",encoding="UTF-8")

Pre-Processamento

pre_process <- function(chat){
    'Retorna uma tabela de dados com data, dia e nome'
    #Separa a data (m/d/Y) do restante da mensagem.
    split.string <- strsplit(sub("\\,", "*", chat), "\\*") 
    timestamp <- sapply(split.string,"[",1)
    is.timestamp <- sapply(timestamp, function(x) !all(is.na(as.Date(as.character(x),format="%m/%d/%Y")))) #Ume mensagem pode conter mais de uma linha. Neste caso ignoro a continuacao. 
    timestamp <- timestamp[is.timestamp]
    timestamp <- as.Date(timestamp,format="%m/%d/%Y")
    tail <- sapply(split.string,"[",2)
    tail <- tail[is.timestamp]
    
    #Separa hora
    split.string <- strsplit(sub("\\-", "*", tail), "\\*") 
    hour <- sapply(split.string,"[",1)
    hour <- substr(strptime(hour,format="%I:%M %p",tz="HST"),11,13) #Converte de AM/PM para 24h e remove o campo de minuto
    tail <- sapply(split.string,"[",2)
    
    #Separa nomes
    split.string <- strsplit(sub("\\:", "*", tail), "\\*") 
    is.name <- sapply(split.string,function(x) length(x) > 1) #Mensagens como "Fulano criou o grupo" e "Fulano foi adicionado ao grupo" nao tem ":", e portanto a separacao nao ocorre resultando em um vetor de 1 elemento. Ignoramos esse caso. 
    name <- sapply(split.string,"[",1)
    name <- name[is.name]
    
    #Filtragem dos campos anteriores. 
    #Como filtramos os nomes, precisamos aplicar o filtro ao timestamp e a hora anteriores tambem.
    timestamp <- timestamp[is.name]
    hour <- hour[is.name]
    
    #Coloque todos em uma so tabela
    messages <- data.frame(date=timestamp,hour=hour,name=name)
    
    return(messages)
}

Por fim aplicamos a função de pre-processamento aos dois logs de chat.

zuera <- pre_process(zuera)
trabalho <- pre_process(trabalho)

Visualizações

Qual é o movimento dos dois canais por data?

Chat Zuera

qplot(date, data=zuera, geom="histogram",binwidth=1) + science_theme + rotate + scale_x_date(labels = date_format("%Y-%m-%d"))  + ylab("Frequencia") + xlab("Data") 

Chat Trabalho

qplot(date, data=trabalho, geom="histogram",binwidth=1) + science_theme + rotate  + scale_x_date(labels = date_format("%Y-%m-%d"))  + ylab("Frequencia") + xlab("Data") 

Qual é o movimento por hora?

Chat Zuera

qplot(hour, data=zuera, geom="histogram",binwidth=1) + science_theme + rotate  + ylab("Frequencia") + xlab("Hora") 

Chat Trabalho

qplot(hour, data=trabalho, geom="histogram",binwidth=1) + science_theme + rotate  + ylab("Frequencia") + xlab("Hora") 

Quem posta mais?

Como estes dados mostram também numero de telefone, os gráficos foram omitidos no report público.

qplot(name, data=zuera, geom="histogram",binwidth=1) + science_theme + rotate  + ylab("Frequencia") + xlab("Nome") 
qplot(name, data=trabalho, geom="histogram",binwidth=1) + science_theme + rotate + ylab("Frequencia") + xlab("Nome")