Muestreo estratificado con pandas en Python

Resumen

El muestreo estratificado en Python te permite crear muestras representativas cuando tu población se divide en grupos homogéneos exclusivos. Aquí aprendes a construirlo con pandas, definir proporciones específicas y resolver errores comunes al concatenar variables categóricas.

Esta técnica es clave para analistas de datos, científicos de datos y estudiantes de estadística que necesitan respetar la composición real de una población al extraer una muestra.

¿Qué es el muestreo estratificado y cuándo conviene usarlo?

El muestreo estratificado divide la población en estratos exclusivos y luego toma una muestra aleatoria dentro de cada uno, manteniendo proporciones definidas. La gracia está en que los estratos son homogéneos por dentro y distintos entre sí.

¿Cuándo uso muestreo estratificado en lugar de aleatorio simple? Cuando tu población tiene subgrupos relevantes (ubicación, tipo, categoría) y necesitas que cada uno aparezca con una proporción específica en la muestra. El aleatorio simple no garantiza esa representación.

En el ejercicio se trabaja con econdata, una base con establecimientos clasificados por delegación y tipo (hotel, museo, mercado, restaurante). El objetivo es construir una muestra que refleje proporciones definidas externamente, no las que aparecen naturalmente en los datos [00:25].

¿Cómo creo la variable de estratificación con pandas?

El primer paso es generar una columna nueva que combine las variables que definen tus estratos. En este caso, delegacion y tipo se concatenan dentro de econdata para formar la columna estratificado [01:05].

Para revisar la distribución natural usas value_counts() dividido sobre len(econdata) y ordenas con sort_values(ascending=False). Esto te muestra el porcentaje de cada estrato ordenado del más frecuente al menos frecuente.

La salida revela que hoteles en Cuauhtemoc representan el 64,34%, seguidos de museos en Cuauhtemoc y hoteles en Venustiano Carranza [02:15]. Aquí aparece un detalle importante: la palabra Cuauhtémoc viene escrita sin tilde desde la fuente. No es un error tuyo, es un typo del origen, y puedes corregirlo en los datos o dejar la observación para tus conclusiones.

¿Qué proporciones objetivo se definen para la muestra?

El ejercicio plantea que la población real debería distribuirse así:

  • Hoteles en Cuauhtemoc: 50%.
  • Museos en Cuauhtémoc: 20%.
  • Hoteles en Venustiano Carranza: 10%.
  • Mercados en Cuauhtemoc: 10%.
  • Mercados en Venustiano Carranza: 10%.

La suma debe dar 100%. Siempre verifica esto antes de correr la función, porque si te pasas o te quedas corto, la muestra final queda mal calibrada.

¿Cómo construyo la función de muestreo estratificado en Python?

La función se define con def data_estratificada y recibe cinco parámetros: la tabla econdata, los nombres de columnas estratificadas (strat), los valores estratificados, la proporción estratificada y random_state [04:30].

Dentro de la función creas un DataFrame vacío con las mismas columnas de econdata. Luego iteras sobre los valores estratificados con un for que recorre el rango de su longitud, ajustando la posición con -1 en cada vuelta.

¿Cómo se calcula la ratio de cada estrato?

La lógica tiene dos caminos:

  • Última iteración: la ratio_length se calcula como la diferencia entre len(econdata) y la longitud del DataFrame estratificado actual. Esto asegura que el total de filas de salida cuadre con el total esperado.
  • Iteraciones intermedias: la ratio_length se obtiene como el entero de len(econdata) multiplicado por la proporción estratificada del componente i.

Esa diferencia entre la última iteración y las demás es lo que evita que se pierdan o sobren registros por redondeo.

Después filtras econdata por la columna estratificada igual al valor del estrato actual, aplicas .sample() con replace, el tamaño de la ratio y el random_state definido. Cada muestra parcial se concatena al DataFrame final con pd.concat() [07:40].

¿Por qué falla el código y cómo se corrige el error de espacios?

Al ejecutar la función por primera vez aparece un error. Revisando con calma, el problema está en cómo se definió la columna estratificado: al concatenar delegacion y tipo con una coma, no se incluyó espacio después de la coma [11:50].

¿Por qué un espacio rompe el código en pandas? Porque los valores categóricos se comparan literalmente. "Cuauhtemoc,hotel" no es lo mismo que "Cuauhtemoc, hotel". Si defines la lista con espacios y la columna sin ellos, ningún filtro encuentra coincidencias.

La solución es alinear ambos lados: o agregas el espacio en la concatenación, o lo quitas en la lista de valores_strat. En el ejercicio se opta por quitar los espacios de la lista, se vuelve a correr y la muestra final entrega 42 registros que respetan las proporciones objetivo: 50%, 20%, 10%, 10%, 10% [13:20].

¿Qué practico después para dominar el muestreo?

La estructura del código es reutilizable. No necesitas memorizarla, sino entender el flujo: variable de estratificación, definición de proporciones, función con iteración condicional y concatenación final.

El reto sugerido es practicar con otras fuentes abiertas, idealmente del gobierno de México, aplicando los tres tipos de muestreo vistos en el curso: aleatorio simple, sistemático y estratificado. Comparte tus resultados en los comentarios y cuenta qué bases usaste.