La diversidad funcional en el ámbito laboral mexicano: Un análisis de su

representación en los textos

En el presente docuemento se realizará un analisis X de la infromación oficial del Gobierno de México, de la Secretaria de X, y también

Para evaluar la problemática, fue necesario plantear a modo de pregunta de investigación, si durante el sexenio de Andres Manuel López Obrador (AMLO), ¿Se ha evidenciado un cambio en el discurso laboral de las personas con discapacidad en México?. Esto toma engloba el si la sociedad, el sector privado, el sector público y los medios de comunicación han implementado las medidas adecuadas para cambiar el contexto y la acciones, permitiendo que las personas con discapacidad se desenvuelvan de manera íntegra, específicamente en el ámbito laboral en México. Para ello se realizarán procedimientos de extracción de datos como: web scrapping, limpieza de texto, vectorización y la exploración de los datos; posterior a ello se realizará los procedimientos/visualizaciones para extraer los resultados, los cuales será: gráficos de frecuencias, nube de palabras, análisis de tópicos y análisis de sentimientos de los textos recopilados.

Antes de comenzar con los procedimientos, se debe tomar en cuenta que las descripción de los mismo se encontrarán en la primera dupla de las fuentes establecidad. En este caso, su descripción estará únicamente en las duplas de 2018-2019 del gobierno de México.

Gobierno de México 2018 - 2019

Se establecen la librerias principales para trabajar la extración y el analisis de los textos, posteriormente se destina la carpeta en donde se guardará la infromación correpondiente. La infromación se manejara por duplas - cada dos años- como resultado se obtendré un análisis de texto del sexenio de Andrés Manuel López Obrador dentro de sus funetes oficiales de gobierno y dentro de los medios de comunicación masivas nacionales - las noticias-.

#cargo las librerias necesarias 
library(rvest)
## Warning: package 'rvest' was built under R version 4.2.3
library(magrittr)
library(httr)
## Warning: package 'httr' was built under R version 4.2.3
library(tools)
library(stringr)
## Warning: package 'stringr' was built under R version 4.2.3
library(tm)
## Warning: package 'tm' was built under R version 4.2.3
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## The following object is masked from 'package:httr':
## 
##     content

Web scrapping de las duplas de los años (2018-2019)

Este código en R realiza web scraping de diversas páginas web del Gobierno de México correspondientes a los años 2018-2019. El objetivo principal es extraer el contenido de los párrafos de cada página web y almacenarlo en archivos de texto individuales. Aquí se presenta una explicación detallada del código:

  1. Definición de la carpeta principal: Se establece la ruta de la carpeta principal donde se guardarán los archivos de texto descargados. En este caso, la ruta es “C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19”.

  2. Definición de las páginas web a scrapear: Se proporciona un vector llamado gobmx1819 que contiene las URLs de las páginas web que se van a analizar. Estas URLs corresponden a diversas secciones del sitio web del Gobierno de México relacionadas con temas de discapacidad y empleo.

  3. Iteración a través de la URL: Se inicia un bucle for para iterar a través de cada URL en el vector gobmx1819.

  4. Lectura del contenido HTML de la página web: Utiliza la función read_html del paquete rvest para cargar el contenido HTML de la página web especificada por la URL.

  5. Extracción de párrafos: Utiliza la función html_elements para extraer los elementos de párrafo (“p”) del contenido HTML de la página web.

  6. Extracción del contenido de los párrafos: Utiliza la función html_text para obtener el texto contenido en los párrafos extraídos, convirtiéndolo en un vector de texto.

  7. Creación del nombre de archivo: Genera un nombre de archivo basado en la URL. Utiliza expresiones regulares para reemplazar caracteres no permitidos en nombres de archivos y agrega la extensión “.txt”.

  8. Creación de la ruta completa del archivo: Utiliza file.path para construir la ruta completa del archivo utilizando la carpeta principal y el nombre del archivo generado.

  9. Escritura del contenido en un archivo de texto: Utiliza writeLines para escribir el contenido extraído de la página web en un archivo de texto con la ruta especificada.

  10. Mensaje de confirmación: Imprime un mensaje indicando que el archivo ha sido descargado y guardado, junto con la ruta completa del archivo.

# Carpeta principal
carpeta_principal1819 <- "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19"

paginas <- c(1:2)
userAgent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"

# Se juntan las ligas del 2018 - 2019
gobmx1819 <- c(
  "https://www.gob.mx/capacidadesyempleo/acciones-y-programas/estimulos-fiscales-para-las-empresas-que-contratan-trabajadores-con-discapacidad-169866",
  "https://www.gob.mx/capacidadesyempleo/es/articulos/30-de-personas-con-discapacidad-fue-discriminada-al-menos-una-vez-en-los-ultimos-5-anos-encuesta-conapred?idiom=es",
  "https://www.gob.mx/capacidadesyempleo/acciones-y-programas/beneficios-fiscales-por-adaptacion-de-instalaciones-para-trabajadores-con-discapacidad",
  "https://www.gob.mx/capacidadesyempleo/es/articulos/si-representas-a-una-empresa-que-busca-contratar-a-personas-con-discapacidad?idiom=es",
  "https://www.gob.mx/conadis/articulos/dia-nacional-por-la-inclusion-laboral-2019?idiom=es",
  "https://www.gob.mx/conadis/articulos/dia-internacional-de-las-personas-con-discapacidad-2019?idiom=es",
  "https://www.gob.mx/conadis/articulos/participacion-del-conadis-en-el-grupo-tecnico-de-trabajo-en-turismo-accesible?idiom=es")

# Iterar a través de las URL´s
for (url in gobmx1819) {
  # Leer las páginas web
  paginasgobmx1819 <- read_html(url)
  
  # Extraer los paráfos de la página 
  parrafos.gob1819 <- html_elements(paginasgobmx1819, "p") #p de parrafos 
  
  # Extraer el contennido de los parrafós 
  text_contentgob1819 <- html_text(parrafos.gob1819)
  
  # Crear el nombre de archivo basado en la URL´s
  nombre_archivogob1819 <- gsub("[^A-Za-z0-9._-]", "_", sub(".*/", "articulos2018-2019", url))
  nombre_archivogob1819 <- paste0(nombre_archivogob1819, ".txt")
  
   # Crear la ruta completa para el archivo
  ruta_archivogob1819 <- file.path(carpeta_principal1819, nombre_archivogob1819)
  
  # Escribe el contenido del archivo de texto 
  writeLines(text_contentgob1819, ruta_archivogob1819)
  
  cat("Archivo descargado y guardado como", ruta_archivogob1819, "\n")
}
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19/articulos2018-2019estimulos-fiscales-para-las-empresas-que-contratan-trabajadores-con-discapacidad-169866.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19/articulos2018-201930-de-personas-con-discapacidad-fue-discriminada-al-menos-una-vez-en-los-ultimos-5-anos-encuesta-conapred_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19/articulos2018-2019beneficios-fiscales-por-adaptacion-de-instalaciones-para-trabajadores-con-discapacidad.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19/articulos2018-2019si-representas-a-una-empresa-que-busca-contratar-a-personas-con-discapacidad_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19/articulos2018-2019dia-nacional-por-la-inclusion-laboral-2019_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19/articulos2018-2019dia-internacional-de-las-personas-con-discapacidad-2019_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno18_19/articulos2018-2019participacion-del-conadis-en-el-grupo-tecnico-de-trabajo-en-turismo-accesible_idiom_es.txt

Limpieza de los textos 2018 - 2019

Nota: Las noticias del gobierno de México son cortas pero fue indispensable mantener cada una en un archivo individual para conservar las limitaciones que provocaría juntar los archivos pdf del gobierno de México - como el Plan Nacional del trabajo para personcas con discpacidad-. Aunque no es lo más óptimo, funciona sí la infromación está separada por carpetas y por periodo para posterior crear un vector que junte la información.

Este código en R se centra en procesar y limpiar archivos de texto correspondientes a los años 2018-2019. Aquí se presenta una explicación detallada del código:

  1. Obtención de la lista de archivos txt del 2018 - 2019: Utiliza la función list.files para obtener una lista de archivos en el directorio actual con la extensión “.txt”. Luego, se añaden manualmente tres archivos adicionales a la lista.

  2. Verificación de la existencia de los archivos: Utiliza file.exists para verificar la existencia de los archivos listados en gob1819. El resultado es un vector lógico que indica qué archivos existen.

  3. Filtrado de archivos existentes: Filtra la lista gob1819 para incluir solo los archivos que realmente existen en el directorio.

  4. Inicialización de una variable para almacenar el texto: Crea un vector vacío llamado texto_unido que se utilizará para almacenar el contenido de los archivos de texto.

  5. Lectura de cada archivo y unión del texto: Utiliza un bucle for para leer cada archivo de la lista y unir su contenido al vector texto_unido.

  6. Conversión del texto unido a un solo vector de caracteres: Utiliza la función paste para combinar todos los elementos del vector texto_unido en un solo string, separando cada elemento con un espacio.

  7. Limpieza de Textos: Llama a una función llamada limpiar_gob1819 que realiza una serie de operaciones de limpieza en el texto, como eliminar URLs, etiquetas HTML, puntuación, números, espacios en blanco adicionales, convertir el texto a minúsculas y eliminar palabras vacías (stopwords).

  8. Función de Limpieza (limpiar_gob1819): La función limpiar_gob1819 realiza diversas operaciones de limpieza, como eliminar URLs, etiquetas HTML, puntuación, números, espacios en blanco adicionales, convertir el texto a minúsculas y eliminar stopwords en español.

# Obtener la lista de archivos txt del 2018 - 2019
gob1819 <- list.files(path = ".", pattern = "*.txt")
gob1819 <- c(gob1819, "gob_manual2019", "gob_youtube2018", "gob_Youtube2019")

# Verificar si los archivos existen
archivos_existentes <- file.exists(gob1819)

# Filtrar solo los archivos existentes
gob1819 <- gob1819[archivos_existentes]

