नमूना डेटा से एक विश्वास अंतराल की गणना करें


109

मेरे पास नमूना डेटा है जिसे मैं सामान्य वितरण मानते हुए, एक विश्वास अंतराल की गणना करना चाहूंगा।

मैंने सुन्न और डरावने पैकेजों को पाया और स्थापित किया है और एक औसत और मानक विचलन (numpy.mean (डेटा) एक सूची में होने के साथ वापसी के लिए सुन्न हो गया है)। एक नमूना विश्वास अंतराल प्राप्त करने पर कोई सलाह बहुत सराहना की जाएगी।


1
मुझे लगता है कि आप सुनिश्चित करें कि आप नमूना माध्य या जनसंख्या माध्य के लिए CI की गणना करना चाहते हैं। यह निर्धारित करेगा कि क्या आप z- स्कोर की गणना के लिए सामान्य या टी वितरण का उपयोग करना चाहते हैं। और नीचे दिए गए शीर्ष उत्तर नमूना माध्य के लिए है, इसलिए वितरण में उपयोग किया जाता है।
जेक

जवाबों:


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

आप इस तरह से गणना कर सकते हैं।


1
sp.stats.stderr पदावनत है। मैंने sp.stats.sem को प्रतिस्थापित किया और इसने बहुत अच्छा काम किया!
Bmayer0122

1
आयात करना scipyजरूरी नहीं है कि सभी उपकेंद्रों को स्वचालित रूप से आयात करें। उप-पैकेज को scipy.statsस्पष्ट रूप से आयात करने के लिए बेहतर है ।
विक्रम

31
की "निजी" उपयोग के साथ सावधान sp.stats.t._ppf। मैं उस के साथ सहज नहीं हूँ और बिना किसी स्पष्टीकरण के वहाँ हूँ। sp.stats.t.ppfसीधे उपयोग करने के लिए बेहतर है , जब तक कि आप सुनिश्चित नहीं हैं कि आप जानते हैं कि आप क्या कर रहे हैं। स्रोत के त्वरित निरीक्षण पर कोड की एक उचित मात्रा के साथ छोड़ दिया गया है _ppf। संभवतः सौम्य, लेकिन संभवतः एक असुरक्षित अनुकूलन प्रयास भी?
रस

मुझे यह पसंद है क्योंकि आप केवल *ss.t._ppf((1+conf)/2.,n-1) अंतर्निहित पांडा डेटाफ़्रेम .semविधि में जोड़ सकते हैं ताकि आपको चिंता करने की ज़रूरत न होapply
टीएनटी

1
बस यह स्पष्ट करना चाहते हैं कि यह गणना नमूना के लिए है, इसलिए वितरण में उपयोग किया जाता है। यदि प्रश्नों का मतलब जनसंख्या की गणना करना है, तो एक सामान्य वितरण का उपयोग किया जाना चाहिए और आत्मविश्वास अंतराल समान आत्मविश्वास के स्तर के लिए छोटा होगा।
जेक

133

यहाँ शॉन के कोड का एक छोटा संस्करण है, जो व्यूह के अर्थ के 95% विश्वास अंतराल की गणना करता है 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))

लेकिन StatsModels का उपयोग tconfint_meanकरना यकीनन अच्छा है:

import statsmodels.stats.api as sms

sms.DescrStatsW(a).tconfint_mean()

दोनों के लिए अंतर्निहित धारणा यह है कि नमूना (सरणी a) अज्ञात मानक विचलन (देखें मैथवर्ल्ड या विकिपीडिया ) के साथ एक सामान्य वितरण से स्वतंत्र रूप से तैयार किया गया था ।

बड़े नमूना आकार n के लिए, नमूना माध्य सामान्य रूप से वितरित किया जाता है, और कोई इसके उपयोग से अपने आत्मविश्वास अंतराल की गणना कर सकता है st.norm.interval()(जैसा कि Jaime की टिप्पणी में सुझाव दिया गया है)। लेकिन उपरोक्त समाधान छोटे n के लिए भी सही हैं, जहां st.norm.interval()आत्मविश्वास अंतराल देता है जो बहुत संकीर्ण हैं (यानी, "नकली आत्मविश्वास")। अधिक विवरण के लिए एक समान प्रश्न के लिए मेरा जवाब देखें (और यहां रसेल की टिप्पणियों में से एक)।

