Estadística Correlacional Interactiva
  • Inicio
  • Inferencia
    • M01. Datos, medición y variabilidad
    • M02. Probabilidad y distribuciones muestrales
    • M03. Curva normal y puntajes Z
    • M04. Teorema del límite central y error estándar
    • M05. Intervalos de confianza
    • M06. Test de hipótesis y lógica de falsación
    • M07. Hipótesis direccionales y no direccionales
  • Asociación bivariada
    • M08. Asociación, covarianza y correlación de Pearson
    • M09. Inferencia y magnitud de la correlación
    • M10. Correlaciones ordinales: Spearman y Kendall
    • M11. Matrices de correlación y casos perdidos
    • M12. Baterías, consistencia e índices
    • M13. Variables categóricas y tablas de contingencia
    • M14. Chi-cuadrado y magnitud de la asociación
  • Glosario

Unidad 2 · Asociación bivariada · Módulo 13

M13. Variables categóricas y tablas de contingencia

En los módulos anteriores trabajamos con valores cuantitativos, rangos, correlaciones e índices. Sin embargo, algunas variables sociales informan principalmente la pertenencia a categorías. En esos casos, una nube de puntos no es la representación principal: necesitamos organizar los casos en una tabla de contingencia. Las frecuencias muestran cuántas personas pertenecen a cada combinación, mientras que los márgenes y porcentajes permiten comparar grupos de distinto tamaño. La clave es identificar el denominador adecuado. Ese denominador no depende automáticamente de filas o columnas, sino de la pregunta que queremos responder.

Pregunta Social

¿La seguridad económica se distribuye de la misma manera entre personas con empleos estables e inestables?

La estabilidad del empleo puede relacionarse con la forma en que las personas evalúan su capacidad para cubrir gastos, enfrentar imprevistos y proyector su futuro económico. Para estudiar descriptivamente esta relación, nuestra unidad de análisis será la persona ocupada.

La variable de agrupación será la estabilidad del empleo, registrada mediante dos categorías: empleo estable y empleo inestable. Se trata de una variable binaria nominal, porque distingue dos grupos sin establecer una distancia cuantitativa entre ellos.

La variable de respuesta será la seguridad económica percibida, resumida en tres categorías ordenadas: baja, media y alta. Esta variable es ordinal: sabemos que “alta” representa una posición superior a “media” y “baja”, pero no podemos suponer que las distancias entre categorías sean iguales.

Cada persona pertenece a una única combinación. Por ejemplo, alguien puede tener empleo inestable y seguridad económica baja. Al contar todas esas combinaciones obtenemos una tabla de contingencia \(2\times3\).

Las celdas muestran frecuencias absolutas. Los márgenes muestran los tamaños de los grupos y el total general. Sin embargo, los conteos no bastan para comparar propensiones si los grupos tienen tamaños diferentes. Para eso necesitamos porcentajes condicionados y un denominador explícito.

Las diferencias observadas describen una asociación entre estabilidad laboral y seguridad económica. No demuestran que una variable cause por sí sola a la otra.

Los datos utilizados en las visualizaciones, cálculos y ejemplos son construidos con fines pedagógicos y no representan estimaciones de una población real.

Las variables del análisis

Variables analizadas en la contingencia
Variable Tipo Categorías Función en la pregunta
Estabilidad laboral Binaria nominal Estable / Inestable Define los grupos que se comparan
Seguridad económica categorizada Ordinal Baja / Media / Alta Describe el nivel de seguridad dentro de cada grupo

La estabilidad laboral puede ubicarse en las filas y la seguridad en las columnas, o viceversa. Intercambiar sus posiciones no cambia los casos ni las frecuencias sustantivas: solo modifica la presentación.

Por eso, “por fila” y “por columna” no son reglas universales. La decisión sustantiva consiste en identificar qué grupo debe funcionar como base de la comparación y, por tanto, sumar 100 %.

Categorización y pérdida de información: Para esta actividad resumimos el índice continuo de seguridad económica en tres niveles. Esto facilita la construcción de una tabla, pero reduce la información disponible y puede ocultar diferencias entre personas situadas dentro de una misma categoría. Dos personas clasificadas con “seguridad media” pueden tener puntuaciones continuas diferentes. Además, los puntos de corte elegidos influyen en las frecuencias de cada categoría. La categorización simplifica la comunicación, pero tiene un costo analítico. Más adelante recuperaremos el índice continuo mediante la correlación punto-biserial.

Tres preguntas para una misma tabla

Pregunta A · Distribución dentro del empleo

Entre quienes tienen empleo estable o inestable, ¿cómo se distribuyen los niveles de seguridad económica?
La base de comparación es cada tipo de empleo. Si la estabilidad laboral está en las filas, el denominador corresponde al total de cada fila y utilizamos porcentajes por fila. Describe el perfil de seguridad económica dentro de cada grupo laboral.

Pregunta B · Composición de un nivel de seguridad

Entre quienes presentan seguridad económica baja, ¿qué proporción tiene empleo estable o inestable?
La base de comparación es cada nivel de seguridad. Si la seguridad está en las columnas, el denominador corresponde al total de cada columna y utilizamos porcentajes por columna. Describe la composición laboral de cada categoría de seguridad.

Una misma celda puede producir tres porcentajes correctos porque cada uno responde una pregunta distinta. El porcentaje no se elige por rutina: se elige después de formular la pregunta y reconocer el grupo que debe constituir el denominador.

Idea Central

1

De los niveles de medición a la técnica

Una variable nominal informa pertenencia a categorías. Una variable ordinal agrega información sobre el orden, pero no garantiza distancias iguales. Los códigos numéricos utilizados para registrar categorías no transforman automáticamente esas variables en cantidades.

Cuando ambas variables son categóricas, sus combinaciones pueden organizarse en una tabla de contingencia. Pearson no debe aplicarse automáticamente a cualquier variable codificada con números.

Codificar “estable” como 1 e “inestable” como 0 no convierte por sí sola una comparación categórica en una relación cuantitativa general.

2

De las frecuencias a los porcentajes condicionados

La frecuencia de una celda funciona como numerador. El margen elegido funciona como denominador.

  • El porcentaje por fila describe una distribución dentro de la fila.
  • El porcentaje por columna describe una composición dentro de la columna.
  • El porcentaje del total describe el peso de la combinación en toda la muestra.

Una cifra como 45,0 % resulta ambigua si no sabemos cuál fue su base de cálculo.

Un porcentaje siempre debe indicar respecto de qué grupo fue calculado.

3

De los porcentajes a los perfiles

Un perfil es una distribución porcentual completa. Las barras apiladas al 100 % permiten comparar grupos de distinto tamaño porque cada barra tiene la misma longitud.

Perfiles semejantes sugieren poca dependencia descriptiva. Perfiles diferentes sugieren asociación descriptiva. La independencia no requiere frecuencias absolutas idénticas: grupos de tamaños distintos pueden presentar las mismas proporciones internas.

¿Cómo pasamos de los casos a los perfiles?

El recorrido guiado utilizará pocos casos para mostrar cómo cada persona se clasifica en una combinación de categorías. A partir de esas combinaciones se construirán las frecuencias, los márgenes y el total general. Luego se compararán porcentajes por fila y por columna para hacer visible el papel del denominador. El cierre transformará los porcentajes en perfiles y presentará la independencia como semejanza descriptiva entre distribuciones.