# Inicializar una variable para almacenar el texto
texto_unido <- character(0)

# Leer cada archivo por separado y unirlos
for (archivo in gob1819) {
  texto_unido <- c(texto_unido, readLines(archivo))
}

# Convertir el texto unido a un solo vector de caracteres
texto_unido <- paste(texto_unido, collapse = " ")

# Limpieza de Textos
limpiar_gob1819 <- function(texto){
  # Eliminar URL´s
  texto <- gsub("http\\S+|www\\.\\S+", "", texto)
  
  # Eliminar etiquetas
  texto <- gsub("<.*?>", "", texto)
  
  # Puntuación 
  texto <- gsub("[[:punct:]]", "", texto)
  
  # Números
  texto <- gsub("\\d+", "", texto)
  
  # Espacios
  texto <- gsub("\\s+", " ", texto)
  
  # Convertir el texto a minúscula 
  texto <- tolower(texto)
  
  # stopwords 
  stopwords_es <- stopwords("es")
  texto <- removeWords(texto, stopwords_es)
  
  return(texto)
}

# Limpieza para el texto unido
texto_limpio_unido <- limpiar_gob1819(texto_unido)

Vectorización Gobierno de México 2018 - 2019

Antes de comenzar con este procedimiento, es indispensable destacar la definición de un corpus: Un corpus es un conjunto estructurado de textos que se utiliza como base para análisis lingüísticos y estudios del lenguaje. Este conjunto puede abarcar una amplia variedad de fuentes y tipos de textos, como libros, artículos, conversaciones, mensajes en redes sociales, entre otros.

  1. Creación de un corpus con el texto limpio y unido: Se utiliza el paquete tm para crear un corpus a partir del texto limpio y unido (texto_limpio_unido). La función Corpus y VectorSource ayudan a estructurar los datos de texto para su posterior procesamiento.

  2. Eliminación de palabras específicas del corpus: La función tm_map se emplea para aplicar la eliminación de palabras definidas en palabras_eliminar al corpus. Esto ayuda a reducir el ruido y a centrarse en las palabras más significativas para el análisis.

  3. Creación de la Document Term Matrix (DTM): La función DocumentTermMatrix se utiliza para convertir el corpus limpio en una matriz de términos por documento. En este contexto, cada documento puede ser un archivo de texto o una unidad de análisis.

  4. Visualización de la Matriz: La función inspect se utiliza para visualizar la Document Term Matrix (dtm1819). Esto muestra la frecuencia de cada palabra en cada documento, proporcionando una perspectiva cuantitativa de la distribución de las palabras en el corpus.

# Limpieza manual de los textos
palabras_eliminar <- c("hacia", "cada", "ello", "día", "junio", "proporcionó", "alguna", "través", "derechos", "gracias", "párrafo", "único", "parte", 
                       "según","así")

# Crear un corpus con el texto limpio y unido
corpus1819 <- Corpus(VectorSource(texto_limpio_unido))
corpus1819 <- tm_map(corpus1819, removeWords, palabras_eliminar)
## Warning in tm_map.SimpleCorpus(corpus1819, removeWords, palabras_eliminar):
## transformation drops documents
# Document Term Matrix
dtm1819 <- DocumentTermMatrix(corpus1819)

# Ver la Matriz
inspect(dtm1819)
## <<DocumentTermMatrix (documents: 1, terms: 1569)>>
## Non-/sparse entries: 1569/0
## Sparsity           : 0%
## Maximal term length: 21
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs desarrollo discapacidad discriminación empleo inclusión información
##    1         45          162             42     52        46          38
##     Terms
## Docs laboral nacional personas trabajo
##    1      61       80      131      62

Cabe mencionar que la creación de una carpeta individual para cada periodo, tiene un impacto positivo en la creación de la matrix de términos. Lo siguiente se debe a que en la vectorización lo que hace la función es juntar todos los textos que tengan la terminación en .txt, el problema con eso es que se puede presentar una matriz que esté sobrescrita con los términos de periodos ajenos al análisis. Es por eso que se obta direccionar la infromación a un lugar especifico, de esta manera se crea un solo documeto con 1569 términos

Exploración de datos 2018 - 2019

La información se presenta en un Data Frame llamado Frecuencia1819, y se muestran los 25 términos más comunes mediante la función head(). Este análisis proporciona una visión inicial de la frecuencia de términos en el conjunto de datos para el período mencionado.

conteo_total1819 <- colSums(as.matrix(dtm1819))
# Ordenar y mostrar los términos más comúnes
terminos_comunes <- sort(conteo_total1819, decreasing = TRUE)

# Data Frame para la tabla de frecuencias 
Frecuencia1819 <- data.frame(termino = names(terminos_comunes), conteo = terminos_comunes)
head(Frecuencia1819, 25) # Mostrar los 25 términos más comunes
##                       termino conteo
## discapacidad     discapacidad    162
## personas             personas    131
## nacional             nacional     80
## trabajo               trabajo     62
## laboral               laboral     61
## empleo                 empleo     52
## inclusión           inclusión     46
## desarrollo         desarrollo     45
## discriminación discriminación     42
## información       información     38
## años                     años     37
## social                 social     35
## población           población     34
## puedes                 puedes     34
## acciones             acciones     29
## seleccionar       seleccionar     28
## acceso                 acceso     27
## condiciones       condiciones     25
## méxico                 méxico     25
## calidad               calidad     24
## general               general     24
## recuperado         recuperado     23
## participación   participación     22
## programa             programa     22
## portal                 portal     21

Visualización de datos Gobierno 2018 - 2019

Gráfica de frecuencias

Este código en R se utiliza para crear un gráfico de barras horizontales que representa los 36 términos más comunes en un conjunto de datos correspondiente al periodo 2018-2019, específicamente en el contexto de un análisis sobre el Gobierno.

Este código utiliza la función barplot para crear el gráfico de barras. Algunos de los parámetros más importantes incluyen:

frecuencias_1819: Las alturas de las barras, es decir, las frecuencias de los términos. names.arg: Los nombres de los términos que se colocarán en el eje y. horiz = TRUE: Indica que el gráfico de barras será horizontal. las = 1: Orientación de las etiquetas en el eje y. main: Título principal del gráfico. xlab: Etiqueta del eje x. col: Colores de las barras, en este caso, los colores personalizados previamente definidos. border: Color de los bordes de las barras. cex.names, cex.axis, cex.main, cex.lab: Tamaños de letra para las etiquetas y el título.

library(RColorBrewer)
# Tomar los 100 términos más comunes
terminos_1819 <- names(terminos_comunes)[5:40]

# Crear un vector con las frecuencias de estos términos
frecuencias_1819 <- terminos_comunes[5:40]

# Definir colores personalizados
colores1819 <- rev(colorRampPalette(brewer.pal(4, "Set1"))(100))

# Crear un gráfico de barras con colores y ajustes de tamaño de letra
barplot(frecuencias_1819, 
        names.arg = terminos_1819, 
        horiz = TRUE, 
        las = 1, 
        main = "Términos Más Utilizados en Gobierno (2018 - 2019)", 
        xlab = "Frecuencia", 
        col = colores1819,  # Agregar los colores personalizados
        border = "white",  # Color de los bordes de las barras
        cex.names = 0.6,   # Tamaño de letra en el eje x
        cex.axis = 0.7,    # Tamaño de letra en los ejes
        cex.main = 1.2,    # Tamaño de letra en el título principal
        cex.lab = 1.2      # Tamaño de letra en las etiquetas de los ejes
)

La gráfica representa visualmente la frecuencia de los términos más utilizados en el contexto gubernamental durante el periodo 2018-2019. Cada barra horizontal representa un término, y la longitud de la barra indica la frecuencia con la que aparece dicho término. Los términos están etiquetados en el eje y. La paleta de colores personalizada proporciona distinción visual entre las barras. Este tipo de gráfico es útil para identificar rápidamente los términos más frecuentes y su comparación relativa en el conjunto de datos analizado.

Nube de palabras

El número de términos es prometedor en este periodo, por lo que la frecuencia promedio se desarrollará dentro de 10, mostrando una cantidad justa de palabras que puedan entrar en la nube de palabras. Así mismo la visualización se presentará con la intención de dimensionar la intencidad y la frecuencia de la palabras mostrando colores y tamaños equivalentes a los parametros mencionados.

library(wordcloud)
## Warning: package 'wordcloud' was built under R version 4.2.3
wordcloud(words = Frecuencia1819$termino,
          freq = Frecuencia1819$conteo,
          min.freq = 10,
          max.words = 100, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(10,"Paired"))

Se puede observar que la palabra discapacidad por la naturaleza del tema muestra un tamaño mayor, debido a la frecuencia de la palabras pero lo interesante de este análsisis es que los términos que se muestran están ligados a un vocabulario institucional y normativo y esto se debe a que el gobierno de Andrés Manuel estaba comenzando a tomar acción en los temas fijados en la agenda pública, dentro de los cuales se encuentra los grupos minoritarios.

Análsis de sentimiento

Este código en R realiza un análisis de sentimiento en textos relacionados con el Gobierno durante el periodo 2018-2019 utilizando el léxico NRC. Luego, visualiza la distribución de las emociones en un gráfico de barras utilizando la librería Plotly. Además, se han cambiado las etiquetas de las emociones al español para mejorar la interpretación del gráfico.

# Cargamos las librerías necesarias
library(syuzhet)
## Warning: package 'syuzhet' was built under R version 4.2.3
library(plotly)
## Warning: package 'plotly' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:NLP':
## 
##     annotate
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:httr':
## 
##     config
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(tm)

# Análisis de sentimiento con el lexico (método de NRC)
nrc1819 <- get_sentiment(texto_limpio_unido, method="nrc")

# Se obtiene las emociones por el diccionario nrc
emotions <- get_nrc_sentiment(texto_limpio_unido)
emo_bar <- colSums(emotions)
emo_sum <- data.frame(emotion = names(emo_bar), count = emo_bar)

