Это мое лучшее решение на данный момент. Важно заранее связать непрерывные переменные и иметь минимум наблюдений для каждого слоя.
В этом примере я:
- Генерация населения
- Выборка чисто случайным образом
- Выборка случайным образом стратифицированным образом
При сравнении обеих выборок стратифицированная является гораздо более представительной для всей популяции.
Если у кого-то есть идея относительно более оптимального способа сделать это, пожалуйста, не стесняйтесь поделиться.
import pandas as pd
import numpy as np
# Generate random population (100K)
population = pd.DataFrame(index=range(0,100000))
population['income'] = 0
population['income'].iloc[39000:80000] = 1
population['income'].iloc[80000:] = 2
population['sex'] = np.random.randint(0,2,100000)
population['age'] = np.random.randint(0,4,100000)
pop_count = population.groupby(['income', 'sex', 'age'])['income'].count()
# Random sampling (100 observations out of 100k)
random_sample = population.iloc[
np.random.randint(
0,
len(population),
int(len(population) / 1000)
)
]
# Random Stratified Sampling (100 observations out of 100k)
stratified_sample = list(map(lambda x : population[
(
population['income'] == pop_count.index[x][0]
)
&
(
population['sex'] == pop_count.index[x][1]
)
&
(
population['age'] == pop_count.index[x][2]
)
].sample(frac=0.001), range(len(pop_count))))
stratified_sample = pd.concat(stratified_sample)