No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende Ingl茅s, Programaci贸n, AI, Ciberseguridad y mucho m谩s.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

4 D铆as
22 Hrs
33 Min
48 Seg

Muestreo estratificado en Python

6/22
Recursos

Aportes 36

Preguntas 12

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Muestreo Estratificado en Python

Yo lo entend铆 de esta forma:

  1. Separa los datos por categor铆as (valores estratificados).
  2. Define las categor铆as que quieres en t煤 muestro y su proporci贸n.
  3. Toma tantos datos como necesites de cada categor铆a para llegar a la proporci贸n deseada.
  4. Junta esas muestras de cada categor铆a para tu muestreo final.

Explicaci贸n del ejemplo

Se crean dichas categor铆as a partir de la delegaci贸n y el tipo, esta informaci贸n se almacena en la columna estratificado:

econdata['estratificado'] = econdata['delegacion'] + "," + econdata['tipo']
(econdata['estratificado'].value_counts() / len(econdata)).sort_values(ascending=False)

Con esto ya tenemos los datos por categor铆as (paso 1) y podemos ver su proporci贸n real:

Para nuestro muestreo definimos las siguientes proporciones (paso 2):

  • Cuaut茅moc, Hotel: 0.5,
  • Cuaut茅moc, Museo: 0.2,
  • Venustiano Carranza, Hotel: 0.1,
  • Cuauht茅moc, Mercado: 0.1,
  • Venustiano Carranza, Mercado: 0.1

Para crear dicha proporci贸n a partir de los datos originales se utiliza la siguiente funci贸n que encuentra el n煤mero de muestras necesario de cada categor铆a (paso 3), hace un sampleo simple dentro de dicha categoria y luego junta esas muestras (paso 4):

def data_estratificada(econdata, nombres_columnas_estrat, valores_estrat, prop_estrat, random_state=None):

  df_estrat = pd.DataFrame(columns = econdata.columns) 

  pos = -1
  for i in range(len(valores_estrat)):
    pos += 1
    if pos == len(valores_estrat) - 1: 
      ratio_len = len(econdata) - len(df_estrat)
    else:
      ratio_len = int(len(econdata) * prop_estrat[i])

    df_filtrado = econdata[econdata[nombres_columnas_estrat] ==valores_estrat[i]]
    df_temp = df_filtrado.sample(replace=True, n=ratio_len, random_state=random_state)

    df_estrat = pd.concat([df_estrat, df_temp]) 
  return df_estrat

Utiliza este c贸digo para crear el sampleo:

valores_estrat = ['Cuaut茅moc,Hotel', 'Cuaut茅moc,Museo', 'Venustiano Carranza,Hotel', 'Cuauht茅moc,Mercado','Venustiano Carranza,Mercado']
prop_estrat = [0.5, 0.2, 0.1, 0.1, 0.1]
df_estrat = data_estratificada(econdata, 'estratificado', valores_estrat, prop_estrat, random_state=42)
df_estrat

Adicionalmente, puedes usar este c贸digo para ver la proporci贸n final de tus datos:

(df_estrat['estratificado'].value_counts()/len(df_estrat)).sort_values(ascending=False)

Si todo sali贸 bien, deber铆as ver algo similar a esto:

Con esto ya tienes una muestra en las proporciones que dese谩bamos en un principio.

Para entender este muestreo vamos a analizar que sucede cuando apliquemos un muestreo aleatorio simple vs un estratificado a los registros de Mercados que se encuentran en la delegacion Venustiano Carranza al cual me referire como el grupo 鈥淢VC鈥 . Escogi el grupo MVS dado que de los 230 registros que tiene nuestro dataset (poblacion) solo el 4.7% (11 registros)son mercados en en la delegacion venustiano carranza, por lo cual es muy sensible a que estos registros desaparezcan al hacer un muestreo aleatorio. en cambio al hacer un estratificado podemos asignar una fraccion a recolectar de cada grupo y asi lograr que el grupo MVC no desaparesca ya que si queremos hacer un muestreo de 40 registros (n = 40) el 4.78% de las muestras seran del grupo MVC osea 1.8 registros que redondeando serian 2. en resumen al hacer un muestro n =40 la probabilidad de que se seleccione un registro del grupo MVC usando un muestreo aleatorio simple es muy bajo siendo probable que no se recoja ningun registro MVC al aplicar el muestreo, pero si en cambio usamos un muestreo estratificado recogeremos al menos 2 registros del grupo.
pd: sin ayuda de la comunidad no hubiera entendido la clase, gracias !

