Objetivo

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.

El chat

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 .

Número de mensajes

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.

Número de mensajes por autor

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.

Emojis más usados

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”.

Objetos multimedia enviados por autor

El paquete no discrimina el tipo de objeto multimedia enviado por los miembros del grupo de Whatsapp y los registra todos como dado que no los puede interpretar. En la siguiente gráfica se ordena quienes envían más objetos multimedia: videos, audio, stikers, etc…

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")