Cargar las bibliotecas necesarias

En esta sección, cargamos las bibliotecas necesarias para la manipulación de datos (dplyr, tidyr), creación de gráficos (ggplot2, plotly), y manejo de escalas (scales).

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.1.3
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(scales)

Descargar los datasets

Puedes descargar los datasets utilizando los siguientes enlaces:

Cargar los datasets

Cargamos los datos de los tres candidatos desde archivos CSV.

maynez <- read.csv("C:/R/DataSet/Maynez.csv")
claudia <- read.csv("C:/R/DataSet/Claudia.csv")
xochilt <- read.csv("C:/R/DataSet/Xochilt.csv")

head(maynez, 5)
##                                                                                                                                                                                                                                                                                                                 ï..text
## 1                                                          Una candidata te dice que votes contra Morena y la otra te dice que votes contra el PRIAN.\n\nTe invito a votar por el futuro de tus hijos y de nuestro país. A votar por la mejor opción. A votar por un #MéxicoNuevo 🇲🇽.\n\n#VotaMáynez 🤟ðŸ\217¾
## 2                                                                                                                                                      Porque la educación es un derecho. \n\nY porque ningún joven debería ser rechazado de la universidad.\n\nVota por el futuro. Vota #MáynezPresidente 🤟ðŸ\217¾
## 3                                                                                                                                Este domingo se define todo âš½ï¸\217. Hemos logrado llegar a la final contra todos los pronósticos y estamos a un paso de que gane México 🇲🇽.\n\n#VotaMáynezPresidente 🤟ðŸ\217¾
## 4                                                       RC TFK y Azuky completan el line up de hoy para el #MaynezCapitalFest. 🎤\n\nEl maestro y la mejor freestylera de México 🇲🇽. Nos vemos en el BlackBerry; recuerda que el acceso es con boleto y no habrá en taquilla. \n\n#VotaMáynezPresidente 🎸
## 5 México merece un presidente con propuestas y que esté a la altura de la grandeza de nuestro país. \n\nMéxico merece dejar atrás el odio y el rencor, para construir una etapa de paz, esperanza y alegría.\n\nEl mejor México 🇲🇽 de la historia comienza este domingo. Elige sonreír, #VotaMáynez ðŸ\230\201
##                       time shares comments likes
## 1 2024-05-30T02:20:31.000Z     27       27   269
## 2 2024-05-30T01:20:06.000Z     30       51   756
## 3 2024-05-30T00:10:41.000Z     67       69   685
## 4 2024-05-29T23:25:07.000Z     33      159   953
## 5 2024-05-29T22:15:43.000Z    100       75   773
head(claudia, 5)
##                    ï..time comments likes shares
## 1 2024-05-30T02:05:30.000Z      235  2830    209
## 2 2024-05-30T02:03:46.000Z     1030 13181   1215
## 3 2024-05-30T02:00:21.000Z      215  3242    345
## 4 2024-05-30T01:55:07.000Z      293  5462    447
## 5 2024-05-30T01:41:35.000Z      372  4214    577
##                                                                                                                                                                                                                                                                                                      text
## 1 Tengo claro que mi obligación es llevar a México por el sendero de la paz, la seguridad, la democracia, las libertades y la justicia. Tengo claro que nuestra guía es el bienestar y la felicidad del pueblo, tengo claro mi compromiso y mi responsabilidad como la próxima presidenta de México.
## 2                Gracias, gracias, gracias. Me comprometo a entregar mi alma, mi vida y lo mejor de mí misma por el bienestar del pueblo de México. Me comprometo con ustedes a ser una buena presidenta que esté a la altura de la generosidad y la grandeza de nuestra historia y de nuestro pueblo.
## 3                                                                                                                                                                                                                Salgamos a votar este 2 de junio para seguir haciendo historia, como lo hicimos en 2018.
## 4                                                                                                                                                                                                       Amor con amor se paga. Juntas y juntos seguiremos haciendo historia. ¡Del Zócalo a la victoria!
## 5                                                                                                     Estoy segura de que este 2 de junio va a triunfar el amor frente al odio, la verdad frente a la calumnia y la democracia frente al fraude. Salgamos a votar todas y todos este domingo todo Morena.
head(xochilt, 5)
##                    ï..time comments likes shares
## 1 2024-05-30T02:45:27.000Z       73   350     32
## 2 2024-05-30T02:22:31.000Z      179   667     43
## 3 2024-05-30T02:17:26.000Z      287  3282    267
## 4 2024-05-30T02:02:45.000Z      243  1689     92
## 5 2024-05-30T01:54:04.000Z      166  1002    106
##                                                                                                                                                                                                                                                                                                                                                                                    text
## 1                                                                                                                                                                                                                                                                                               Vamos a llegar a la Presidencia a servir, nunca a servirnos.\n\n#XóchitlPresidenta2024
## 2                                                                                                                                                                              🗳ï¸\217🗳ï¸\217Vamos a inundar las urnas el domingo. No te creas los cuentos de que van arriba. Si sales a votar, ¡ganamos nosotros!🗳ï¸\217🗳ï¸\217#XóchitlGálvez #Politica #Edomex #Verdad #Motivacion
## 3                                                                                               Ser de Nuevo León es símbolo de trabajo, esfuerzo y liderazgo.\n\nNosotros vamos a construir un proyecto de verdad, donde nadie se quedará atrás y que luche por la vida, la verdad y la libertad.\n\n¡Todos a votar este 2 de junio! ¡Muchas gracias!\n\n#XóchitlPresidenta2024
## 4 No hay palabras para expresar la indignación que siento por el asesinato de Alfredo Cabrera, candidato a presidente municipal de Coyuca, Guerrero.\n\nLo conocí personalmente durante la brigada tras el huracán Otis y sé que era un hombre generoso y de bien.\n\nMi más sentido pésame a su familia, a sus amigos y a todo el pueblo de Coyuca de Benítez. Descanse en paz.
## 5                                                  Palacio Nacional volverá a ser el lugar del pueblo y para el pueblo.\n\nLes garantizo que siempre les voy a hablar con la verdad y juntos vamos a construir un país de libertades, un país democrático.\n\nEste 2 de junio necesito de todas y de todos.\n\n#XochitlPresidenta2024 #InundemosLasUrnas #VotaPAN #VotaPRI #VotaPRD

