0Pricing
Pandas & NumPy Academy · Lección

crosstab para tablas de frecuencias

Calcule una tabla de contingencia de frecuencias o proporciones de dos columnas categóricas con pd.crosstab.

crosstab para tablas de frecuencias es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué es una tabla de contingencia?

Una tabla de contingencia (crosstab) cuenta cuántas veces aparece en un conjunto de datos cada combinación de valores de dos o más variables categóricas. Es un caso especial de tabla dinámica diseñado específicamente para realizar recuentos. Pandas proporciona pd.crosstab() como una forma concisa de calcular estas tablas de frecuencias sin necesidad de llamar explícitamente a groupby() o pivot_table().

Llamada básica a crosstab()

La llamada mínima pd.crosstab(index, columns) recibe dos entradas similares a arrays (normalmente, columnas de un DataFrame) y devuelve una tabla de frecuencias. Las filas corresponden a los valores únicos del primer argumento y las columnas, a los valores únicos del segundo. Cada celda contiene el recuento de filas en las que ambos valores aparecen juntos en los datos originales.

import pandas as pd

df = pd.DataFrame({
    'gender':  ['M', 'F', 'M', 'F', 'M', 'F', 'M'],
    'product': ['A', 'A', 'B', 'B', 'A', 'B', 'B']
})

ct = pd.crosstab(df['gender'], df['product'])
print(ct)
# product  A  B
# gender
# F        1  2
# M        2  2

Personalizar los nombres de filas y columnas

Use los parámetros rownames y colnames para asignar nombres significativos a los ejes de filas y columnas de la salida, sustituyendo los nombres predeterminados de las Series. Esto resulta útil cuando los nombres originales de las columnas del DataFrame no son suficientemente claros en el contexto de la tabla que se está generando.

ct = pd.crosstab(
    df['gender'], df['product'],
    rownames=['Customer Gender'],
    colnames=['Purchased Product']
)
print(ct)
# Purchased Product  A  B
# Customer Gender
# F                  1  2
# M                  2  2

Añadir márgenes (totales de filas y columnas)

Pase margins=True para incluir una fila y una columna con los totales de todos los valores. La etiqueta del margen es 'All' de forma predeterminada, pero puede personalizarla con margins_name. La fila de márgenes muestra el recuento total por columna, la columna de márgenes muestra el recuento total por fila y la celda inferior derecha muestra el total general.

ct = pd.crosstab(df['gender'], df['product'],
                 margins=True, margins_name='Total')
print(ct)
# product  A  B  Total
# gender
# F        1  2      3
# M        2  2      4
# Total    3  4      7

Normalizar a proporciones

Pase el parámetro normalize para convertir los recuentos en proporciones. normalize=True o normalize='all' divide entre el total general. normalize='index' calcula las proporciones por fila (cada fila suma 1.0). normalize='columns' calcula las proporciones por columna (cada columna suma 1.0). Las proporciones son más informativas que los recuentos sin procesar cuando el tamaño de los grupos varía.

# Row proportions: what fraction of each gender bought each product?
print(pd.crosstab(df['gender'], df['product'], normalize='index').round(2))
# product     A     B
# gender
# F        0.33  0.67
# M        0.50  0.50

# All proportions: each cell as fraction of grand total
print(pd.crosstab(df['gender'], df['product'], normalize=True).round(2))

Agregar valores en lugar de contarlos

De forma predeterminada, crosstab cuenta filas. También puede agregar una columna numérica pasando los parámetros values y aggfunc, de forma similar a pivot_table(). Por ejemplo, puede calcular los ingresos totales para cada combinación de género y producto. Esto hace que crosstab sea prácticamente equivalente a pivot_table, aunque con una sintaxis algo más concisa para el caso de uso de las tablas de frecuencias.

df['revenue'] = [100, 80, 150, 120, 200, 90, 130]

# Sum revenue by gender and product instead of counting
ct_rev = pd.crosstab(
    df['gender'], df['product'],
    values=df['revenue'],
    aggfunc='sum'
)
print(ct_rev)
# product    A    B
# gender
# F         80  210
# M        300  280

Tabla de contingencia multinivel

Pase una lista a index o columns para crear una tabla de contingencia con varios niveles en las filas o las columnas. El resultado tiene un MultiIndex, lo que proporciona un desglose más detallado. Por ejemplo, cruzar género y región en las filas con producto en las columnas muestra cada combinación de género, región y producto.

df['region'] = ['East', 'West', 'East', 'West', 'East', 'East', 'West']

ct_multi = pd.crosstab(
    [df['gender'], df['region']],
    df['product'],
    margins=True
)
print(ct_multi)
# product         A  B  All
# gender region
# F      East     0  1    1
#        West     1  1    2
# M      East     2  1    3
#        West     0  1    1
# All            3  4    7

