Вот сокращенная версия кода шасана, вычисляющая 95% доверительный интервал среднего значения массива a
:
import numpy as np, scipy.stats as st
st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Но использование StatsModels, tconfint_mean
возможно, даже лучше:
import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()
В основе обоих лежит предположение, что выборка (массив a
) была построена независимо от нормального распределения с неизвестным стандартным отклонением (см. MathWorld или Википедию ).
Для большого размера выборки n среднее значение выборки имеет нормальное распределение, и его доверительный интервал можно рассчитать, используя st.norm.interval()
(как предлагается в комментарии Хайме). Но приведенные выше решения верны также для малых n, что st.norm.interval()
дает слишком узкие доверительные интервалы (т. Е. «Ложная уверенность»). См. Мой ответ на аналогичный вопрос для получения более подробной информации (и один из комментариев Русса здесь).
Вот пример, в котором правильные параметры дают (по существу) одинаковые доверительные интервалы:
In [9]: a = range(10,14)
In [10]: mean_confidence_interval(a)
Out[10]: (11.5, 9.4457397432391215, 13.554260256760879)
In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Out[11]: (9.4457397432391215, 13.554260256760879)
In [12]: sms.DescrStatsW(a).tconfint_mean()
Out[12]: (9.4457397432391197, 13.55426025676088)
И, наконец, неверный результат с использованием st.norm.interval()
:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)