Ну, это не так, как работает статистика. Нормальное распределение Гаусса имеет среднее значение и стандартное значение, но значения можно извлечь далеко от среднего значения + - стандартное, они просто менее вероятны. Согласно определению нормального распределения, 68% всех значений находятся в пределах + - 1 * std, 95% находятся в пределах + -2 * std и так далее. Вопрос в том, что вы хотите сделать с выбросами? Установите для них значение + - std или снова рисуйте?
Случай 1: Установите выбросы на минимум / максимум
Это обычно нежелательно, так как это меняет ваше распределение и увеличивает вес на нижнем и нижнем уровнях. верхняя граница.
from matplotlib import pyplot as plt
mu = 100
sigma = 7
a = np.random.normal(mu, sigma, size=2000) # I used a size of 2000 as an example
a[a<(mu-sigma)] = mu-sigma
a[a>(mu+sigma)] = mu+sigma
plt.hist(a, bins=12, edgecolor='black')
plt.show()
Случай 2: усеченное нормальное распределение
Обычно вам требуется усеченное нормальное Распределение . Это создает распределение с верхней и нижней границей. Вы найдете эту функцию в модуле scipy.stats
. Это работает немного по-другому: сначала вы создаете распределение путем нормализации нижнего и верхнего клипа, а затем создаете из него ряд случайных величин rvs
следующим образом:
from matplotlib import pyplot as plt
import scipy.stats as stats
mu = 100
sigma = 7
lower_clip = mu-sigma
upper_clip = mu+sigma
a = stats.truncnorm((lower_clip - mu) / sigma, (upper_clip - mu) / sigma, loc=mu, scale=sigma)
plt.hist(a.rvs(2000), bins=12, edgecolor='black')
plt.show()
Константа кратных сигма легко реализуется. Вы можете просто изменить нижний и верхний клип, например,
lower_clip = mu-x*sigma
, где x - это ваша постоянная.