PROJETOS EM DATA SCIENCE
Projeto_4: Mineração de Texto
Pós-Graduação em Estatística e Experimentação Agropecuária da Universidade Federal de Lavras (DES/UFLA). Disciplina Tópicos Especiais. Professor Responsável Paulo Henrique. Análise e Visualização de Dados
Introdução
O WhatsApp parece se tornar cada vez mais importante, não apenas como um serviço de mensagens, mas também como uma rede social - graças aos seus recursos de bate-papo em grupos.
Foram utilizados um banco de dados de um grupo pessoal do Whatsapp para fazer uma análise de mineração de dados. O objetivo dessa pesquisa é aprender e aperfeiçoar esse tipo de ferramenta para os específicos dados com texto (strings). Desa forma podemos entender comportamentos, sentimentos e interesse das pessoas envolvidas entre outros objetivos.
Obtendo os dados
Para obter os dados do aplicativo Whatsapp é bem simples. Para recuperação de texto de bate-papo do aplicativo Android ou iOS basta escolher o Configuraço (três pontinho na barra superior) dentro do grupo que deseja obter o banco de dados, selecionar a opção Mais e em seguida exportar os dados na opção Exportar conversa indicando se quer incluir arquivos de mídia ou não. Exportando dados com mídia naturalmente o arquivo ficará mais pesado. E por fim selecione a forma que quer enviar os dado (normalmente no formato .txt).
rwhatsapp é um pacote pequeno, porém robusto, que fornece alguma infraestrutura para trabalhar com dados de texto do WhatsApp R.
Mineração de Texto
Após a instalação do pacote rwhatsapp e a exportação dos dados no grupo do Whatsapp para seu computado, basta importar para o R e começar a análise.
set <- "/home/zarzar/Documentos/UFLA Doutorado/Disciplina/Data Science/Projeto Data Sceince/4_Projeto_Texto/Dados/Grupo Futebol/WT_FUTEBOL.txt"
chat <- rwa_read(set)
chat# A tibble: 1,253 x 6
time author text source emoji emoji_name
<dttm> <fct> <chr> <chr> <lis> <list>
1 2019-09-02 15:50:21 <NA> As mensagens e… /home/zarzar/D… <chr… <chr [0]>
2 2019-09-02 14:27:21 <NA> "Nica Estatís… /home/zarzar/D… <chr… <chr [2]>
3 2019-09-02 15:50:21 <NA> Nica Estatíst… /home/zarzar/D… <chr… <chr [0]>
4 2019-09-02 15:51:21 <NA> Nica Estatíst… /home/zarzar/D… <chr… <chr [0]>
5 2019-09-02 15:52:21 <NA> Você agora é u… /home/zarzar/D… <chr… <chr [0]>
6 2019-09-02 15:53:21 <NA> Cristian Esta… /home/zarzar/D… <chr… <chr [0]>
7 2019-09-02 15:54:21 <NA> Nica Estatíst… /home/zarzar/D… <chr… <chr [0]>
8 2019-09-02 15:55:21 <NA> Cristian Esta… /home/zarzar/D… <chr… <chr [0]>
9 2019-09-02 15:55:21 <NA> Cristian Esta… /home/zarzar/D… <chr… <chr [0]>
10 2019-09-02 16:40:21 Nica Es… "Futebol quint… /home/zarzar/D… <chr… <chr [0]>
# … with 1,243 more rows
Frequência das mensagens enviadas por dia
Inicialmente observamos a frequência das mensagens por dia enviados pelos integrantes do grupo.
# Frequencia das msg por dia
chat %>%
mutate(day = date(time)) %>%
count(day) %>%
ggplot(aes(x = day, y = n)) +
geom_bar(stat = "identity") +
ylab("") + xlab("") +
ggtitle("Messages per day") +
theme_bw()As mensagens durante os três meses de existência do grupo foram constantes ao longo de cada mês. E a pessoa que mais escreveu no grupo foi o Nica, Youre e o terceiro que segue na figura abaixo.
# Pessoas que contribuem mais no grupo
chat %>%
mutate(day = date(time)) %>%
count(author) %>%
ggplot(aes(x = reorder(author, n), y = n)) +
geom_bar(stat = "identity") +
ylab("") + xlab("") +
coord_flip() +
ggtitle("Number of messages") +
theme_bw()Por algum motivo seja interessante saber qual o dia da semana ao longo dos meses, o grupo foi mais ativo. Assim, devemos incluir novas colunas com essas variáveis mes, dia e hora para plotarmos o gráfico ao longo dos meses que se passaram.
# Inserindo a informacao colunas mes, dia e hora
chat <- chat %>% mutate(mes = months(chat$time, abbreviate = TRUE),
dia = weekdays(chat$time, abbreviate = TRUE),
hora = hour(chat$time))
names(chat)[1] "time" "author" "text" "source" "emoji"
[6] "emoji_name" "mes" "dia" "hora"
# Dias por Meses
ggplot(chat, aes(x = reorder(dia, dia, function(x)-length(x)),
fill = reorder(mes,mes, function(x)-length(x)))) +
geom_bar() +
theme_gdocs() +
ggtitle("Dias da semana mais ativos, por mês") +
labs(x = "Dias", y = "Quantidade", fill = "Meses")Dessa forma, concluímos que nas sextas-feiras o grupo foi mais ativo nas conversas e participações. Isso deve-se ao fato de que esse grupo é para as reuniões de futebol na justamente na sexta-feira. E nitidamente os demais dias não temos muita utilização do grupo, embora que mesmo assim eles se comuniquem.
Selecionando os principais ativos no grupo para maiores análises
Vamos fazer uma análise mais detalhada aos principais colaboradores do grupo no whatsapp. Selecionaremos os 10 mais ativos.
[1] "time" "author" "text" "source" "emoji"
[6] "emoji_name" "mes" "dia" "hora"
# A tibble: 33 x 1
author
<fct>
1 <NA>
2 Nica Estatística UFLA
3 Marcel Estatística UFLA
4 Roger UFLA Estatística
5 Youre Estatística UFLA
6 Edilson UFLA Estatística
7 Édipo UFLA Estatística
8 Cristian Estatística UFLA
9 +55 37 9846-6256
10 +55 83 8785-5226
# … with 23 more rows
Frequência de emojis enviados no grupo
Na linguagem textual moderna de redes sociais, aplicativos e interação social virtual como a própria internet, são muito utilizados os famosos emojis. Eles são figuras de carinhas que representam muito o estado emocional e as reações do indivíduo nesses grupos de Whatsapp.
Portanto, abaixo segue um gráfico da frequência dos principais emijis enviados pelos 10 maiores contribuidores do grupo.
# Emojis mais utilizados no grupo
chat %>%
unnest(emoji) %>%
count(author, emoji, sort = TRUE) %>%
group_by(author) %>%
top_n(n = 6, n) %>%
ggplot(aes(x = reorder(emoji, n), y = n, fill = author)) +
geom_col(show.legend = FALSE) +
ylab("") +
xlab("") +
coord_flip() +
facet_wrap(~author, ncol = 2, scales = "free_y") +
ggtitle("Most often used emojis") +
theme_bw()Na maioria a carinha com sorriso e lágrimas de alegria são os mais utilizados. No geral todos acabaram usando os principais emojis para o grupo. No entanto, apenas um integrante usou os olhos e apenas ele. Para o integrante Nica e Edílson, a mão fechada foi bem também.
Principais palavras
Uma análise muito importante é saber as principais palavras utilizadas no grupo. Porém ates de fazer essa análise precisamos limpar o banco de dados com algumas palavras não muito significativa utilizada na linguagem portuguesa e outras palavras muito utilizada no grupo que não significa muita coisa para o analista de mineração de texto.
Essas palávras são para o português:
[1] "de" "a" "o" "que" "e" "do" "da" "em"
[9] "um" "para" "com" "não" "uma" "os" "no" "se"
[17] "na" "por" "mais" "as" "dos" "como" "mas" "ao"
[25] "ele" "das" "à" "seu" "sua" "ou" "quando" "muito"
[33] "nos" "já" "eu" "também" "só" "pelo" "pela" "até"
[41] "isso" "ela" "entre" "depois" "sem" "mesmo" "aos" "seus"
[49] "quem" "nas" "me" "esse" "eles" "você" "essa" "num"
[57] "nem" "suas" "meu" "às" "minha" "numa" "pelos" "elas"
[65] "qual" "nós" "lhe" "deles" "essas" "esses" "pelas" "este"
[73] "dele" "tu" "te"
[ reached getOption("max.print") -- omitted 128 entries ]
E como estamos utilizando o banco de dados do whatsapp, também precisamos excluir da análise as palavras: mídia, oculto, arquivo pois são palavras que o aplicativo escreve cada vez que alguém manda uma mensagem no formato de imagem ou na forma de mídia (áudio).
# removendo as palavras nao uteis
to_remove <- c(stopwords(language = "pt"),
"mídia",
"oculto",
"arquivo",
"é")# Principais palavras utilizadas
chat %>%
unnest_tokens(input = text,
output = word) %>%
filter(!word %in% to_remove) %>%
count(author, word, sort = TRUE) %>%
group_by(author) %>%
top_n(n = 6, n) %>%
ggplot(aes(x = reorder_within(word, n, author), y = n, fill = author)) +
geom_col(show.legend = FALSE) +
ylab("") +
xlab("") +
coord_flip() +
facet_wrap(~author, ncol = 2, scales = "free_y") +
scale_x_reordered() +
ggtitle("Most often used words") +
theme_bw()Diversidade lexical
Diversidade lexical é a análise das palávras únicas mais utilizadas no grupo e quem o escreveu.
# diversidade lexical - quantas palavras únicas são usadas por um autor
chat %>%
unnest_tokens(input = text,
output = word) %>%
filter(!word %in% to_remove) %>%
group_by(author) %>%
summarise(lex_diversity = n_distinct(word)) %>%
arrange(desc(lex_diversity)) %>%
ggplot(aes(x = reorder(author, lex_diversity),
y = lex_diversity,
fill = author)) +
geom_col(show.legend = FALSE) +
scale_y_continuous(expand = (mult = c(0, 0, 0, 500))) +
geom_text(aes(label = scales::comma(lex_diversity)), hjust = -0.1) +
ylab("unique words") +
xlab("") +
ggtitle("Lexical Diversity") +
theme_bw() +
coord_flip()Uma vez que o integrante Youre foi quem mais escreveu palávras únicas no grupo. Queremos saber quais foram essas palávras. Dessa forma segue o gráfico abaixo.
# Quais as palavras unicas mais utilizada por Youre
o_words <- chat %>%
unnest_tokens(input = text,
output = word) %>%
filter(author != "Youre Estatística UFLA") %>%
count(word, sort = TRUE)
chat %>%
unnest_tokens(input = text,
output = word) %>%
filter(author == "Youre Estatística UFLA") %>%
count(word, sort = TRUE) %>%
filter(!word %in% o_words$word) %>% # only select words nobody else uses
top_n(n = 6, n) %>%
ggplot(aes(x = reorder(word, n), y = n)) +
geom_col(show.legend = FALSE) +
ylab("") + xlab("") +
coord_flip() +
ggtitle("Unique words of Youre") +
theme_bw()