No me est谩 quedando del todo claro que papel juega el random_state 馃槙

Creo que esta es una alternativa mas clara y menos larga:

data['strat'] = data['delegacion'] + " - " + data['tipo']

def stratified_sample(data, category, size):
  strat_values = data[category].unique()
  strat_props = (data[category].value_counts() / len(data))

  strat_sample = pd.DataFrame(columns = data.columns)

  for value in strat_values:
    strat_sample = pd.concat([strat_sample, data[(data[category] == value)].sample(n = round(strat_props[value]*size)) ])
  
  return strat_sample

strat_sample = stratified_sample(data, 'strat', 40)

No hab铆a entendido bien el muestreo estratificado, pero al hacer el c贸digo ya lo entend铆 mejor.

  • B谩sicamente es muy 煤til cuando quieres indicar qu茅 proporci贸n de datos de una misma categor铆a quieres obtener.
  • Obtener el mismo muestreo (con las mismas condiciones) gracias al random_state.

Muy mal explicado el c贸digo

Otro curso que se lleva todos los aplausos.

Me parece que se le complico mucho a la profe el explicar este tipo de muestreo, te lo explico de forma sencilla:

Por ejemplo, si tiene una poblaci贸n de 50 000 personas en una ciudad y desea encuestarlas, probablemente no pueda encuestarlas a todas. Podr铆a encuestar a 100 y extrapolar los resultados. Pero querr谩 asegurarse de que el grupo de muestra (esas 100 personas que encuesta) realmente represente a la poblaci贸n de la ciudad en su conjunto. Entonces, si el 20 % de la ciudad son asi谩ticos, querr谩s asegurarte de que el 20 % del grupo de muestra (20 personas) tambi茅n sean asi谩ticos.

Esto, en esencia, es un muestreo estratificado: garantizar que cada subgrupo (o 鈥榚strato鈥) en su muestra est茅 representado en la porci贸n correcta de toda la poblaci贸n.

pd: el codigo de la profe NO devuelve dicha muestra, pueden verificar esto en el colab al ver que econdata tiene 230 registros y df_estrat tambien tiene 230 registros

Bueno, me costo mas de lo que me hubiera gustado la verda, pero aca les dejo el reto que hice con una dataset de dibujitos que encontre en kaggle (voy a hacer el muestreo estratificado, ya que los otros son simples dentro de todo :p)


# Creamos una variable nueva en el dataset
df_cartoons['estratificado'] = df_cartoons['Country']+','+df_cartoons['Original Channel']
(df_cartoons['estratificado'].value_counts() / len(df_cartoons)).sort_values(ascending=False)

def data_estratificada(df_cartoons, nombres_columnas_estrat, valores_estrat, prop_estrat, random_state=None):
    
    df_estrat = pd.DataFrame(columns = df_cartoons.columns) # Creamos un data frame vac铆o con los nombres de las columnas de df_cartoons

    pos = -1
    for i in range(len(valores_estrat)): # iteraci贸n sobre los valores estratificados
        pos += 1
        if pos == len(valores_estrat) - 1: 
            ratio_len = len(df_cartoons) - len(df_estrat) # si es la iteraci贸n final calcula el n煤mero de valores de salida tenga el mismo n煤mero de filas que de entrada
        else:
            ratio_len = int(len(df_cartoons) * prop_estrat[i]) # calcula el n煤mero de filas seg煤n la proporci贸n deseada

        df_filtrado = df_cartoons[df_cartoons[nombres_columnas_estrat] ==valores_estrat[i]] # filtra los datos de origen seg煤n los valores seleccionados en la estratificaci贸n de datos
        df_temp = df_filtrado.sample(replace=True, n=ratio_len, random_state=random_state) # haz un sample de los datos filtrados usando la ratio que hemos calculado
        
        df_estrat = pd.concat([df_estrat, df_temp]) # junta las tablas de sample con la estratificada para producir el resultado final
        
    return df_estrat # Return the stratified, re-sampled data  