# Cambiar etiquetas de emociones a español
emo_sum$emotion[emo_sum$emotion == "positive"] <- "Positivo"
emo_sum$emotion[emo_sum$emotion == "negative"] <- "Negativo"
emo_sum$emotion[emo_sum$emotion == "anger"] <- "Enojo"
emo_sum$emotion[emo_sum$emotion == "anticipation"] <- "Anticipación"
emo_sum$emotion[emo_sum$emotion == "disgust"] <- "Disgusto"
emo_sum$emotion[emo_sum$emotion == "fear"] <- "Miedo"
emo_sum$emotion[emo_sum$emotion == "joy"] <- "Alegría"
emo_sum$emotion[emo_sum$emotion == "sadness"] <- "Tristeza"
emo_sum$emotion[emo_sum$emotion == "surprise"] <- "Sorpresa"
emo_sum$emotion[emo_sum$emotion == "trust"] <- "Confianza"

# Visualización
plot_ly(emo_sum, x = ~emotion, y = ~count, type = "bar", color = ~emotion) %>%
  layout(xaxis = list(title = ""), showlegend = FALSE,
         title = "Distribución de sentimientos en los textos de Gobierno 2018 - 2019 ")
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

El resultado final muestra una tendencia positiva, aunque es importante considerar que para este tipo de análisis, la biblioteca tiene en cuenta la raíz de la palabra y no el contexto en el que se encuentra. Por lo tanto, a pesar de arrojar resultados favorables, estos podrían estar sesgados debido a la estructura y el estilo de los textos analizados. Además, observamos que el segundo sentimiento predominante es el de “confianza”. Sin embargo, en nuestro contexto específico, este término se traduce como la expectativa de mejores oportunidades, las cuales pueden no ser tan positivas como inicialmente se pensaba.

Modelo Supervisado y no supervisado

Este código en R realiza un análisis integral de un conjunto de texto representado por transcription1819. Primero, utiliza la biblioteca sentimentr para realizar un análisis de sentimiento en los textos, proporcionando una visión general de las emociones presentes. Luego, emplea el modelo de topic models (LDA) de la biblioteca topicmodels para identificar y explorar los temas latentes presentes en el corpus. Este modelo asigna probabilidades a palabras específicas en relación con cada tema, permitiendo la identificación de términos más relevantes para cada tópico.

El código genera un gráfico de barras utilizando ggplot2, donde cada barra representa la importancia de los términos más relevantes en cada uno de los cinco tópicos identificados por el modelo. El eje y representa la probabilidad (beta) de cada término en el tópico, y el color de las barras indica a qué tópico pertenecen. La disposición del gráfico facilita la comparación entre términos y tópicos.

Finalmente, el código crea un dataframe llamado terms1819 que contiene los términos más importantes de cada tópico, junto con sus respectivas probabilidades.

library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.0     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::annotate()     masks NLP::annotate()
## ✖ plotly::config()        masks httr::config()
## ✖ NLP::content()          masks httr::content()
## ✖ tidyr::extract()        masks magrittr::extract()
## ✖ dplyr::filter()         masks plotly::filter(), stats::filter()
## ✖ readr::guess_encoding() masks rvest::guess_encoding()
## ✖ dplyr::lag()            masks stats::lag()
## ✖ purrr::set_names()      masks magrittr::set_names()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(tidytext)
## Warning: package 'tidytext' was built under R version 4.2.3
library(dplyr)
library(sentimentr)
## Warning: package 'sentimentr' was built under R version 4.2.3
## 
## Attaching package: 'sentimentr'
## 
## The following object is masked from 'package:plotly':
## 
##     highlight
## 
## The following object is masked from 'package:syuzhet':
## 
##     get_sentences
library(topicmodels)
## Warning: package 'topicmodels' was built under R version 4.2.3
library(tm)
library(ggplot2)

# Leer el archivo txt
transcription1819 <- texto_limpio_unido

# Analizar el sentimiento
sentiment1819 <- sentiment_by(transcription1819)
## Warning: Each time `sentiment_by` is run it has to do sentence boundary disambiguation when a
## raw `character` vector is passed to `text.var`. This may be costly of time and
## memory.  It is highly recommended that the user first runs the raw `character`
## vector through the `get_sentences` function.
# Generar un modelo de topic models
lda1819 <- LDA(dtm1819, k = 5)

# Obtener los términos más importantes de cada tópico
terms1819 <- tidy(lda1819, matrix = "beta") %>%
  group_by(topic) %>%
  top_n(5, wt = beta)

# Generar el gráfico
ggplot(terms1819, aes(x = term, y = beta, fill = factor(topic))) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~topic, ncol = 3)

# Obtener los términos más importantes de cada tópico en un dataframe
terms1819 <- tidy(lda1819, matrix = "beta")
terms1819 <- terms1819 %>%
  select(term, beta)

¿Qué significan las betas?

En el contexto de modelos de tópicos, como el modelo de Latent Dirichlet Allocation (LDA), las betas representan las probabilidades de ocurrencia de cada palabra en un tópico específico. Cada tópico está asociado con una distribución de palabras, y las betas indican la probabilidad de que una palabra particular pertenezca a ese tópico.

Gobierno de México 2020 - 2021

Se realiza el mismo procedimiento, las diferencias se encuentran en los resultados de las visualizaciones

Web scrapping de las duplas de los años (2020-2021)

# Se establece la pagina destino 
carpeta_destino20 <- "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno20_21"
Sys.setlocale("LC_TIME","es_ES.UTF-8")
## [1] "es_ES.UTF-8"
paginas20 <- c(1:2)
userAgent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"

# Se juntan las ligas del 2018 - 2019
gobmx20y21 <- c(
  "https://www.gob.mx/stps/es/articulos/pensiones-para-el-bienestar-de-personas-con-discapacidad-y-de-adultos-mayores-conferencias-sobre-programas-del-bienestar?idiom=es",
  "https://www.gob.mx/bienestar/es/articulos/servidores-de-la-nacion-los-programas-sociales-hasta-donde-nunca-habian-llegado?idiom=es",
  "https://comunicacionsocial.senado.gob.mx/informacion/comunicados/1419-respalda-senado-reforma-que-promueve-inclusion-laboral-de-personas-con-discapacidad")

# Iterar a través de las URL´s
for (url20 in gobmx20y21) {
  # Leer las páginas web
  paginasgobmx20y21 <- read_html(url20)
  
  # Extraer los paráfos de la página 
  parrafos.gob20y21 <- html_elements(paginasgobmx20y21, "p") #p de parrafos 
  
  # Extraer el contennido de los parrafós 
  text_contentgob20y21 <- html_text(parrafos.gob20y21)
  
  # Crear el nombre de archivo basado en la URL´s
  nombre_archivogob20y21 <- paste0("articulo_2020_21",
                                   gsub("[^A-Za-z0-9._-]",
                                        "_",
                                        sub(".*/"," ", url20)), ".txt")
  
  
  # Crear la ruta completa para el archivo
  ruta_archivogob2021 <- file.path(carpeta_destino20, nombre_archivogob20y21)
  
  # Escribe el contenido del archivo de texto 
  writeLines(text_contentgob20y21, ruta_archivogob2021)
  
  cat("Archivo descargado y guardado como", ruta_archivogob2021, "\n")
}
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno20_21/articulo_2020_21_pensiones-para-el-bienestar-de-personas-con-discapacidad-y-de-adultos-mayores-conferencias-sobre-programas-del-bienestar_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno20_21/articulo_2020_21_servidores-de-la-nacion-los-programas-sociales-hasta-donde-nunca-habian-llegado_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno20_21/articulo_2020_21_1419-respalda-senado-reforma-que-promueve-inclusion-laboral-de-personas-con-discapacidad.txt

Limpieza de los datos

# Obtener la lista de archivos txt
gob20_21 <- list.files(path = carpeta_destino20, pattern = "\\.txt$", full.names = TRUE)

# Verificar si los archivos existen
archivos_existentes20 <- file.exists(gob20_21)

# Filtrar solo los archivos existentes
gob20_21 <- gob20_21[archivos_existentes20]

# Inicializar una variable para almacenar el texto
texto_unido20 <- character(0)

# Leer cada archivo por separado y unirlos
for (archivo20 in gob20_21) {
  texto_archivo <- readLines(archivo20)
  if (length(texto_archivo) > 0) {
    texto_unido20 <- c(texto_unido20, texto_archivo)
  } else {
    warning("El archivo", archivo20, "está vacío.")
  }
}
## Warning in readLines(archivo20): incomplete final line found on
## 'C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos
## II/evidenciadd/gobierno20_21/gob_manual20211.txt'
# Convertir el texto unido a un solo vector de caracteres
texto_unido20 <- paste(texto_unido20, collapse = " ")

# Limpieza de Textos
limpiar_gob20_21 <- function(texto20){
  # Eliminar URL´s
  texto20 <- gsub("http\\S+|www\\.\\S+", "", texto20)
  
  # Eliminar etiquetas
  texto20 <- gsub("<.*?>", "", texto20)
  
  # Puntuación 
  texto20 <- gsub("[[:punct:]]", "", texto20)
  
  # Números
  texto20 <- gsub("\\d+", "", texto20)
  
  # Espacios
  texto20 <- gsub("\\s+", " ", texto20)
  
  # Convertir el texto a minúscula 
  texto20 <- tolower(texto20)
  
  # stopwords 
  stopwords_es20 <- stopwords("es")
  texto20 <- removeWords(texto20, stopwords_es20)
  
  return(texto20)
}

# Limpieza para el texto unido
texto_limpio_unido20g <- limpiar_gob20_21(texto_unido20)

Vectorización de Gobierno 2020 - 2021

# Limpieza manual de los textos
palabras_eliminar20 <- c("hacia", "cada", "ello", "día", "junio", "proporcionó", "alguna", "través", "derechos", "gracias",
                         "párrafo", "único", "parte", "según","así","ejercicio", "mayor", "vamos", "demás", "siguiente",
                         "pogg", "abril", "ser", "año", "deberá", "mil", "vii", "pues", "iii")

