Вы не взвесили вклад каждого бина с n[i]
.Измените приращение t
на
t += n[i]*(bins[i] - mean)**2
Кстати, вы можете упростить (и ускорить) ваши вычисления, используя numpy.average
с аргументом weights
.
Вот пример.Сначала сгенерируйте данные для работы.Перед вычислением гистограммы мы вычислим среднее значение выборки, дисперсию и стандартное отклонение ввода.
In [54]: x = np.random.normal(loc=10, scale=2, size=1000)
In [55]: x.mean()
Out[55]: 9.9760798903061847
In [56]: x.var()
Out[56]: 3.7673459904902025
In [57]: x.std()
Out[57]: 1.9409652213499866
Я буду использовать numpy.histogram
для вычисления гистограммы:
In [58]: n, bins = np.histogram(x)
mids
- середина бункеров;он имеет ту же длину, что и n
:
In [59]: mids = 0.5*(bins[1:] + bins[:-1])
Оценка среднего значения представляет собой средневзвешенное значение mids
:
In [60]: mean = np.average(mids, weights=n)
In [61]: mean
Out[61]: 9.9763028267760312
В этом случае оно довольно близкок среднему значению исходных данных.
Расчетная дисперсия представляет собой средневзвешенное значение квадрата разности от среднего значения:
In [62]: var = np.average((mids - mean)**2, weights=n)
In [63]: var
Out[63]: 3.8715035807387328
In [64]: np.sqrt(var)
Out[64]: 1.9676136767004677
Эта оценка находится в пределах 2% от фактического стандартного отклонения выборки.