Oblicz przedział ufności na podstawie przykładowych danych

109

Mam przykładowe dane, dla których chciałbym obliczyć przedział ufności, zakładając rozkład normalny.

Znalazłem i zainstalowałem pakiety numpy i scipy i otrzymałem numpy, aby zwracać średnią i odchylenie standardowe (numpy.mean (dane) z danymi będącymi listą). Wszelkie porady dotyczące uzyskania przykładowego przedziału ufności byłyby bardzo mile widziane.

Bmayer0122
źródło
1
Myślę, że na pewno określ, czy chcesz obliczyć CI dla średniej próbki, czy średniej populacji. To określiłoby, czy chcesz użyć rozkładu normalnego, czy t do obliczenia wyniku Z. A górna odpowiedź poniżej dotyczy średniej próbki, więc przy dystrybucji jest używana.
Jake

Odpowiedzi:

162
import numpy as np
import scipy.stats


def mean_confidence_interval(data, confidence=0.95):
    a = 1.0 * np.array(data)
    n = len(a)
    m, se = np.mean(a), scipy.stats.sem(a)
    h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)
    return m, m-h, m+h

możesz obliczyć w ten sposób.

shasan
źródło
1
sp.stats.stderr jest przestarzałe. Zastąpiłem sp.stats.sem i działało świetnie!
Bmayer0122
1
Import scipyniekoniecznie oznacza automatyczny import wszystkich podpakietów. Lepiej jest scipy.statsjawnie zaimportować pakiet podrzędny .
Vikram,
31
Ostrożnie z „prywatnym” użyciem sp.stats.t._ppf. Nie czuję się z tym dobrze bez dalszych wyjaśnień. Lepiej używać sp.stats.t.ppfbezpośrednio, chyba że jesteś pewien, że wiesz, co robisz. Przy szybkiej inspekcji źródła można pominąć sporą ilość kodu _ppf. Prawdopodobnie nieszkodliwa, ale prawdopodobnie niebezpieczna próba optymalizacji?
Russ
Podoba mi się to, ponieważ możesz po prostu dodać *ss.t._ppf((1+conf)/2.,n-1) do wbudowanej .semmetody ramki danych pandy , więc nie musisz się martwićapply
TNT
1
Chcę tylko wyjaśnić, że to obliczenie dotyczy średniej próbki, więc jest używana przy dystrybucji. Jeśli pytania dotyczą obliczenia średniej populacji, należy zastosować rozkład normalny, a przedział ufności będzie mniejszy dla tego samego poziomu ufności.
Jake
133

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_meanjest 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)
Ulrich Stern
źródło
1
Uważam, że powinieneś dzwonić, st.t.interval(0.05)aby uzyskać 95% przedział ufności.
Scimonster
5
Nie, st.t.interval(0.95)jest prawidłowe dla 95% przedziału ufności, patrz dokumenty do scipy.stats.t. Jednak nazwanie argumentu przez SciPy alphawydaje się mniej niż idealne.
Ulrich Stern
Jeśli mam dwie tablice danych, a następnie obliczyłem różnicę ich średniej. Czy istnieje sposób na uzyskanie 95% przedziału ufności dla tej średniej różnicy? Czy mógłbyś wymyślić prosty sposób na zrobienie tego, taki jak ten, który podajesz tutaj, używając StatsModelsl?
Steven
@steven, okazuje się, odpowiedziałem na pytanie na ten temat. :)
Ulrich Stern
16

Zacznij od wyszukania wartości z dla żądanego przedziału ufności w tabeli przeglądowej . Przedział ufności wynosi zatem mean +/- z*sigma, gdzie sigmajest szacowanym odchyleniem standardowym średniej z próby, podanym przez sigma = s / sqrt(n), gdzie sjest odchyleniem standardowym obliczonym na podstawie danych próbki i njest wielkością próby.

bogatron
źródło
29
scipy.stats.norm.interval(confidence, loc=mean, scale=sigma)
Jaime
4
Pierwotny pytający wskazał, że należy założyć rozkład normalny, ale warto zwrócić uwagę, że dla małych populacji prób (N <100 lub więcej) lepiej jest spojrzeć z w rozkładzie t Studenta zamiast w rozkładzie normalnym . Odpowiedź Shasana już to robi.
Russ
3
@bogatron, o sugerowanym rachunku różniczkowym dla przedziału ufności, nie byłby średnią +/- z * sigma / sqrt (n) , gdzie n to wielkość próby?
David
3
@David, masz rację. Zniekształciłem znaczenie sigma. sigmaw mojej odpowiedzi powinno być szacowane odchylenie standardowe średniej próby, a nie szacowane odchylenie standardowe rozkładu. Zaktualizowałem odpowiedź, aby to wyjaśnić. Dzięki za zwrócenie uwagi.
bogatron
15

Począwszy Python 3.8od biblioteki standardowej NormalDistobiekt jest częścią statisticsmodułu:

from statistics import NormalDist

def confidence_interval(data, confidence=0.95):
  dist = NormalDist.from_samples(data)
  z = NormalDist().inv_cdf((1 + confidence) / 2.)
  h = dist.stdev * z / ((len(data) - 1) ** .5)
  return dist.mean - h, dist.mean + h

To:

  • Tworzy NormalDistobiekt z próbki danych ( NormalDist.from_samples(data)co daje nam dostęp do średniej próbki i odchylenia standardowego za pośrednictwem NormalDist.meani NormalDist.stdev.

  • Oblicz Z-scorebazując na standardowym rozkładzie normalnym (reprezentowanym przez NormalDist()) dla danego poziomu ufności, używając odwrotności funkcji rozkładu skumulowanego ( inv_cdf).

  • Tworzy przedział ufności na podstawie odchylenia standardowego próbki i średniej.


Zakłada się, że wielkość próby jest wystarczająco duża (powiedzmy ponad ~ 100 punktów), aby do obliczenia zwartości użyć standardowego rozkładu normalnego zamiast rozkładu t studenta .

Xavier Guihot
źródło