Как сгенирировать распределение исходя из выборок
Чтобы сгенерировать распределение, исходя из выборки, нужно восстановить (оценить) вероятностное распределение, описывающее поведение этих данных. Существует два основных подхода:
1. Эмпирическое распределение
Это самый простой способ — взять имеющуюся выборку как "приближение" распределения.
✅ Шаги:
-
Собрать выборку: допустим, у вас есть массив значений:
samples = [3.2, 2.9, 3.7, 4.1, 3.0, 2.8, 3.5] -
Построить гистограмму или ЭФР (эмпирическую функцию распределения):
-
Гистограмма делит диапазон значений на бины и показывает частоты.
-
ЭФР — ступенчатая функция, показывающая долю значений ≤ 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. Параметрическая оценка распределения
Если известно (или предполагается), что данные подчиняются известному типу распределения (например, нормальному), можно оценить параметры этого распределения.
✅ Шаги:
-
Выбрать модель распределения (например, нормальное).
-
Оценить параметры (среднее и стандартное отклонение).
-
Построить плотность вероятности или сгенерировать новые выборки.
📌 Пример: нормальное распределение
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 |
--- | --- |
Таким образом, вы можете восстановить распределение из выборки, визуализировать его и использовать для генерации новых данных, оценки плотности и статистических выводов.