Oto skrócona wersja kodu shasan, w obliczeniu 95% przedział ufności średniej 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 używając StatsModels' tconfint_mean niewątpliwie jest nawet ładniejszy:
import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()
Podstawowymi założeniami dla obu są to, że próbka (tablica a
) została pobrana niezależnie od rozkładu normalnego z nieznanym odchyleniem standardowym (patrz MathWorld lub Wikipedia).
Dla dużego rozmiaru próby n średnia próbka jest zwykle dystrybuowana i można obliczyć jej przedział ufności za pomocą st.norm.interval()
(jak zasugerowano w komentarzu Jaime'a). Jednak powyższe rozwiązania są poprawne również dla małych n, gdzie st.norm.interval()
daje przedziały ufności, które są zbyt wąskie (tj. "Fałszywe zaufanie"). Zobacz moje answer na podobne pytanie, aby uzyskać więcej szczegółów (i jeden z komentarzy Russa tutaj).
Oto przykład, gdzie właściwe opcje dać (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 wreszcie, nieprawidłowy wynik używając st.norm.interval()
:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)
sp.stats.stderr jest przestarzałe. Zastąpiłem sp.stats.sem i działało świetnie! – Bmayer0122
Importowanie 'scipy' niekoniecznie automatycznie importuje wszystkie podpakiety. Lepiej zaimportować pakiet podrzędny 'scipy.statystyki jawnie. – Vikram
Ostrożnie z "prywatnym" użyciem 'sp.stats.t._ppf'. Nie jestem z tym tak komfortowo bez dalszych wyjaśnień. Lepiej używać 'sp.stats.t.ppf' bezpośrednio, chyba że masz pewność, że wiesz, co robisz. Po szybkiej inspekcji [źródła] (https://github.com/scipy/scipy/blob/v0.13.0/scipy/stats/distributions.py#L1474) jest sporo kodu pomijanego przez '_ppf'. Być może łagodna, ale także potencjalnie niebezpieczna próba optymalizacji? – Russ