valores_estrat = ['United States,Netflix', 'United States,Cartoon Network', 'United States,Adult Swim']
prop_estrat = [0.6, 0.3, 0.1]
df_estrat = data_estratificada(df_cartoons, 'estratificado', valores_estrat, prop_estrat, random_state=42)
df_estrat

(df_estrat['estratificado'].value_counts()/len(df_estrat)).sort_values(ascending=False)

Me pareci贸 un poco complicado el c贸digo de la profesora, por lo que me d铆 la tarea de escribir mi propio c贸digo:

def stratified_sampling(df, col_name, size, random_state=0):
    ratio_df = df[col_name].value_counts() / len(df) 
    
    strat_idx = []
    for val in ratio_df.index:
        n_val = int(ratio_df[val] * len(df)) 
        size_per_val = round(n_val * size)
        strat = df[df[col_name]==val].sample(size_per_val, random_state=random_state)
        strat_idx.append(strat.index)
 
    strat_idx = [i for sublist in strat_idx for i in sublist]

    return df.iloc[strat_idx]

Hola, si quedaste como, que, que rayos?
que signfica esto?
bueno, tranquil@, yo tambien sent铆 lo mismo y tuve que tomarme mi tiempo para digerirlo.
Cosas que debes de tener en cuenta.

  1. Es una t茅cnica: Esto significa que pueden haber otras formas de extraer informacion y evaluarlas.
    posiblemente esta es la mas popular.
    La cual busca que cada subgrupo(estrato, categoria) pueda representar la poblacion.
    ahora, lo que se busca es tener una vision amplia de cual es la distribucion real de los datos(sacando solo unos valores especificos) para poder concluir su distribucion.
  2. y luego, como resultado tener la muestra final, en esta muestra final, lo que se busca entonces es que all铆 esten representados los datos o subgrupos segun su proporcion.
