Oto skrócona wersja kodu Shasana, obliczająca 95% przedział ufności średniej z tablicy 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))
Ale korzystanie z StatsModels tconfint_mean
jest prawdopodobnie jeszcze przyjemniejsze:
import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()
Podstawowym założeniem dla obu jest to, że próbka (tablica a
) została pobrana niezależnie od rozkładu normalnego z nieznanym odchyleniem standardowym (patrz MathWorld lub Wikipedia ).
W przypadku dużej próby o rozmiarze n średnia z próby ma rozkład normalny i można obliczyć jej przedział ufności za pomocą st.norm.interval()
(jak zasugerowano w komentarzu Jaime'a). Ale powyższe rozwiązania są poprawne również dla małego n, gdzie st.norm.interval()
daje przedziały ufności, które są zbyt wąskie (tj. „Fałszywe zaufanie”). Zobacz moją odpowiedź na podobne pytanie, aby uzyskać więcej informacji (i jeden z komentarzy Russa tutaj).
Oto przykład, w którym prawidłowe opcje dają (zasadniczo) identyczne przedziały ufności:
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)
I na koniec niepoprawny wynik przy użyciu st.norm.interval()
:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)