Muestreo Estratificado en Python
Yo lo entendí de esta forma:
- Separa los datos por categorías (valores estratificados).
- Define las categorías que quieres en tú muestro y su proporción.
- Toma tantos datos como necesites de cada categoría para llegar a la proporción deseada.
- 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.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?