Выборка значений по заданному дискретному распределению
Рассмотрим, какие в Python имеются инструменты создания выборки по заданному дискретному распределению. Она окажется вам полезной, например, для заполнения пропусков в некоторой колонке, не нарушая исходного распределения. Зададим имитационный набор данных x:
import numpy as np np.random.seed(0) x = [0]*20+[1]*10+[2]*40+[3]*30 np.bincount(x)
Вероятности появления 4 заданных значений от 0 до 3 следующие:
probs = np.bincount(x)/100 probs
Для нашей цели можно использовать функцию choice из модуля np.random, которая при получении списка значений (параметр a) и их вероятностей (p) возвращает набор величин размером (size) с учетом распределения:
M=100 res = np.random.choice(a=range(4), size=M, p=probs) np.bincount(res)/M
Как видим, вероятности значений из нового набора близки исходным.
Еще более общим инструментом является создание объекта дискретного распределения функцией rv_discrete из модуля scipy.stats:
from scipy.stats import rv_discrete distr = rv_discrete(values=(range(4), probs))
Воспользовавшись его методом rvs, можно получить набор значений из этого распределения:
samples = distr.rvs(size=M) np.bincount(samples)/M
Как видим, вероятности получившегося набора тоже близки к исходным.