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)
Puedes descargar los datasets utilizando los siguientes enlaces:
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
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))
ï..time a time si es
necesarioEn 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"
time al formato correctoConvertimos 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")
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))
)
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")
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))
)
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)
}
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")
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
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))
ggplot2 para
ClaudiaCreamos 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)
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))
ggplot2 para MaynezCreamos 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)
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))
ggplot2 para
XochiltCreamos 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)