यहां एक उदाहरण जहां सही विकल्प (अनिवार्य रूप से) समान आत्मविश्वास अंतराल देते हैं:

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)

और अंत में, गलत परिणाम का उपयोग कर 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% विश्वास अंतराल प्राप्त करने के लिए कॉल करना चाहिए ।
शमौनस्टर

5
नहीं है, st.t.interval(0.95)95% विश्वास अंतराल के लिए, देखना सही है डॉक्स के लिए scipy.stats.t। SciPy का नामकरण तर्क alphaसे कम लगता है, हालांकि।
उलरिक स्टर्न

यदि मेरे पास डेटा के दो सरणियाँ हैं और फिर उनके माध्य के अंतर की गणना की जाती है। क्या इस अंतर के लिए 95% CI प्राप्त करने का कोई तरीका है? क्या आप इसे StatsModelsl का उपयोग करके अपने द्वारा प्रदान किए गए किसी भी आसान तरीके के बारे में सोच सकते हैं?
स्टीवन

@ जल्दी, पता चला, मैंने इस बारे में एक सवाल का जवाब दिया । :)
उलरिच स्टर्न

16

लुक-अप तालिका से अपने इच्छित आत्मविश्वास अंतराल के लिए z- मूल्य की तलाश शुरू करें । विश्वास अंतराल तब है , जहां आपके नमूना माध्य का अनुमानित मानक विचलन है , जहां दिया गया है , जहां आपके नमूना डेटा से गणना की गई मानक विचलन है और आपका नमूना आकार है।mean +/- z*sigmasigmasigma = s / sqrt(n)sn


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

4
मूल प्रश्नकर्ता ने संकेत दिया कि एक सामान्य वितरण को ग्रहण किया जाना था, लेकिन यह इंगित करने योग्य है कि, छोटे नमूना आबादी (एन <100 या तो) के लिए, सामान्य वितरण के बजाय छात्र टी के वितरण में z को देखना बेहतर है। । शसन का जवाब पहले से ही ऐसा करता है।
रस

3
@bogatron, आत्मविश्वास अंतराल के लिए सुझाए गए कलन के बारे में, मतलब नहीं होगा +/- z * सिग्मा / sqrt (n) , जहां n नमूना आकार है?
डेविड

3
@ डेविड, आप सही हैं। मैंने का अर्थ गलत बताया sigmasigmaमेरे जवाब में नमूना माध्य का अनुमानित मानक विचलन होना चाहिए, न कि वितरण का अनुमानित मानक विचलन। मैंने स्पष्ट करने के लिए उत्तर को अपडेट कर दिया है। यह बात बताने के लिए धन्यवाद।
बोगट्रॉन

15

प्रारंभ करना Python 3.8, मानक पुस्तकालय मॉड्यूल के NormalDistभाग के रूप में वस्तु प्रदान करता है statistics:

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

यह:

  • NormalDistडेटा सैंपल से एक ऑब्जेक्ट बनाता है ( NormalDist.from_samples(data)जो हमें सैंपल के माध्य और मानक विचलन के माध्यम से पहुँच प्रदान करता है NormalDist.meanऔर) NormalDist.stdev

  • संचयी वितरण फ़ंक्शन ( ) के व्युत्क्रम का उपयोग करके दिए गए विश्वास के लिए Z-scoreमानक सामान्य वितरण (द्वारा प्रतिनिधित्व NormalDist()) के आधार पर गणना करें inv_cdf

  • नमूना के मानक विचलन और माध्य के आधार पर आत्मविश्वास अंतराल का उत्पादन करता है।


यह मान लेता है कि नमूना आकार काफी बड़ा है ( zमान को गणना करने के लिए छात्र के t वितरण के बजाय मानक सामान्य वितरण का उपयोग करने के लिए ~ 100 अंक से अधिक कहते हैं) ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.