El objetivo de este ejercicio es emplear los diferentes paquetes de R para hacer un análisis de un chat de WhatsApp. Se usó RMarkdown para hacer éste análisis y se publicó vía RStudio en RPubs.com.
Se exportó, desde el celular, el mes de octubre del chat de mis compañeros egresados de la Universidad. El 27 de octubre se realizaron las elecciones Regionales de colombia 2019, lo cual hizo que se enviaran muchos mensajes, esto hace más divertido y variado este análisis.
El paquete rwhatsapp, escrito por Johannes B. Gruber, es el empleado para leer el chat exportado.
Primero se cargan todos los paquetes a utilizar, luego se lee el chat del directorio de trabajo, se crea una nueva columna, llamada day usando la función mutate, para identificar el día, y se filtra el mes del estudio:
library("rwhatsapp") # Permite rwa_read para leer el chat
setwd("C:/Users/Gustavo/OneDrive/R_WhatsApp") # directorio de trabajo
chat <- rwa_read("ChatUNINORTE.txt") # Lee el chat exportado
Chat_completo <- chat # Copia para filtros
library("dplyr") # Habilita la sintaxis %>% de tuberIa
library("ggplot2") # grAfica
library("lubridate") # mutate
# Filtro para el mes de Octubre
chat <- Chat_completo %>%
mutate(day = date(time)) %>% # crea la columna dIa
filter(day >= "2019-10-01" & day <= "2019-10-31")
library("tidyr") # Habilita el unnest para leer las listas de emojis
library("tidytext") #
library("stopwords") # lExico para eliminar palabras
head(chat,4) # Se exploran las primeras observaciones
## # A tibble: 4 x 7
## time author text source emoji emoji_name day
## <dttm> <fct> <chr> <chr> <lis> <list> <date>
## 1 2019-10-01 05:33:40 <NA> Los mensa~ ChatUN~ <chr~ <chr [0]> 2019-10-01
## 2 2019-10-01 05:33:40 Nan <Multimed~ ChatUN~ <chr~ <chr [0]> 2019-10-01
## 3 2019-10-01 05:35:40 ~Jose "\U0001f6~ ChatUN~ <chr~ <chr [4]> 2019-10-01
## 4 2019-10-01 05:35:40 ~Jose Esa vieja~ ChatUN~ <chr~ <chr [0]> 2019-10-01
dim(chat) # Dimensiones del chat
## [1] 5755 7
Se revisan los primeros 4 registros de un base de 5754 mensajes, se omite el primer registro que es el mensaje de cifrado del chat, y las 7 variables .
Se calculan unas estadísticas descriptivas básicas: mínimo, promedio y máximo.
Se agrupan los mensajes de cada día y se envían a una gráfica de ggplot. Se adiciona una línea de tendencia con intervalo de confianza.
descriptivas <- unlist(chat %>% # Se calculan las estadIsticas descriptivas bAsicas
group_by(day) %>%
summarise(mensajes=n()) %>%
summarise(min(mensajes),round(mean(mensajes)),max(mensajes)))
chat %>%
count(day) %>%
ggplot(aes(x = day, y = n)) + # Define el Area estEtica
geom_bar(stat = "identity", fill="blue", alpha=0.5) + # Define la geometrIa tipo barra
ylab("# de mensajes") + xlab("dIa") +
ggtitle("Mensajes por dIa del mes") +
geom_hline(yintercept=descriptivas[2]) + # Adiciona la lInea del promedio
geom_text(aes(x=date("2019-09-28"),y=descriptivas[2]+10, label=paste0("promedio",descriptivas[2])),nudge_x = 2, color="black") +
geom_text(aes(x=date("2019-09-27"),y=descriptivas[1], label=descriptivas[1]),nudge_x = 2, color="black") +
geom_text(aes(x=date("2019-10-26"),y=descriptivas[3]+10, label=descriptivas[3]),nudge_x = 2, color="black") +
geom_smooth(fill="grey") # Adiciona la lInea de tendencia
En la gráfica anterior, se observa que el día de las elecciones, domingo, se enviaron 404 mensajes, siendo el día más activo. El promedio del mes fue de 186 mensajes, con el primer día como el de menor número de mensajes, con 21. La tendencia se calculó con el Ajuste de Regresión Polinómica Local que es la que viene por defecto.
chat %>%
mutate(dia_semana = wday(day, label = TRUE)) %>%
group_by(dia_semana) %>%
summarise( nn=if_else( (dia_semana == "mar\\.") || (dia_semana == "miæ¼ã¸¹\\.") || (dia_semana == "jue\\.")
, round(n()/5) # Mar, MiE y Jue hubo 5 dIas en octubre de 2019
, round(n()/4))) %>% # Los otros dIas solo fueron 4
ggplot(aes(x = dia_semana, y = nn)) + # define el Area estEtica
geom_bar(stat = "identity", fill="purple", alpha=0.5) + # define la geometrIa tipo barra
ylab("# de mensajes Promedio") + xlab("dIa") +
ggtitle("Mensajes promedio por dIa de la semana")
Sin embargo, al analizar por los días de la semana se ve que en promedio los miércoles se escribieron más mensajes. Los días lunes y sábado fueron los de menor actividad.
Se agrupan los mensajes por autor, se filtran los primeros diez.
chat %>%
count(author) %>% # Se agrupan los mensajes por autor
top_n(n = 10, n) %>% # se seleccionana los primeros 10
ggplot(aes(x = reorder(author, n), y = n)) +
geom_bar(stat = "identity", fill="red", alpha=0.5) +
ylab("# de mensajes") + xlab( "Autor") +
coord_flip() +
ggtitle("Mensajes por autor en el mes")
Se observa que Edgar superó los 800 mensajes. Nan, Calixto y Pavel superaron los 650 y Chechi es la primera mujer en el top 5, superando los 400.
Se extraen los valores de la columna emoji, se agrupan y seleccionana los 10 más usados.
chat %>%
unnest(emoji) %>% # Se extraen los valores de los emojies
count(emoji, sort = TRUE) %>%
top_n(n = 10, n) %>%
ggplot(aes(x = reorder(emoji, n), y = n)) +
geom_col(show.legend = FALSE, fill="orange", alpha=0.5) +
ylab("Cantidad") + xlab( "Emoji") +
coord_flip() +
ggtitle("Cantidad de veces de emoji")
Algunos emojies no son interpretados correctamente y se observan como un rectángulos o una combinación de caracteres, se elevó la consulta al creador del paquete para intentar resolverlo. Mienrtas tanto se utilizará la variable emoji_name para repetir la gráfica.
chat %>%
unnest(emoji_name) %>% # Se extraen los nombres de los emojies
count(emoji_name, sort = TRUE) %>%
top_n(n = 10, n) %>%
ggplot(aes(x = reorder(emoji_name, n), y = n)) +
geom_col(show.legend = FALSE, fill="orange", alpha=0.5) +
ylab("Cantidad") + xlab( "Nombre del emoji") +
coord_flip() +
ggtitle("Cantidad de veces de emoji")
De los 10 emojies más usados se puede decir que son en su mayoría positivos. Ubicado en el primer lugar, “rodando en el piso de risa” con más de 400, seguido con un casi 300 veces de “Lágrimas de alegría”.
El paquete no discrimina el tipo de objeto multimedia enviado por los miembros del grupo de Whatsapp y los registra todos como
chat %>%
filter (text=="<Multimedia omitido>") %>% # Se convierte en valores los emojies
count(author) %>% # Los agrupa y ordena
top_n(n = 10, n) %>% # se presentan los primeros 10
ggplot(aes(x = reorder(author, n), y = n)) + # define el Area estEtica
geom_bar(stat = "identity", fill="yellow", alpha=0.5) + # define la geometrIa tipo columna
ylab("Cantidad") + xlab( "Autor") +
coord_flip() +
ggtitle("# de veces usado objeto multimedia")