Asegurar que los nombres de las columnas sean consistentes

Convertimos los nombres de las columnas a minúsculas para mantener la consistencia entre los datasets y evitar problemas.

colnames(maynez) <- tolower(colnames(maynez))
colnames(claudia) <- tolower(colnames(claudia))
colnames(xochilt) <- tolower(colnames(xochilt))

Renombrar la columna ï..time a time si es necesario

En algunos casos, la columna de tiempo puede tener un nombre incorrecto o formato no deseado. Este segmento de código corrige ese error si es necesario.

if("ï..time" %in% colnames(maynez)) colnames(maynez)[colnames(maynez) == "ï..time"] <- "time"
if("ï..time" %in% colnames(claudia)) colnames(claudia)[colnames(claudia) == "ï..time"] <- "time"
if("ï..time" %in% colnames(xochilt)) colnames(xochilt)[colnames(xochilt) == "ï..time"] <- "time"

Convertir la columna time al formato correcto

Convertimos la columna time al formato de fecha y hora adecuado para facilitar su manipulación.

maynez$time <- as.POSIXct(maynez$time, format = "%Y-%m-%dT%H:%M:%OS")
claudia$time <- as.POSIXct(claudia$time, format = "%Y-%m-%dT%H:%M:%OS")
xochilt$time <- as.POSIXct(xochilt$time, format = "%Y-%m-%dT%H:%M:%OS")

Calcular los totales

Calculamos los totales de likes, comentarios, y compartidos para cada candidato y los almacenamos en data frames separados.

likes_totales <- rbind(
  maynez %>% summarise(likes_totales = sum(likes)),
  claudia %>% summarise(likes_totales = sum(likes)),
  xochilt %>% summarise(likes_totales = sum(likes))
)