Laboratorio interactivo

Nota pedagógica: Modifica la distribución y el tamaño de los grupos, selecciona la pregunta de análisis y compara frecuencias, porcentajes y perfiles condicionados sin perder de vista el denominador.

Después de explorar

Los conteos dependen del tamaño de los grupos. Si aumenta la cantidad de personas con empleo estable, sus frecuencias pueden crecer en varias celdas aunque las proporciones internas permanezcan iguales. Más casos no implican necesariamente una mayor propensión relativa.

La pregunta determina el denominador. Los porcentajes por fila y por columna pueden ser correctos simultáneamente porque describen bases distintas. Transponer la tabla tampoco cambia los datos: solo intercambia su orientación y obliga a revisar dónde se encuentra el margen pertinente.

Los perfiles semejantes sugieren independencia descriptiva y los perfiles diferentes sugieren asociación descriptiva. Las barras al 100 % facilitan esa comparación, pero no muestran el tamaño real de los grupos, por lo que deben leerse junto con sus márgenes.

Finalmente, categorizar el índice continuo simplifica el análisis, pero pierde información. Las diferencias observadas describen una asociación y no demuestran causalidad.

Cómo leer una tabla de contingencia

1. Revisa los encabezados

Identifica la variable de las filas, la de las columnas, sus categorías y el orden en las ordinales.

2. Observa las frecuencias y márgenes

Identifica cuántas personas hay en cada combinación, si existen celdas con pocos casos y el total general. Los márgenes actúan como denominadores según la pregunta. Las frecuencias describen volumen, no propensión.

3. Compara perfiles completos

No interpretes una celda de forma aislada. Observa cómo se distribuyen todas las categorías dentro del grupo.

4. Mantén separadas la descripción y la inferencia

Las diferencias visibles son descriptivas. El contraste formal de independencia se desarrollará en el M14.

¿Casos completos o casos disponibles?

Comparativa de tipos de porcentajes
Aspecto Porcentaje por fila Porcentaje por columna Porcentaje del total
Base o grupo Tipo de empleo (Fila \(X\)) Nivel de seguridad (Columna \(Y\)) Muestra completa (\(N\))
Denominador Total de la fila correspondiente Total de la columna correspondiente Total general
Lectura principal Perfil de seguridad de cada grupo Composición laboral de la categoría Peso de la combinación en toda la muestra

“Por fila” y “por columna” son instrucciones operativas. La decisión sustantiva es identificar el grupo que debe sumar 100 % (el denominador).

Pensar la independencia mediante perfiles

Bajo independencia, la distribución de seguridad económica sería semejante entre quienes tienen empleo estable e inestables. Esto no significa que todas las frecuencias deban ser iguales. Si un grupo contiene más personas, sus conteos pueden ser mayores incluso cuando los perfiles porcentuales coinciden. La semejanza se observa mediante distribuciones condicionadas.

Advertencia

Advertencia metodológica: “Compatible con independencia” es una lectura descriptiva de perfiles semejantes, no una conclusión inferencial.

Puente: una variable binaria y una cuantitativa

El mismo problema puede analizarse sin categorizar el índice de seguridad económica. En ese caso, mantenemos estabilidad laboral como variable binaria y seguridad como cuantitativa.

La correlación punto-biserial (\(r_{pb}\)) equivale a Pearson entre una variable codificada 0/1 (inestable/estable) y la cuantitativa.

Si la media de seguridad es mayor en empleo estable (\(\bar Y_1 > \bar Y_0\)), entonces \(r_{pb} > 0\). Si invertimos la codificación (estable=0, inestable=1), el signo de la correlación se invierte, pero su magnitud se conserva.

La tabla de contingencia y la correlación punto-biserial responden versiones relacionadas, pero distintas: la tabla compara perfiles categóricos, mientras que la punto-biserial resume la separación lineal entre las medias del índice continuo, conservando más información al evitar la categorización.

Evita estas interpretaciones

Interpretaciones problemáticas en análisis categórico
Interpretación problemática Corrección
“Los códigos numéricos convierten una categoría en cantidad.” Los códigos identifican categorías y no garantizan distancias cuantitativas.
“Una variable ordinal es automáticamente continua.” Informa orden, pero no necesariamente intervalos iguales.
“La tabla depende de qué variable está arriba.” La orientación cambia la presentación, no los casos ni las frecuencias sustantivas.
“Los porcentajes siempre deben calcularse por fila.” La dirección correcta depende de la pregunta y del denominador.
“Los porcentajes por columna son incorrectos.” Son adecuados cuando la pregunta describe la composición de las columnas.
“El total general sirve para cualquier pregunta.” Solo corresponde cuando queremos describir el peso de una combinación en toda la muestra.
“Una frecuencia mayor implica mayor propensión.” Puede reflejar únicamente un grupo más numeroso.
“El grupo más numeroso presenta necesariamente más asociación.” El tamaño del grupo y la diferencia entre perfiles son dimensiones distintas.
“Una celda puede interpretarse sin revisar los márgenes.” El porcentaje depende del total utilizado como base.
“Dos porcentajes distintos de una celda se contradicen.” Pueden utilizar denominadores diferentes y responder preguntas distintas.
“Transponer la tabla cambia los datos.” Solo intercambia filas y columnas.
“Independencia significa frecuencias iguales.” Significa perfiles condicionados semejantes, aun con grupos de tamaños diferentes.
“Perfiles distintos demuestran significación.” Describen una diferencia; la inferencia formal corresponde al M14.
“Una asociación descriptiva demuestra causalidad.” La tabla no identifica por sí sola un mecanismo causal.
“Categorizar conserva toda la información.” Agrupar un índice continuo reduce detalle y depende de los puntos de corte.
“La punto-biserial se utiliza entre dos variables multicategóricas.” Requiere una variable binaria y una cuantitativa.
“El signo de la punto-biserial tiene sentido sin revisar la codificación.” El signo depende de qué grupo se codifica como 1.
“Las barras al 100 % muestran los tamaños de los grupos.” Muestran proporciones; los tamaños deben informarse por separado.
Ejemplo aplicado: una misma tabla puede responder preguntas diferentes Ver ejemplo Ocultar ejemplo ↓

Supongamos una muestra de \(N = 240\) personas ocupadas clasificadas según empleo y seguridad:

Tabla de frecuencias absolutas observadas
Empleo (Fila \(X\)) Seguridad Baja Seguridad Media Seguridad Alta Total Fila (\(n_{i+}\))
Inestable 32 34 14 80
Estable 16 62 82 160
Total Columna (\(n_{+j}\)) 48 96 96 240

Lectura A. Porcentajes por fila (Riesgo / Perfil de cada empleo)

  • Dentro de inestable: \(\frac{32}{80} \times 100\% = 40,0\%\) Baja, \(\frac{34}{80} \times 100\% = 42,5\%\) Media, \(\frac{14}{80} \times 100\% = 17,5\%\) Alta.
  • Dentro de estable: \(\frac{16}{160} \times 100\% = 10,0\%\) Baja, \(\frac{62}{160} \times 100\% = 38,8\%\) Media, \(\frac{82}{160} \times 100\% = 51,2\%\) Alta.

