Hitung interval kepercayaan dari data sampel

109

Saya memiliki data sampel yang ingin saya hitung interval kepercayaannya, dengan asumsi distribusi normal.

Saya telah menemukan dan menginstal paket numpy dan scipy dan mendapatkan numpy untuk mengembalikan mean dan deviasi standar (numpy.mean (data) dengan data menjadi daftar). Setiap saran tentang mendapatkan interval kepercayaan sampel akan sangat dihargai.

Bmayer0122
sumber
1
Saya pikir Anda yakin menentukan apakah Anda ingin menghitung CI untuk sampel rata-rata atau rata-rata populasi. Itu akan menentukan apakah Anda ingin menggunakan distribusi normal atau t untuk menghitung skor-z. Dan jawaban teratas di bawah ini untuk mean sampel, jadi pada distribusi digunakan.
Jake

Jawaban:

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

Anda bisa menghitung seperti ini.

shasan
sumber
1
sp.stats.stderr tidak digunakan lagi. Saya mengganti sp.stats.sem dan hasilnya bagus!
Bmayer0122
1
Mengimpor scipytidak selalu mengimpor semua subpaket secara otomatis. Lebih baik mengimpor sub-paket scipy.statssecara eksplisit.
Vikram
31
Hati-hati dengan penggunaan "pribadi" sp.stats.t._ppf. Saya tidak nyaman dengan itu di sana tanpa penjelasan lebih lanjut. Lebih baik gunakan sp.stats.t.ppfsecara langsung, kecuali Anda yakin tahu apa yang Anda lakukan. Pada pemeriksaan cepat sumber ada cukup banyak kode yang dilewati _ppf. Mungkin jinak, tetapi juga upaya pengoptimalan yang tidak aman?
Russ
Saya menyukainya karena Anda dapat menambahkan metode *ss.t._ppf((1+conf)/2.,n-1) bingkai .semdata panda bawaan sehingga Anda tidak perlu khawatirapply
TNT
1
Hanya ingin memperjelas perhitungan ini untuk rata-rata sampel, jadi pada distribusi digunakan. Jika pertanyaannya adalah untuk menghitung rata-rata populasi, distribusi normal harus digunakan dan interval kepercayaan akan lebih kecil untuk tingkat kepercayaan yang sama.
Jake
133

Berikut adalah versi singkat dari kode shasan, menghitung interval kepercayaan 95% dari mean array 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))

Tetapi menggunakan StatsModels ' tconfint_meanbisa dibilang lebih bagus:

import statsmodels.stats.api as sms

sms.DescrStatsW(a).tconfint_mean()

Asumsi yang mendasari keduanya adalah bahwa sampel (larik a) diambil secara independen dari distribusi normal dengan deviasi standar yang tidak diketahui (lihat MathWorld atau Wikipedia ).

Untuk ukuran sampel besar n, mean sampel terdistribusi normal, dan seseorang dapat menghitung interval kepercayaannya menggunakan st.norm.interval()(seperti yang disarankan dalam komentar Jaime). Tetapi solusi di atas juga benar untuk n kecil, di mana st.norm.interval()memberikan interval kepercayaan yang terlalu sempit (yaitu, "kepercayaan palsu"). Lihat jawaban saya untuk pertanyaan serupa untuk lebih jelasnya (dan salah satu komentar Russ di sini).

Berikut adalah contoh di mana opsi yang benar memberikan (pada dasarnya) interval kepercayaan yang identik:

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)

Dan akhirnya, hasil yang salah menggunakan 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
sumber
1
Saya yakin Anda harus menelepon st.t.interval(0.05)untuk mendapatkan interval kepercayaan 95%.
Scimonster
5
Tidak, st.t.interval(0.95)benar untuk interval kepercayaan 95%, lihat dokumen untuk scipy.stats.t. SciPy menyebutkan argumen tersebut alphatampaknya kurang dari ideal.
Ulrich Stern
Jika saya memiliki dua array data dan kemudian menghitung selisih meannya. Apakah ada cara untuk mendapatkan CI 95% untuk perbedaan rata-rata ini? Dapatkah Anda memikirkan cara mudah untuk melakukannya seperti yang Anda sediakan di sini dengan menggunakan StatsModelsl?
steven
@steven, ternyata, saya menjawab pertanyaan tentang ini. :)
Ulrich Stern
16

Mulailah dengan mencari nilai z untuk interval kepercayaan yang Anda inginkan dari tabel pencarian . Interval kepercayaan kemudian mean +/- z*sigma, di mana sigmaperkiraan deviasi standar rata-rata sampel Anda, diberikan oleh sigma = s / sqrt(n), di mana sdeviasi standar dihitung dari data sampel dan nukuran sampel Anda.

bogatron.dll
sumber
29
scipy.stats.norm.interval(confidence, loc=mean, scale=sigma)
Jaime
4
Penanya asli menunjukkan bahwa distribusi normal akan diasumsikan, tetapi perlu diperhatikan bahwa, untuk populasi sampel kecil (N <100 atau lebih), lebih baik mencari z dalam distribusi Student t daripada dalam distribusi normal . Jawaban shasan sudah melakukan ini.
Russ
3
@ Bogatron, tentang kalkulus yang disarankan untuk interval kepercayaan, tidak akan berarti +/- z * sigma / sqrt (n) , di mana n adalah ukuran sampel?
David
3
@ David, Anda benar. Saya salah menyatakan arti dari sigma. sigmadalam jawaban saya harus perkiraan deviasi standar rata-rata sampel, bukan deviasi standar perkiraan distribusi. Saya telah memperbarui jawaban untuk mengklarifikasi itu. Terima kasih telah menunjukkannya.
bogatron
15

Memulai Python 3.8, pustaka standar menyediakan NormalDistobjek sebagai bagian dari statisticsmodul:

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

Ini:

  • Membuat NormalDistobjek dari sampel data ( NormalDist.from_samples(data), yang memberi kita akses ke mean sampel dan deviasi standar melalui NormalDist.meandan NormalDist.stdev.

  • Hitung Z-scoreberdasarkan pada distribusi normal standar (diwakili oleh NormalDist()) untuk kepercayaan yang diberikan menggunakan kebalikan dari fungsi distribusi kumulatif ( inv_cdf).

  • Menghasilkan interval kepercayaan berdasarkan deviasi standar dan mean sampel.


Ini mengasumsikan ukuran sampel cukup besar (katakanlah lebih dari ~ 100 poin) untuk menggunakan distribusi normal standar daripada distribusi t siswa untuk menghitung znilai.

Xavier Guihot
sumber