expss (II): Dominando la Estructura con Tablas Avanzadas y Banners Complejos

Author

Roberto Gil-Saura

Published

May 2, 2025

Introducción: Más allá de una tabla, un informe

En la primera parte de nuestra serie sobre expss, sentamos las bases. Aprendiste a crear tablas de frecuencias y tablas cruzadas de forma limpia y eficiente, replicando la salida básica de SPSS. Ya dominas la lógica secuencial de tab_cells(), tab_cols() y tab_pivot().

Ahora, es el momento de desatar el verdadero poder de expss. Un informe de investigación de mercados raramente se compone de tablas simples con un solo porcentaje. Necesitamos tablas más ricas, que muestren múltiples estadísticos, que incorporen variables numéricas y que, sobre todo, nos permitan comparar muchos grupos demográficos a la vez en una única vista.

En este post, nos sumergiremos en tres técnicas avanzadas que te permitirán construir tablas de calidad profesional:

  1. Añadir múltiples estadísticos a cada celda (recuentos, porcentajes fila, etc.).
  2. Incorporar variables continuas para analizar medias y desviaciones estándar.
  3. Construir “banners” complejos con múltiples variables en las columnas.

Preparación: Ampliando nuestro dataset

Para los ejemplos de hoy, necesitaremos una variable continua. Vamos a añadir el Gasto_Mensual a nuestro dataset de la encuesta de Telco S.A. Y recuerda, siempre cargamos dplyr antes que expss.

Code
# Cargar las librerías en el orden recomendado
library(dplyr)
library(expss)

# Crear un conjunto de datos simulado (ahora con Gasto_Mensual)
set.seed(42)
datos_encuesta <- tibble(
  ID_Cliente = 1:500,
  Genero = sample(c("Hombre", "Mujer"), 500, replace = TRUE, prob = c(0.48, 0.52)),
  Plan_Contratado = sample(c("Básico", "Premium", "Familia"), 500, replace = TRUE, prob = c(0.5, 0.3, 0.2)),
  Satisfaccion = sample(c("Muy insatisfecho", "Insatisfecho", "Neutral", "Satisfecho", "Muy satisfecho"), 500, replace = TRUE),
  Gasto_Mensual = rnorm(500, mean = 45, sd = 15)
) %>%
  apply_labels(
    Genero = "Género del cliente",
    Plan_Contratado = "Plan de servicio contratado",
    Satisfaccion = "Satisfacción General con el Servicio",
    Gasto_Mensual = "Gasto Mensual Medio (€)"
  )

1. Múltiples estadísticos por celda: Una visión completa

En el post anterior, mostramos el porcentaje columna (% Columna). Pero a veces queremos una visión más completa. Por ejemplo, ¿qué porcentaje de los “Muy satisfechos” tienen un plan Familiar? Para eso, necesitamos el porcentaje fila (% Fila).

expss nos permite apilar tantos estadísticos como queramos.

Pregunta: ¿Cómo se distribuye la satisfacción por plan, mostrando recuentos, % columna y % fila?

  • tab_stat_cases(): para el recuento (N).
  • tab_stat_cpct(): para el porcentaje columna.
  • tab_stat_rpct(): para el porcentaje fila. rpct significa “row percent”.
Code
datos_encuesta %>%
  tab_cells(Satisfaccion) %>%
  tab_cols(total(), Plan_Contratado) %>%
  tab_stat_cases(label = "N") %>%
  tab_stat_cpct(label = "% Columna") %>%
  tab_stat_rpct(label = "% Fila") %>%
  tab_pivot(stat_position = "inside_rows")
   #Total     Plan de servicio contratado 
     Básico   Familia   Premium 
 Satisfacción General con el Servicio 
   Insatisfecho   N    109.0   52.0 24.0 33.0
    % Columna    21.8   19.8 25.3 23.1
    % Fila    100.0   47.7 22.0 30.3
   Muy insatisfecho   N    102.0   67.0 12.0 23.0
    % Columna    20.4   25.6 12.6 16.1
    % Fila    100.0   65.7 11.8 22.5
   Muy satisfecho   N    94.0   47.0 19.0 28.0
    % Columna    18.8   17.9 20.0 19.6
    % Fila    100.0   50.0 20.2 29.8
   Neutral   N    104.0   52.0 28.0 24.0
    % Columna    20.8   19.8 29.5 16.8
    % Fila    100.0   50.0 26.9 23.1
   Satisfecho   N    91.0   44.0 12.0 35.0
    % Columna    18.2   16.8 12.6 24.5
    % Fila    100.0   48.4 13.2 38.5
   #Total cases   N    500   262 95 143
    % Columna    500   262 95 143
    % Fila    500   262 95 143

¡Fantástico! Ahora la tabla es mucho más rica. Podemos leerla de dos maneras: * Verticalmente (% Columna): “El 29.8% de los clientes del plan Familia están ‘Muy satisfechos’”. * Horizontalmente (% Fila): “De todos los clientes ‘Muy satisfechos’, el 22.8% tienen el plan Familia”.

Esta doble perspectiva es extremadamente útil para el análisis.

2. Incorporando variables continuas: Análisis de medias

Las tablas no son solo para variables categóricas. Una de las tareas más comunes es calcular la media de una variable continua (como el gasto, la edad o una valoración en escala) para diferentes grupos.