# Crear un corpus con el texto limpio
corpus2021 <- Corpus(VectorSource(texto_limpio_unido20g))
corpus2021 <- tm_map(corpus2021, removeWords, palabras_eliminar20)
## Warning in tm_map.SimpleCorpus(corpus2021, removeWords, palabras_eliminar20):
## transformation drops documents
# Document Term Matrix
dtm2021 <- DocumentTermMatrix(corpus2021)
# Ver la Matriz
inspect(dtm2021)
## <<DocumentTermMatrix (documents: 1, terms: 2920)>>
## Non-/sparse entries: 2920/0
## Sparsity           : 0%
## Maximal term length: 20
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs acciones discapacidad empleo gobierno inclusión instituto ley personas
##    1       67          302     74       75        83        59  65      286
##     Terms
## Docs situación trabajo
##    1       172      71

Lo siguiente es la vectorización lo que hace la función es juntar todos los textos que tengan la terminación en .txt, el problema con eso es que se puede presentar una matriz que esté sobrescrita con los términos de periodos ajenos al análisis. Es por eso que se obta direccionar la infromación a un lugar especifico, de esta manera se crea un solo documeto con 2920 términos

Nota: Fue necesario crear una carpeta para cada año de cada fuente para evitar que los textos se sobrescribieran.

Exploración de los datos de gobierno 2020-2021

conteo_total2021 <- colSums(as.matrix(dtm2021))

# Ordenar y mostrar los términos más comúnes
terminos_comunes2021 <- sort(conteo_total2021, decreasing = TRUE)
# Data Frame
Frecuencia2021 <- data.frame(termino = names(terminos_comunes2021), conteo = terminos_comunes2021)
head(Frecuencia2021, 25) # Mostrar los 25 términos más comunes
##                     termino conteo
## discapacidad   discapacidad    302
## personas           personas    286
## situación         situación    172
## inclusión         inclusión     83
## gobierno           gobierno     75
## empleo               empleo     74
## trabajo             trabajo     71
## acciones           acciones     67
## ley                     ley     65
## instituto         instituto     59
## laboral             laboral     59
## méxico               méxico     59
## artículo           artículo     52
## social               social     49
## programa           programa     48
## programas         programas     47
## promover           promover     43
## desarrollo       desarrollo     42
## materia             materia     41
## bienestar         bienestar     38
## manera               manera     38
## secretaría       secretaría     36
## disposiciones disposiciones     35
## cuota                 cuota     34
## información     información     31

Visualizaciones de los datos

Gráfica de frecuencias

# Tomar los 100 términos más comunes
terminos_2021 <- names(terminos_comunes2021)[5:40]

# Crear un vector con las frecuencias de estos términos
frecuencias_2021 <- terminos_comunes2021[5:40]

# Definir colores personalizados
colores2021 <- rev(colorRampPalette(brewer.pal(4, "Set1"))(100))

# Crear un gráfico de barras con colores y ajustes de tamaño de letra
barplot(frecuencias_2021, 
        names.arg = terminos_2021, 
        horiz = TRUE, 
        las = 1, 
        main = "Términos más Utilizados en Gobierno (2020 - 2021)", 
        xlab = "Frecuencia", 
        col = colores2021,  # Agregar los colores personalizados
        border = "white",  # Color de los bordes de las barras
        cex.names = 0.6,   # Tamaño de letra en el eje x
        cex.axis = 0.7,    # Tamaño de letra en los ejes
        cex.main = 1.2,    # Tamaño de letra en el título principal
        cex.lab = 1.2      # Tamaño de letra en las etiquetas de los ejes
)

En la gráfica de frecuencias, se seleccionan y muestran los 100 términos más comunes según su frecuencia de aparición en el texto. Este enfoque se centra en la cantidad absoluta de veces que cada palabra aparece y presenta un ranking de términos basado en esas frecuencias.

explicar porque serán diferentes términos a los de la word cloud…

World clouds

la nube de palabras utiliza un método visual que destaca las palabras más frecuentes y las presenta en un diseño gráfico, donde el tamaño de cada palabra refleja su frecuencia relativa . La frecuencia relativa se determina por la proporción de apariciones de cada palabra en comparación con el total de palabras en el conjunto de datos.

Nota: Las diferencias entre ambos enfoques surge porque la gráfica de frecuencias considera únicamente la frecuencia absoluta, mientras que la nube de palabras incorpora la frecuencia relativa para resaltar las palabras más importantes visualmente. Además, los parámetros y criterios utilizados en cada método, como la frecuencia mínima, el orden aleatorio y el límite máximo de palabras, también pueden influir en las discrepancias observadas.

wordcloud(words = Frecuencia2021$termino,
          freq = Frecuencia2021$conteo,
          min.freq = 8,
          max.words = 100, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(10,"Paired"))

En esta nube, se destaca la presencia de la palabra “situación”, haciendo referencia a la emergencia sanitaria del COVID-19. Dentro del contexto de esta visualización, se observa que este análisis no profundiza en el tema debido a que la atención estaba centrada en compartir información sobre la pandemia que ocurrió en ese periodo.

Análisis de sentimiento

# Análisis de sentimiento con el lexico (método de NRC)
nrc2021 <- get_sentiment(texto_limpio_unido20g, method="nrc")

# Se obtiene las emociones por el diccionario nrc
emotions20 <- get_nrc_sentiment(texto_limpio_unido20g)
emo_bar20 <- colSums(emotions20)
emo_sum20 <- data.frame(emotion = names(emo_bar20), count = emo_bar20)

# Cambiar etiquetas de emociones a español
emo_sum20$emotion[emo_sum20$emotion == "positive"] <- "Positivo"
emo_sum20$emotion[emo_sum20$emotion == "negative"] <- "Negativo"
emo_sum20$emotion[emo_sum20$emotion == "anger"] <- "Enojo"
emo_sum20$emotion[emo_sum20$emotion == "anticipation"] <- "Anticipación"
emo_sum20$emotion[emo_sum20$emotion == "disgust"] <- "Disgusto"
emo_sum20$emotion[emo_sum20$emotion == "fear"] <- "Miedo"
emo_sum20$emotion[emo_sum20$emotion == "joy"] <- "Alegría"
emo_sum20$emotion[emo_sum20$emotion == "sadness"] <- "Tristeza"
emo_sum20$emotion[emo_sum20$emotion == "surprise"] <- "Sorpresa"
emo_sum20$emotion[emo_sum20$emotion == "trust"] <- "Confianza"

# Visualización
plot_ly(emo_sum20, x = ~emotion, y = ~count, type = "bar", color = ~emotion) %>%
  layout(xaxis = list(title = ""), showlegend = FALSE,
         title = "Distribución de sentimientos en los textos de Gobierno 2020 - 2021 ")
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

En el análisis de sentimiento realizado, se destaca la presencia del sentimiento de confianza. Este sentimiento, en este contexto específico, se interpreta como la incertidumbre relacionada con la expectativa de mejores oportunidades laborales para la población de personas con discapacidad. La presencia de este sentimiento sugiere que, a pesar de ciertos aspectos positivos, persiste una sensación de incertidumbre entre este grupo específico en cuanto a las expectativas de mejoras en el ámbito laboral

Análisis de tópicos

# Leer el archivo txt
transcription2021 <- texto_limpio_unido20g

# Analizar el sentimiento
sentiment20 <- sentiment_by(transcription2021)
## Warning: Each time `sentiment_by` is run it has to do sentence boundary disambiguation when a
## raw `character` vector is passed to `text.var`. This may be costly of time and
## memory.  It is highly recommended that the user first runs the raw `character`
## vector through the `get_sentences` function.
# Generar un modelo de topic models
lda2021 <- LDA(dtm2021, k = 5)

# Obtener los términos más importantes de cada tópico
terms2021 <- tidy(lda2021, matrix = "beta") %>%
  group_by(topic) %>%
  top_n(5, wt = beta)

# Generar el gráfico
ggplot(terms2021, aes(x = term, y = beta, fill = factor(topic))) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~topic, ncol = 3)

# Obtener los términos más importantes de cada tópico en un dataframe
terms2021 <- tidy(lda2021, matrix = "beta")
terms2021 <- terms2021 %>%
  select(term, beta)

En el análisis de tópicos, se abordará el primer tópico, que se centra en el diálogo sobre la situación laboral de las personas con discapacidad durante la pandemia del año 2020. Este tópico revela una atención específica a los desafíos y circunstancias laborales que enfrentaron las personas con discapacidad en el contexto de la crisis sanitaria global. En el análisis de tópicos, se abordará el primer tópico, que se centra en el diálogo sobre la situación laboral de las personas con discapacidad durante la pandemia del año 2020. Este tópico revela una atención específica a los desafíos y circunstancias laborales que enfrentaron las personas con discapacidad en el contexto de la crisis sanitaria global.

Gobierno de México 2022 - 2023

Web scrapping de las duplas de los años (2022-2023)

Se vuelve a hacer el procedimiento de la carpeta destino ahora para el último periodo del sexenio de AMLO

# Se establece la pagina destino 
carpeta_destino23 <- "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23"
Sys.setlocale("LC_TIME","es_ES.UTF-8")
## [1] "es_ES.UTF-8"
paginas <- c(1:2)
userAgent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"

