Как сгенирировать распределение исходя из выборок


Чтобы сгенерировать распределение, исходя из выборки, нужно восстановить (оценить) вероятностное распределение, описывающее поведение этих данных. Существует два основных подхода:

1. Эмпирическое распределение

Это самый простой способ — взять имеющуюся выборку как "приближение" распределения.

✅ Шаги:

  1. Собрать выборку: допустим, у вас есть массив значений:
    samples = [3.2, 2.9, 3.7, 4.1, 3.0, 2.8, 3.5]

  2. Построить гистограмму или ЭФР (эмпирическую функцию распределения):

    • Гистограмма делит диапазон значений на бины и показывает частоты.

    • ЭФР — ступенчатая функция, показывающая долю значений ≤ x.

🧰 В Python:

import matplotlib.pyplot as plt
import numpy as np
samples = np.array(\[3.2, 2.9, 3.7, 4.1, 3.0, 2.8, 3.5\])
plt.hist(samples, bins=5, density=True, edgecolor='black')
plt.title("Гистограмма")
plt.show()

2. Параметрическая оценка распределения

Если известно (или предполагается), что данные подчиняются известному типу распределения (например, нормальному), можно оценить параметры этого распределения.

✅ Шаги:

  1. Выбрать модель распределения (например, нормальное).

  2. Оценить параметры (среднее и стандартное отклонение).

  3. Построить плотность вероятности или сгенерировать новые выборки.

📌 Пример: нормальное распределение

from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt
samples = np.array(\[3.2, 2.9, 3.7, 4.1, 3.0, 2.8, 3.5\])
mu, sigma = norm.fit(samples) # Оценка параметров
x = np.linspace(min(samples), max(samples), 100)
pdf = norm.pdf(x, mu, sigma)
plt.hist(samples, bins=5, density=True, alpha=0.5, label='Гистограмма')
plt.plot(x, pdf, 'r-', label='Оценка N(μ, σ²)')
plt.legend()
plt.title(f'Нормальное распределение: μ={mu:.2f}, σ={sigma:.2f}')
plt.show()

Теперь у вас есть плотность вероятности, описывающая распределение данных.

3. Непараметрическая оценка плотности (KDE)

Если вы не уверены в форме распределения, используйте оценку плотности ядром (Kernel Density Estimation).

Это более гибкий способ восстановления распределения из выборки.

📌 Пример:

from scipy.stats import gaussian_kde
kde = gaussian_kde(samples)
x = np.linspace(min(samples), max(samples), 100)
y = kde(x)
plt.plot(x, y, label='KDE')
plt.hist(samples, bins=5, density=True, alpha=0.5, label='Гистограмма')
plt.legend()
plt.title("Оценка плотности ядром (KDE)")
plt.show()

4. Генерация новых данных из оцененного распределения

После того как вы восстановили распределение (например, с помощью norm.fit или gaussian_kde), вы можете сгенерировать искусственные данные, похожие на исходные:

📌 Из нормального:

new_samples = np.random.normal(loc=mu, scale=sigma, size=1000)

📌 Из KDE:

new_samples_kde = kde.resample(1000)\[0\]

5. Проверка качества восстановления

Чтобы убедиться, что сгенерированное распределение действительно похоже на исходные данные, можно использовать:

  • Q-Q plot (сравнение квантилей).

  • Тесты согласия (например, Колмогорова-Смирнова).

  • Визуальное сравнение (наложение графиков).

Когда применять какой подход?

Сценарий Метод
Небольшой объём данных KDE или эмпирическое распределение
--- ---
Есть обоснованное предположение о типе Параметрическая оценка (например, нормальная)
--- ---
Нужно сгенерировать новые похожие данные Нормальное распределение или KDE
--- ---
Визуализация формы распределения Гистограмма + KDE или PDF
--- ---

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