El actual presidente de USA, Donald Trump es una figura política que genera opiniones y debates altamente polarizados. Esto hace que las discusiones en redes sociales, especialmente Reddit sean altamente ricas en lenguaje emocional, valorativo y argumentativo, lo que resulta ideal para practicar técnicas de procesamiento de lenguaje natural. Además, la cantidad de datos disponibles en la plataforma permite obtener una muestra suficiente para el análisis.
Con este análisis buscamos identificar cuáles son las palabras y temas más frecuentes al discutir la aprobación o desaprobación del mandatario, y si existen diferencias lingüísticas significativas entre subreddits de distintas inclinaciones políticas.
#Instalar paquete
library(RedditExtractoR)
## Warning: package 'RedditExtractoR' was built under R version 4.4.3
En este apartado, para asegurar que los datos que se obtengan sean relevantes para la pregunta de investigación se determinan los siguientes términos específicos para filtrar la posterior descarga de posts en la red social Reddit.
Utilizamos frases específicas como “Trump approval poll” en lugar de términos amplios como “Trump”, siguiendo la recomendación de evitar búsquedas demasiado amplias. Esto asegura que los posts capturados contengan explícitamente opiniones sobre su gestión.
# Términos que capturan opinión pública sobre Trump
terminos_opinion <- c(
"Trump approval rating",
"Americans think about Trump",
"Trump public opinion",
"Trump policies survey",
"Do Americans support Trump",
"Trump approval poll",
"Trump disapproval reasons",
"Americans view Trump decision"
)
# Subreddits donde se debate opinión pública (TODOS ACTIVOS)
subreddits_opinion <- c(
"politics", # Debate político general
"AskAnAmerican", # Preguntas a estadounidenses
"PoliticalDiscussion",# Discusión seria
"conservatives", # Visión conservadora
"democrats", # Visión liberal
"neutralnews", # Intento de neutralidad
"fivethirtyeight" # Datos y encuestas
)
El propósito general de esta sección es implementar una función que busca threads (hilos de discusión) en Reddit sobre un tema específico.
buscar_threads_documentado <- function(termino, subreddit = NA) {
cat("\n🔍 Búsqueda:", termino)
if(!is.na(subreddit)) cat(" | subreddit: r/", subreddit)
cat("\n")
# Pausa para respetar API de Reddit (decisión metodológica)
Sys.sleep(1)
resultado <- tryCatch({
find_thread_urls(
keywords = termino,
subreddit = subreddit,
sort_by = "relevance", # Más relevante que "top" para opiniones
period = "month" # Último mes (datos frescos)
)
}, error = function(e) {
cat(" ❌ Error:", conditionMessage(e), "\n")
return(NULL)
})
if(!is.null(resultado) && nrow(resultado) > 0) {
# Añadir metadatos de la búsqueda
resultado$termino_usado <- termino
resultado$subreddit_buscado <- ifelse(is.na(subreddit), "todos", subreddit)
resultado$fecha_busqueda <- Sys.Date()
cat(" ✅", nrow(resultado), "threads encontrados\n")
return(resultado)
} else {
cat(" ⚠️ 0 resultados\n")
return(NULL)
}
}
Luego de haber filtrado nuestros datos de búsqueda, procedemos a extraer publicaciones/posts y comentarios desde Reddit.
##
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
## INICIO DE DESCARGA DE DATOS
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
## Objetivo minimo: 80 posts
##
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
## RESULTADOS DE LA DESCARGA (DATOS DE EJEMPLO)
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
##
## ESTADISTICAS:
## - Threads descargados: 100
## - Objetivo de 80 posts: ALCANZADO
## - Subreddits representados: 4
## - Periodo de datos: 2026-04-01 a 2026-05-27
##
## DISTRIBUCION POR SUBREDDIT:
##
## AskAnAmerican conservatives PoliticalDiscussion politics
## 25 25 25 25
##
## EJEMPLO DE LA BASE (primeros 5 posts):
## title
## 1 Trump favorability hits 51% in latest Gallup poll
## 2 Trump favorability hits 51% in latest Gallup poll
## 3 Polarized nation: Trump's tax plan splits voters down the middle
## 4 Poll shows 47% of Americans approve of Trump's handling of economy
## 5 Trump's trade policies unpopular with 63% of voters
## subreddit comments score
## 1 politics 241 2872
## 2 conservatives 375 1976
## 3 PoliticalDiscussion 252 2283
## 4 AskAnAmerican 359 507
## 5 politics 344 880
##
## EJEMPLO DE COMENTARIO:
## I voted for him twice but I am not sure about 2026.
##
## Datos guardados en 'datos_trump_opinion.rds'
Importante:
Al intentar descargar datos reales desde Reddit, se detectó un error porque la API de la app actualmente requiere autenticación que no fue posible obtener. Para poder completar el ejercicio se optó por generar un dataset sintético que replica la estructura de los datos reales.
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Warning: package 'tidytext' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
##
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
## LIMPIEZA TEXTUAL
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
##
## Texto a analizar:
## - Total de documentos: 100
## - Largo promedio del texto: 118.03 caracteres
##
## === TOKENIZACION ===
## Total de tokens generados: 1915
## Palabras unicas (tipo): 140
##
## Ejemplo de tokens (primeros 30):
## [1] "trump" "favorability" "hits" "51" "in"
## [6] "latest" "gallup" "poll" "i" "voted"
## [11] "for" "him" "twice" "but" "i"
## [16] "am" "not" "sure" "about" "2026"
## [21] "trump" "favorability" "hits" "51" "in"
## [26] "latest" "gallup" "poll" "the" "media"
##
## === ELIMINACION DE STOPWORDS ===
## Stopwords eliminadas (primeras 20):
## [1] "a" "a's" "able" "about" "above"
## [6] "according" "accordingly" "across" "actually" "after"
## [11] "afterwards" "again" "against" "ain't" "all"
## [16] "allow" "allows" "almost" "alone" "along"
##
## Resultados:
## - Tokens antes: 1915
## - Tokens despues: 1056
## - Tokens eliminados: 859
## - Porcentaje eliminado: 44.9 %
##
## Posibles problemas residuales (palabras tecnicas):
## Ninguna palabra tecnica problematica encontrada
##
## Despues de eliminar palabras tecnicas:
## - Tokens restantes: 1056
##
## === PALABRAS MAS FRECUENTES ===
## Top 15 palabras mas frecuentes (global):
## palabra n
## 1 trump's 81
## 2 americans 43
## 3 voters 43
## 4 trump 41
## 5 approval 26
## 6 disapprove 25
## 7 economy 25
## 8 trade 23
## 9 approve 22
## 10 policies 21
## 11 immigration 19
## 12 majority 19
## 13 poll 18
## 14 45 15
## 15 48 15
##
## === COMPARACION POR SUBREDDIT ===
## Top 5 palabras por subreddit:
## # A tibble: 20 × 3
## # Groups: subreddit [4]
## subreddit palabra n
## <chr> <chr> <int>
## 1 AskAnAmerican trump's 19
## 2 AskAnAmerican americans 12
## 3 AskAnAmerican trump 11
## 4 AskAnAmerican voters 10
## 5 AskAnAmerican approve 8
## 6 PoliticalDiscussion trump's 22
## 7 PoliticalDiscussion americans 12
## 8 PoliticalDiscussion voters 12
## 9 PoliticalDiscussion trump 10
## 10 PoliticalDiscussion approval 8
## 11 conservatives trump's 21
## 12 conservatives trump 11
## 13 conservatives americans 9
## 14 conservatives voters 9
## 15 conservatives approval 8
## 16 politics trump's 19
## 17 politics voters 12
## 18 politics americans 10
## 19 politics trump 9
## 20 politics disapprove 7
##
## === EXPLICACION METODOLOGICA ===
##
## DECISIONES TOMADAS:
##
## 1. Tokenizacion:
## - Se uso unnest_tokens() que convierte todo a minusculas
## - Elimina automaticamente puntuacion y numeros
## - Separa por espacios en blanco
##
## 2. Stopwords:
## - Se utilizo el diccionario 'stop_words' de tidytext
## - Contiene palabras vacias del ingles (the, and, a, to, etc.)
## - Estas palabras no aportan significado al analisis
##
## 3. Limpieza adicional:
## - Se eliminaron palabras tecnicas como 'amp', 'http', 'www'
## - Estas aparecen por la estructura HTML de Reddit
##
##
## RECOMENDACIONES PARA ANALISIS FUTUROS:
##
## - Aplicar stemming (reducir palabras a su raiz)
## - Crear n-grams (frases de 2-3 palabras)
## - Hacer analisis de sentimiento especifico
##
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
## VISUALIZACIONES
## = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
## Warning: package 'wordcloud' was built under R version 4.4.3
## Cargando paquete requerido: RColorBrewer
# ============================================================
# 4. TF-IDF · OPINIÓN PÚBLICA SOBRE DONALD TRUMP EN REDDIT
# ============================================================
# ------------------------------------------------------------
# ¿QUÉ HAREMOS?
# ------------------------------------------------------------
#
# Vamos a:
#
# 1. Usar la base creada previamente: base_final
# 2. Combinar título + comentario
# 3. Tokenizar el texto
# 4. Limpiar palabras vacías y palabras técnicas
# 5. Calcular TF-IDF por subreddit
# 6. Identificar palabras distintivas por comunidad
#
# IDEA CENTRAL:
#
# TF-IDF identifica palabras que son:
#
# ✔ frecuentes dentro de un grupo
# ✘ poco frecuentes en otros grupos
#
# En este caso, el grupo será el subreddit.
# Esto permite comparar el lenguaje usado en comunidades
# como politics, conservatives, PoliticalDiscussion y AskAnAmerican.
# ------------------------------------------------------------
# ============================================================
# 1. CARGAR LIBRERÍAS
# ============================================================
library(dplyr)
library(tidytext)
library(stringr)
library(tidyr)
library(ggplot2)
# ============================================================
# 2. CREAR VARIABLE DE TEXTO COMPLETO
# ============================================================
# ------------------------------------------------------------
# Se combina el título del post con el comentario.
# Esto permite analizar todo el contenido textual disponible.
# ------------------------------------------------------------
base_tfidf <- base_final %>%
mutate(
texto_completo = paste(title, comment, sep = " "),
texto_completo = str_to_lower(texto_completo)
)
# ============================================================
# 3. REVISAR DOCUMENTOS POR SUBREDDIT
# ============================================================
base_tfidf %>%
count(subreddit, sort = TRUE)
## subreddit n
## 1 AskAnAmerican 25
## 2 PoliticalDiscussion 25
## 3 conservatives 25
## 4 politics 25
# ============================================================
# 4. TOKENIZAR TEXTO
# ============================================================
# ------------------------------------------------------------
# unnest_tokens():
#
# Convierte cada texto en palabras individuales.
# Cada palabra queda como una fila.
# ------------------------------------------------------------
tokens_tfidf <- base_tfidf %>%
select(url, subreddit, texto_completo) %>%
unnest_tokens(
palabra,
texto_completo
)
# ============================================================
# 5. LIMPIEZA DE TOKENS
# ============================================================
# ------------------------------------------------------------
# Eliminamos:
#
# ✔ stopwords del inglés
# ✔ palabras técnicas de Reddit
# ✔ números
# ✔ palabras muy cortas
# ✔ términos demasiado generales del tema
# ------------------------------------------------------------
data("stop_words")
palabras_tecnicas <- c(
"amp", "http", "https", "com", "www", "reddit",
"subreddit", "post", "posts", "comment", "comments"
)
# Palabras del tema que pueden aparecer en todos los grupos
# y por tanto no ayudan mucho a diferenciar subreddits.
palabras_generales_tema <- c(
"trump", "donald", "president", "america", "american",
"americans", "usa", "us"
)
tokens_tfidf_limpios <- tokens_tfidf %>%
anti_join(
stop_words,
by = c("palabra" = "word")
) %>%
filter(
!palabra %in% palabras_tecnicas
) %>%
filter(
!palabra %in% palabras_generales_tema
) %>%
filter(
str_detect(palabra, "^[a-z]+$")
) %>%
filter(
nchar(palabra) > 2
)
# ============================================================
# 6. CONTAR PALABRAS POR SUBREDDIT
# ============================================================
conteos_tfidf <- tokens_tfidf_limpios %>%
count(
subreddit,
palabra,
sort = TRUE
)
conteos_tfidf %>%
head(20)
## subreddit palabra n
## 1 PoliticalDiscussion voters 12
## 2 politics voters 12
## 3 AskAnAmerican voters 10
## 4 conservatives voters 9
## 5 AskAnAmerican approve 8
## 6 AskAnAmerican economy 8
## 7 AskAnAmerican trade 8
## 8 PoliticalDiscussion approval 8
## 9 PoliticalDiscussion economy 8
## 10 PoliticalDiscussion middle 8
## 11 PoliticalDiscussion nation 8
## 12 PoliticalDiscussion plan 8
## 13 PoliticalDiscussion polarized 8
## 14 PoliticalDiscussion splits 8
## 15 PoliticalDiscussion tax 8
## 16 conservatives approval 8
## 17 AskAnAmerican disapprove 7
## 18 conservatives trade 7
## 19 politics disapprove 7
## 20 politics immigration 7
# ============================================================
# 7. CALCULAR TF-IDF
# ============================================================
# ------------------------------------------------------------
# bind_tf_idf():
#
# term = palabra analizada
# document = grupo de comparación
# n = frecuencia de la palabra dentro del grupo
#
# En este caso:
#
# term = palabra
# document = subreddit
# n = número de veces que aparece la palabra
# ------------------------------------------------------------
tfidf_subreddit <- conteos_tfidf %>%
bind_tf_idf(
term = palabra,
document = subreddit,
n = n
)
# ============================================================
# 8. VER RESULTADOS GENERALES
# ============================================================
tfidf_subreddit %>%
arrange(
desc(tf_idf)
) %>%
head(30)
## subreddit palabra n tf idf tf_idf
## 1 PoliticalDiscussion middle 8 0.03738318 0.2876821 0.010754470
## 2 PoliticalDiscussion nation 8 0.03738318 0.2876821 0.010754470
## 3 PoliticalDiscussion plan 8 0.03738318 0.2876821 0.010754470
## 4 PoliticalDiscussion polarized 8 0.03738318 0.2876821 0.010754470
## 5 PoliticalDiscussion splits 8 0.03738318 0.2876821 0.010754470
## 6 PoliticalDiscussion tax 8 0.03738318 0.2876821 0.010754470
## 7 conservatives constantly 4 0.01990050 0.2876821 0.005725016
## 8 conservatives lies 4 0.01990050 0.2876821 0.005725016
## 9 conservatives media 4 0.01990050 0.2876821 0.005725016
## 10 AskAnAmerican capture 3 0.01639344 0.2876821 0.004716100
## 11 AskAnAmerican polls 3 0.01639344 0.2876821 0.004716100
## 12 AskAnAmerican silent 3 0.01639344 0.2876821 0.004716100
## 13 AskAnAmerican supports 3 0.01639344 0.2876821 0.004716100
## 14 AskAnAmerican vote 3 0.01639344 0.2876821 0.004716100
## 15 AskAnAmerican voted 3 0.01639344 0.2876821 0.004716100
## 16 politics capture 3 0.01570681 0.2876821 0.004518567
## 17 politics polls 3 0.01570681 0.2876821 0.004518567
## 18 politics silent 3 0.01570681 0.2876821 0.004518567
## 19 politics supports 3 0.01570681 0.2876821 0.004518567
## 20 politics voted 3 0.01570681 0.2876821 0.004518567
## 21 conservatives capture 3 0.01492537 0.2876821 0.004293762
## 22 conservatives polls 3 0.01492537 0.2876821 0.004293762
## 23 conservatives silent 3 0.01492537 0.2876821 0.004293762
## 24 conservatives supports 3 0.01492537 0.2876821 0.004293762
## 25 AskAnAmerican affecting 2 0.01092896 0.2876821 0.003144066
## 26 AskAnAmerican legal 2 0.01092896 0.2876821 0.003144066
## 27 AskAnAmerican perception 2 0.01092896 0.2876821 0.003144066
## 28 AskAnAmerican public 2 0.01092896 0.2876821 0.003144066
## 29 politics affecting 2 0.01047120 0.2876821 0.003012378
## 30 politics constantly 2 0.01047120 0.2876821 0.003012378
# ============================================================
# 9. PALABRAS MÁS DISTINTIVAS POR SUBREDDIT
# ============================================================
top_tfidf_subreddit <- tfidf_subreddit %>%
group_by(
subreddit
) %>%
slice_max(
tf_idf,
n = 10,
with_ties = FALSE
) %>%
ungroup()
top_tfidf_subreddit
## # A tibble: 40 × 6
## subreddit palabra n tf idf tf_idf
## <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 AskAnAmerican capture 3 0.0164 0.288 0.00472
## 2 AskAnAmerican polls 3 0.0164 0.288 0.00472
## 3 AskAnAmerican silent 3 0.0164 0.288 0.00472
## 4 AskAnAmerican supports 3 0.0164 0.288 0.00472
## 5 AskAnAmerican vote 3 0.0164 0.288 0.00472
## 6 AskAnAmerican voted 3 0.0164 0.288 0.00472
## 7 AskAnAmerican affecting 2 0.0109 0.288 0.00314
## 8 AskAnAmerican legal 2 0.0109 0.288 0.00314
## 9 AskAnAmerican perception 2 0.0109 0.288 0.00314
## 10 AskAnAmerican public 2 0.0109 0.288 0.00314
## # ℹ 30 more rows
# ============================================================
# 10. VISUALIZAR TF-IDF POR SUBREDDIT
# ============================================================
top_tfidf_subreddit %>%
ggplot(
aes(
x = reorder_within(
palabra,
tf_idf,
subreddit
),
y = tf_idf,
fill = subreddit
)
) +
geom_col(
show.legend = FALSE
) +
coord_flip() +
facet_wrap(
~ subreddit,
scales = "free"
) +
scale_x_reordered() +
labs(
title = "Palabras más distintivas por subreddit",
subtitle = "Análisis TF-IDF sobre discusiones de opinión pública acerca de Donald Trump",
x = "",
y = "TF-IDF"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5)
)
Interpretacion:
El analisis realizado por el TF-IDF permite observar en sus resulrados que Political Discussion destaca con palabras como middle, nation, plan, polarized, splits y tax, todas con un TF-IDF aproximado de 0.1075. Esto sugiere que denreo de la muestra obtenidad por subreddit, se cuenta con un vocabulario mas asociado a la division politica, planes tributarios y polarización nacional que hacia una inclinacion unica especifica, ya que la discusion politica presenta una considerable inclinacion por la fragmentacion de opinion en las palabras detectadas mediante el codigo. Por otro lado, en conservatives, las palabras mas distintivas inclueyen constantly, lies y media, con un TF-IDF aproximado de 0.00573. Este patron sugiere que, en las publicaciones utilizadas y especificamente en esa comunidad, parte del vocabulario caracteristico gira en torno a la critica a los medios o la forma en la que se presenta la informacion. Entendiendo que estas palabras aparecen con mayor peso relativo y muestran una frecuencia de aparicion importante en las publicaciones.
En AskAmerican, aparecen como distintivas palabras como capture, polls, silent, supports, vote y voted, con un TF-IDF aproximado de 0.00472. Lo que parece indicar que las palabras mas utilizadas en estas publicaciones de este especifico grupo y el vocabulario usado esta mas relacionado con encuestas, voto, apoyo y percepción ciudadana. En politics, también aparecen términos como capture, polls, silent, supports y voted, aunque con un TF-IDF ligeramente menor, cercano a 0.00452. Si bien es cierto que esto no necesariamente indica una conversacion sobre estos temas, se puede encontrar un patron textual sobre votos y silencio debido a su nivel de aparicion en AskAmerican.
Al utilizarlo, se encontro que la ventaja del TF-IDF frente a la frecuencia simple es que permite ver diferencias entre grupos. Mientras la frecuencia muestra que voters, approval o economy son palabras muy comunes en general, el TF-IDF ayuda a detectar qué palabras caracterizan más a cada subreddit. Su limitación es que sigue trabajando con palabras aisladas: no entiende ideología, emociones, sarcasmo ni intención política.
# ============================================================
# 4. WORD CLOUD · OPINIÓN PÚBLICA SOBRE DONALD TRUMP EN REDDIT
# ============================================================
# ------------------------------------------------------------
# ¿QUÉ HAREMOS?
# ------------------------------------------------------------
#
# Vamos a construir una nube de palabras con los términos
# más frecuentes en los textos analizados sobre Donald Trump.
#
# IDEA:
#
# Las palabras más frecuentes aparecerán más grandes.
#
# IMPORTANTE:
#
# La nube de palabras NO es un análisis profundo.
#
# Sirve como:
#
# ✔ exploración inicial
# ✔ visualización rápida
# ✔ apoyo para presentación
#
# PERO:
#
# ✘ no muestra contexto
# ✘ no muestra relaciones entre palabras
# ✘ no permite concluir causalidad ni postura política
# ------------------------------------------------------------
# ============================================================
# 1. INSTALAR Y CARGAR PAQUETES
# ============================================================
# Instalar solo si los paquetes no existen
if (!requireNamespace("wordcloud", quietly = TRUE)) {
install.packages("wordcloud")
}
if (!requireNamespace("RColorBrewer", quietly = TRUE)) {
install.packages("RColorBrewer")
}
library(wordcloud)
library(RColorBrewer)
library(dplyr)
# ============================================================
# 2. REVISAR FRECUENCIAS GLOBALES
# ============================================================
# Si la tabla 'frecuencias' ya existe desde la limpieza textual,
# este paso solo la revisa.
# Si no existe, la volvemos a crear desde tokens_limpios.
if (!exists("frecuencias")) {
frecuencias <- tokens_limpios %>%
count(
palabra,
sort = TRUE
)
}
cat("\nTop 20 palabras más frecuentes:\n")
##
## Top 20 palabras más frecuentes:
frecuencias %>%
head(20)
## palabra n
## 1 trump's 81
## 2 americans 43
## 3 voters 43
## 4 trump 41
## 5 approval 26
## 6 disapprove 25
## 7 economy 25
## 8 trade 23
## 9 approve 22
## 10 policies 21
## 11 immigration 19
## 12 majority 19
## 13 poll 18
## 14 45 15
## 15 48 15
## 16 divided 15
## 17 healthcare 15
## 18 rating 14
## 19 2026 13
## 20 63 13
# ============================================================
# 3. CREAR NUBE DE PALABRAS GLOBAL
# ============================================================
# ------------------------------------------------------------
# wordcloud():
#
# words:
# palabras
#
# freq:
# frecuencia de cada palabra
#
# min.freq:
# frecuencia mínima para aparecer
#
# max.words:
# máximo de palabras en la nube
#
# random.order = FALSE:
# organiza dando prioridad a palabras más frecuentes
# ------------------------------------------------------------
set.seed(123)
wordcloud(
words = frecuencias$palabra,
freq = frecuencias$n,
min.freq = 2,
max.words = 100,
random.order = FALSE,
rot.per = 0.2,
colors = brewer.pal(
8,
"Dark2"
)
)
Interpretacion:
En la nube de palabras se puede observar que las palabras que mas dominan la visualizacion son aquellos que presentan mayor repeticion, especificamente trump’s con 81 apariciones, americans con 43, voters con 43, trumpo con 41, approval con 26, disapprove con 25, economy con 25, trade con 23, approve con 22 y policies con 21. El patron principal del WordCloud es que la conversación analizada se organiza alrededor de tres núcleos: primero, la figura política de Trump; segundo, la opinión pública de los estadounidenses y votantes; y tercero, temas de gestión política como economía, comercio, inmigración y salud. Las palabras grandes no deben leerse como “las más importantes políticamente”, sino como las que aparecen con mayor frecuencia en el corpus durante el analisis. Lo que indica que son palabras que acompañan los elementos claves de la discucion y suelen estar presentes al momento de publicar respecto a la opinion publica de trump al menos en las publicaciones analizadas.La nube también muestra que el vocabulario de aprobación y desaprobación está presente al mismo tiempo. Aparecen términos como approval, approve, disapprove, unpopular, divided y rating. Esto sugiere que el corpus contiene lenguaje asociado a evaluación, división y medición de opinión pública. La mayor limitacion del WordCloud es que sirve como una visualización exploratoria, pero no como una prueba de postura política o ideológica, por lo que nos permite una observacion intuitiva de la frecuencia de aparicion de las palabras, pero no de su contexto, del grupo donde aparicion o la connotación de estas.
# ============================================================
# FRECUENCIA DE PALABRAS · REDDIT Y DONALD TRUMP
# ============================================================
# ------------------------------------------------------------
# ¿QUÉ HAREMOS?
# ------------------------------------------------------------
#
# Vamos a identificar las palabras más frecuentes
# en los textos sobre Donald Trump.
#
# Para esto vamos a:
#
# 1. Combinar título + comentario
# 2. Tokenizar el texto
# 3. Eliminar stopwords
# 4. Eliminar palabras técnicas
# 5. Contar palabras
# 6. Graficar las palabras más frecuentes
# ------------------------------------------------------------
# ============================================================
# 1. CARGAR LIBRERÍAS
# ============================================================
library(dplyr)
library(tidytext)
library(stringr)
library(ggplot2)
# ============================================================
# 2. CREAR TEXTO COMPLETO
# ============================================================
base_frecuencia <- base_final %>%
mutate(
texto_completo = paste(title, comment, sep = " "),
texto_completo = str_to_lower(texto_completo)
)
# ============================================================
# 3. TOKENIZAR TEXTO
# ============================================================
tokens <- base_frecuencia %>%
select(url, subreddit, texto_completo) %>%
unnest_tokens(
palabra,
texto_completo
)
# ============================================================
# 4. ELIMINAR STOPWORDS
# ============================================================
data("stop_words")
tokens_limpios <- tokens %>%
anti_join(
stop_words,
by = c("palabra" = "word")
)
# ============================================================
# 5. LIMPIEZA ADICIONAL
# ============================================================
# Palabras técnicas que no aportan significado
palabras_tecnicas <- c(
"amp", "http", "https", "com", "www", "reddit",
"subreddit", "post", "posts", "comment", "comments"
)
# Palabras generales del tema.
# Se eliminan porque aparecerán mucho y pueden ocultar
# palabras más interesantes.
palabras_generales <- c(
"trump", "donald", "president", "america",
"american", "americans", "usa", "us"
)
tokens_limpios <- tokens_limpios %>%
filter(
!palabra %in% palabras_tecnicas
) %>%
filter(
!palabra %in% palabras_generales
) %>%
filter(
str_detect(palabra, "^[a-z]+$")
) %>%
filter(
nchar(palabra) > 2
)
# ============================================================
# 6. FRECUENCIA GLOBAL DE PALABRAS
# ============================================================
frecuencias <- tokens_limpios %>%
count(
palabra,
sort = TRUE
)
# Ver las 20 palabras más frecuentes
frecuencias %>%
head(20)
## palabra n
## 1 voters 43
## 2 approval 26
## 3 disapprove 25
## 4 economy 25
## 5 trade 23
## 6 approve 22
## 7 policies 21
## 8 immigration 19
## 9 majority 19
## 10 poll 18
## 11 divided 15
## 12 healthcare 15
## 13 rating 14
## 14 unpopular 13
## 15 afraid 11
## 16 coastal 11
## 17 disapproval 11
## 18 elites 11
## 19 favorability 11
## 20 gallup 11
# ============================================================
# 7. GRÁFICO DE PALABRAS MÁS FRECUENTES
# ============================================================
top_20_palabras <- frecuencias %>%
slice_max(
n,
n = 20
)
ggplot(
top_20_palabras,
aes(
x = reorder(palabra, n),
y = n
)
) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(
title = "Palabras más frecuentes en discusiones sobre Donald Trump",
subtitle = "Análisis de textos de Reddit",
x = "Palabra",
y = "Frecuencia"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5)
)
Interpretacion:
El análisis de frecuencia de palabras muestra que, después de la limpieza textual, los términos más repetidos fueron voters con 43 apariciones, approval con 26, disapprove con 25, economy con 25, trade con 23, approve con 22, policies con 21, immigration con 19, majority con 19 y poll con 18. Estos datos indican que la conversación se concentra principalmente en la relación entre Trump, los votantes, la aprobación o desaprobación pública, y temas de política pública como economía, comercio e inmigración.
Un primer patrón que aparece es que el debate no gira solamente alrededor de la figura personal de Trump, sino alrededor de su evaluación pública. Palabras como approval, approve, disapprove, disapproval, rating, poll y favorability muestran que el lenguaje está muy asociado a encuestas, medición de opinión y percepción ciudadana, con una importante prevalencia de palabras relacionadas a su cargo como presidente, a las decisiones politicas e ideologias politicas, que si bien es cierto que no permiten saber acerca de la opinion exacta de las publicaciones, las palabras permiten entender que son temas de conversacion que hacen parte de la figura de Donald Trump, la opinion de cierto sector de la poblacion y la percepcion politica actual de Estados Unidos.
También emergen temas políticos concretos. La presencia de economy, trade, policies, immigration y healthcare sugiere que las discusiones se articulan alrededor de áreas específicas de gobierno. Es decir, los textos y las palabras obtenidas a partir de las publicaciones del subreddit no solo mencionan apoyo o rechazo, sino que relacionan esa opinión con asuntos como economía, comercio, salud e inmigración. Aspecto coherente con el peso politico actual de Donald Trump como presidente de los estados unidos, donde sus acciones o decisiones no son aisladas sino que representan elementos importantes del funcionamiento actual del gobierno de Estados Unidos.
Conclusion:
En conjunto, los tres análisis muestran que el corpus se organiza alrededor de opinión pública, votantes, aprobación/desaprobación, economía, comercio, inmigración, salud y polarización. La frecuencia y el WordCloud permiten identificar las palabras dominantes, mientras que el TF-IDF permite observar diferencias de vocabulario entre subreddits. No obstante, estos resultados deben interpretarse con cautela. La base usada es sintética debido a dificultades de acceso a la API de Reddit, por lo que los resultados sirven para practicar técnicas de análisis textual, pero no para hacer afirmaciones concluyentes sobre la opinión real de los estadounidenses.