Conclusión: El empleo inestable concentra una proporción mucho mayor de seguridad económica baja (\(40\%\)) respecto del empleo estable (\(10\%\)).

Lectura B. Porcentajes por columna (Composición de cada nivel de seguridad)

  • De quienes tienen seguridad baja: \(\frac{32}{48} \times 100\% = 66,7\%\) tienen empleo inestable, \(\frac{16}{48} \times 100\% = 33,3\%\) tienen empleo estable.

Conclusión: Dos de cada tres personas con seguridad baja pertenecen al grupo de empleo inestable.

Lectura C. Porcentaje del total

  • Combinación Inestable y Seguridad Baja: \(\frac{32}{240} \times 100\% = 13,3\%\) de toda la muestra.
Fórmulas mínimas y complementarias

Fórmulas de Variables Categóricas y Tablas de Contingencia

Frecuencia marginal por fila

\[ n_{i+} = \sum_j n_{ij} \]

Suma todas las celdas de la fila y representa el tamaño del grupo ubicado en ella.

Frecuencia marginal por columna

\[ n_{+j} = \sum_i n_{ij} \]

Suma todas las celdas de la columna y representa el tamaño del grupo ubicado en ella.

Total general

\[ N = \sum_i\sum_j n_{ij} \]

Corresponde al total de personas de la tabla.

Porcentaje por fila

\[ p_{j\mid i} = \frac{n_{ij}}{n_{i+}} \times 100 \]

Cada fila suma 100 %. Describe la distribución de \(Y\) condicionada a la categoría \(i\) de \(X\).

Porcentaje por columna

\[ p_{i\mid j} = \frac{n_{ij}}{n_{+j}} \times 100 \]

Cada columna suma 100 %. Describe la distribución de \(X\) condicionada a la categoría \(j\) de \(Y\).

Porcentaje del total

\[ p_{ij} = \frac{n_{ij}}{N} \times 100 \]

La suma de todas las celdas es 100 %. Describe la probabilidad o proporción conjunta.

Correlación punto-biserial

\[ r_{pb} = \frac{\bar Y_1-\bar Y_0}{s_Y} \sqrt{pq} \]

donde: - \(\bar Y_1\): media del grupo codificado como 1; - \(\bar Y_0\): media del grupo codificado como 0; - \(s_Y\): desviación estándar de la variable cuantitativa; - \(p\): proporción del grupo 1; - \(q\): proporción del grupo 0.

Equivale a:

\[ r_{pb} = \operatorname{cor}(X_{0/1},Y) \]

Categorización

Categorizar una variable cuantitativa reduce el número de valores posibles, agrupa personas distintas y puede ocultar variación interna. No se incluyen todavía frecuencias esperadas, chi-cuadrado, Phi ni V de Cramer.

Código en R y Python
  • R
  • Python
set.seed(2026)

n <- 240

empleo <- sample(
  c("Estable", "Inestable"),
  size = n,
  replace = TRUE,
  prob = c(2 / 3, 1 / 3)
)

# Índice continuo de seguridad económica
seguridad_indice <- ifelse(
  empleo == "Estable",
  rnorm(n, mean = 3.5, sd = 0.75),
  rnorm(n, mean = 2.8, sd = 0.80)
)

seguridad_indice <- pmin(5, pmax(1, seguridad_indice))

# Categorizar con fines pedagógicos
seguridad_categoria <- cut(
  seguridad_indice,
  breaks = c(-Inf, 2.5, 3.5, Inf),
  labels = c("Baja", "Media", "Alta"),
  ordered_result = TRUE
)

datos <- data.frame(empleo, seguridad_indice, seguridad_categoria)

# Declarar factores
datos$empleo <- factor(datos$empleo, levels = c("Inestable", "Estable"))
datos$seguridad_categoria <- factor(datos$seguridad_categoria, levels = c("Baja", "Media", "Alta"), ordered = TRUE)

### Revisar niveles
levels(datos$empleo)
levels(datos$seguridad_categoria)

### Construir la tabla
tabla <- table(
  Empleo = datos$empleo,
  Seguridad = datos$seguridad_categoria
)

tabla
addmargins(tabla)

### Porcentajes por fila
por_fila <- prop.table(tabla, margin = 1) * 100
round(por_fila, 1)
rowSums(por_fila)

### Porcentajes por columna
por_columna <- prop.table(tabla, margin = 2) * 100
round(por_columna, 1)
colSums(por_columna)

### Porcentajes del total
por_total <- prop.table(tabla) * 100
round(por_total, 1)
sum(por_total)

### Transponer la tabla
t(tabla)

### Barras apiladas al 100 %
matriz_perfiles <- prop.table(tabla, margin = 1)

barplot(
  t(matriz_perfiles),
  beside = FALSE,
  horiz = FALSE,
  ylim = c(0, 1),
  ylab = "Proporción dentro del empleo",
  xlab = "Estabilidad laboral",
  main = "Perfiles de seguridad económica",
  legend.text = colnames(matriz_perfiles),
  args.legend = list(x = "topright", bty = "n")
)

### Preparar una tabla de reporte
tabla_reporte <- matrix(
  "",
  nrow = nrow(tabla),
  ncol = ncol(tabla),
  dimnames = dimnames(tabla)
)

for (i in seq_len(nrow(tabla))) {
  for (j in seq_len(ncol(tabla))) {
    tabla_reporte[i, j] <- sprintf(
      "%d (%.1f %%)",
      tabla[i, j],
      por_fila[i, j]
    )
  }
}
tabla_reporte

### Correlación punto-biserial
datos$empleo_01 <- ifelse(datos$empleo == "Estable", 1, 0)
r_pb <- cor(datos$empleo_01, datos$seguridad_indice, use = "complete.obs")
r_pb

### Comparar medias
aggregate(seguridad_indice ~ empleo, data = datos, FUN = mean)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

rng = np.random.default_rng(2026)

n = 240

empleo = rng.choice(
    ["Estable", "Inestable"],
    size=n,
    replace=True,
    p=[2 / 3, 1 / 3],
)

seguridad_indice = np.where(
    empleo == "Estable",
    rng.normal(3.5, 0.75, n),
    rng.normal(2.8, 0.80, n),
)

seguridad_indice = np.clip(seguridad_indice, 1, 5)

seguridad_categoria = pd.cut(
    seguridad_indice,
    bins=[-np.inf, 2.5, 3.5, np.inf],
    labels=["Baja", "Media", "Alta"],
    ordered=True,
)

datos = pd.DataFrame({
    "empleo": empleo,
    "seguridad_indice": seguridad_indice,
    "seguridad_categoria": seguridad_categoria,
})

datos["empleo"] = pd.Categorical(
    datos["empleo"],
    categories=["Inestable", "Estable"],
    ordered=False,
)

### Revisar categorías
print(datos["empleo"].cat.categories)
print(datos["seguridad_categoria"].cat.categories)

### Construir la tabla
tabla = pd.crosstab(
    datos["empleo"],
    datos["seguridad_categoria"],
    dropna=False,
)
print(tabla)

tabla_margenes = pd.crosstab(
    datos["empleo"],
    datos["seguridad_categoria"],
    margins=True,
    margins_name="Total",
    dropna=False,
)
print(tabla_margenes)

### Porcentajes por fila
por_fila = tabla.div(tabla.sum(axis=1), axis=0) * 100
print(por_fila.round(1))

