обработка данных
January 25, 2023

Выборка значений по заданному дискретному распределению

Рассмотрим, какие в 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

Как видим, вероятности получившегося набора тоже близки к исходным.