Pregunta: ¿Cuál es el Gasto_Mensual medio para cada Plan_Contratado?

Aquí la lógica cambia ligeramente. La variable continua va en tab_cells(), y la variable de agrupación va en tab_cols(). Luego, usamos un estadístico de resumen como tab_stat_mean_sd_n().

Code
datos_encuesta %>%
  tab_cells(Gasto_Mensual) %>% # La variable continua en las celdas
  tab_cols(total(), Plan_Contratado) %>% # La variable de agrupación en las columnas
  tab_stat_mean_sd_n(labels = c("Media", "D.E.", "Base (N)")) %>% # Múltiples estadísticos
  tab_pivot()
Warning in as.data.frame.numeric(x[[i]], optional = TRUE, nm = "x[[i]]", :
Direct call of 'as.data.frame.numeric()' is deprecated.  Use
'as.data.frame.vector()' or 'as.data.frame()' instead
 #Total     Plan de servicio contratado 
   Básico   Familia   Premium 
 Gasto Mensual Medio (€) 
   Media  46.3   47.6 43.0 45.9
   D.E.  15.3   15.0 14.6 16.0
   Base (N)  500.0   262.0 95.0 143.0

Esta tabla nos muestra de forma clara que la mínima diferencia en el gasto medio con la categoría del plan. Mostrar la Desviación Estándar (D.E.) y la Base (N) es una buena práctica que da robustez al análisis.

expss tiene muchos otros estadísticos de resumen que puedes usar, como tab_stat_median(), tab_stat_min(), tab_stat_max(), etc.

3. La habilidad estrella: Creación de “banners” complejos

Esta es, posiblemente, la funcionalidad más potente de expss para un investigador de mercados. Un “banner” es un conjunto de columnas que combina múltiples variables demográficas o de segmentación. Te permite ver todos tus cruces clave en una sola tabla, en lugar de generar docenas de ellas por separado.

Pregunta: ¿Cómo se distribuye la Satisfaccion a través de todos nuestros grupos clave: Genero y Plan_Contratado?

La sintaxis es sorprendentemente simple. ¡Simplemente listas todas las variables que quieres en las columnas dentro de tab_cols()!

Code
datos_encuesta %>%
  tab_cells(Satisfaccion) %>%
  tab_cols(total(), Genero, Plan_Contratado) %>%
  tab_stat_cpct(label = "% Columna") %>%
  tab_stat_cases(label = "Base (N)") %>%
  tab_pivot(stat_position = "inside_columns")
 #Total     Género del cliente     Plan de servicio contratado 
 % Columna     Base (N)     Hombre     Mujer     Básico     Familia     Premium 
     % Columna   Base (N)     % Columna   Base (N)     % Columna   Base (N)     % Columna   Base (N)     % Columna   Base (N) 
 Satisfacción General con el Servicio 
   Insatisfecho  21.8   109   23.1 52   20.7 57   19.8 52   25.3 24   23.1 33
   Muy insatisfecho  20.4   102   23.1 52   18.2 50   25.6 67   12.6 12   16.1 23
   Muy satisfecho  18.8   94   16.9 38   20.4 56   17.9 47   20.0 19   19.6 28
   Neutral  20.8   104   19.6 44   21.8 60   19.8 52   29.5 28   16.8 24
   Satisfecho  18.2   91   17.3 39   18.9 52   16.8 44   12.6 12   24.5 35
   #Total cases  500   500   225 225   275 275   262 262   95 95   143 143

Tabla de satisfacción con un banner complejo que combina Género y Plan Contratado.

Con una sola línea de código, hemos creado una tabla ancha y completa, lista para un informe. Ahora puedes comparar la satisfacción de los Hombres vs. las Mujeres, y al mismo tiempo compararla con la de los clientes del plan Básico vs. Premium, todo en la misma vista.

Esta capacidad para crear banners complejos es lo que hace que expss sea una herramienta tan productiva, ahorrando horas de trabajo y permitiendo un análisis mucho más fluido e integrado.

Conclusión y próximos pasos

Hoy has dado un salto cualitativo en tu dominio de expss. Ya no estás limitado a tablas simples. Has aprendido a:

  • Enriquecer tus celdas con múltiples estadísticos (N, % col, % fila).
  • Analizar variables continuas calculando medias y otros estadísticos de resumen por grupos.
  • Construir “banners” complejos, la piedra angular de los informes de investigación de mercados.

Ahora tienes las herramientas para construir casi cualquier tabla descriptiva que puedas necesitar. Pero nos falta un ingrediente crucial: la inferencia. ¿Son las diferencias que vemos en nuestras tablas estadísticamente significativas?

En nuestro próximo y último post de la serie, cerraremos el círculo aprendiendo a añadir pruebas de significación (pruebas Z y T) directamente en nuestras tablas, completando así tu transición a un analista de datos de encuestas profesional en R.

Referencias

Demin, G. (2024). expss: Tables with Labels, Weights, Multiple Response and Significance Testing. R package version 0.11.6. https://CRAN.R-project.org/package=expss

Wickham, H., et al. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686


Este post es parte de la serie “Tablas Profesionales en R: La Guía Definitiva del Paquete expss para Investigadores de Mercado”.