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 recomendadolibrary(dplyr)library(expss)# Crear un conjunto de datos simuladoset.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 SPSSapply_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_Contratadodatos_encuesta %>%tab_cells(Plan_Contratado) %>%tab_stat_cases(label ="N") %>%# 'label' define el nombre en la tablatab_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 cruzadadatos_encuesta %>%tab_cells(Satisfaccion) %>%# Filas: Satisfaccióntab_cols(Plan_Contratado) %>%# Columnas: Plan Contratadotab_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 principiotab_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 recuentostab_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