Örnek verilerden bir güven aralığı hesaplayın


109

Normal bir dağılım varsayarak bir güven aralığı hesaplamak istediğim örnek verilerim var.

Numpy ve scipy paketlerini buldum ve yükledim ve bir ortalama ve standart sapma (liste olan verilerle numpy.mean (veri)) döndürmek için numpy aldım. Örnek bir güven aralığı elde etme konusunda herhangi bir tavsiye çok takdir edilecektir.


1
Örneklem ortalaması için CI'yı mı yoksa popülasyon ortalaması için mi hesaplamak istediğinizi kesinlikle belirttiğinizi düşünüyorum. Bu, z-skorunu hesaplamak için normal veya t dağılımını kullanmak isteyip istemediğinizi belirler. Ve aşağıdaki en üst cevap örnek ortalama içindir, bu yüzden dağıtımda kullanılır.
Jake,

Yanıtlar:


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

bu şekilde hesaplayabilirsiniz.


1
sp.stats.stderr kullanımdan kaldırıldı. Sp.stats.sem'i değiştirdim ve harika çalıştı!
Bmayer0122

1
İçe aktarma scipy, tüm alt paketleri otomatik olarak içe aktarmayabilir. Alt paketi scipy.statsaçıkça içe aktarmak daha iyidir.
Vikram

31
"Özel" kullanımına dikkat edin sp.stats.t._ppf. Daha fazla açıklama yapmadan orada olmasından rahatsızım. sp.stats.t.ppfNe yaptığınızı bildiğinizden emin değilseniz doğrudan kullanmak daha iyidir. Kaynağın hızlı bir şekilde incelenmesi üzerine , atlanan makul miktarda kod var _ppf. Muhtemelen zararsız ama aynı zamanda muhtemelen güvenli olmayan bir optimizasyon girişimi mi?
Russ

Bunu beğendim çünkü *ss.t._ppf((1+conf)/2.,n-1) yerleşik pandalar veri çerçevesi .semyöntemini ekleyebildiğiniz için endişelenmenize gerek yokapply
TNT

1
Açıklığa kavuşturmak istiyorum, bu hesaplama örnek ortalamadır, bu nedenle dağıtımda kullanılır. Sorular, popülasyon ortalamasını hesaplamaksa, normal bir dağılım kullanılmalı ve aynı güven seviyesi için güven aralığı daha küçük olacaktır.
Jake

133

Burada, dizi ortalamasının% 95 güven aralığını hesaplayan shasan kodunun kısaltılmış bir versiyonu 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))

Ancak StatsModels'i kullanmak tconfint_meantartışmasız daha da güzel:

import statsmodels.stats.api as sms

sms.DescrStatsW(a).tconfint_mean()

Her ikisi için de temel varsayımlar, örneğin (dizi a) bilinmeyen standart sapma ile normal bir dağılımdan bağımsız olarak çizildiğidir (bkz. MathWorld veya Wikipedia ).

Büyük örneklem büyüklüğü n için, örneklem ortalaması normal olarak dağıtılır ve biri kullanılarak güven aralığı hesaplanabilir st.norm.interval()(Jaime'nin yorumunda önerildiği gibi). Ancak yukarıdaki çözümler, st.norm.interval()çok dar güven aralıkları veren küçük n için de doğrudur (yani, "sahte güven"). Daha fazla ayrıntı için benzer bir soruya verdiğim yanıta bakın (ve Russ'ın yorumlarından biri burada).

Doğru seçeneklerin (esasen) aynı güven aralıklarını verdiği bir örnek:

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)

Ve son olarak, kullanarak yanlış sonuç st.norm.interval():

In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)

1
st.t.interval(0.05)% 95 güven aralığını öğrenmek için aramanız gerektiğine inanıyorum .
Scimonster

5
Hayır, st.t.interval(0.95)% 95 güven aralığı için doğrudur, için dokümanlara bakın scipy.stats.t. SciPy'nin argümanı adlandırması alphaidealden daha az görünüyor.
Ulrich Stern

İki veri dizim varsa ve sonra ortalamalarının farkını hesaplarsam. Bu ortalama fark için% 95 CI almanın bir yolu var mı? StatsModelsl kullanarak burada sağladığınız gibi yapmanın kolay bir yolunu düşünebiliyor musunuz?
steven

@steven, çıkıyor, bununla ilgili bir soruyu cevapladım . :)
Ulrich Stern

16

Bir başvuru tablosundan istediğiniz güven aralığı için z değerini aramakla başlayın . Güven aralığı daha sonra , nerede tarafından verilen örnek ortalaması tahmini standart sapması olduğu , nerede sizin örnek verilerden hesaplanan standart sapma ve sizin örnek boyutudur.mean +/- z*sigmasigmasigma = s / sqrt(n)sn


29
scipy.stats.norm.interval(confidence, loc=mean, scale=sigma)
Jaime

4
Asıl soru soran kişi, normal bir dağılımın varsayılması gerektiğini belirtti, ancak küçük örnek popülasyonlar için (N <100 veya daha fazla), z'yi normal dağılım yerine Student t dağılımında aramanın daha iyi olduğuna işaret etmeye değer. . shasan'ın cevabı bunu zaten yapıyor.
Russ

3
Güven aralığı için önerilen analiz hakkında @bogatron, ortalama +/- z * sigma / sqrt (n) olmaz , burada n örneklem büyüklüğüdür?
David

3
@David, haklısın. Anlamını yanlış beyan ettim sigma. sigmabenim cevabımda, dağılımın tahmini standart sapması değil, örnek ortalamasının tahmini standart sapması olmalıdır. Bunu açıklığa kavuşturmak için cevabı güncelledim. Bunu belirttiğiniz için teşekkürler.
bogatron

15

Başlangıç ​​olarak Python 3.8, standart kütüphane NormalDistnesneyi statisticsmodülün bir parçası olarak sağlar :

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

Bu:

  • NormalDistVeri örneğinden bir nesne oluşturur ( NormalDist.from_samples(data)bu, numunenin ortalamasına ve standart sapmasına NormalDist.meanve NormalDist.stdev.

  • Kümülatif dağılım işlevinin ( ) tersini kullanarak verilen güvenirlik için Z-scorestandart normal dağılıma (ile temsil edilen NormalDist()) göre hesaplayın inv_cdf.

  • Numunenin standart sapmasına ve ortalamasına göre güven aralığını üretir.


Bu, zdeğeri hesaplamak için öğrencinin t dağılımından ziyade standart normal dağılımı kullanmak için örnek boyutunun yeterince büyük olduğunu varsayar (~ 100 puandan fazla diyelim) .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.