ValueError Traceback (most recent call last) [\<ipython-input-16-abac41bc8492>](https://localhost:8080/#) in \<cell line: 3>() 1 valores\_estrat = \['Cuaut茅moc,Hotel', 'Cuaut茅moc,Museo', 'Venustianos Carranza,Hotel', 'Cuauht茅moc,Mercado', 'Venustiano Carranza,Mercado'] 2 prop\_estrat = \[0.5, 0.2, 0.1, 0.1, 0.1] \----> 3 df\_estrat = data\_estratificada(econdata, 'estratificado', valores\_estrat, prop\_estrat, random\_state = 42) 4 df\_estrat 2 frames[/usr/local/lib/python3.10/dist-packages/pandas/core/sample.py](https://localhost:8080/#) in sample(obj\_len, size, replace, weights, random\_state) 148 raise ValueError("Invalid weights: weights sum to zero") 149 \--> 150 return random\_state.choice(obj\_len, size=size, replace=replace, p=weights).astype( 151 np.intp, copy=False 152 ) mtrand.pyx in numpy.random.mtrand.RandomState.choice() ValueError: a must be greater than 0 unless no samples are taken

Explicaci贸n de la funci贸n data_estratificada

Le agreugue el parametro tama帽o de muestra para hacer mas entendible la funci贸n

Definimos la funci贸n con sus variables

def data_estratificad(econdata,nombres_columnas_estrat,
                      valores_estrat, prop_estrat, 
                      tamano_muestra,random_state=None):
    '''Funci贸n que dado un dataFrame toma una muestra estratificada
    
    Argumentos:
    econdata {DataFrame}    -- DataFrame del cual tomaremos la muestra
    nombres_columnas {list} -- Valores a partir de los cuales se va a estratificar el DataFrame
    valores_estrat {list}   -- Valores del porcentaje de la muestra que tomara cada nombre de la lista anterior
    tamano_muestra {int}    -- Cantidad de datos que tendra la muestra
    random_state {int}      -- Funci贸n que nos permite elegir la semilla de los n煤meros pseudo-aleatorios
    '''
    
    'Creamos un DataFrame vacio con las mismas columnas donde guardaremos los datos'
    df_estrat = pd.DataFrame(columns= econdata.columns)
    
    'Contador auxiliar para ir pasando la lista'
    pos = -1
    
    'Ciclo for el cual va cambiando los valores donde seleccionamos la cantidad de datos por cada nombre'
    'Funci贸n range(len(valores_estrat)) nos indica que iremos desde 0 hasta la cantidad de entradas que tenga la lista valores_estrat'
    'esto para recorrer toda la lista'
    for i in range(len(valores_estrat)):
        
        'sumamos 1 a pos'
        pos +=1
        
        'Ciclo if el cual nos ayudara a saber la cantidad de datos que vamos a extraer de cada clasificador'
        'si posicion es igual a ultima:'
        if pos == len(valores_estrat)-1:
            'la cantidad de valores que obtendremos sera el tama帽o de la muestra menos los que ya tenemos'
            ratio_len = tamano_muestra - len(df_estrat)
            'En caso de no sea la ultima posici贸n'
            
        else:
            'la cantidad de valores que tendremos para este clasificador se obtendra de la siguente forma'
            'multiplicamos el tama帽o de la muestra por la proporcion que corresponde a ese clasificador'
            'como el valor puede no ser entero, lo convertimos en entero'
            ratio_len = int(tamano_muestra*prop_estrat[i])
        
        'en el DataFrame df_filtrado filtramos los valores de la columna que incluyan al clasificador'
        df_filtrado = econdata[econdata[nombres_columnas_estrat]==valores_estrat[i]]
        
        'obtenemos una muestra del tamano obtenido en ratio_len y la agregamos al dataFrame df_temp'
        df_temp = df_filtrado.sample(replace=True, n=ratio_len, random_state=random_state)
        
        'Concatenamos la informaci贸n al DataFrame df_estrat, de tal forma que se guardan los valores de todos los clasificadores'
        df_estrat = pd.concat([df_estrat,df_temp])
    return df_estrat

Le hice unos peque帽os cambio al c贸digo, nos permite colocar el tama帽o de la muestra.

def mi_estratificado (datos,columna,size,valores_estrat ,random_state = None):
  df_estrat = pd.DataFrame(columns=datos.columns)
  datos_en_col = datos[columna].unique()
  con = 0
  for i in datos_en_col :
    df_filtrado = datos[datos[columna] == datos_en_col[con]]
    df_temp = df_filtrado.sample(replace=True , n= int(valores_estrat[con] *size) ,random_state= random_state)
    df_estrat = pd.concat([df_estrat,df_temp])
    con += 1
  return df_estrat
### Para Probarlo
val_estrat = [0.5,0.2,0.1,0.1,0.1]
df_p = mi_estratificado(econodata,'estratificado',150,val_estrat, random_state=4)
print((df_p['estratificado'].value_counts()/len(df_p)).sort_values(ascending=False))
df_p

Hay una imprecisi贸n: El par谩metro random_state (en este caso 42) la instructora indica que hace que las filas se tomen de 42 en 42 lo cual no tiene nada que ver con su verdadero comportamiento (pueden verificar que las filas no tienen ese intervalo). Lo que hace es servir de semilla para el generador de n煤meros aleatorios y es un par谩metro opcional en la funci贸n sample.

En el contexto de muestreo, el par谩metro 鈥渞andom_state鈥 es utilizado para establecer una semilla para el generador de n煤meros aleatorios utilizado en la selecci贸n de muestras. Esto asegura que los resultados son reproducibles, ya que si utiliza el mismo valor para 鈥渞andom_state鈥 en dos llamadas diferentes, se seleccionar谩n las mismas muestras. Sin embargo, si se utiliza un valor diferente para 鈥渞andom_state鈥 en cada llamada, se seleccionar谩n muestras diferentes.

鈥婣qu铆 te doy un ejemplo de c贸mo realizar el muestreo estratificado en Python con la librer铆a pandas:

Copiar c贸digo
import pandas as pd

Crear un dataframe

data = {'Gnero': ['Hombre', 'Mujer', 'Hombre', 'Mujer', 'Hombre', 'Mujer'],
        'Edad': [22, 38, 27, 35, 18, 45],
        'Ingresos': [50000, 100000, 75000, 120000, 90000, 80000]}
df = pd.DataFrame(data)

Crear estratos

strat_df = df.groupby(
strat_df =
'G茅nero').apply(lambda x: x.sample(frac=0.3))

Muestra estratificada

print(strat_df)
  • En este ejemplo, se crea un marco de datos con tres columnas: G茅nero, Edad e Ingresos. Luego, se agrupa el dataframe por la columna 鈥淕茅nero鈥 y se aplica una funci贸n de prueba de forma aleatoria a cada estrato con una fracci贸n de 0.3. El resultado es una muestra estratificada donde el 30% de los elementos de cada estrato son seleccionados al azar.

La librer铆a numpy tambi茅n tiene la funci贸n 鈥榬andom.choice鈥 que permite elegir elementos al azar de una lista o una matriz de una manera similar.

Si bien el c贸digo deber铆a funcionar bien, es mejor comprobar el resultado, aqu铆 una peque帽a validaci贸n del objetivo

(df_estrat['estratificado'].value_counts() / len(df_estrat)).sort_values(ascending=False)

Cuaut茅moc,Hotel                0.5
Cuaut茅moc,Museo                0.2
Venustiano Carranza,Hotel      0.1
Cuauht茅moc,Mercado             0.1
Venustiano Carranza,Mercado    0.1
Name: estratificado, dtype: float64
Les comparto mis apuntes en notion: <https://www.notion.so/Muestreo-estratificado-en-python-799d54cd991842b4acd6dc9cea3ce542>

馃搶 NOTA: En la funci贸n data_estratificada al obtener la muestra aleatoria, el par谩metro replace=True nos permite repetir rows del DataFrame df_filtrado cuando el total de elementos a tomar (n=ratio_len) es mayor a la longitud del DataFrame, de lo contrario python nos lanzara este error:

En consecuencia obtenemos un nuevo DataFreame con rows repetidos, por ende al final podemos hacer una limpieza de la muestra eliminando aquellos elementos que se duplicaron.

cleaned_df = df_estrat.drop_duplicates(keep="first")
print(f"shape={cleaned_df.shape}")
cleaned_df

Espero este aporte les sea de ayuda 馃槂

n=ratio\_len da error
**AHORA PUE隆隆隆** Muestreo estraficcado
lo que hace este tipo de muestreo es agarrar el dataframe, lo mapea, lo separa por las categorias o "estratos" que le definas y reescribe las hileras/rows del dataframe para ajustarse a las proporciones que le pediste, aun no entiendo bien porque querer modificar un dataframe a tu gusto si se supone que lo que se debe ahacer es interpretarlo, no ajustarlo a una hipotesis ideal que se ajuste a uno
La proporci贸n es una decisi贸n arbitraria?
Pueden corregir el "Cuaut茅moc" mal escrito con as铆: ```python def fix_words(column): for i in range(len(column)): if column[i] == "Cuauht茅moc": column[i] = "Cuaut茅moc" return column.copy() econdata["delegacion"] = fix_words(econdata["delegacion"]) econdata["delegacion"].value_counts() ```def fix\_words(column):聽 for i in range(len(column)):聽 聽 if column\[i] == "Cuauht茅moc":聽 聽 聽 column\[i] = "Cuaut茅moc" 聽 return column.copy() econdata\["delegacion"] = fix\_words(econdata\["delegacion"])econdata\["delegacion"].value\_counts()

Hice un codigo similar pero con peque帽os cambios que permitern al usuario definir la proporci贸n del tama帽o de la muesta.

def data_stratify(df, column_strat, values_strat, frac=0.25, random_state=None):
    df_stratify = pd.DataFrame(columns=df.columns)
    total_size = frac * len(df)
    
    for name, proportion in values_strat.items():
        ratio_len = int(proportion * total_size)
        df_filtrate = df[df[column_strat] == name]
        df_temp = df_filtrate.sample(replace=True, n=ratio_len, random_state=random_state)
        
        df_stratify = pd.concat([df_stratify, df_temp])
    return df_stratify

values_strat = {
    'Cuaut茅moc,Hotel': 0.5,
    'Cuaut茅moc,Museo': 0.2,
    'Venustiano Carranza,Hotel': 0.1,
    'Cuauht茅moc,Mercado': 0.1,
    'Venustiano Carranza,Mercado': 0.1
}

df_strat = data_stratify(econdata, 'estratificado', values_strat, frac=0.3, random_state=42)

No entend铆 nada 馃槙

Creo que se hubiera aprendido m谩s si se daba un ejemplo m谩s b谩sico.

Los muestreos aleatorio, sistem谩tico y estratificado son tres m茅todos comunes y ampliamente utilizados en la pr谩ctica del muestreo. Sin embargo, no se puede decir que sean los 煤nicos importantes, ya que existen otros m茅todos de muestreo que tambi茅n pueden ser relevantes seg煤n el contexto y los objetivos de la investigaci贸n.

A continuaci贸n, te proporciono una descripci贸n de estos tres m茅todos de muestreo y algunas consideraciones sobre su importancia:

Muestreo Aleatorio: En este m茅todo, cada elemento de la poblaci贸n tiene la misma probabilidad de ser seleccionado para formar parte de la muestra. Es un enfoque sencillo y objetivo, que permite obtener muestras representativas de la poblaci贸n. Es ampliamente utilizado y forma la base de otros m茅todos de muestreo.

Muestreo Sistem谩tico: En este m茅todo, se selecciona un elemento de la poblaci贸n al azar y luego se seleccionan los elementos subsiguientes a intervalos fijos. El tama帽o del intervalo se determina dividiendo el tama帽o de la poblaci贸n entre el tama帽o de la muestra deseado. Este m茅todo es simple de implementar y puede ser eficiente en t茅rminos de tiempo y costos. Sin embargo, puede introducir sesgos si hay un patr贸n sistem谩tico en la distribuci贸n de los elementos.

Muestreo Estratificado: En este m茅todo, la poblaci贸n se divide en grupos homog茅neos llamados estratos, y luego se selecciona una muestra de cada estrato de manera independiente. El objetivo es asegurar que cada estrato est茅 representado en la muestra, lo que permite obtener estimaciones m谩s precisas para subgrupos espec铆ficos de la poblaci贸n. El muestreo estratificado es particularmente 煤til cuando hay variabilidad heterog茅nea dentro de la poblaci贸n.

Aunque estos tres m茅todos son muy importantes y ampliamente utilizados en el muestreo, existen otros m茅todos que tambi茅n pueden ser relevantes dependiendo del contexto y los objetivos de la investigaci贸n. Algunos ejemplos incluyen el muestreo por conglomerados, el muestreo por cuotas y el muestreo secuencial. Cada m茅todo tiene sus propias ventajas y desventajas, y la elecci贸n del m茅todo adecuado depende de diversos factores, como la naturaleza de la poblaci贸n, el tama帽o de la muestra deseado, los recursos disponibles y los objetivos del estudio.

Cost贸 entender el c贸digo pero se logr贸, gracias a la comunidad por complementar la clase 馃槃

隆Hola muchach@s!

Al tomar una muestra, lo m谩s importante es que 茅sta sea reprensentativa de la poblaci贸n.
Si la poblaci贸n est谩 divida en categor铆as (estratos), la muestra debe reflejar esas categor铆as y sus proporciones para evitar sesgos, esto es lo que se denomina como muestreo estratificado (donde cada estrato es la representaci贸n de una categor铆a)

El proceso es el siguiente:

  1. Crear los estratos (basados en las categor铆as de la fuente de datos )
  2. Calcular las proporciones (la suma de las proporciones debe dar 1)
  3. Definir el tama帽o de la muestra
  4. Tomar la muestra seg煤n la proporci贸n para cada estrato (categor铆a)

En python:

proporciones = {
    'Cuaut茅moc, Hotel': 0.5,
    'Cuaut茅moc, Museo': 0.2,
    'Venustiano Carranza, Hotel': 0.1,
    'Cuauht茅moc, Mercado': 0.1,
    'Venustiano Carranza, Mercado': 0.1
}

#Crear el dataframe para almacenar la muestra

muestra_estratificada = pd.DataFrame()
tamano_muestra = 10

# filtrar, recorrer los datos y tomar la muestra seg煤n proporci贸n

for estrato, proporcion in proporciones.items():
    filtro_estratificado = df[df['estratificado'] == estrato]
    muestra = int(tamano_muestra*proporcion)
    muestra_estrato = filtro_estratificado.sample(n=muestra, random_state=42)
    muestra_estratificada = muestra_estratificada.append(muestra_estrato)

# el resultado ser谩 este:
muestra_estratificada

Esta ser铆a la l贸gica del c贸digo:

Filtrar los datos por estratos (categor铆as), recorrerlos y seg煤n su proporci贸n tomar la muestra. El resultado se debe ir almacenando en el dataframe inicial que declaramos

NOTA: El random_state es un n煤mero de referencia que utiliza Python para generar la muestra aleatoriamente, se puede cambiar para generar diferentes tipos de muestra (debe ser n煤mero entero), si se mantiene, la muestra ser谩 la misma.

A diferencia del c贸digo de la profe, este toma una muestra m谩s peque帽a en relaci贸n
a la fuente de datos.

隆saludos!

No busque explicar perfectamente el c贸digo, pero ya que me lo escrib铆 para entender mejor, lo dejo por aca (recuerden usar chatgpt apra que les explique funciones y lineas enteras o m茅todos de alguna libreria:

#Reconfiguramos los datos
#Creamos un nuevo dataframe extrayendo muestras de cada estrato, cumpliendo con las proporciones indicadas
#orden de parametros (BBDD, columna generada, nombres de las divisiones que hicimos, proporci贸n deseada de las divisiones)
def data_estratificada(econdata, nombres_columnas_estrat, valores_estrat, prop_estrat, random_state=None):
    #hacemos un nuevo df con columnas vacias del mismo nombre q econdata
    df_estrat = pd.DataFrame(columns = econdata.columns)
    #variable para seguir la posici贸n en la lista valores_estrat
    pos = -1
    #copiamos las filas tomando como proporci贸n para la cantidad de muestras, a los valores en la lista prop_estrat
    for i in range(len(valores_estrat)):
        pos += 1
        #si es el ultimo estrato
        if pos == len(valores_estrat) -1:
            #ratio_len = 230 - (4?)
            ratio_len = len(econdata) - len(df_estrat)
        else:
            #ratio_len = la proporci贸n = prop_estrat[i] de econdata
            ratio_len = int(len(econdata) * prop_estrat[i])

        #seleccionamos las columnas en "estratificado" que sean iguales a valores_estrat[i]
        df_filtrado = econdata[econdata[nombres_columnas_estrat] == valores_estrat[i]]
        #filtra pudiendo copiar filas, en la proporcion de ratio_len, y con random_state = None implica que el muestreo no ser谩 determinista, variando en cada ejecuci贸n
        df_temp = df_filtrado.sample(replace=True, n=ratio_len, random_state=random_state)
        #concatena df_estrat y df_temp
        df_estrat = pd.concat([df_estrat, df_temp])
    return df_estrat

El siguiente c贸digo me regresa los valores de cada categor铆a ordenados del que mas veces aparece al que menos, seria una forma de reemplazar valores_estrat pero igual generar uno mismo la lista con los valores nos da un mayor control sobre las proporciones que le asignamos a cada categor铆a.

econdata[columna_strat].value_counts().index

Resultado final:

(df_estrat['estratificado'].value_counts() / len(econdata)).sort_values(ascending=False)

Muy bueno para dar esas proporciones al final y luego hacer otros estudios con los datos resultantes