सामान्य वितरण में माध्य और मानक विचलन में संभाव्यता की गणना कैसे करें?


91

सामान्य वितरण में संभावना की गणना कैसे की जाती है, पायथन में std? मैं हमेशा स्पष्ट रूप से अपने स्वयं के फ़ंक्शन को ओपी की तरह परिभाषा के अनुसार कोड कर सकता हूं इस प्रश्न में: पायथन में एक वितरण में एक यादृच्छिक चर की संभावना की गणना

बस सोच रहा था कि कोई लाइब्रेरी फंक्शन कॉल है जो आपको ऐसा करने की अनुमति देगा। मेरी कल्पना में यह इस तरह होगा:

nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)

पर्ल में एक समान प्रश्न है: मैं पर्ल में सामान्य वितरण को देखते हुए संभावना की गणना कैसे कर सकता हूं? । लेकिन मैंने पायथन में एक नहीं देखा।

Numpyएक random.normalसमारोह है, लेकिन यह नमूना जैसा है, वैसा नहीं जैसा मैं चाहता हूं।

जवाबों:


129

Scipy.stats में एक है :

>>> import scipy.stats
>>> scipy.stats.norm(0, 1)
<scipy.stats.distributions.rv_frozen object at 0x928352c>
>>> scipy.stats.norm(0, 1).pdf(0)
0.3989422804014327
>>> scipy.stats.norm(0, 1).cdf(0)
0.5
>>> scipy.stats.norm(100, 12)
<scipy.stats.distributions.rv_frozen object at 0x928352c>
>>> scipy.stats.norm(100, 12).pdf(98)
0.032786643008494994
>>> scipy.stats.norm(100, 12).cdf(98)
0.43381616738909634
>>> scipy.stats.norm(100, 12).cdf(100)
0.5

[एक बात से सावधान रहना - बस एक टिप - यह है कि गुजर रहा पैरामीटर थोड़ा व्यापक है। कोड सेट करने के तरीके के कारण, यदि आप गलती scipy.stats.norm(mean=100, std=12)से scipy.stats.norm(100, 12)या इसके बजाय लिख देते हैं scipy.stats.norm(loc=100, scale=12), तो वह इसे स्वीकार कर लेगा, लेकिन चुपचाप उन अतिरिक्त कीवर्ड तर्क को छोड़ दें और आपको डिफ़ॉल्ट (0,1) दे दें।]


3
आपको श्रेणियों से संभावनाएँ कैसे मिलेंगी? 98 से कहो - 102?
लियोन

2
@DSM: आपके उपरोक्त उदाहरण में, जब आप कहते हैं scipy.stats.norm(100, 12).pdf(98), क्या इसका मतलब वितरण के साथ 98 होने की संभावना है mean 100 और stddev 12है 0.032?
श्रीवत्स

14
@ ThePredator: नहीं, मतलब 100 और stddev 12 के साथ एक सामान्य वितरण में 98 प्राप्त करने की संभावना शून्य है। :-) प्रायिकता घनत्व 0.032 है।
DSM

उस स्थिति में संभाव्यता घनत्व का अर्थ है वाई-मान, सामान्य वितरण के लिए x-मूल्य 1.42। cdf का मतलब है कि हम वक्र के तहत क्षेत्र के रूप में क्या संदर्भित करते हैं।
टुकड़ों में

5
@ लियोन, वह rv.cdf(102) - rv.cdf(98)जहां है rv = scipy.stats.norm(100, 12)
fuglede

46

Scipy.stats एक बेहतरीन मॉड्यूल है। बस एक और दृष्टिकोण की पेशकश करने के लिए, आप सीधे इसका उपयोग करके गणना कर सकते हैं

import math
def normpdf(x, mean, sd):
    var = float(sd)**2
    denom = (2*math.pi*var)**.5
    num = math.exp(-(float(x)-float(mean))**2/(2*var))
    return num/denom

यह यहाँ पाए गए सूत्र का उपयोग करता है: http://en.wikipedia.org/wiki/Normal_distribution#Probability_density_function

मापना:

>>> normpdf(7,5,5)  
0.07365402806066466
>>> norm(5,5).pdf(7)
0.073654028060664664

अरे, यह बहुत अच्छा जवाब है। क्या आप चरण-दर-चरण स्पष्टीकरण प्रदान करना चाहेंगे, शायद?
लेलमेडेडन

इस विधि को
स्काइप की

