net y subtotal en una crosstab

analisis
R
Author

Roberto Gil-Saura

Published

July 24, 2021

Hola de nuevo. Como siempre hemos tardado mucho, pero aquí dejamos este nuevo post con una explicación de dos elementos que en muchos casos utilizamos en nuestro análisis de datos. Los conceptos a los que me refiero son:

Normalmente los encontramos por separado. Pero vamos primero con contextualizar su uso, porque se supone que debes saber qué significan. Ya sabéis de esa tendencia en los cargos de decisión a dar una gran relevancia a términos que después son muy sencillos. Ya tuvimos un ejemplo de ello con el NPS.

¿Qué es un NET?

El término NET hace referencia a la agrupación de determinados valores (códigos, niveles, factores) de una variable cualitativa en un grupo de nivel superior, cuya frecuencia es el resultado de la suma de las frecuencias de los valores (códigos, niveles o factores) que lo componen.

Imagina una pregunta en un cuestionario, cualitativa, que hace referencia a los likes y dislikes de un producto determinado. Tomemos los likes y en este caso, los entrevistados responden cosas como:

Esto es un pequeño ejemplo de respuestas abiertas que posteriormente deberían ser codificadas. La codificación que reciben genera el siguiente libro de claves

  1. Color azul
  2. Color verde
  3. Mar, playa,
  4. Cielo
  5. Infancia
  6. Sol, luz
  7. Olor
  8. Densidad
  9. Capacidad de aplicación
  10. Absorción

Como puedes observar, los valores entre paréntesis en el listado de verbatim se corresponden con los valores (códigos) del libro de claves. Vamos a poner esta información en un dataframe y tratamos de procesar la información que de ello deriva.

suppressMessages(library(expss))
df <-
  data.frame(
    id = seq(1:7),
    p56_1 = c(1, 2, 3, 3, 1, 7, 8),
    p56_2 = c(2, 3, 7, 5, 6, NA, 9),
    p56_3 = c(3, 4, NA, NA, NA, NA, 10)
  )
df
  id p56_1 p56_2 p56_3
1  1     1     2     3
2  2     2     3     4
3  3     3     7    NA
4  4     3     5    NA
5  5     1     6    NA
6  6     7    NA    NA
7  7     8     9    10

Puede observarse que al ser una pregunta de respuesta múltiple, se han requerido hasta tres variables (caso con máximo nº de menciones, 3) para poder recoger toda la información multi-respuesta.

Usaremos ahora nuestro paquete de referencia expss que ya hemos cargado en el paso anterior, para hacer varias cosas que necesitamos:

var_lab(df$p56_1) <- 'Likes de la crema' #etiquetamos la variable
val_lab(df$p56_1) <- c(
  'Color azul' = 1,
  'Color verde' = 2,
  'Mar, playa' = 3,
  'Cielo' = 4,
  'Infancia' = 5,
  'Sol, luz' = 6,
  'Olor' = 7,
  'Densidad' = 8,
  'Capacidad de aplicación' = 9,
  'Absorción' = 10
) #etiquetamos los valores de la variable
df %>% 
  tab_cells(mrset_f(p56_)) %>% 
  tab_stat_cases() %>% 
  tab_pivot() %>% 
  as.datatable_widget() # hacemos un marginal de frecuencias

Nótese que en la tabla de frecuencias el resultados son 7 casos, aunque la suma de respuestas es mayor que 7. Recordemos, es multi-respuesta. Estamos hablando de los NETS y ha llegado la hora de definirlos con el ejemplo que nos ocupa. En nuestro ejemplo un NET sería la agregación de todas las menciones realizadas un factor de nivel mayor. Sobre el ejemplo, si quisiéramos crear una agregación de mayor nivel como por ejemplo COLOR, deberíamos sumar los códigos. Y eso vamos a hacer en nuestro script…

df %>%
  tab_cols(total()) %>%
  tab_cells(
    subtotal(
      mrset_f(p56_),
      "COLOR" = c(1:2),
      "NATURALEZA" = c(3:4, 6),
      "OTROS" = c(5, 7:10),
      position = "bottom",
      new_label = "range"
    )
  ) %>%
  tab_stat_cases(total_row_position = "below") %>%
  tab_pivot() %>%
  set_caption("Tabla nº 1") %>%
  as.datatable_widget()

Nótese que los NET aparecen al final por el uso del modificador position. Pero me parece más importante que veamos un detalle. Si sumamos el valor en marginal de color azul y color verde la frecuencia sería 4, pero sin embargo el NET de COLOR suma 3. ¿Por qué?, Esto es debido a que los NET se muestran en función de los casos y no tiene en cuenta la multi-respuesta. Se leería como que hay tres casos (personas en este caso) que han respondido atributos de tipo like que hacen referencia al COLOR.

Sin embargo si obtenemos la misma tabla en porcentajes…

df %>%
  tab_cols(total()) %>%
  tab_cells(
    subtotal(
      mrset_f(p56_),
      "COLOR" = c(1:2),
      "NATURALEZA" = c(3:4, 6:7),
      "OTROS" = c(5, 8:10),
      position = "bottom",
      new_label = "range"
    )
  ) %>%
  tab_stat_cpct(total_row_position = "below") %>%
  tab_pivot() %>%
  set_caption("Tabla nº 2") %>%
  as.datatable_widget()

Y si esos porcentajes los calculamos sobre las repuestas y no sobre los casos …

df %>%
  tab_cols(total()) %>%
  tab_cells(
    subtotal(
      mrset_f(p56_),
      "COLOR" = c(1:2),
      "NATURALEZA" = c(3:4, 6:7),
      "OTROS" = c(5, 8:10),
      position = "bottom",
      new_label = "range"
    )
  ) %>%
  tab_stat_cpct_responses(total_row_position = "below") %>%
  tab_pivot() %>%
  set_caption("Tabla nº 3") %>%
  as.datatable_widget()

Nótese que aunque el cçalculo del NET ha variado, este siempre se mantiene en casos y no en respuestas.

¿En que se diferencia el subototal del NET? subtotal agrega una fila al conjunto de categorías, sin embargo net reemplaza las categorías con su valor agregado o neto. Esa es la diferencia. En nuestra jerga, también podemos decir que el término NET se utiliza más con las multrespuesta, y el término subtotal se asocia más con respuetas agregadas de tipo simple.

Veamos como quedaría la misma tabla, pero usando la función NET en lugar de SUBOTOTAL.

df %>%
  tab_cols(total()) %>%
  tab_cells(
    net(
      mrset_f(p56_),
      "COLOR" = c(1:2),
      "NATURALEZA" = c(3:4, 6),
      "OTROS" = c(5, 7:10),
      position = "bottom",
      new_label = "range"
    )
  ) %>%
  tab_stat_cases(total_row_position = "below") %>%
  tab_pivot() %>%
  set_caption("Tabla nº 4") %>%
  as.datatable_widget()

Y hasta aquí un post más.