crosstab() frente a pivot_table()

pd.crosstab() y pd.pivot_table() se solapan considerablemente. crosstab está optimizado para contar frecuencias y recibe directamente entradas similares a arrays (no un DataFrame), por lo que resulta algo más conciso para crear tablas rápidas. pivot_table opera sobre un DataFrame y admite de forma nativa cualquier función de agregación. Para tareas de recuento puro, crosstab es la opción idiomática; para agregar valores numéricos, prefiera pivot_table.

# crosstab (more concise for counting)
print(pd.crosstab(df['gender'], df['product']))

# Equivalent pivot_table
print(pd.pivot_table(df, index='gender', columns='product',
                     aggfunc='size', fill_value=0))
# Both produce the same result

Preparación para la prueba de chi-cuadrado

Una tabla de contingencia es la entrada estándar para una prueba de independencia de chi-cuadrado, que determina si dos variables categóricas están relacionadas estadísticamente. La función scipy.stats.chi2_contingency() acepta directamente un array de tabla de contingencia. Este es uno de los usos más habituales de crosstab en el análisis estadístico de datos: se calcula la tabla y después se prueba en un mismo flujo de trabajo.

from scipy import stats

ct = pd.crosstab(df['gender'], df['product'])
# Convert to numpy array for scipy
chi2, p, dof, expected = stats.chi2_contingency(ct.values)
print(f'Chi2: {chi2:.2f}')
print(f'P-value: {p:.4f}')
print(f'Degrees of freedom: {dof}')
# p > 0.05 means no significant association

Visualizar una tabla de contingencia como mapa de calor

Las tablas de contingencia con muchas categorías son difíciles de interpretar como números sin procesar. Visualizarlas como un mapa de calor con sns.heatmap() hace que los patrones sean visibles de inmediato: las celdas con mayor frecuencia aparecen con colores más intensos. Pase la versión normalizada para mostrar proporciones en lugar de recuentos sin procesar y use annot=True para mostrar los valores en cada celda.

import seaborn as sns
import matplotlib.pyplot as plt

ct_norm = pd.crosstab(df['gender'], df['product'], normalize='index')

# sns.heatmap(ct_norm, annot=True, fmt='.0%', cmap='Blues')
# plt.title('Purchase Rate by Gender and Product')
# plt.tight_layout()
# plt.show()
print('Normalised crosstab ready for heatmap:')
print(ct_norm.round(2))

Ejemplo práctico: análisis de encuestas

Un flujo de trabajo completo con crosstab consiste en cargar los datos de la encuesta, calcular tablas de frecuencias entre variables demográficas y de respuesta, normalizarlas por filas para obtener tasas de respuesta e identificar patrones marcados. Esta es la canalización de análisis estándar en estudios de mercado, pruebas A/B y segmentación de usuarios, y puede completarse en menos de 10 líneas de código de Pandas.

# Simulate a survey dataset
survey = pd.DataFrame({
    'age_group': ['18-25', '26-35', '18-25', '36-45', '26-35', '36-45'],
    'satisfaction': ['High', 'Low', 'High', 'Medium', 'High', 'Low']
})

ct = pd.crosstab(survey['age_group'], survey['satisfaction'],
                 margins=True, margins_name='Total')
print(ct)

rates = pd.crosstab(survey['age_group'], survey['satisfaction'],
                    normalize='index').round(2)
print(rates)

Comprobación rápida

Compruebe su comprensión de pd.crosstab para crear tablas de frecuencias a partir de lo aprendido en esta lección.

Resumen de la lección

En esta lección ha aprendido: pd.crosstab() calcula recuentos de frecuencia para combinaciones de dos variables categóricas; normalize convierte los recuentos en proporciones por fila, por columna o totales; margins=True añade totales de filas y columnas; y el resultado de crosstab es directamente compatible con pruebas de chi-cuadrado y visualizaciones de mapas de calor. A continuación, trabajaremos con datos de series temporales mediante DatetimeIndex y rangos de periodos.

Preguntas frecuentes

¿La lección «crosstab para tablas de frecuencias» es gratis?

Sí — el texto completo de «crosstab para tablas de frecuencias» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué aprenderé en «crosstab para tablas de frecuencias»?

Calcule una tabla de contingencia de frecuencias o proporciones de dos columnas categóricas con pd.crosstab. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Pandas & NumPy Academy?

No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «crosstab para tablas de frecuencias»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?

Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. pivot_table: tablas de contingencia
  2. melt: de formato ancho a formato largo
  3. stack y unstack con MultiIndex
  4. crosstab para tablas de frecuencias
← Volver a Pandas & NumPy Academy