# Se juntan las ligas del 2022 - 2023
gobmx2223 <- c(
  "https://www.gob.mx/stps/prensa/inclusion-laboral-garantizada-con-mas-de-25-mil-vacantes-en-la-feria-nacional-de-empleo?idiom=es",
  "https://www.trabajo.cdmx.gob.mx/comunicacion/nota/oferta-feria-nacional-de-empleo-700-opciones-para-la-inclusion-laboral-en-la-ciudad-de-mexico",
  "https://www.gob.mx/stps/prensa/invita-sne-a-la-feria-nacional-de-empleo-para-la-inclusion-laboral-de-grupos-vulnerables?idiom=es",
  "https://dof.gob.mx/nota_detalle.php?codigo=5669785&fecha=27/10/2022#gsc.tab=0",
  "https://www.gob.mx/stps/documentos/informacion-referente-a-la-politica-publica-laboral",
  "https://www.gob.mx/stps/prensa/mas-de-23-mil-ofertas-de-empleos-incluyentes-en-la-feria-nacional-de-empleo-para-la-inclusion-2023?idiom=es",
  "https://congresodurango.gob.mx/mas-oportunidades-de-empleo-para-personas-con-discapacidad/",
  "https://www.trabajo.cdmx.gob.mx/comunicacion/nota/impulsa-secretaria-de-trabajo-creacion-de-empleos-traves-del-periodico-digital-y-microferias",
  "https://www.nl.gob.mx/boletines-comunicados-y-avisos/acerca-secretaria-del-trabajo-mas-de-2-mil-oportunidades-de-empleo")

# Iterar a través de las URL´s
for (url23 in gobmx2223) {
  # Leer las páginas web
  paginasgobmx2223 <- read_html(url23)
  
  # Extraer los paráfos de la página 
  parrafos.gob2223 <- html_elements(paginasgobmx2223, "p") #p de parrafos 
  
  # Extraer el contennido de los parrafós 
  text_contentgob2223 <- html_text(parrafos.gob2223)
  
  # Crear el nombre de archivo basado en la URL´s
  nombre_archivogob2223 <- gsub("[^A-Za-z0-9._-]", "_", sub(".*/", "articulos2022-2023", url23))
  nombre_archivogob2223 <- paste0(nombre_archivogob2223, ".txt")
  
   # Crear la ruta completa para el archivo
  ruta_archivogob2023<- file.path(carpeta_destino23, nombre_archivogob2223)
  
  # Escribe el contenido del archivo de texto 
  writeLines(text_contentgob2223, ruta_archivogob2023)
  
  cat("Archivo descargado y guardado como", ruta_archivogob2023, "\n")
             
}
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023inclusion-laboral-garantizada-con-mas-de-25-mil-vacantes-en-la-feria-nacional-de-empleo_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023oferta-feria-nacional-de-empleo-700-opciones-para-la-inclusion-laboral-en-la-ciudad-de-mexico.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023invita-sne-a-la-feria-nacional-de-empleo-para-la-inclusion-laboral-de-grupos-vulnerables_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-20232022_gsc.tab_0.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023informacion-referente-a-la-politica-publica-laboral.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023mas-de-23-mil-ofertas-de-empleos-incluyentes-en-la-feria-nacional-de-empleo-para-la-inclusion-2023_idiom_es.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023impulsa-secretaria-de-trabajo-creacion-de-empleos-traves-del-periodico-digital-y-microferias.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/gobierno22_23/articulos2022-2023acerca-secretaria-del-trabajo-mas-de-2-mil-oportunidades-de-empleo.txt

Limpieza del 2022 - 2023

# Obtener la lista de archivos txt
gob22_23 <- list.files(path = carpeta_destino23, pattern = "\\.txt$", full.names = TRUE)
# Verificar si los archivos existen
archivos_existentes23 <- file.exists(gob22_23)
# Filtrar solo los archivos existentes
gob22_23 <- gob22_23[archivos_existentes23]

# Inicializar una variable para almacenar el texto
texto_unido23 <- character(0)

# Leer cada archivo por separado y unirlos
for (archivo23 in gob22_23) {
  texto_archivo23 <- readLines(archivo23)
  if (length(texto_archivo23) > 0) {
    texto_unido23 <- c(texto_unido23, texto_archivo23)
  } else {
    warning("El archivo", archivo20, "está vacío.")
  }
}
## Warning in readLines(archivo23): incomplete final line found on
## 'C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos
## II/evidenciadd/gobierno22_23/gob_manual2022.txt'
# Convertir el texto unido a un solo vector de caracteres
texto_unido22 <- paste(texto_unido23, collapse = " ")

# Limpieza de Textos
limpiar_gob2223 <- function(texto23){
  # Eliminar URL´s
  texto23 <- gsub("http\\S+|www\\.\\S+", "", texto23)
  
  # Eliminar etiquetas
  texto23 <- gsub("<.*?>", "", texto23)
  
  # Puntuación 
  texto23 <- gsub("[[:punct:]]", "", texto23)
  
  # Números
  texto23 <- gsub("\\d+", "", texto23)
  
  # Espacios
  texto23 <- gsub("\\s+", " ", texto23)
  
  # Convertir el texto a minúscula 
  texto23 <- tolower(texto23)
  
  # stopwords 
  stopwords_es23 <- stopwords("es")
  texto23 <- removeWords(texto23, stopwords_es23)
  
  return(texto23)
}
# Limpieza para el texto unido
texto_limpio_unido23g <- limpiar_gob2223(texto_unido22)

Vectorización de los datos para el 2022 - 2023

La creación del corpus es indispensable para retificar que los datos se hayan guardado de manera eficiente

# Limpieza manual de los textos
palabras_eliminar23 <- c("mientras", "través","grupo", "octubre","stps","mil","primer","puedes")

# Crear un corpus con el texto limpio
corpus2023 <- Corpus(VectorSource(texto_limpio_unido23g))
corpus2023 <- tm_map(corpus2023, removeWords, palabras_eliminar23)
## Warning in tm_map.SimpleCorpus(corpus2023, removeWords, palabras_eliminar23):
## transformation drops documents
dtm2023 <- DocumentTermMatrix(corpus2023)
inspect(dtm2023)
## <<DocumentTermMatrix (documents: 1, terms: 1298)>>
## Non-/sparse entries: 1298/0
## Sparsity           : 0%
## Maximal term length: 18
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs discapacidad empleo informe laboral méxico nacional personas previsión
##    1           69     54      27      40     35       30       79        24
##     Terms
## Docs social trabajo
##    1     31      71

Dar detalle de cuentos términos fueron.

A diferencia de la vectorización del periodo anterior, en el periodo del 2022 - 2023 se presentaron menos términos debido a que no se incluyó el análisis de los documentos oficiales, como el Plan Nacional; el análisis únicamente se realizó de las notas y/o noticias que se proporcionaban en la página oficial del estado. En relación a lo anterior, se puede ver un claro ejemplo en la palabra discapacidad, que si bien es la palabra central del tema, esta muestra una frecunecia menor a los presentados con anterioridad lo cuál provoca que el enfoque se refleje en la palabra trabajo y personas

conteo_total2023 <- colSums(as.matrix(dtm2023))

# Ordenar y mostrar los términos más comúnes
terminos_comunes2023 <- sort(conteo_total2023, decreasing = TRUE)
# Data Frame
Frecuencia2023 <- data.frame(termino = names(terminos_comunes2023), conteo = terminos_comunes2023)
head(Frecuencia2023, 25) # Mostrar los 25 términos más comunes
##                   termino conteo
## personas         personas     79
## trabajo           trabajo     71
## discapacidad discapacidad     69
## empleo             empleo     54
## laboral           laboral     40
## méxico             méxico     35
## social             social     31
## nacional         nacional     30
## informe           informe     27
## previsión       previsión     24
## labores           labores     22
## inclusión       inclusión     21
## programa         programa     19
## mujeres           mujeres     18
## población       población     18
## secretaría     secretaría     18
## trimestre       trimestre     18
## ciento             ciento     17
## ciudad             ciudad     17
## federal           federal     17
## promedio         promedio     16
## segundo           segundo     16
## años                 años     15
## empresas         empresas     14
## ley                   ley     14

Visualizaciones del Gobierno de México, 2022 - 2023

Gráfica de frecuencias

# Tomar los 100 términos más comunes
terminos_2023 <- names(terminos_comunes2023)[5:40]

# Crear un vector con las frecuencias de estos términos
frecuencias_2023 <- terminos_comunes2023[5:40]

# Definir colores personalizados
colores2023 <- rev(colorRampPalette(brewer.pal(4, "Set1"))(100))

# Crear un gráfico de barras con colores y ajustes de tamaño de letra
barplot(frecuencias_2023, 
        names.arg = terminos_2023, 
        horiz = TRUE, 
        las = 1, 
        main = "Términos más Utilizados en Gobierno (2022 - 2023)", 
        xlab = "Frecuencia", 
        col = colores2023,  # Agregar los colores personalizados
        border = "white",  # Color de los bordes de las barras
        cex.names = 0.6,   # Tamaño de letra en el eje x
        cex.axis = 0.7,    # Tamaño de letra en los ejes
        cex.main = 1.2,    # Tamaño de letra en el título principal
        cex.lab = 1.2      # Tamaño de letra en las etiquetas de los ejes
)

Word cloud

wordcloud(words = Frecuencia2023$termino,
          freq = Frecuencia2023$conteo,
          min.freq = 8,
          max.words = 100, random.order = FALSE, rot.per = 0.25, colors = brewer.pal(10,"Paired"))

La aparición destacada de ciertos términos en la nube de palabras sugiere que las iniciativas propuestas en la primera dupla no solo fueron presentadas, sino que también se refleja su implementación y ejecución. Estos términos pueden incluir acciones específicas, proyectos concretos, o cualquier otra manifestación práctica de las propuestas gubernamentales.

Este análisis a través de las nubes de palabras permite identificar visualmente las áreas temáticas que han sido prioritarias y que han experimentado un impacto tangible en el discurso de las personas con discapacidad. Al examinar los términos más prominentes, se puede inferir la efectividad y la resonancia de las acciones propuestas en la primera dupla.

Análisis de sentimiento

# Análisis de sentimiento con el lexico (método de NRC)
nrc2023 <- get_sentiment(texto_limpio_unido23g, method="nrc")

# Se obtiene las emciones por el diccionario nrc
emotions23 <- get_nrc_sentiment(texto_limpio_unido23g)
emo_bar23 = colSums(emotions23)
emo_sum23 = data.frame(count=emo_bar23, emotion=names(emo_bar23))
emo_sum23$emotion = factor(emo_sum23$emotion, levels=emo_sum23$emotion[order(emo_sum23$count, decreasing = TRUE)])

