expss (I): Tu Primera Tabla de Frecuencias y Tablas Cruzadas

Author

Roberto Gil-Saura

Published

May 1, 2025

Introducción: Tablas profesionales de SPSS, dentro de R

Bienvenido al primer post de nuestra serie sobre expss. Si alguna vez has trabajado con SPSS, especialmente con su módulo de Tablas Personalizadas (Custom Tables), sabrás lo potentes que son para crear tablas de resultados listas para un informe. Generan porcentajes, recuentos y pruebas de significación de una manera que es el estándar de facto en la industria de la investigación de mercados.

Durante mucho tiempo, replicar esa funcionalidad en R fue una tarea compleja que requería combinar múltiples paquetes y escribir mucho código. Todo eso cambió con expss. Este paquete, desarrollado por Gregory Demin, fue diseñado explícitamente para traer la potencia y la lógica de las tablas de SPSS, SAS y Quantum al ecosistema de R.

expss te permite construir tablas complejas de forma secuencial, añadiendo capas de información de una manera muy intuitiva. Su sintaxis es clara y, una vez que la dominas, te permite crear cualquier tabla que puedas imaginar con una velocidad y reproducibilidad que superan a las herramientas de point-and-click.

En este primer post, vamos a sentar las bases. Aprenderás a crear las dos tablas más fundamentales de cualquier análisis: las tablas de frecuencias y las tablas cruzadas, utilizando la familia de funciones tab_*.

Preparación: Librerías y datos

Primero, necesitamos instalar y cargar los paquetes. El orden en que los cargamos es importante. Cargaremos primero dplyr y luego expss. Esto se debe a que expss tiene algunas funciones con el mismo nombre que funciones de dplyr (un proceso llamado “masking”). Al cargar expss en segundo lugar, nos aseguramos de que R utilice la versión de expss de esas funciones, que es lo que necesitamos para construir nuestras tablas.

Para nuestros ejemplos, usaremos un conjunto de datos simulado que imita una típica encuesta de satisfacción de una empresa de telecomunicaciones.

Code
# Instalar los paquetes si no los tienes
# install.packages("dplyr")
# install.packages("expss")

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

# Crear un conjunto de datos simulado
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)
) %>%
  # Es una buena práctica usar etiquetas con expss, como en SPSS
  apply_labels(
    Genero = "Género del cliente",
    Plan_Contratado = "Plan de servicio contratado",
    Satisfaccion = "Satisfacción General con el Servicio"
  )

1. La tabla más básica: Frecuencias

La primera tabla que siempre se realiza en cualquier análisis es la de frecuencias, para ver la distribución de una variable. Con expss, la lógica es encadenar funciones que definen la estructura de la tabla.

Pregunta: ¿Cómo se distribuyen los clientes según el Plan_Contratado?

La estructura es la siguiente: 1. Empiezas con tu dataframe. 2. Usas tab_cells() para indicar la variable que quieres tabular (las filas). 3. Usas tab_stat_cases() para añadir el recuento (N). 4. Usas tab_stat_cpct() para añadir el porcentaje columna (%). cpct significa “column percent”. 5. Usas tab_pivot() para construir la tabla final.

Code
# Crear una tabla de frecuencias para Plan_Contratado
datos_encuesta %>%
  tab_cells(Plan_Contratado) %>%
  tab_stat_cases(label = "N") %>% # 'label' define el nombre en la tabla
  tab_stat_cpct(label = "% Columna") %>%
  tab_pivot(stat_position = "inside_rows") # Muestra N y % en filas separadas
 #Total 
 Plan de servicio contratado 
   Básico   N  262.0
    % Columna  52.4
   Familia   N  95.0
    % Columna  19.0
   Premium   N  143.0
    % Columna  28.6
   #Total cases   N  500
    % Columna  500

¡Excelente! Con un código limpio y legible, has creado una tabla de frecuencias profesional, con etiquetas y un total. La función tab_pivot() es la que ensambla todas las piezas.

2. El pilar del análisis: Tablas cruzadas

El verdadero análisis comienza cuando cruzas variables. Una tabla cruzada (o tabla de contingencia) te permite ver cómo se distribuye una variable en función de otra.

Pregunta: ¿Existe una relación entre el Plan_Contratado y la Satisfaccion general?

La lógica es muy similar, pero ahora introducimos una nueva función: tab_cols().

  • tab_cells(): La variable de las filas.
  • tab_cols(): La variable de las columnas (el “banner”).