### Porcentajes por columna
por_columna = tabla.div(tabla.sum(axis=0), axis=1) * 100
print(por_columna.round(1))

### Porcentajes del total
por_total = (tabla / tabla.to_numpy().sum()) * 100
print(por_total.round(1))

### Transponer
print(tabla.T)

### Barras apiladas al 100 %
perfiles = por_fila / 100
ax = perfiles.plot(kind="bar", stacked=True)

ax.set_ylim(0, 1)
ax.set_xlabel("Estabilidad laboral")
ax.set_ylabel("Proporción dentro del empleo")
ax.set_title("Perfiles de seguridad económica")
ax.legend(title="Seguridad")

for contenedor in ax.containers:
    etiquetas = [
        f"{valor * 100:.1f} %" if valor >= 0.08 else ""
        for valor in contenedor.datavalues
    ]
    ax.bar_label(contenedor, labels=etiquetas, label_type="center")

plt.tight_layout()
plt.show()

### Tabla para reporte
tabla_reporte = tabla.astype(str).copy()

for fila in tabla.index:
    for columna in tabla.columns:
        frecuencia = tabla.loc[fila, columna]
        porcentaje = por_fila.loc[fila, columna]
        tabla_reporte.loc[fila, columna] = f"{frecuencia} ({porcentaje:.1f} %)"

print(tabla_reporte)

### Codificación 0/1 y punto-biserial
datos["empleo_01"] = datos["empleo"].map({"Inestable": 0, "Estable": 1}).astype(int)

r_pb = (
    datos[["empleo_01", "seguridad_indice"]]
    .corr()
    .loc["empleo_01", "seguridad_indice"]
)
print("Punto-biserial:", r_pb)

### Comparar medias
medias = datos.groupby("empleo", observed=True)["seguridad_indice"].mean()
print(medias)

# Alternativa con scipy
from scipy.stats import pointbiserialr

resultado = pointbiserialr(datos["empleo_01"], datos["seguridad_indice"])
print(resultado.statistic)
Cómo Reportarlo

Plantillas de Comunicación

  • Técnico: Se construyó una tabla de contingencia de \(2 \times 3\) entre estabilidad laboral y seguridad económica categorizada, reportando frecuencias absolutas y proporciones marginales condicionales por fila (margin = 1, \(N = 240\)).
  • Simple: La proporción de personas con alta seguridad económica es significativamente mayor entre quienes tienen empleos estables en comparación con quienes enfrentan inestabilidad laboral.
  • Sociológico: El análisis descriptivo de la tabla cruzada con porcentajes por fila revela una asimetría estructural: mientras el \(51,2\%\) de quienes poseen un empleo estable reporta alta seguridad económica, esta cifra desciende al \(17,5\%\) en el grupo inestable. Por el contrario, la baja seguridad económica es cuatro veces más frecuente en el segmento inestable (\(40,0\%\)) que en el estable (\(10,0\%\)), evidenciando cómo la precarización laboral condiciona de manera directa el bienestar percibido.
Bibliografía
  • Ritchey, Ferris J. (2008). Estadística para las ciencias sociales. McGraw-Hill. (Cap. 14: Tablas cruzadas y la regla de Zeisel para la lectura bivariada en sociología).
  • Pardo, Antonio; Ruiz, Miguel Ángel; y San Martín, Rafael. (2009). Análisis de datos en ciencias sociales y de la salud I. Síntesis. (Cap. 12: Organización de datos categóricos).
  • Agresti, Alan; Franklin, Christine; y Klingenberg, Bernhard. (2023). Statistics: The art and science of learning from data. Pearson. (Cap. 3: Contingency tables, row vs. column percentages).

Lo esencial

Las variables categóricas se analizan observando cómo se distribuyen los casos entre combinaciones de categorías. La tabla de contingencia organiza frecuencias, márgenes y total general. Los conteos muestran volumen, pero los porcentajes permiten comparar grupos de distinto tamaño. El denominador depende de la pregunta: los porcentajes por fila describen distribuciones dentro de las filas; los porcentajes por columna describen composiciones dentro de las columnas; y los porcentajes del total muestran el peso conjunto de cada celda. Los perfiles permiten pensar la independencia como semejanza entre distribuciones, sin exigir frecuencias idénticas. Categorizar un índice continuo simplifica el análisis y pierde información. La punto-biserial recupera la comparación entre una variable binaria y una cuantitativa. Toda diferencia sigue siendo asociativa y no causal.

El porcentaje correcto es el que responde la pregunta correcta y utiliza como denominador al grupo que queremos describir.

← Módulo anterior M12. Baterías, consistencia e índices Siguiente módulo M14. Chi-cuadrado y magnitud de la asociación →
Ejecutar el código
---
pagetitle: "M13. Variables categóricas y tablas de contingencia | Estadística Correlacional Interactiva"
page-layout: custom
toc: false
body-class: rs-lesson-page inferencia-module m13-page
format:
  html:
    css:
      - ../assets/css/m01-datos-medicion.css
      - ../assets/css/inferencia-modules.css
---

::: {.rs-lesson-page-wrap}

::: {.m01-module-intro}
::: {.inference-module-kicker .m01-module-kicker}
Unidad 2 · Asociación bivariada · Módulo 13
:::

# M13. Variables categóricas y tablas de contingencia {.m01-title}

::: {.m01-module-lead .rs-module-lead}
En los módulos anteriores trabajamos con valores cuantitativos, rangos, correlaciones e índices. Sin embargo, algunas variables sociales informan principalmente la pertenencia a categorías. En esos casos, una nube de puntos no es la representación principal: necesitamos organizar los casos en una tabla de contingencia. Las frecuencias muestran cuántas personas pertenecen a cada combinación, mientras que los márgenes y porcentajes permiten comparar grupos de distinto tamaño. La clave es identificar el denominador adecuado. Ese denominador no depende automáticamente de filas o columnas, sino de la pregunta que queremos responder.
:::
:::