# Visualización 
plot_ly(emo_sum23, x=~emotion, y=~count, type="bar", color=~emotion) %>%
  layout(xaxis=list(title=""), showlegend=FALSE,
         title="Distribución de sentimientos en los textos de Gobierno 2022 - 2023")
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
# Análisis de sentimiento con el lexico (método de NRC)
nrc2023 <- get_sentiment(texto_limpio_unido23g, method="nrc")

# Se obtiene las emociones por el diccionario nrc
emotions23 <- get_nrc_sentiment(texto_limpio_unido23g)
emo_bar23 <- colSums(emotions23)
emo_sum23 <- data.frame(emotion = names(emo_bar23), count = emo_bar23)

# Cambiar etiquetas de emociones a español
emo_sum23$emotion[emo_sum23$emotion == "positive"] <- "Positivo"
emo_sum23$emotion[emo_sum23$emotion == "negative"] <- "Negativo"
emo_sum23$emotion[emo_sum23$emotion == "anger"] <- "Enojo"
emo_sum23$emotion[emo_sum23$emotion == "anticipation"] <- "Anticipación"
emo_sum23$emotion[emo_sum23$emotion == "disgust"] <- "Disgusto"
emo_sum23$emotion[emo_sum23$emotion == "fear"] <- "Miedo"
emo_sum23$emotion[emo_sum23$emotion == "joy"] <- "Alegría"
emo_sum23$emotion[emo_sum23$emotion == "sadness"] <- "Tristeza"
emo_sum23$emotion[emo_sum23$emotion == "surprise"] <- "Sorpresa"
emo_sum23$emotion[emo_sum23$emotion == "trust"] <- "Confianza"

# Visualización
plot_ly(emo_sum23, x = ~emotion, y = ~count, type = "bar", color = ~emotion) %>%
  layout(xaxis = list(title = ""), showlegend = FALSE,
         title = "Distribución de sentimientos en los textos de Gobierno 2022 - 2023")
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

La atención se centra en el matiz particular del sentimiento de confianza, que refleja no solo un optimismo general, sino también una espera específica de oportunidades laborales mejoradas. Esta interpretación resalta la importancia de considerar el contexto y la naturaleza específica del sentimiento, ya que la confianza en este caso no se traduce simplemente como una percepción positiva, sino como una expectativa de condiciones laborales más favorables para las personas con discapacidad.

Análsis de tópicos

# Leer el archivo txt
transcription2021 <- texto_limpio_unido20g

# Analizar el sentimiento
sentiment20 <- sentiment_by(transcription2021)
## Warning: Each time `sentiment_by` is run it has to do sentence boundary disambiguation when a
## raw `character` vector is passed to `text.var`. This may be costly of time and
## memory.  It is highly recommended that the user first runs the raw `character`
## vector through the `get_sentences` function.
# Generar un modelo de topic models
lda2021 <- LDA(dtm2021, k = 5)

# Obtener los términos más importantes de cada tópico
terms2021 <- tidy(lda2021, matrix = "beta") %>%
  group_by(topic) %>%
  top_n(5, wt = beta)

# Generar el gráfico
ggplot(terms2021, aes(x = term, y = beta, fill = factor(topic))) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~topic, ncol = 3)

# Obtener los términos más importantes de cada tópico en un dataframe
terms2021 <- tidy(lda2021, matrix = "beta")
terms2021 <- terms2021 %>%
  select(term, beta)

En el primer análisis de tópicos, se identifican palabras clave como “trabajo”, “situación”, “personas”, “instituto” y “gobierno”. Estas palabras sugieren que el tópico aborda predominantemente la temática relacionada con el empleo, la situación general, las personas afectadas, las acciones o iniciativas del Instituto y la intervención gubernamental. El primer tópico se centra en temas fundamentales como el empleo, la situación general, la consideración individual y colectiva de las personas con discapacidad, la participación de instituciones específicas y las acciones gubernamentales.

Noticias Nacionales

Web scrpping de Noticias Nacionales 2018 - 2019

# Se establece la pagina destino 
carpeta_destinonot18 <- "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19"
Sys.setlocale("LC_TIME","es_ES.UTF-8")
## [1] "es_ES.UTF-8"
paginas <- c(1:2)
userAgent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"

# Se juntan las noticias del 2018 - 2019
noticia1819 <- c(
  "https://www.animalpolitico.com/analisis/invitades/tener-una-discapacidad-y-buscar-trabajo-una-tarea-complicada",
  "https://www.eluniversal.com.mx/nacion/politica/conapred-ve-pendientes-con-las-personas-con-discapacidad/",
  "https://www.eluniversal.com.mx/nacion/sociedad/contratan-2-mil-90-personas-con-discapacidad-en-empleoton/",
  "https://www.eluniversal.com.mx/nacion/sociedad/stps-coloca-en-empleos-260-mil-adultos-mayores/",
  "https://elpais.com/economia/2019/11/13/actualidad/1573657110_252972.html",
  "https://expansion.mx/opinion/2019/10/02/los-grupos-vulnerables",
  "https://www.milenio.com/milenio-foros/falta-mas-inclusion-de-personas-con-discapacidad",
  "https://www.eluniversal.com.mx/opinion/mochilazo-en-el-tiempo/personas-ciegas-lucharon-por-su-derecho-al-trabajo/")


# Iterar a través de las URL´s
for (url in noticia1819) {
  # Leer las páginas web
  paginasnot1819 <- read_html(url)
  
  # Extraer los paráfos de la página 
  parrafos.not1819 <- html_elements(paginasnot1819, "p") #p de parrafos 
  
  # Extraer el contennido de los parrafós 
  text_contenot1819 <- html_text(parrafos.not1819)
  
  # Crear el nombre de archivo basado en la URL´s
  nombre_archivonot1819 <- gsub("[^A-Za-z0-9._-]", "_", sub(".*/", "noticias2018-2019", url))
  nombre_archivonot1819 <- paste0(nombre_archivonot1819, ".txt")
  
  # Crear la ruta completa para el archivo
  ruta_archivonot18<- file.path(carpeta_destinonot18, nombre_archivonot1819)
  
  # Escribe el contenido del archivo de texto 
  writeLines(text_contenot1819, ruta_archivonot18)
  
  cat("Archivo descargado y guardado como", ruta_archivonot18, "\n")
}
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-2019tener-una-discapacidad-y-buscar-trabajo-una-tarea-complicada.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-2019.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-2019.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-2019.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-20191573657110_252972.html.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-2019los-grupos-vulnerables.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-2019falta-mas-inclusion-de-personas-con-discapacidad.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia18_19/noticias2018-2019.txt

Limpieza de las noticias 2018 - 2019

# Obtener la lista de archivos txt
noticia1819 <- list.files(path = carpeta_destinonot18, pattern = "\\.txt$", full.names = TRUE)
# Verificar si los archivos existen
archivos_existentesnot18 <- file.exists(noticia1819)
# Filtrar solo los archivos existentes
noticia1819 <- noticia1819[archivos_existentesnot18]

# Inicializar una variable para almacenar el texto
texto_unidonot18 <- character(0)

# Leer cada archivo por separado y unirlos
for (archivonot18 in noticia1819) {
  texto_archivonot18 <- readLines(archivonot18)
  if (length(texto_archivonot18) > 0) {
    texto_unidonot18 <- c(texto_unidonot18, texto_archivonot18)
  } else {
    warning("El archivo", archivo20, "está vacío.")
  }
}

# Convertir el texto unido a un solo vector de caracteres
texto_unidonot18 <- paste(texto_unidonot18, collapse = " ")

# Limpieza de Textos
limpiar_not1819 <- function(textonoticia){
  # Eliminar URL´s
  textonoticia <- gsub("http\\S+|www\\.\\S+", "", textonoticia)
  
  # Eliminar etiquetas
  textonoticia <- gsub("<.*?>", "", textonoticia)
  
  # Puntuación 
  textonoticia <- gsub("[[:punct:]]", "", textonoticia)
  
  # Números
  textonoticia <- gsub("\\d+", "", textonoticia)
  
  # Espacios
  textonoticia <- gsub("\\s+", " ", textonoticia)
  
  # Convertir el texto a minúscula 
  textonoticia <- tolower(textonoticia)
  
  # stopwords 
  stopwords_es188 <- stopwords("es")
  textonoticia <- removeWords(textonoticia, stopwords_es188)
  
  return(textonoticia)
}

# Limpieza para el texto unido
texto_limpio_unidonot <- limpiar_not1819(texto_unidonot18)

Exploración de los datos

# Limpieza manual de los textos
palabras_eliminarnot18 <- c("través", "pues", "hace", "mil", "día", "ejemplo", "puede", "así","van", "ello", "muchas", "además",
                            "cada", "hoy", "ser")

# Corpus con los términos limpios
corpusno18 <- Corpus(VectorSource(texto_limpio_unidonot))
corpusno18 <- tm_map(corpusno18, removeWords, palabras_eliminarnot18)
## Warning in tm_map.SimpleCorpus(corpusno18, removeWords,
## palabras_eliminarnot18): transformation drops documents
# matriz de términos limpios 
dtmnoticia18 <- DocumentTermMatrix(corpusno18)
inspect(dtmnoticia18)
## <<DocumentTermMatrix (documents: 1, terms: 1853)>>
## Non-/sparse entries: 1853/0
## Sparsity           : 0%
## Maximal term length: 16
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs años discapacidad empleo empresas hacer inclusión jóvenes laboral personas
##    1   21           80     36       24    17        18      17      24       59
##     Terms
## Docs trabajo
##    1      46

Tabla de frecuencias

conteo_total_not18 <- colSums(as.matrix(dtmnoticia18))