लेकिन डरपोक साधनों, stdevs और नमूनों की सरणियों को संभाल सकता है: mean = [5, 10, 20] stddev = [20, 30, 40] x के लिए ([5, 10, 20], [10, 20, 40]। [१५, ३०, ५०],): प्रोब = scipy.stats.norm (माध्य, stddev) .cdf (x) प्रिंट (f'prob = {प्रोब} ’) आउटपुट: प्रोब = [०.५ ०.५] प्रोब = 0.59870633 0.63055866 0.69146246] प्रोब = [0.69146246 0.74750746 0.77337265]
जॉन दीघन

16

यहाँ अधिक जानकारी है । पहले आप एक जमे हुए वितरण के साथ काम कर रहे हैं (इस मामले में जमे हुए इसका मतलब है कि इसके पैरामीटर विशिष्ट मानों पर सेट हैं)। एक जमे हुए वितरण बनाने के लिए:

import scipy.stats
scipy.stats.norm(loc=100, scale=12)
#where loc is the mean and scale is the std dev
#if you wish to pull out a random number from your distribution
scipy.stats.norm.rvs(loc=100, scale=12)

#To find the probability that the variable has a value LESS than or equal
#let's say 113, you'd use CDF cumulative Density Function
scipy.stats.norm.cdf(113,100,12)
Output: 0.86066975255037792
#or 86.07% probability

#To find the probability that the variable has a value GREATER than or
#equal to let's say 125, you'd use SF Survival Function 
scipy.stats.norm.sf(125,100,12)
Output: 0.018610425189886332
#or 1.86%

#To find the variate for which the probability is given, let's say the 
#value which needed to provide a 98% probability, you'd use the 
#PPF Percent Point Function
scipy.stats.norm.ppf(.98,100,12)
Output: 124.64498692758187

मैं पर्याप्त धन्यवाद नहीं कर सकता जिसने भी यह उत्तर लिखा है। मैं इसे हल करने के लिए हर जगह देख रहा था लेकिन इसे खोजने में सक्षम नहीं था। और कोड के साथ टिप्पणियों को जोड़ने से वास्तव में मुझे यह समझने में मदद मिली कि क्या हो रहा है। बहुत बहुत धन्यवाद।
भोला प्रसाद

बस एक सवाल पूछना चाहता हूं, जब डेटा सामान्य रूप से वितरित नहीं किया जाता है, तो इन संभावनाओं की गणना कैसे करें? मुझे इस मामले में क्या करना है?
भोला प्रसाद

12

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

इसका उपयोग संभाव्यता घनत्व फ़ंक्शन को प्राप्त करने के लिए किया जा सकता है ( pdf- संभावना है कि किसी दिए गए माध्य के लिए एक यादृच्छिक नमूना X दिए गए मान x के पास होगा) (mu ) और मानक विचलन ( sigma) के लिए किया जा सकता है:

from statistics import NormalDist

NormalDist(mu=100, sigma=12).pdf(98)
# 0.032786643008494994

यह भी ध्यान दें कि NormalDistऑब्जेक्ट संचयी वितरण फ़ंक्शन भी प्रदान करता है ( cdf- संभावना है कि एक यादृच्छिक नमूना X, x से कम या बराबर होगा):

NormalDist(mu=100, sigma=12).cdf(98)
# 0.43381616738909634

4

यदि आप x माध्य = 1 के 2 मानों के बीच का क्षेत्र ज्ञात करना चाहते हैं; मानक विचलन = 2; [0.5,2] के बीच x की संभावना

import scipy.stats
scipy.stats.norm(1, 2).cdf(2) - scipy.stats.norm(1,2).cdf(0.5)

3

उत्तर में उल्लिखित विकिपीडिया से उद्धृत सूत्र का उपयोग सामान्य संभाव्यता की गणना के लिए नहीं किया जा सकता है। संभाव्यता की गणना करने के लिए आपको उस सूत्र का उपयोग करके एक संख्यात्मक एकीकरण सन्निकटन फ़ंक्शन लिखना होगा।

वह सूत्र संभाव्यता घनत्व फ़ंक्शन के लिए मान की गणना करता है। चूंकि सामान्य वितरण निरंतर है, आपको संभावनाओं को प्राप्त करने के लिए एक अभिन्न गणना करनी होगी। विकिपीडिया साइट में सीडीएफ का उल्लेख है, जिसमें सामान्य वितरण के लिए एक बंद रूप नहीं है।


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

1

मैंने आपके लिए गणित करने के लिए यह कार्यक्रम लिखा था। बस सारांश आँकड़ों में दर्ज करें। कोई सरणी प्रदान करने की आवश्यकता नहीं है:

जनसंख्या अनुपात के लिए एक-नमूना जेड-टेस्ट:

अनुपात के बजाय माध्य के लिए ऐसा करने के लिए, z के अनुसार सूत्र बदलें

संपादित करें:
यहाँ लिंक से सामग्री है:

import scipy.stats as stats
import math

def one_sample_ztest_pop_proportion(tail, p, pbar, n, alpha):
    #Calculate test stat

    sigma = math.sqrt((p*(1-p))/(n))
    z = round((pbar - p) / sigma, 2)

    if tail == 'lower':
        pval = round(stats.norm(p, sigma).cdf(pbar),4)
        print("Results for a lower tailed z-test: ")


    elif tail == 'upper':
        pval = round(1 - stats.norm(p, sigma).cdf(pbar),4)
        print("Results for an upper tailed z-test: ")


    elif tail == 'two':
        pval = round(stats.norm(p, sigma).cdf(pbar)*2,4)
        print("Results for a two tailed z-test: ")


    #Print test results
    print("Test statistic = {}".format(z))   
    print("P-value = {}".format(pval))
    print("Confidence = {}".format(alpha))

    #Compare p-value to confidence level
    if pval <= alpha:
        print("{} <=  {}. Reject the null hypothesis.".format(pval, alpha))
    else:
        print("{} > {}. Do not reject the null hypothesis.".format(pval, alpha))


#one_sample_ztest_pop_proportion('upper', .20, .25, 400, .05)

#one_sample_ztest_pop_proportion('two', .64, .52, 100, .05)

2
हालांकि लिंक एक मूल्यवान उत्तर प्रदान कर सकता है, इसलिए SO उपयोगकर्ताओं को अपने कोड को यहां पोस्ट करने के लिए कहता है SO लिंक एक संदर्भ के रूप में उपयोगी होते हैं, लेकिन वे थोड़ी देर बाद टूट जाते हैं, जिससे भविष्य के आगंतुकों के लिए समाधान दुर्गम हो जाता है।
श्री टी।

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