comentarios_totales <- rbind(
  maynez %>% summarise(comentarios_totales = sum(comments)),
  claudia %>% summarise(comentarios_totales = sum(comments)),
  xochilt %>% summarise(comentarios_totales = sum(comments))
)

compartidos_totales <- rbind(
  maynez %>% summarise(compartidos_totales = sum(shares)),
  claudia %>% summarise(compartidos_totales = sum(shares)),
  xochilt %>% summarise(compartidos_totales = sum(shares))
)

Graficas de barra para likes, comentarios y compartidos totales

Creamos gráficos de barra para comparar los totales de likes, comentarios, y compartidos entre los candidatos.

barplot(likes_totales$likes_totales, 
        names.arg = c("Maynez", "Claudia", "Xochilt"),
        main = "Comparación de Likes Totales entre Candidatos",
        xlab = "Candidato",
        ylab = "Likes Totales",
        col = c("orange", "darkred", "blue"),
        ylim = c(0, max(likes_totales$likes_totales) * 1.2),
        border = NA)
text(x = 1:3, y = likes_totales$likes_totales, labels = likes_totales$likes_totales, pos = 3, cex = 0.8, col = "black")

barplot(comentarios_totales$comentarios_totales, 
        names.arg = c("Maynez", "Claudia", "Xochilt"),
        main = "Comparación de Comentarios Totales entre Candidatos",
        xlab = "Candidato",
        ylab = "Comentarios Totales",
        col = c("orange", "darkred", "blue"),
        ylim = c(0, max(comentarios_totales$comentarios_totales) * 1.2),
        border = NA)
text(x = 1:3, y = comentarios_totales$comentarios_totales, labels = comentarios_totales$comentarios_totales, pos = 3, cex = 0.8, col = "black")

barplot(compartidos_totales$compartidos_totales, 
        names.arg = c("Maynez", "Claudia", "Xochilt"),
        main = "Comparación de Compartidos Totales entre Candidatos",
        xlab = "Candidato",
        ylab = "Compartidos Totales",
        col = c("orange", "darkred", "blue"),
        ylim = c(0, max(compartidos_totales$compartidos_totales) * 1.2),
        border = NA)
text(x = 1:3, y = compartidos_totales$compartidos_totales, labels = compartidos_totales$compartidos_totales, pos = 3, cex = 0.8, col = "black")

Datos para graficas de comparacion de likes y compartidos

Preparamos los datos para crear gráficos de comparación de likes y compartidos para cada candidato.

data_maynez <- data.frame(
  Tipo = c("Likes", "Compartidos"),
  Total = c(sum(maynez$likes), sum(maynez$shares))
)

data_claudia <- data.frame(
  Tipo = c("Likes", "Compartidos"),
  Total = c(sum(claudia$likes), sum(claudia$shares))
)

data_xochilt <- data.frame(
  Tipo = c("Likes", "Compartidos"),
  Total = c(sum(xochilt$likes), sum(xochilt$shares))
)

Funcion para crear graficos

Creamos una función para generar y mostrar gráficos de barras apiladas con ggplot2.

crear_grafico <- function(data, titulo) {
  p <- ggplot(data, aes(x = factor(1), y = Total, fill = Tipo)) +
    geom_bar(stat = "identity", position = "stack") +
    geom_text(aes(label = scales::comma(Total)), position = position_stack(vjust = 0.5)) +
    scale_fill_manual(values = c("Likes" = "#8FE28F", "Compartidos" = "#40E0D0")) +
    scale_y_continuous(labels = comma) +
    labs(title = titulo,
         x = NULL,
         y = "Total") +
    theme_minimal() +
    theme(axis.title.x = element_blank(),
          axis.text.x = element_blank(),
          axis.ticks.x = element_blank(),
          plot.title = element_text(hjust = 0.5))
  print(p)
}

Crear graficos para cada candidato

Usamos la función crear_grafico para generar y mostrar gráficos de comparación de likes y compartidos para cada candidato.

crear_grafico(data_maynez, "Comparación de Likes y Compartidos para Maynez")