# Ordenar y mostrar los términos más comúnes
terminos_comunes_not18 <- sort(conteo_total_not18, decreasing = TRUE)
# Data Frame
Frecuencianot18 <- data.frame(termino = names(terminos_comunes_not18), conteo = terminos_comunes_not18)
head(Frecuencianot18, 25) # Mostrar los 25 términos más comunes
##                   termino conteo
## discapacidad discapacidad     80
## personas         personas     59
## trabajo           trabajo     46
## empleo             empleo     36
## empresas         empresas     24
## laboral           laboral     24
## años                 años     21
## inclusión       inclusión     18
## hacer               hacer     17
## jóvenes           jóvenes     17
## vida                 vida     17
## fundación       fundación     14
## intelectual   intelectual     13
## persona           persona     13
## falta               falta     12
## nacional         nacional     12
## social             social     12
## ver                   ver     12
## ciegos             ciegos     11
## gente               gente     11
## metro               metro     11
## oportunidad   oportunidad     11
## programa         programa     11
## trabajar         trabajar     11
## ahora               ahora     10

Visualizaciones de las noticias 2018 - 2019

Gráfico de frecuencias

# Tomar los 100 términos más comunes
terminos_not18 <- names(terminos_comunes_not18)[5:40]

# Crear un vector con las frecuencias de estos términos
frecuencias_not18 <- terminos_comunes_not18[5:40]

# Definir colores personalizados
coloresnoticia <- rev(colorRampPalette(brewer.pal(4, "Set1"))(100))

# Crear un gráfico de barras con colores y ajustes de tamaño de letra
barplot(frecuencias_not18, 
        names.arg = terminos_not18, 
        horiz = TRUE, 
        las = 1, 
        main = "Términos más Utilizados en las noticias nacionales (2018 - 2019)", 
        xlab = "Frecuencia", 
        col = coloresnoticia,  # Agregar los colores personalizados
        border = "white",  # Color de los bordes de las barras
        cex.names = 0.6,   # Tamaño de letra en el eje x
        cex.axis = 0.7,    # Tamaño de letra en los ejes
        cex.main = 1.2,    # Tamaño de letra en el título principal
        cex.lab = 1.2      # Tamaño de letra en las etiquetas de los ejes
)

Visualizaciones de la primera dupla de noticias

Nube de palabras

wordcloud(words = Frecuencianot18$termino,
          freq = Frecuencianot18$conteo,
          min.freq = 8,
          max.words = 100, random.order = FALSE, rot.per = 0.45, colors = brewer.pal(10,"Paired"))
## Warning in wordcloud(words = Frecuencianot18$termino, freq =
## Frecuencianot18$conteo, : personas could not be fit on page. It will not be
## plotted.

Dentro del contexto de esta nube de palabras, es importante señalar que la representación visual está condicionada por las fuentes utilizadas en el análisis, siendo la mayoría de ellas provenientes del periódico “El Universal”. Esto sugiere que la nube de palabras refleja los valores y los intereses específicos de dicho periódico durante el periodo analizado.

La presencia destacada de la palabra “ciego” podría indicar un énfasis particular en las noticias o discusiones relacionadas con personas con discapacidad visual. Este enfoque específico podría deberse a eventos, iniciativas o situaciones específicas que involucran a individuos ciegos, lo que lleva a una mayor frecuencia de esa palabra en la nube de palabras

Análisis de sentimiento

# Análisis de sentimiento con el lexico (método de NRC)
nrcnoticia <- get_sentiment(texto_limpio_unidonot, method="nrc")

# Se obtiene las emociones por el diccionario nrc
emotionsnot <- get_nrc_sentiment(texto_limpio_unidonot)
emo_barnot <- colSums(emotionsnot)
emo_sumnot <- data.frame(emotion = names(emo_barnot), count = emo_barnot)

# Cambiar etiquetas de emociones a español
emo_sumnot$emotion[emo_sumnot$emotion == "positive"] <- "Positivo"
emo_sumnot$emotion[emo_sumnot$emotion == "negative"] <- "Negativo"
emo_sumnot$emotion[emo_sumnot$emotion == "anger"] <- "Enojo"
emo_sumnot$emotion[emo_sumnot$emotion == "anticipation"] <- "Anticipación"
emo_sumnot$emotion[emo_sumnot$emotion == "disgust"] <- "Disgusto"
emo_sumnot$emotion[emo_sumnot$emotion == "fear"] <- "Miedo"
emo_sumnot$emotion[emo_sumnot$emotion == "joy"] <- "Alegría"
emo_sumnot$emotion[emo_sumnot$emotion == "sadness"] <- "Tristeza"
emo_sumnot$emotion[emo_sumnot$emotion == "surprise"] <- "Sorpresa"
emo_sumnot$emotion[emo_sumnot$emotion == "trust"] <- "Confianza"

# Crear un vector con los colores de la paleta Set2
colores_set2 <- brewer.pal(11, "Set3")

# Visualización 
plot_ly(emo_sumnot, x = ~emotion, y = ~count, type = "bar", color = ~emotion, colors = colores_set2) %>%
  layout(xaxis = list(title = ""), showlegend = FALSE,
         title = "Distribución de sentimientos en las noticias nacionales 2018 - 2019")

Más allá de lo mencionado anteriormente, al analizar los textos provenientes del gobierno, se observa que en la primera dupla de noticias (2018-2019), no hay una percepción clara del miedo en el discurso. Esto puede sugerir que durante ese periodo específico, el tema del miedo no fue prominentemente abordado o destacado en las comunicaciones gubernamentales.

La ausencia de la palabra “miedo” en la nube de palabras y en el análisis de sentimientos puede indicar que, al menos en términos de contenido textual analizado, el gobierno no enfocó su discurso en transmitir o abordar situaciones que generaran temor en la población. Esto podría ser resultado de una estrategia comunicativa específica o reflejar las prioridades y temas destacados por el gobierno durante ese período.

# Leer el archivo txt
transcriptionnot <- texto_limpio_unidonot

# Obtener las oraciones
sentences_not <- get_sentences(transcriptionnot)
# Analizar el sentimiento
sentimentnot18 <- sentiment_by(sentences_not)

# Generar un modelo de topic models
lda2018n <- LDA(dtmnoticia18, k = 3)

# Obtener los términos más importantes de cada tópico
termsnot18 <- tidy(lda2018n, matrix = "beta") %>%
  group_by(topic) %>%
  top_n(5, wt = beta)

# Generar el gráfico
ggplot(termsnot18, aes(x = term, y = beta, fill = factor(topic))) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  facet_wrap(~topic, ncol = 3)

# Obtener los términos más importantes de cada tópico en un dataframe
termsnot18 <- tidy(lda2018n, matrix = "beta")
termsnot18 <- termsnot18 %>%
  select(term, beta)

El análisis de tópicos de la primera dupla de noticias revela palabras clave como “trabajo”, “personas”, “fundación”, “empresas” y “discapacidad”. La presencia de “trabajo” y “empresas” indica un interés particular en el ámbito laboral, posiblemente explorando la inclusión de personas con discapacidad en el mercado laboral y la colaboración con empresas y fundaciones para lograr este objetivo. La inclusión de “personas” y “discapacidad” señala la atención a la población afectada y destaca la importancia de abordar cuestiones relacionadas con la discapacidad en el contexto de las noticias.La presencia de “fundación” podría indicar la participación de organizaciones sin fines de lucro o entidades dedicadas a trabajar en pro de la discapacidad.

Noticias 2020-2021

Periodo de Covid

# Se establece la pagina destino 
carpeta_destinonot21 <- "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21"
Sys.setlocale("LC_TIME","es_ES.UTF-8")
## [1] "es_ES.UTF-8"
paginas <- c(1:2)
userAgent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"

# Se juntan as noticias del 2020 - 2021
noticias2021 <- c(
  "https://www.eluniversal.com.mx/nacion/covid-afecta-vida-laboral-de-personas-con-discapacidad/",
  "https://www.eluniversal.com.mx/metropoli/edomex/c5-de-edomex-cuenta-con-32-trabajadores-con-capacidades-diferentes/",
  "https://www.animalpolitico.com/sociedad/covid-personas-discapacidad-intelectual-sin-empleo",
  "https://www.eluniversal.com.mx/nacion/pensiones-para-adultos-mayores-y-menores-con-discapacidad-aumentaran-en-2021-amlo/",
  "https://www.eluniversal.com.mx/mundo/nadie-sabe-lo-que-ocurre-entre-estas-paredes-la-vulnerabilidad-de-las-personas-discapacitadas/",
  "https://www.eluniversal.com.mx/estados/rocha-moya-pide-al-congreso-estatal-reasignar-129-mdp-para-ampliar-apoyos-personas-discapacitadas/",
  "https://expansion.mx/opinion/2021/04/14/inclusion-laboral-hoy-mas-que-nunca" )

#Iterar a través de las URL´s
for (url in noticias2021){
  # Función para leer las páginas web
  paginasnot2021 <- read_html(url)
  
  # Extraer los paráfos de la página 
  parrafos.not2021 <- html_element(paginasnot2021, "p")
  
  # Extraer el contenido de los parrafos
  text_contentnot2021 <- html_text(parrafos.not2021)
  
  # Crear el nombre de archivo 
  nombre_archivonot2021 <- gsub("[^A-Za-z0-9._-]", "_", sub(".*/", "noticias2020-2021", url))
  nombre_archivonot2021 <- paste0(nombre_archivonot2021, ".txt")

  # Verificar si el archivo ya existe
  i <- 1
  while (file.exists(file.path(carpeta_destinonot21, nombre_archivonot2021))) {
    i <- i + 1
    
  nombre_archivonot2021 <- gsub(".txt$", paste0("_", i, ".txt"), nombre_archivonot2021)
  }

  
  # Crear la ruta completa para el archivo
  ruta_archivonot2<- file.path(carpeta_destinonot21, nombre_archivonot2021)
  
  # Escribe el contenido del archivo de texto 
  writeLines(text_contentnot2021, ruta_archivonot2)
  
  cat("Archivo descargado y guardado como", ruta_archivonot2, "\n")
             
}
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021covid-personas-discapacidad-intelectual-sin-empleo_2_3_4_5_6.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26.txt 
## Archivo descargado y guardado como C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021inclusion-laboral-hoy-mas-que-nunca_2_3_4_5_6.txt