::: {.rs-lesson-section #pregunta-social}
## Pregunta Social

::: {.m01-editorial-block}
### ¿La seguridad económica se distribuye de la misma manera entre personas con empleos estables e inestables? {.m01-social-question-title}

::: {.m01-social-question-intro}
La estabilidad del empleo puede relacionarse con la forma en que las personas evalúan su capacidad para cubrir gastos, enfrentar imprevistos y proyector su futuro económico. Para estudiar descriptivamente esta relación, nuestra **unidad de análisis** será la persona ocupada.

La variable de agrupación será la **estabilidad del empleo**, registrada mediante dos categorías: empleo estable y empleo inestable. Se trata de una variable binaria nominal, porque distingue dos grupos sin establecer una distancia cuantitativa entre ellos.

La variable de respuesta será la **seguridad económica percibida**, resumida en tres categorías ordenadas: baja, media y alta. Esta variable es ordinal: sabemos que “alta” representa una posición superior a “media” y “baja”, pero no podemos suponer que las distancias entre categorías sean iguales.

Cada persona pertenece a una única combinación. Por ejemplo, alguien puede tener empleo inestable y seguridad económica baja. Al contar todas esas combinaciones obtenemos una tabla de contingencia $2\times3$.

Las celdas muestran frecuencias absolutas. Los márgenes muestran los tamaños de los grupos y el total general. Sin embargo, los conteos no bastan para comparar propensiones si los grupos tienen tamaños diferentes. Para eso necesitamos porcentajes condicionados y un denominador explícito.

Las diferencias observadas describen una asociación entre estabilidad laboral y seguridad económica. No demuestran que una variable cause por sí sola a la otra.
:::

::: {.rs-callout-note .rs-callout-note--m01-blue}
Los datos utilizados en las visualizaciones, cálculos y ejemplos son construidos con fines pedagógicos y no representan estimaciones de una población real.
:::

### Las variables del análisis

::: {.m01-table-wrap}
| Variable | Tipo | Categorías | Función en la pregunta |
|---|---|---|---|
| **Estabilidad laboral** | Binaria nominal | Estable / Inestable | Define los grupos que se comparan |
| **Seguridad económica categorizada** | Ordinal | Baja / Media / Alta | Describe el nivel de seguridad dentro de cada grupo |
: Variables analizadas en la contingencia {.m01-table}
:::

La estabilidad laboral puede ubicarse en las filas y la seguridad en las columnas, o viceversa. Intercambiar sus posiciones **no cambia los casos ni las frecuencias sustantivas**: solo modifica la presentación.

Por eso, “por fila” y “por columna” no son reglas universales. La decisión sustantiva consiste en identificar qué grupo debe funcionar como base de la comparación y, por tanto, sumar 100 %.

::: {.rs-callout-warning .rs-callout-warning--m01-amber}
**Categorización y pérdida de información:** Para esta actividad resumimos el índice continuo de seguridad económica en tres niveles. Esto facilita la construcción de una tabla, pero reduce la información disponible y puede ocultar diferencias entre personas situadas dentro de una misma categoría. Dos personas clasificadas con “seguridad media” pueden tener puntuaciones continuas diferentes. Además, los puntos de corte elegidos influyen en las frecuencias de cada categoría. La categorización simplifica la comunicación, pero tiene un costo analítico. Más adelante recuperaremos el índice continuo mediante la correlación punto-biserial.
:::

### Tres preguntas para una misma tabla

::: {.m01-group-comparison-box}
::: {.m01-group-col}
[Pregunta A · Distribución dentro del empleo]{.m01-group-badge .m01-badge-a}

**Entre quienes tienen empleo estable o inestable, ¿cómo se distribuyen los niveles de seguridad económica?**  
La base de comparación es cada tipo de empleo. Si la estabilidad laboral está en las filas, el denominador corresponde al total de cada fila y utilizamos porcentajes por fila. Describe el perfil de seguridad económica dentro de cada grupo laboral.
:::

::: {.m01-group-col}
[Pregunta B · Composición de un nivel de seguridad]{.m01-group-badge .m01-badge-b}

**Entre quienes presentan seguridad económica baja, ¿qué proporción tiene empleo estable o inestable?**  
La base de comparación es cada nivel de seguridad. Si la seguridad está en las columnas, el denominador corresponde al total de cada columna y utilizamos porcentajes por columna. Describe la composición laboral de cada categoría de seguridad.
:::
:::

> **Una misma celda puede producir tres porcentajes correctos porque cada uno responde una pregunta distinta. El porcentaje no se elige por rutina: se elige después de formular la pregunta y reconocer el grupo que debe constituir el denominador.**
:::
:::

::: {.rs-lesson-section #idea-central}
## Idea Central

::: {.m01-sequence-flow .rs-sequence-flow role="list"}

::: {.m01-flow-step .rs-flow-step role="listitem"}
```{=html}
<div class="m01-flow-step-num rs-flow-step-num" aria-hidden="true">1</div>
```
### De los niveles de medición a la técnica

Una variable nominal informa pertenencia a categorías. Una variable ordinal agrega información sobre el orden, pero no garantiza distancias iguales. Los códigos numéricos utilizados para registrar categorías no transforman automáticamente esas variables en cantidades.

Cuando ambas variables son categóricas, sus combinaciones pueden organizarse en una tabla de contingencia. Pearson no debe aplicarse automáticamente a cualquier variable codificada con números.

> Codificar “estable” como 1 e “inestable” como 0 no convierte por sí sola una comparación categórica en una relación cuantitativa general.
:::

::: {.m01-flow-step .rs-flow-step role="listitem"}
```{=html}
<div class="m01-flow-step-num rs-flow-step-num" aria-hidden="true">2</div>
```
### De las frecuencias a los porcentajes condicionados

La frecuencia de una celda funciona como numerador. El margen elegido funciona como denominador.

- El porcentaje por fila describe una distribución dentro de la fila.
- El porcentaje por columna describe una composición dentro de la columna.
- El porcentaje del total describe el peso de la combinación en toda la muestra.

Una cifra como 45,0 % resulta ambigua si no sabemos cuál fue su base de cálculo.

> Un porcentaje siempre debe indicar respecto de qué grupo fue calculado.
:::

::: {.m01-flow-step .rs-flow-step role="listitem"}
```{=html}
<div class="m01-flow-step-num rs-flow-step-num" aria-hidden="true">3</div>
```
### De los porcentajes a los perfiles

Un **perfil** es una distribución porcentual completa. Las barras apiladas al 100 % permiten comparar grupos de distinto tamaño porque cada barra tiene la misma longitud.

Perfiles semejantes sugieren poca dependencia descriptiva. Perfiles diferentes sugieren asociación descriptiva. La independencia no requiere frecuencias absolutas idénticas: grupos de tamaños distintos pueden presentar las mismas proporciones internas.
:::

:::
:::

::: {.rs-lesson-section #recorrido-guiado}
## ¿Cómo pasamos de los casos a los perfiles?

El recorrido guiado utilizará pocos casos para mostrar cómo cada persona se clasifica en una combinación de categorías. A partir de esas combinaciones se construirán las frecuencias, los márgenes y el total general. Luego se compararán porcentajes por fila y por columna para hacer visible el papel del denominador. El cierre transformará los porcentajes en perfiles y presentará la independencia como semejanza descriptiva entre distribuciones.

::: {.column-screen-inset}
```{=html}
<div id="m13-contingency-tour">
  <!-- El contenido es generado por m13-tablas-contingencia.js -->
</div>
```
:::
:::

::: {.rs-lesson-section #laboratorio-interactivo}
## Laboratorio interactivo

::: {.rs-callout-note .rs-callout-note--m01-blue}
**Nota pedagógica:**
Modifica la distribución y el tamaño de los grupos, selecciona la pregunta de análisis y compara frecuencias, porcentajes y perfiles condicionados sin perder de vista el denominador.
:::

::: {.column-screen-inset}
```{=html}
<div id="m13-contingency-lab">
  <!-- El contenido es generado por m13-tablas-contingencia.js -->
</div>
```
:::
:::

::: {.rs-lesson-section #despues-del-laboratorio}
## Después de explorar

Los conteos dependen del tamaño de los grupos. Si aumenta la cantidad de personas con empleo estable, sus frecuencias pueden crecer en varias celdas aunque las proporciones internas permanezcan iguales. Más casos no implican necesariamente una mayor propensión relativa.

La pregunta determina el denominador. Los porcentajes por fila y por columna pueden ser correctos simultáneamente porque describen bases distintas. Transponer la tabla tampoco cambia los datos: solo intercambia su orientación y obliga a revisar dónde se encuentra el margen pertinente.

Los perfiles semejantes sugieren independencia descriptiva y los perfiles diferentes sugieren asociación descriptiva. Las barras al 100 % facilitan esa comparación, pero no muestran el tamaño real de los grupos, por lo que deben leerse junto con sus márgenes.

Finalmente, categorizar el índice continuo simplifica el análisis, pero pierde información. Las diferencias observadas describen una asociación y no demuestran causalidad.
:::

```{=html}
<script src="../assets/js/m13-tablas-contingencia.js" defer></script>
```


::: {.rs-lesson-section #interpretacion}
## Cómo leer una tabla de contingencia

### 1. Revisa los encabezados

Identifica la variable de las filas, la de las columnas, sus categorías y el orden en las ordinales.

### 2. Observa las frecuencias y márgenes

Identifica cuántas personas hay en cada combinación, si existen celdas con pocos casos y el total general. Los márgenes actúan como denominadores según la pregunta. Las frecuencias describen volumen, no propensión.

### 3. Compara perfiles completos

No interpretes una celda de forma aislada. Observa cómo se distribuyen todas las categorías dentro del grupo.

### 4. Mantén separadas la descripción y la inferencia

Las diferencias visibles son descriptivas. El contraste formal de independencia se desarrollará en el M14.

### ¿Casos completos o casos disponibles?

::: {.m01-table-wrap}
| Aspecto | Porcentaje por fila | Porcentaje por columna | Porcentaje del total |
|---|---|---|---|
| **Base o grupo** | Tipo de empleo (Fila $X$) | Nivel de seguridad (Columna $Y$) | Muestra completa ($N$) |
| **Denominador** | Total de la fila correspondiente | Total de la columna correspondiente | Total general |
| **Lectura principal** | Perfil de seguridad de cada grupo | Composición laboral de la categoría | Peso de la combinación en toda la muestra |
: Comparativa de tipos de porcentajes {.m01-table}
:::

> **“Por fila” y “por columna” son instrucciones operativas. La decisión sustantiva es identificar el grupo que debe sumar 100 % (el denominador).**

### Pensar la independencia mediante perfiles

Bajo independencia, la distribución de seguridad económica sería semejante entre quienes tienen empleo estable e inestables. Esto no significa que todas las frecuencias deban ser iguales. Si un grupo contiene más personas, sus conteos pueden ser mayores incluso cuando los perfiles porcentuales coinciden. La semejanza se observa mediante distribuciones condicionadas.

::: {.callout-warning}
**Advertencia metodológica:** “Compatible con independencia” es una lectura descriptiva de perfiles semejantes, no una conclusión inferencial.
:::

### Puente: una variable binaria y una cuantitativa

El mismo problema puede analizarse sin categorizar el índice de seguridad económica. En ese caso, mantenemos estabilidad laboral como variable binaria y seguridad como cuantitativa.

La correlación punto-biserial ($r_{pb}$) equivale a Pearson entre una variable codificada 0/1 (inestable/estable) y la cuantitativa.

Si la media de seguridad es mayor en empleo estable ($\bar Y_1 > \bar Y_0$), entonces $r_{pb} > 0$. Si invertimos la codificación (estable=0, inestable=1), el signo de la correlación se invierte, pero su magnitud se conserva.

La tabla de contingencia y la correlación punto-biserial responden versiones relacionadas, pero distintas: la tabla compara perfiles categóricos, mientras que la punto-biserial resume la separación lineal entre las medias del índice continuo, conservando más información al evitar la categorización.

### Evita estas interpretaciones

::: {.m01-table-wrap}
| Interpretación problemática | Corrección |
|---|---|
| “Los códigos numéricos convierten una categoría en cantidad.” | Los códigos identifican categorías y no garantizan distancias cuantitativas. |
| “Una variable ordinal es automáticamente continua.” | Informa orden, pero no necesariamente intervalos iguales. |
| “La tabla depende de qué variable está arriba.” | La orientación cambia la presentación, no los casos ni las frecuencias sustantivas. |
| “Los porcentajes siempre deben calcularse por fila.” | La dirección correcta depende de la pregunta y del denominador. |
| “Los porcentajes por columna son incorrectos.” | Son adecuados cuando la pregunta describe la composición de las columnas. |
| “El total general sirve para cualquier pregunta.” | Solo corresponde cuando queremos describir el peso de una combinación en toda la muestra. |
| “Una frecuencia mayor implica mayor propensión.” | Puede reflejar únicamente un grupo más numeroso. |
| “El grupo más numeroso presenta necesariamente más asociación.” | El tamaño del grupo y la diferencia entre perfiles son dimensiones distintas. |
| “Una celda puede interpretarse sin revisar los márgenes.” | El porcentaje depende del total utilizado como base. |
| “Dos porcentajes distintos de una celda se contradicen.” | Pueden utilizar denominadores diferentes y responder preguntas distintas. |
| “Transponer la tabla cambia los datos.” | Solo intercambia filas y columnas. |
| “Independencia significa frecuencias iguales.” | Significa perfiles condicionados semejantes, aun con grupos de tamaños diferentes. |
| “Perfiles distintos demuestran significación.” | Describen una diferencia; la inferencia formal corresponde al M14. |
| “Una asociación descriptiva demuestra causalidad.” | La tabla no identifica por sí sola un mecanismo causal. |
| “Categorizar conserva toda la información.” | Agrupar un índice continuo reduce detalle y depende de los puntos de corte. |
| “La punto-biserial se utiliza entre dos variables multicategóricas.” | Requiere una variable binaria y una cuantitativa. |
| “El signo de la punto-biserial tiene sentido sin revisar la codificación.” | El signo depende de qué grupo se codifica como 1. |
| “Las barras al 100 % muestran los tamaños de los grupos.” | Muestran proporciones; los tamaños deben informarse por separado. |
: Interpretaciones problemáticas en análisis categórico {.m01-table}
:::
:::

::: {.rs-lesson-section .rs-example-section #ejemplo-aplicado}
<details class="rs-example-disclosure">
<summary class="rs-example-disclosure__summary">
<span class="rs-example-disclosure__heading" role="heading" aria-level="2">Ejemplo aplicado: una misma tabla puede responder preguntas diferentes</span>
<span class="rs-example-disclosure__action">
  <span class="rs-example-disclosure__show">Ver ejemplo</span>
  <span class="rs-example-disclosure__hide">Ocultar ejemplo</span>
  <span class="rs-example-disclosure__chevron" aria-hidden="true">↓</span>
</span>
</summary>

::: {.rs-example-disclosure__content}

Supongamos una muestra de $N = 240$ personas ocupadas clasificadas según empleo y seguridad:

::: {.m01-table-wrap}
| Empleo (Fila $X$) | Seguridad Baja | Seguridad Media | Seguridad Alta | Total Fila ($n_{i+}$) |
|---|---|---|---|---|
| **Inestable** | 32 | 34 | 14 | **80** |
| **Estable** | 16 | 62 | 82 | **160** |
| **Total Columna ($n_{+j}$)** | **48** | **96** | **96** | **240** |
: Tabla de frecuencias absolutas observadas {.m01-table}
:::

### Lectura A. Porcentajes por fila (Riesgo / Perfil de cada empleo)

- **Dentro de inestable:** $\frac{32}{80} \times 100\% = 40,0\%$ Baja, $\frac{34}{80} \times 100\% = 42,5\%$ Media, $\frac{14}{80} \times 100\% = 17,5\%$ Alta.
- **Dentro de estable:** $\frac{16}{160} \times 100\% = 10,0\%$ Baja, $\frac{62}{160} \times 100\% = 38,8\%$ Media, $\frac{82}{160} \times 100\% = 51,2\%$ Alta.

*Conclusión:* El empleo inestable concentra una proporción mucho mayor de seguridad económica baja ($40\%$) respecto del empleo estable ($10\%$).

### Lectura B. Porcentajes por columna (Composición de cada nivel de seguridad)

- **De quienes tienen seguridad baja:** $\frac{32}{48} \times 100\% = 66,7\%$ tienen empleo inestable, $\frac{16}{48} \times 100\% = 33,3\%$ tienen empleo estable.

*Conclusión:* Dos de cada tres personas con seguridad baja pertenecen al grupo de empleo inestable.

### Lectura C. Porcentaje del total

- **Combinación Inestable y Seguridad Baja:** $\frac{32}{240} \times 100\% = 13,3\%$ de toda la muestra.

:::
</details>
:::

::: {.inference-endmatter}

<details class="inference-endmatter__item inference-endmatter__formulas">
<summary><span>Fórmulas mínimas y complementarias</span></summary>

::: {.inference-endmatter__content}

::: {.m01-formula-card}
#### Fórmulas de Variables Categóricas y Tablas de Contingencia

##### Frecuencia marginal por fila

$$
n_{i+} = \sum_j n_{ij}
$$

Suma todas las celdas de la fila y representa el tamaño del grupo ubicado en ella.

##### Frecuencia marginal por columna

$$
n_{+j} = \sum_i n_{ij}
$$

Suma todas las celdas de la columna y representa el tamaño del grupo ubicado en ella.

##### Total general

$$
N = \sum_i\sum_j n_{ij}
$$

Corresponde al total de personas de la tabla.

##### Porcentaje por fila

$$
p_{j\mid i} = \frac{n_{ij}}{n_{i+}} \times 100
$$

Cada fila suma 100 %. Describe la distribución de $Y$ condicionada a la categoría $i$ de $X$.

##### Porcentaje por columna

$$
p_{i\mid j} = \frac{n_{ij}}{n_{+j}} \times 100
$$

Cada columna suma 100 %. Describe la distribución de $X$ condicionada a la categoría $j$ de $Y$.

##### Porcentaje del total

$$
p_{ij} = \frac{n_{ij}}{N} \times 100
$$

La suma de todas las celdas es 100 %. Describe la probabilidad o proporción conjunta.

##### Correlación punto-biserial

$$
r_{pb} = \frac{\bar Y_1-\bar Y_0}{s_Y} \sqrt{pq}
$$

donde:
- $\bar Y_1$: media del grupo codificado como 1;
- $\bar Y_0$: media del grupo codificado como 0;
- $s_Y$: desviación estándar de la variable cuantitativa;
- $p$: proporción del grupo 1;
- $q$: proporción del grupo 0.

Equivale a:

$$
r_{pb} = \operatorname{cor}(X_{0/1},Y)
$$

##### Categorización

Categorizar una variable cuantitativa reduce el número de valores posibles, agrupa personas distintas y puede ocultar variación interna. No se incluyen todavía frecuencias esperadas, chi-cuadrado, Phi ni V de Cramer.
:::

:::
</details>

<details class="inference-endmatter__item inference-endmatter__code">
<summary><span>Código en R y Python</span></summary>

::: {.inference-endmatter__content}

::: {.panel-tabset .rs-code-tabs}

### R {.unnumbered .unlisted}

```r
set.seed(2026)

n <- 240

empleo <- sample(
  c("Estable", "Inestable"),
  size = n,
  replace = TRUE,
  prob = c(2 / 3, 1 / 3)
)

# Índice continuo de seguridad económica
seguridad_indice <- ifelse(
  empleo == "Estable",
  rnorm(n, mean = 3.5, sd = 0.75),
  rnorm(n, mean = 2.8, sd = 0.80)
)

seguridad_indice <- pmin(5, pmax(1, seguridad_indice))

# Categorizar con fines pedagógicos
seguridad_categoria <- cut(
  seguridad_indice,
  breaks = c(-Inf, 2.5, 3.5, Inf),
  labels = c("Baja", "Media", "Alta"),
  ordered_result = TRUE
)

datos <- data.frame(empleo, seguridad_indice, seguridad_categoria)

# Declarar factores
datos$empleo <- factor(datos$empleo, levels = c("Inestable", "Estable"))
datos$seguridad_categoria <- factor(datos$seguridad_categoria, levels = c("Baja", "Media", "Alta"), ordered = TRUE)

### Revisar niveles
levels(datos$empleo)
levels(datos$seguridad_categoria)

### Construir la tabla
tabla <- table(
  Empleo = datos$empleo,
  Seguridad = datos$seguridad_categoria
)

tabla
addmargins(tabla)

### Porcentajes por fila
por_fila <- prop.table(tabla, margin = 1) * 100
round(por_fila, 1)
rowSums(por_fila)

### Porcentajes por columna
por_columna <- prop.table(tabla, margin = 2) * 100
round(por_columna, 1)
colSums(por_columna)

### Porcentajes del total
por_total <- prop.table(tabla) * 100
round(por_total, 1)
sum(por_total)

### Transponer la tabla
t(tabla)

### Barras apiladas al 100 %
matriz_perfiles <- prop.table(tabla, margin = 1)

barplot(
  t(matriz_perfiles),
  beside = FALSE,
  horiz = FALSE,
  ylim = c(0, 1),
  ylab = "Proporción dentro del empleo",
  xlab = "Estabilidad laboral",
  main = "Perfiles de seguridad económica",
  legend.text = colnames(matriz_perfiles),
  args.legend = list(x = "topright", bty = "n")
)

### Preparar una tabla de reporte
tabla_reporte <- matrix(
  "",
  nrow = nrow(tabla),
  ncol = ncol(tabla),
  dimnames = dimnames(tabla)
)

for (i in seq_len(nrow(tabla))) {
  for (j in seq_len(ncol(tabla))) {
    tabla_reporte[i, j] <- sprintf(
      "%d (%.1f %%)",
      tabla[i, j],
      por_fila[i, j]
    )
  }
}
tabla_reporte

### Correlación punto-biserial
datos$empleo_01 <- ifelse(datos$empleo == "Estable", 1, 0)
r_pb <- cor(datos$empleo_01, datos$seguridad_indice, use = "complete.obs")
r_pb

### Comparar medias
aggregate(seguridad_indice ~ empleo, data = datos, FUN = mean)
```

### Python {.unnumbered .unlisted}

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

rng = np.random.default_rng(2026)

n = 240

empleo = rng.choice(
    ["Estable", "Inestable"],
    size=n,
    replace=True,
    p=[2 / 3, 1 / 3],
)

seguridad_indice = np.where(
    empleo == "Estable",
    rng.normal(3.5, 0.75, n),
    rng.normal(2.8, 0.80, n),
)

seguridad_indice = np.clip(seguridad_indice, 1, 5)

seguridad_categoria = pd.cut(
    seguridad_indice,
    bins=[-np.inf, 2.5, 3.5, np.inf],
    labels=["Baja", "Media", "Alta"],
    ordered=True,
)

datos = pd.DataFrame({
    "empleo": empleo,
    "seguridad_indice": seguridad_indice,
    "seguridad_categoria": seguridad_categoria,
})

datos["empleo"] = pd.Categorical(
    datos["empleo"],
    categories=["Inestable", "Estable"],
    ordered=False,
)

### Revisar categorías
print(datos["empleo"].cat.categories)
print(datos["seguridad_categoria"].cat.categories)

### Construir la tabla
tabla = pd.crosstab(
    datos["empleo"],
    datos["seguridad_categoria"],
    dropna=False,
)
print(tabla)

tabla_margenes = pd.crosstab(
    datos["empleo"],
    datos["seguridad_categoria"],
    margins=True,
    margins_name="Total",
    dropna=False,
)
print(tabla_margenes)

### Porcentajes por fila
por_fila = tabla.div(tabla.sum(axis=1), axis=0) * 100
print(por_fila.round(1))

### Porcentajes por columna
por_columna = tabla.div(tabla.sum(axis=0), axis=1) * 100
print(por_columna.round(1))

### Porcentajes del total
por_total = (tabla / tabla.to_numpy().sum()) * 100
print(por_total.round(1))

### Transponer
print(tabla.T)

### Barras apiladas al 100 %
perfiles = por_fila / 100
ax = perfiles.plot(kind="bar", stacked=True)

ax.set_ylim(0, 1)
ax.set_xlabel("Estabilidad laboral")
ax.set_ylabel("Proporción dentro del empleo")
ax.set_title("Perfiles de seguridad económica")
ax.legend(title="Seguridad")

for contenedor in ax.containers:
    etiquetas = [
        f"{valor * 100:.1f} %" if valor >= 0.08 else ""
        for valor in contenedor.datavalues
    ]
    ax.bar_label(contenedor, labels=etiquetas, label_type="center")

plt.tight_layout()
plt.show()

### Tabla para reporte
tabla_reporte = tabla.astype(str).copy()

for fila in tabla.index:
    for columna in tabla.columns:
        frecuencia = tabla.loc[fila, columna]
        porcentaje = por_fila.loc[fila, columna]
        tabla_reporte.loc[fila, columna] = f"{frecuencia} ({porcentaje:.1f} %)"

print(tabla_reporte)

### Codificación 0/1 y punto-biserial
datos["empleo_01"] = datos["empleo"].map({"Inestable": 0, "Estable": 1}).astype(int)

r_pb = (
    datos[["empleo_01", "seguridad_indice"]]
    .corr()
    .loc["empleo_01", "seguridad_indice"]
)
print("Punto-biserial:", r_pb)

### Comparar medias
medias = datos.groupby("empleo", observed=True)["seguridad_indice"].mean()
print(medias)

# Alternativa con scipy
from scipy.stats import pointbiserialr

resultado = pointbiserialr(datos["empleo_01"], datos["seguridad_indice"])
print(resultado.statistic)
```

:::

:::
</details>

<details class="inference-endmatter__item inference-endmatter__report">
<summary><span>Cómo Reportarlo</span></summary>

::: {.inference-endmatter__content}

#### Plantillas de Comunicación

- **Técnico:** *Se construyó una tabla de contingencia de $2 \times 3$ entre estabilidad laboral y seguridad económica categorizada, reportando frecuencias absolutas y proporciones marginales condicionales por fila (`margin = 1`, $N = 240$).*
- **Simple:** *La proporción de personas con alta seguridad económica es significativamente mayor entre quienes tienen empleos estables en comparación con quienes enfrentan inestabilidad laboral.*
- **Sociológico:** *El análisis descriptivo de la tabla cruzada con porcentajes por fila revela una asimetría estructural: mientras el $51,2\%$ de quienes poseen un empleo estable reporta alta seguridad económica, esta cifra desciende al $17,5\%$ en el grupo inestable. Por el contrario, la baja seguridad económica es cuatro veces más frecuente en el segmento inestable ($40,0\%$) que en el estable ($10,0\%$), evidenciando cómo la precarización laboral condiciona de manera directa el bienestar percibido.*

:::
</details>

<details class="inference-endmatter__item inference-endmatter__references">
<summary><span>Bibliografía</span></summary>

::: {.inference-endmatter__content}

- **Ritchey, Ferris J. (2008).** *Estadística para las ciencias sociales*. McGraw-Hill. (Cap. 14: Tablas cruzadas y la regla de Zeisel para la lectura bivariada en sociología).
- **Pardo, Antonio; Ruiz, Miguel Ángel; y San Martín, Rafael. (2009).** *Análisis de datos en ciencias sociales y de la salud I*. Síntesis. (Cap. 12: Organización de datos categóricos).
- **Agresti, Alan; Franklin, Christine; y Klingenberg, Bernhard. (2023).** *Statistics: The art and science of learning from data*. Pearson. (Cap. 3: Contingency tables, row vs. column percentages).

:::
</details>

:::

::: {.rs-lesson-section #lo-esencial}
## Lo esencial

Las variables categóricas se analizan observando cómo se distribuyen los casos entre combinaciones de categorías. La tabla de contingencia organiza frecuencias, márgenes y total general. Los conteos muestran volumen, pero los porcentajes permiten comparar grupos de distinto tamaño. El denominador depende de la pregunta: los porcentajes por fila describen distribuciones dentro de las filas; los porcentajes por columna describen composiciones dentro de las columnas; y los porcentajes del total muestran el peso conjunto de cada celda. Los perfiles permiten pensar la independencia como semejanza entre distribuciones, sin exigir frecuencias idénticas. Categorizar un índice continuo simplifica el análisis y pierde información. La punto-biserial recupera la comparación entre una variable binaria y una cuantitativa. Toda diferencia sigue siendo asociativa y no causal.

> **El porcentaje correcto es el que responde la pregunta correcta y utiliza como denominador al grupo que queremos describir.**
:::

```{=html}
<nav class="rs-lesson-footer-nav rs-inference-footer-nav" aria-label="Navegación entre módulos">
  <a href="m12_baterias_consistencia_indices.qmd" class="rs-nav-link rs-nav-link--previous">
    <span class="rs-nav-link__arrow" aria-hidden="true">←</span>
    <span class="rs-nav-link__copy">
      <span class="rs-nav-link__label">Módulo anterior</span>
      <span class="rs-nav-link__title">M12. Baterías, consistencia e índices</span>
    </span>
  </a>

  <a href="m14_chi_cuadrado_magnitud_asociacion.qmd" class="rs-nav-link rs-nav-link--next">
    <span class="rs-nav-link__copy">
      <span class="rs-nav-link__label">Siguiente módulo</span>
      <span class="rs-nav-link__title">M14. Chi-cuadrado y magnitud de la asociación</span>
    </span>
    <span class="rs-nav-link__arrow" aria-hidden="true">→</span>
  </a>
</nav>
```

:::

Estadística Correlacional Interactiva
Facultad de Ciencias Sociales
Departamento de Sociología
Universidad de Chile

Volver arriba

Sitio creado por Katherine Aravena .

Código bajo licencia MIT · Ver repositorio en GitHub