crear_grafico(data_claudia, "Comparación de Likes y Compartidos para Claudia")

crear_grafico(data_xochilt, "Comparación de Likes y Compartidos para Xochilt")

Correccion del error en el dataset de Claudia

Reemplazamos valores NA en las columnas comments y likes con 0 en el dataset de Claudia.

claudia$comments[is.na(claudia$comments)] <- 0
claudia$likes[is.na(claudia$likes)] <- 0

Agrupar y sumar datos por cada hora para Claudia

Agrupamos y sumamos los datos por cada hora del día para

Claudia y transformamos el formato de la columna hour.

comments_likes_per_hour_claudia <- claudia %>%
  mutate(hour = format(time, "%H")) %>%
  group_by(hour) %>%
  summarise(comments = sum(comments, na.rm = TRUE), likes = sum(likes, na.rm = TRUE)) %>%
  gather(key = "type", value = "count", -hour)

comments_likes_per_hour_claudia$hour <- factor(comments_likes_per_hour_claudia$hour, levels = sprintf("%02d", 0:23))

Crear la gráfica de líneas con ggplot2 para Claudia

Creamos y mostramos un gráfico de líneas que muestra la cantidad de comentarios y likes por hora para Claudia.

p_claudia <- ggplot(comments_likes_per_hour_claudia, aes(x = hour, y = count, color = type, group = type)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  labs(title = "Cantidad de comentarios y likes por hora (Claudia)", x = "Hora del día", y = "Cantidad") +
  theme_minimal() +
  scale_color_manual(values = c("comments" = "steelblue", "likes" = "lightblue"), name = "Tipo", labels = c("Comentarios", "Likes"))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## i Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
print(p_claudia)

Repetir el mismo proceso para Maynez y Xochilt

Agrupar y sumar datos por cada hora para Maynez

Agrupamos y sumamos los datos por cada hora del día para Maynez.

comments_likes_per_hour_maynez <- maynez %>%
  mutate(hour = format(time, "%H")) %>%
  group_by(hour) %>%
  summarise(comments = sum(comments), likes = sum(likes)) %>%
  gather(key = "type", value = "count", -hour)

comments_likes_per_hour_maynez$hour <- factor(comments_likes_per_hour_maynez$hour, levels = sprintf("%02d", 0:23))

Crear la gráfica de líneas con ggplot2 para Maynez

Creamos y mostramos un gráfico de líneas que muestra la cantidad de comentarios y likes por hora para Maynez.

p_maynez <- ggplot(comments_likes_per_hour_maynez, aes(x = hour, y = count, color = type, group = type)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  labs(title = "Cantidad de comentarios y likes por hora (Maynez)", x = "Hora del día", y = "Cantidad") +
  theme_minimal() +
  scale_color_manual(values = c("comments" = "steelblue", "likes" = "lightblue"), name = "Tipo", labels = c("Comentarios", "Likes"))

print(p_maynez)

Agrupar y sumar datos por cada hora para Xochilt

Agrupamos y sumamos los datos por cada hora del día para Xochilt.

comments_likes_per_hour_xochilt <- xochilt %>%
  mutate(hour = format(time, "%H")) %>%
  group_by(hour) %>%
  summarise(comments = sum(comments), likes = sum(likes)) %>%
  gather(key = "type", value = "count", -hour)

comments_likes_per_hour_xochilt$hour <- factor(comments_likes_per_hour_xochilt$hour, levels = sprintf("%02d", 0:23))

Crear la gráfica de líneas con ggplot2 para Xochilt

Creamos y mostramos un gráfico de líneas que muestra la cantidad de comentarios y likes por hora para Xochilt.

p_xochilt <- ggplot(comments_likes_per_hour_xochilt, aes(x = hour, y = count, color = type, group = type)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  labs(title = "Cantidad de comentarios y likes por hora (Xochilt)", x = "Hora del día", y = "Cantidad") +
  theme_minimal() +
  scale_color_manual(values = c("comments" = "steelblue", "likes" = "lightblue"), name = "Tipo", labels = c("Comentarios", "Likes"))

print(p_xochilt)