Limpieza de los textos

# Obtener la lista de archivos txt
noticias2021 <- list.files(path = carpeta_destinonot21, pattern = "\\.txt$", full.names = TRUE)
print(noticias2021)
##  [1] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021.txt"                                                                   
##  [2] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2.txt"                                                                 
##  [3] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3.txt"                                                               
##  [4] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4.txt"                                                             
##  [5] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5.txt"                                                           
##  [6] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6.txt"                                                         
##  [7] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7.txt"                                                       
##  [8] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8.txt"                                                     
##  [9] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9.txt"                                                   
## [10] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10.txt"                                                
## [11] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11.txt"                                             
## [12] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12.txt"                                          
## [13] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13.txt"                                       
## [14] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14.txt"                                    
## [15] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15.txt"                                 
## [16] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16.txt"                              
## [17] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17.txt"                           
## [18] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18.txt"                        
## [19] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19.txt"                     
## [20] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20.txt"                  
## [21] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21.txt"               
## [22] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22.txt"            
## [23] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23.txt"         
## [24] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24.txt"      
## [25] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25.txt"   
## [26] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26.txt"
## [27] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021covid-personas-discapacidad-intelectual-sin-empleo.txt"                 
## [28] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021covid-personas-discapacidad-intelectual-sin-empleo_2.txt"               
## [29] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021covid-personas-discapacidad-intelectual-sin-empleo_2_3.txt"             
## [30] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021covid-personas-discapacidad-intelectual-sin-empleo_2_3_4.txt"           
## [31] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021covid-personas-discapacidad-intelectual-sin-empleo_2_3_4_5.txt"         
## [32] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021covid-personas-discapacidad-intelectual-sin-empleo_2_3_4_5_6.txt"       
## [33] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021inclusion-laboral-hoy-mas-que-nunca.txt"                                
## [34] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021inclusion-laboral-hoy-mas-que-nunca_2.txt"                              
## [35] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021inclusion-laboral-hoy-mas-que-nunca_2_3.txt"                            
## [36] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021inclusion-laboral-hoy-mas-que-nunca_2_3_4.txt"                          
## [37] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021inclusion-laboral-hoy-mas-que-nunca_2_3_4_5.txt"                        
## [38] "C:/Users/Sicaru/Desktop/Tecnologico/5to semestre/Ciencia de datos II/evidenciadd/noticia20_21/noticias2020-2021inclusion-laboral-hoy-mas-que-nunca_2_3_4_5_6.txt"
# Verificar si los archivos existen
archivos_existentesnot21 <- file.exists(noticias2021)
# Filtrar solo los archivos existentes
noticias2021 <- noticias2021[archivos_existentesnot21]

# Inicializar una variable para almacenar el texto
texto_unidonot21 <- character(0)

# Leer cada archivo por separado y unirlos
for (archivonot21 in noticias2021) {
  texto_archivonot21 <- readLines(archivonot21)
  if (length(texto_archivonot21) > 0) {
    texto_unidonot21 <- c(texto_unidonot21, texto_archivonot21)
  } else {
    warning("El archivo", archivo20, "está vacío.")
  }
}

# Convertir el texto unido a un solo vector de caracteres
texto_unidonot18 <- paste(texto_unidonot21, collapse = " ")


# Limpieza de Textos
limpiar_not21 <- function(textonoticia20){
  # Eliminar URL´s
  textonoticia20 <- gsub("http\\S+|www\\.\\S+", "", textonoticia20)
  
  # Eliminar etiquetas
  textonoticia20 <- gsub("<.*?>", "", textonoticia20)
  
  # Puntuación 
  textonoticia20 <- gsub("[[:punct:]]", "", textonoticia20)
  
  # Números
  textonoticia20 <- gsub("\\d+", "", textonoticia20)
  
  # Espacios
  textonoticia20 <- gsub("\\s+", " ", textonoticia20)
  
  # Convertir el texto a minúscula 
  textonoticia20 <- tolower(textonoticia20)
  
  # stopwords 
  stopwords_es202 <- stopwords("es")
  textonoticia20 <- removeWords(textonoticia20, stopwords_es202)
  
  return(textonoticia20)
}

# Limpieza para el texto unido
texto_limpio_unidonot20 <- limpiar_not21(texto_unidonot21)

Exploración de los datos

palabras_eliminarnot20 <- c("rubén", "rocha", "visitó", "moya")
# Corpus con los términos limpios
corpusn20 <- Corpus(VectorSource(texto_limpio_unidonot20))
corpusn20 <- tm_map(corpusn20, removeWords, palabras_eliminarnot20)
## Warning in tm_map.SimpleCorpus(corpusn20, removeWords, palabras_eliminarnot20):
## transformation drops documents
dtmnot20 <- DocumentTermMatrix(corpusn20)
inspect(dtmnot20)
## <<DocumentTermMatrix (documents: 38, terms: 109)>>
## Non-/sparse entries: 598/3544
## Sparsity           : 86%
## Maximal term length: 14
## Weighting          : term frequency (tf)
## Sample             :
##     Terms
## Docs ampliar apoyos discapacidad discapacitadas egresos gobernador ingresos
##   12       0      0            1              0       0          0        0
##   14       0      0            1              0       0          0        0
##   17       0      0            1              0       0          0        0
##   19       0      0            1              0       0          0        0
##   2        0      0            1              0       0          0        0
##   22       0      0            1              0       0          0        0
##   24       0      0            1              0       0          0        0
##   4        0      0            1              0       0          0        0
##   7        0      0            1              0       0          0        0
##   9        0      0            1              0       0          0        0
##     Terms
## Docs personas presupuesto sociales
##   12        1           0        0
##   14        0           1        1
##   17        1           0        0
##   19        0           1        1
##   2         1           0        0
##   22        1           0        0
##   24        0           1        1
##   4         0           1        1
##   7         1           0        0
##   9         0           1        1

Es importante mencionar que las visualizaciones que se realizarán a partir de esta recopilación estarán limitadas, ya que el documento solo contiene 109 términos. Esta restricción se debe a la limitada información obtenida durante la pandemia del COVID-19. La emergencia sanitaria generó un impacto significativo en la producción y contenido de textos, lo cual se refleja en la cantidad reducida de términos disponibles para el análisis. Por lo tanto, es esencial tener en cuenta esta restricción al interpretar y generalizar los resultados de las visualizaciones, reconociendo que la situación extraordinaria de la pandemia puede haber influido en la diversidad y cantidad de términos presentes en los textos analizados.

conteo_totalnot20 <- colSums(as.matrix(dtmnot20))

# Ordenar y mostrar los términos más comúnes
terminos_comunes_noticia20 <- sort(conteo_totalnot20, decreasing = TRUE)
# Data Frame
Frecuencianot20 <- data.frame(termino = names(terminos_comunes_noticia20), conteo = terminos_comunes_noticia20)
head(Frecuencianot20, 25) # Mostrar los 25 términos más comunes
##                       termino conteo
## personas             personas     16
## discapacitadas discapacitadas     11
## presupuesto       presupuesto     11
## sociales             sociales     11
## discapacidad     discapacidad     10
## ampliar               ampliar      6
## apoyos                 apoyos      6
## egresos               egresos      6
## gobernador         gobernador      6
## ingresos             ingresos      6
## iniciativa         iniciativa      6
## legislativo       legislativo      6
## ley                       ley      6
## marco                   marco      6
## millones             millones      6
## pesos                   pesos      6
## poder                   poder      6
## practique           practique      6
## reasignación     reasignación      6
## revisión             revisión      6
## sede                     sede      6
## solicitar           solicitar      6
## redes                   redes      6
## síguenos             síguenos      6
## atleta                 atleta      5

Gráfico de frecuencia

# Tomar los 100 términos más comunes
terminos_not202 <- names(terminos_comunes_noticia20)[1:40]

# Crear un vector con las frecuencias de estos términos
frecuencias_not20 <- terminos_comunes_noticia20[1:40]

# Definir colores personalizados
coloresnoticia20 <- rev(colorRampPalette(brewer.pal(4, "Set1"))(100))

# Crear un gráfico de barras con colores y ajustes de tamaño de letra
barplot(frecuencias_not20, 
        names.arg = terminos_not202, 
        horiz = TRUE, 
        las = 1, 
        main = "Términos más Utilizados en las noticias nacionales (2018 - 2019)", 
        xlab = "Frecuencia", 
        col = coloresnoticia20,  # Agregar los colores personalizados
        border = "white",  # Color de los bordes de las barras
        cex.names = 0.6,   # Tamaño de letra en el eje x
        cex.axis = 0.7,    # Tamaño de letra en los ejes
        cex.main = 1.2,    # Tamaño de letra en el título principal
        cex.lab = 1.2      # Tamaño de letra en las etiquetas de los ejes
)

Nube de palabras de las noticias 2020 - 2021

wordcloud(words = Frecuencianot20$termino,
  freq = Frecuencianot20$conteo, 
  min.freq = 1,
  max.words = 30,  # Reducir el número máximo de palabras
  random.order = FALSE, rot.per = 0.40, colors = brewer.pal(6, "Paired"))

La nube de palabras revela aspectos interesantes sobre los términos más frecuentes en los textos analizados. La prominencia de la palabra “personas” sugiere un enfoque centrado en la población, indicando posiblemente un interés en destacar la humanidad y las historias individuales en el discurso. La presencia destacada de “discapacidad” subraya la relevancia y atención dada al tema específico de la discapacidad en los textos.

Es interesante notar que la palabra “presupuesto” también figura entre las más frecuentes, lo cual puede indicar un énfasis en cuestiones financieras o presupuestarias. Este resultado puede ser atribuido al hecho de que se ha utilizado el periódico Expansión como fuente, un medio conocido por su enfoque en noticias financieras y económicas. Esto sugiere que las discusiones sobre discapacidad se abordan, al menos en parte, desde una perspectiva financiera.