Arreglo de base de datos de Redes Semánticas Naturales Clásicas

Creación de base de ejemplo

Primero se carga el paquete tibble, el cual permite consturir data frames de forma más versatil que la función data.frame(), nativa de R.
Como segundo paso, se crea el data frame conocido como tibble. Nótese que la función no es tibble, es tribble
Nota. La virgulilla ~ indica que se trata de un nombre del vector (variable). Véase como el nombre va entre comillas porque se trata de un nombre que tiene espacios en blanco: PREGUNTA 1

library(tibble)
z <- tribble(~ folio, ~"PREGUNTA 1", ~"PREGUNTA 2", ~"PREGUNTA 10", ~"GRADO PREGUNTA 1", ~"GRADO PREGUNTA 2", ~"GRADO PREGUNTA 10",
        1, "a", "b", "c", NA, NA, NA,
        2, "", "c", "d", 1, 2, NA,
        3, "c", "d", "e", 1, 2, NA)
z

En el recien creado tibble, la variable g3 tiene formato lgl que significa logical, es decir el tipo de variable es logico: TRUE (VERDADERO), FALSE (FALSO). Así que para cambiar esta variable a double o númerica utilizamos el comando as.numeric. Obsérvese que se hace referencia al nombre de la variable GRADO_PREGUNTA 10 del data frame z utilizando un corchete doble; esa es la forma de referirnos a un elemento dentor de un data frame, porque tiene 2 dimensiones: renglones y columnas. Adicionalmente, cuando usamos el doble corchete estamos indicando a R que queremos utilizar el formato de esa columna, en este caso, un vector de tipo caracter y no un objeto list, el cual no puede ser convertido a un vector numérico.

z[[7]] <- as.numeric(z$"GRADO PREGUNTA 10")
z

Convirtiendo el objeto tibble en tidy data

El objetivo de ordenar los datos (tidy data) es poner todas las variables que contienen preguntas: PREGUNA 1 a PREGUNTA 10, en una sola columna y hacer lo mismo con sus calificaciones de grado: GRADO_PREGUNTA 1 a GRADO_PREGUNTA 10. Por supuesto, cada palabra con su respectiva calificación: PREGUNTA 1 con GRADO_PREGUNTA 1, PREGUNTA 2 con GRADO_PREGUNTA 2, y así sucesivamente.
Primero hay que cargar la libreria, en este caso se usa el paquete tidyverse (recordemos que tidyverse es un conjunto de programas), que incluye el paquete tidyr, el cual contiene la función gather. Una vez cargada la libreria, se usa dicha función para formar todas las columnas en una sola.

library(tidyverse)
z2 <- z %>%
  gather(col = "PREGUNTA 1":"GRADO PREGUNTA 10", key = "preguntas", value = "respuestas")
z2

Separación o extracción del indicador de las preguntas.

Esta maniobra nos permitirá separar del nombre de la variable (v.gr. PREGUNTA 1) su índice o número que señala el orden de pregunta.
Se utiliza la función extract que fue para después relacionarlo con las desu mismo índice obtener el número de preguntaordenar las variables en un par de columnas de acuerdo a su correspondencia; en lugar de en una sola, como están en este momento. Para ello se va a utilizar posteriormente la función spread

z3 <- z2 %>%
  extract(col = "preguntas", into = c("preguntas", "indice_de_pregunta"),
          regex = "(.*)\\s([[:digit:]]+)")
z3

Reordenación de preguntas en dos columnas.

Esta maniobra nos permitirá ordenar las variables en un par de columnas de acuerdo a su correspondencia; en lugar de en una sola, como están en este momento. Para ello se va a utilizar posteriormente la función spread

Vamos a pasar de una sola columna preguntas a dos columnas distintas, pero relacionadas, utilizando la función spread

z4 <- z3 %>%
  spread(key = preguntas, value = respuestas, convert = TRUE)
z4

Obtención de datos distancias semánticas.

Inversión de importancias de las palabras.

El primer paso es invertir las calificaciones de importancias, en este caso es la variable GRADO PALABRA. Al número 1 le asignamos el 10, al 2 le asignamos el 9, al 3 el 8, y así sucecivamente. En lugar de recodificar los valores, como suele hacerse, utilizaremos un truco que consiste en restarle a la escala original el máximo número de la escala más 1, en este caso el número que restaremos será 11 a la columna vector que contiene la importancia GRADO PALABRA.

library(tidyverse)
rsn.df <- read_csv("rsn.csv")
rsn.df$`GRADO PALABRA` <- 11 - rsn.df$`GRADO PALABRA`

Cálculo del puntaje total de cada palabra.

Se utiliza la función count de Dplyr que me cuenta por grupos. En este ejemplo cuenta por cada red y grupo de edad; al final pondera por el grado de palabra y ordena, lo cual nos ayuda a ver que término o palabra fua la más mencionada.

rsn_edad.df <- rsn.df %>%
  count(RED, EDAD_RNG, PALABRA, wt = `GRADO PALABRA`, sort = T)

Obtención de la distancia semántica.

La distancia semántica de una plabra se calcula dividiendo su peso semántico entre el peso semántico máximo que haya alcanzado cualquier palabra dentro del grupo de análisis.

rsn_edad.df <- rsn_edad.df %>%
  group_by(RED, EDAD_RNG) %>%
  mutate(DISTANCIA = n/max(n)) %>%
  ungroup

Graficación de resultados.

Se utiliza el paquete ggplot2, muy porbablemente es el más popular para graficar en R.
Debido a que se utilizará una gráfica de radar, también llamada de telaraña o polar, necesitamos que las distancia semánticas sean menores conforme más se asocian al concepto. El método que usamos para lograrlo es muy sencillo; restamos 1 a la distancia que obtuvo la palabra. Así la palabra con el cociente 1 tendrá cero distancia del concepto; mientras que la palabra con un cociente cercano a cero tendrá una distancia de casi 1. Para hacer mucho más entendible esta distancia la convertiremos en porcentajes multiplicando el resultado por 100.

rsn_edad.df
## # A tibble: 4,895 x 5
##    RED          EDAD_RNG PALABRA         n DISTANCIA
##    <chr>        <chr>    <chr>       <dbl>     <dbl>
##  1 justicia     16 a 29  igualdad      393     1.00 
##  2 movimiento68 16 a 29  estudiantes   392     1.00 
##  3 ciudadano    16 a 29  derechos      383     1.00 
##  4 democracia   45-59    libertad      354     1.00 
##  5 ciudadano    45-59    persona       333     1.00 
##  6 movimiento68 16 a 29  injusticia    333     0.849
##  7 ciudadano    45-59    derechos      316     0.949
##  8 democracia   16 a 29  igualdad      315     1.00 
##  9 movimiento68 45-59    injusticia    314     1.00 
## 10 ciudadano    16 a 29  persona       312     0.815
## # ... with 4,885 more rows