Code
# Crear una tabla cruzada
datos_encuesta %>%
  tab_cells(Satisfaccion) %>%           # Filas: Satisfacción
  tab_cols(Plan_Contratado) %>%         # Columnas: Plan Contratado
  tab_stat_cpct(label = "% Columna") %>%
  tab_pivot()
   Plan de servicio contratado 
   Básico   Familia   Premium 
 Satisfacción General con el Servicio 
   Insatisfecho   % Columna    19.8 25.3 23.1
   Muy insatisfecho   % Columna    25.6 12.6 16.1
   Muy satisfecho   % Columna    17.9 20.0 19.6
   Neutral   % Columna    19.8 29.5 16.8
   Satisfecho   % Columna    16.8 12.6 24.5
   #Total cases   % Columna    262 95 143

Tabla cruzada de Satisfacción por Plan Contratado.

¡Voilà! Acabas de crear una tabla cruzada estándar de investigación de mercados. Ahora puedes analizar los porcentajes columna y empezar a ver patrones. Por ejemplo, parece que los clientes del plan “Familia” tienden a estar más satisfechos que los del plan “Básico”.

Añadiendo el “Total” a las columnas

Una tabla profesional casi siempre incluye una columna de “Total”. expss lo hace increíblemente fácil. Simplemente añade total() dentro de tab_cols().

Code
datos_encuesta %>%
  tab_cells(Satisfaccion) %>%
  tab_cols(total(), Plan_Contratado) %>% # Añadimos el total al principio
  tab_stat_cpct(label = "% Columna") %>%
  tab_pivot()
   #Total     Plan de servicio contratado 
     Básico   Familia   Premium 
 Satisfacción General con el Servicio 
   Insatisfecho   % Columna    21.8   19.8 25.3 23.1
   Muy insatisfecho   % Columna    20.4   25.6 12.6 16.1
   Muy satisfecho   % Columna    18.8   17.9 20.0 19.6
   Neutral   % Columna    20.8   19.8 29.5 16.8
   Satisfecho   % Columna    18.2   16.8 12.6 24.5
   #Total cases   % Columna    500   262 95 143

Añadiendo el recuento (N) a la base

Los porcentajes son útiles, pero siempre debes mostrar la base sobre la que se calculan. Puedes añadir el recuento (la “base”) a tu tabla con tab_stat_cases().

Code
datos_encuesta %>%
  tab_cells(Satisfaccion) %>%
  tab_cols(total(), Plan_Contratado) %>%
  tab_stat_cpct(label = "% Columna") %>%
  tab_stat_cases(label = "Base (N)") %>% # Añadimos los recuentos
  tab_pivot(stat_position = "inside_columns") # Muestra % y N en la misma celda
 #Total     Plan de servicio contratado 
 % Columna     Base (N)     Básico     Familia     Premium 
     % Columna   Base (N)     % Columna   Base (N)     % Columna   Base (N) 
 Satisfacción General con el Servicio 
   Insatisfecho  21.8   109   19.8 52   25.3 24   23.1 33
   Muy insatisfecho  20.4   102   25.6 67   12.6 12   16.1 23
   Muy satisfecho  18.8   94   17.9 47   20.0 19   19.6 28
   Neutral  20.8   104   19.8 52   29.5 28   16.8 24
   Satisfecho  18.2   91   16.8 44   12.6 12   24.5 35
   #Total cases  500   500   262 262   95 95   143 143

Ahora la tabla es mucho más completa. La opción stat_position = "inside_columns" es muy útil para crear tablas más compactas.

Conclusión y próximos pasos

Hoy has dado tus primeros pasos con expss y has visto lo fácil que es empezar a crear tablas con un aspecto profesional. Has aprendido la sintaxis básica y secuencial del paquete, y ya eres capaz de:

  • Construir tablas de frecuencias claras y completas.
  • Crear tablas cruzadas para explorar la relación entre dos variables.
  • Añadir totales y recuentos para hacer tus tablas más robustas.

Lo más importante es que has empezado a pensar en la construcción de tablas como un proceso de “añadir capas”, una filosofía que nos permitirá crear visualizaciones mucho más complejas en los próximos posts.

En la siguiente entrega, profundizaremos en la personalización. Aprenderás a construir “banners” complejos con múltiples variables, a incorporar estadísticos como las medias en tus tablas y a controlar cada detalle de la presentación.

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., Averick, M., Bryan, J., Chang, W., McGowan, L., François, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T., Miller, E., Bache, S., Müller, K., Ooms, J., Robinson, D., Seidel, D., Spinu, V., Takahashi, K., Vaughan, D., Yutani, H., & Canty, A. (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”.

  • Post 1: Tu Primera Tabla de Frecuencias y Tablas Cruzadas
  • Post 2 (Próximamente): Dominando la Estructura con Tablas Avanzadas y Banners Complejos