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!
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" )
)
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_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)
qplot(date, data=zuera, geom="histogram",binwidth=1) + science_theme + rotate + scale_x_date(labels = date_format("%Y-%m-%d")) + ylab("Frequencia") + xlab("Data")
qplot(date, data=trabalho, geom="histogram",binwidth=1) + science_theme + rotate + scale_x_date(labels = date_format("%Y-%m-%d")) + ylab("Frequencia") + xlab("Data")
qplot(hour, data=zuera, geom="histogram",binwidth=1) + science_theme + rotate + ylab("Frequencia") + xlab("Hora")
qplot(hour, data=trabalho, geom="histogram",binwidth=1) + science_theme + rotate + ylab("Frequencia") + xlab("Hora")
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")