## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
##
## 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
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## corrplot 0.95 loaded
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## Installing package into '/home/alexxus/R/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
## Loading required package: RColorBrewer
En la actualidad la tecnología nos ha brindado una mayor facilidad en cuanto a la comunicación, los seres humanos se han visto más dependientes de ella y eso sugiere que pasamos bastante tiempo interactuando, por lo tanto el análisis que se puede obtener a través de nuestra interacción en redes sociales es bastante amplio, prácticamente podemos encontrar patrones y transformar la información a conocimiento, por lo tanto se utilizaran los tweets de Donald Trump para demostrar un análisis de datos sobre una red social.
Analizar a profundidad el conjunto de datos de los tweets de Trump para encontrar patrones e información clave en su actividad en Twitter.
El conjunto de datos utilizados es el de “trump_tweets”, los cuales son la recopilación de tweets hechos por el magnate y actual presidente de los Estados Unidos, Donald Trump, estos tweets se recopilan desde 2009 hasta 2017, de su cuenta oficial, este conjunto de datos es muy interesante ya que nos ofrecer un panorama para el análisis de datos, en base a análisis de sentimiento y de texto.
El conjunto de datos “trump_tweets” proviene del paquete dslabs, creado por el profesor Rafael Irizarry como parte del curso Data Science de HarvardX (PH125.9x). Estos tweets fueron recopilados a través de la API de Twitter o extraídos de bases de datos públicas como trumptwitterarchive.com, los datos se han procesado previamente para incluir campos como el texto, fecha de creación, número de favoritos, número de retweets, entre otros campos de importancia.
Irizarry, R. A. (2017). Data Science Labs (dslabs). HarvardX. Disponible en: https://github.com/rafalab/dslabs
| Variable | Descripción |
|---|---|
| source | Fuente o dispositivo desde el cual se publicó el tweet (Web Client, iPhone, etc.). |
| id_str | Identificador único del tweet como cadena de caracteres. |
| text | Contenido textual del tweet. |
| created_at | Fecha y hora exacta de publicación del tweet. |
| retweet_count | Número de veces que el tweet fue retuiteado. |
| in_reply_to_user_id_str | ID del usuario al que se respondió, si aplica (NA en caso contrario). |
| favorite_count | Número de veces que el tweet fue marcado como favorito. |
| is_retweet | Valor lógico que indica si el tweet es un retweet (TRUE) o no (FALSE). |
Se puede evidenciar que las variables, son categóricas y discretas, no hay alguna continua.
ggplot(trump_tweets, aes(x = source)) +
geom_bar(fill = "orange") +
coord_flip() +
labs(title = "Cantidad de tweets por fuente",
x = "Fuente",
y = "Número de tweets") +
theme_minimal()
Este gráfico utiliza la variable de source, que es categórica, la cual es sobre las fuentes de comunicación, con esto que grafique la cantidad de tweets por medio de difusión, esto porque este valor categórico es ideal para gráficos de comparación. Con esto nos podemos dar cuenta que se hacían los tweets desde el cliente de un navegador, puede ser la computadora o sino desde el navegador de un celular, además de otros dos grandes escenarios, que es desde un teléfono Android y otro IOS, es muy interesante pensar que Trump tenía dos opciones de celulares con sistemas operativos diferentes.
trump_num <- trump_tweets %>%
mutate(
tweet_length = nchar(text)
) %>%
select(favorite_count, retweet_count, tweet_length)
cor_matrix <- cor(trump_num, use = "complete.obs")
print(cor_matrix)
## favorite_count retweet_count tweet_length
## favorite_count 1.0000000 0.9173168 0.2509832
## retweet_count 0.9173168 1.0000000 0.2155187
## tweet_length 0.2509832 0.2155187 1.0000000
corrplot(cor_matrix, method = "color", type = "upper", tl.cex = 0.8)
ggplot(trump_tweets, aes(x=favorite_count, y=retweet_count)) +
geom_point()
trump_tweets_norm <- trump_tweets %>%
mutate(
fav_z = scale(favorite_count),
rt_z = scale(retweet_count)
)
ggplot(trump_tweets_norm, aes(x = fav_z, y = rt_z)) +
geom_point(alpha = 0.5, color = "#2ECC71") +
scale_x_log10() +
scale_y_log10() +
labs(title = "Dispersión normalizada (Z-score)", x = "Likes (Z)", y = "Retweets (Z)") +
theme_minimal()
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_x_log10(): log-10 transformation introduced infinite values.
## Warning in transformation$transform(x): NaNs produced
## Warning in scale_y_log10(): log-10 transformation introduced infinite values.
## Warning: Removed 16351 rows containing missing values or values outside the scale range
## (`geom_point()`).
Para esto algo ideal es ver la correlación de la variables para poder graficar adecuadamente, sino se tendrá una dispersión inadecuada que no me dirá nada, así que importó otra librería “corrplot”, solo para ver la matriz de correlación, esto a partir de una variable que ya tiene esta información de nuestro data frame.
Algo ideal es una normalización de los datos, para que el rango de estos no sea tan sesgado en el análisis, para ello es bueno hacer una estandarización a través de desviación estándar y luego una escala logarítmica para poder visualizar de forma más adecuada.
Con esto en mente primero se realizó el diagrama de dispersión sin esta normalización, utilizando los valores de la cantidad de favoritos y la cantidad de retweets, esto debido que la matriz de correlación mostró un 97% de relación entre estas variables, así que es ideal utilizarlas para este gráfico, posteriormente, como son valores muy grandes, alrededor de 100,000. Por lo tanto lo ideal acá es realizar esa normalización, así que primero se realiza la escala de desviación estándar en un nuevo data frame y ya se grafica con las nuevas variables normalizadas, con esto se genera un nueva escala en la gráfica, está logarítmica y se imprime, con ello me puedo dar cuenta que la correspondencia de pares ordenados va de (0.1, 0.1) aproximadamente por lo tanto se refleja ese crecimiento que se tiene en cuanto a si un tweet tiene una gran cantidad de likes, también tendrá una gran cantidad de retweets.
trump_tweets <- trump_tweets %>%
mutate(tweet_length = nchar(text))
ggplot(trump_tweets, aes(x = tweet_length)) +
geom_histogram(binwidth = 5, fill = "#27AE60", color = "white") +
labs(title = "Distribución de la longitud de los tweets",
x = "Número de caracteres", y = "Frecuencia") +
scale_x_continuous(breaks = seq(0, max(trump_tweets$tweet_length), by = 20)) +
theme_minimal()
Aca se utilizó “tweet_length”, la cual es una nueva variable que se generó con mutate, para ver la cantidad de caracteres por texto, posteriormente se utilizó un histograma como gráfico de distribución, en este se usa esa variable para ver la cantidad de valores, por cantidad de caracteres, esto con la finalidad de poder determinar en qué rango de longitud usaba Trump para escribir cada mensaje, en este nos damos cuenta que oscilaba entre 130 a 150 caracteres los cuales eran mensajes muy directos, eso significa que deben de ser mensajes muy cargados con poco texto, algún anuncio, queja, entre otros.
trump_tweets <- trump_tweets %>%
mutate(
fechaExacta = as_datetime(created_at),
fecha = as.Date(created_at),
dia = as.Date(fechaExacta),
hora = hour(fechaExacta),
dia_semana = wday(fechaExacta, label = TRUE),
mes = month(fechaExacta, label = TRUE),
año = year(fechaExacta)
)
ggplot(trump_tweets, aes(x = hora)) +
geom_histogram(binwidth = 1, fill = "red", color = "white") +
labs(title = "Frecuencia de tweets por hora del día", x = "Hora", y = "Cantidad") +
theme_minimal()
Se usará la librería “lubridate”, para apoyarme en valores los cuales son de fecha, para obtener información de días, horas, entre otros, con esto generó un histograma de la cantidad de tweets por hora, esto con la finalidad de poder evidenciar la cantidad de tweets que se realizan por horas específicas del dia, donde se puede ver que la mayor cantidad está entre las 2 y 3 de la tarde, además otro gran grupo es de 9 a 11 de la mañana.
trump_tweets %>%
group_by(fecha) %>%
summarise(total = n()) %>%
ggplot(aes(x = fecha, y = total)) +
geom_line(color = "tomato") +
labs(title = "Tweets por día", x = "Fecha", y = "Cantidad de tweets")
Para el quinto gráfico, se utiliza la variable fecha del inciso anterior, esté solo indica los días, sin la hora, así que se agrupa en base a esta variable y se genera una constante de total, con el summarize, con eso se grafica en base a fecha y total de tweets, luego se le da el estilo de un gráfico de líneas, esto con la finalidad de poder observar la evolución de series de tiempo que tienen los tweets, para poder evidenciar algún patrón, con esto nos damos cuenta que Trump realizó más tweets entre 2013 y 2014, además de un pico en 2016 a 2017, esto se puede deber a que ya se estaba preparando para campaña o estaba en ese tiempo de elecciones en Estados Unidos.
ggplot(trump_tweets, aes(x = dia_semana, y = tweet_length)) +
geom_violin(fill = "purple") +
labs(title = "Distribución de longitud de tweets por día", x = "Día", y = "Longitud") +
theme_minimal()
Para este gráfico, se utilizó un gráfico de violín para ver distribuciones en base a variables, con esto se genero la utilización a través de dia de la semana y el largo de cada uno de los tweets, acá nos podemos dar cuenta que hace los gráficos por los 7 días, al ser variable categórica y con esto evidencia que los días sábado y domingo, eran los días donde escribía textos más largos, esto puede deberse a que ya era fin de semana y tenia mas tiempo para escribir mensajes.
ggplot(trump_tweets, aes(x = hora)) +
geom_histogram(binwidth = 1, fill = "black", color = "white") +
facet_wrap(~ dia_semana) +
labs(title = "Tweets por hora en cada día de la semana", x = "Hora", y = "Tweets") +
theme_minimal()
En este utilice facetas para poder generar múltiples gráficos de elementos diferentes, con esto utilice histogramas para visualizar la distribución de la cantidad de tweets por horas en el transcurso del día, por cada uno de los días, eso con la finalidad de poder contrastar la información entre cada uno de los días y poder determinar cuándo es que escribia mas, con esto me puedo dar cuenta que los días entre semana, tiene un patrón, ya que solía escribir más alrededor de las 13 a 16 horas, además se puede evidenciar que el dia que mas escribía era el miércoles, martes y jueves.
trump_words <- trump_tweets %>%
unnest_tokens(word, text) %>%
anti_join(stop_words) %>%
count(word, sort = TRUE)
## Joining with `by = join_by(word)`
palabras_Sentimiento <- trump_words %>%
inner_join(get_sentiments("nrc"), by= "word")
palabras_Sentimiento_total <- palabras_Sentimiento %>%
count(sentiment)
ggplot(palabras_Sentimiento_total, aes(x = sentiment, y = n, fill = sentiment)) +
geom_bar(stat = "identity") +
scale_fill_brewer(palette = "Set3") +
labs(title = "Análisis de Sentimiento de Tweets de Trump",
y = "Número de palabras",
x = "Sentimiento")
En este realice algo diferente, instale textdata, que es una librería de analisis de sentimiento, esto con la finalidad de poder abstraer las emociones de cada una de las palabras que escribió Trump, para ello primero se debe de realizar una vectorización de cada una de las palabras, separandolas en tokens, quitando palabras que no importan mucho como articulos o espacios, luego se cuenta la cantidad de palabras, con esto se utiliza la liberia con “nrc”, esto ya que determina la palabra en base a varias categorias, como tristeza, enojo, miedo, entre otros sentimientos, luego se cuenta la cantidad total de sentimientos y se grafica en base a esta variable, la cantidad de palabras y se rellena para que de color a cada columna en base al sentimiento, aca se genera una grafica de barras y si nos podemos dar cuenta, justo los sentimientos que mas se obtuvieron, fueron negativos, positivos, de confianza, miedo y rabia, esto suele describir bastante los discursos del mandatario, ya que son discursos muy patriotico donde suele utilizar falacias de miedo, donde le promete a las personas cambiar aspectos sociales, con el objetivo de mejorar el pais, no importa a quien perjudique.
trump_words %>%
with(wordcloud(word, n, max.words = 100, colors = brewer.pal(10,"Dark2")))
## Warning in brewer.pal(10, "Dark2"): n too large, allowed maximum for palette Dark2 is 8
## Returning the palette you asked for with that many colors
En esta genere una nube de palabras para evidenciar cuales son las que más usa, con esto instale la librería de “wordcloud” para que pueda hacer la nube de palabras y “RColorBrewer” para que use varios colores, con esto, ya solo utilizo el data frame y todas las palabras generadas anteriormente, con 100 palabras como máximo, con esto se puede evidenciar que muchas de las palabras que usa son sobre noticias, sobre política como Obama, Clinton, votaciones y el fervor patriótico, haciendo alusión al partido republicano, nacional, ganar, además de hablar de China, esto nos puede dar una idea de los intereses de Trump, el cual es convencer a sus seguidores de votar por el, ejercer opiniones en la oposición sobre programas como el “Obama care”, además de siempre hablar desde el nacionalismo, con palabras positividad, seguro sobre Estados Unidos.
trump_words %>%
slice(5:21) %>%
ggplot(aes(reorder(word, n), n)) +
geom_col(fill = "skyblue") +
coord_flip() +
labs(title = "Palabras más frecuentes en los tweets", x = "Palabra", y = "Frecuencia")
Para este se tiene el uso del data frame de las palabras, donde se utilizan las palabras y la cantidad de palabras como variables, con esto se grafica un diagrama de columnas, con estos valores, utilizado un rango desde la palabra 5 a la 21, esto debido a que las primeras palabras, hacen referencia a sintaxis de Twitter, como los links, asi que eso realmente no es de ayuda, con esto nos podemos dar cuenta que se tiene, como las 5 palabras mas usadas, Trump, Personas, Obama, Tiempo y América, la primera con más de 1500 usos y todas con una mínima de 750 veces, así que realmente trataba de dejar claro su postura ante lo que realizó Obama y siempre trata de llamar a las personas, para que estas se sientan en confianza con cada mensaje.
El análisis de los tweets de Donald Trump nos ha permitido explorar cómo las redes sociales, en particular Twitter, pueden servir como una herramienta poderosa para entender el comportamiento y las opiniones de figuras públicas. A través de la visualización y el análisis de datos, hemos sido capaces de identificar patrones en la actividad de Trump en Twitter, como la frecuencia de sus tweets, su uso de ciertas palabras y la relación entre sus tweets y las interacciones de los usuarios. Estos resultados no solo proporcionan una visión detallada sobre cómo una figura influyente utiliza las redes sociales, sino que también demuestran el potencial del análisis de datos para extraer información valiosa de grandes volúmenes de información no estructurada.