সাধারণ বন্টন এবং গড় বিচ্যুতিতে সম্ভাব্যতা কীভাবে গণনা করা যায়?


91

পাইথনে স্ট্যান্ডার্ড গড় বিতরণে সম্ভাব্যতা গণনা কিভাবে? আমি এই প্রশ্নের ওপির মতো সংজ্ঞা অনুসারে আমি সর্বদা স্পষ্টভাবে নিজের ফাংশনটি কোড করতে পারি: পাইথনের ডিস্ট্রিবিউশনে এলোমেলো পরিবর্তনের সম্ভাবনা গণনা

কোনও লাইব্রেরির ফাংশন কল রয়েছে কিনা তা ভেবেই আপনাকে এই করতে দেওয়া হবে। আমার ধারণায় এটি এটি পছন্দ করবে:

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

পার্লেও একই রকম প্রশ্ন রয়েছে: পারলে একটি সাধারণ বিতরণ দেওয়ার পরে আমি কীভাবে সম্ভাবনাটি গণনা করতে পারি? । তবে পাইথনে একটিও দেখিনি।

Numpyএকটি random.normalফাংশন আছে, তবে এটি নমুনা দেওয়ার মতো, আমি যা চাই ঠিক তা নয়।

উত্তর:


129

স্কিপি.স্ট্যাটসে একটি আছে :

>>> 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)পরিবর্তে লিখেন তবে তা এটি গ্রহণ করবে তবে নীরবে সেই অতিরিক্ত কীওয়ার্ড যুক্তিগুলি বাতিল করে দেবে এবং আপনাকে ডিফল্ট (0,1) দেবে]]scipy.stats.norm(100, 12)scipy.stats.norm(loc=100, scale=12)


4
আপনি কিভাবে ব্যাপ্তি থেকে সম্ভাবনা পাবেন? 98 - 102 থেকে বলুন?
লিওন

4
@ ডিএসএম: আপনার উপরের উদাহরণে, আপনি যখন বলছেন scipy.stats.norm(100, 12).pdf(98), তার অর্থ কি এই সাথে বিতরণে 98 প্রাপ্তির সম্ভাবনা রয়েছে mean 100 এবং stddev 12তা 0.032কি?
শ্রীবতসান

14
@ দ্য প্রিডেটর: না, গড় বিতরণে ১০০ এবং স্টাডিডিভ 12 দিয়ে একটি সাধারণ বিতরণে 98 পাওয়ার সম্ভাবনা শূন্য। :-) সম্ভাবনার ঘনত্ব 0.032।
ডিএসএম 21

সেক্ষেত্রে সম্ভাব্যতার ঘনত্বের অর্থ হ'ল y-মান, সাধারণ বিতরণের জন্য এক্স-মান 1.42 দেওয়া। সিডিএফ এর অর্থ আমরা বক্ররেখার নিচে অঞ্চল হিসাবে চিহ্নিত করি।
কাটার

4
@Leon, যে rv.cdf(102) - rv.cdf(98)যেখানে rv = scipy.stats.norm(100, 12)
22

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.wikedia.org/wiki/Normal_dist تقسیم#Probability_density_function

পরীক্ষা করতে:

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

আরে, এটি একটি দুর্দান্ত উত্তর। আপনি কি ধাপে ধাপে ব্যাখ্যা প্রদান করতে আপত্তি করবেন, সম্ভবত?
ল্লেমাজেডন

এই পদ্ধতিতে স্কিপি
এমকেএম

তবে স্কিপি অর্থ, স্টাডিভ এবং নমুনার অ্যারেগুলি পরিচালনা করতে পারে: অর্থ = [5, 10, 20] স্টডিডেভ = [20, 30, 40] এক্স ইন এর জন্য ([5, 10, 20], [10, 20, 40], [১৫, ৩০, ৫০],): প্রোব = স্কিপি.স্ট্যাটস.এনর্ম (মানে, এসডিডিডিভ) .সিডিএফ (এক্স) প্রিন্ট (f'prob = {প্রোব} ') আউটপুট: প্রোব = [0.5 0.5 0.5] প্রোব = [ 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 এর কাছাকাছি হবে) একটি নির্দিষ্ট গড় ( mu) এবং স্ট্যান্ডার্ড বিচ্যুতি ( sigma) এর জন্য:

from statistics import NormalDist

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

এছাড়াও লক্ষ করুন যে NormalDistবস্তুটি সংশ্লেষিত বিতরণ ফাংশনও সরবরাহ করে ( cdf- সম্ভাব্যতা যে এলোমেলোভাবে নমুনা এক্স এর চেয়ে কম বা x এর সমান হবে):

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

4

আপনি যদি x এর অর্থ 2 মানের 2 এর মধ্যবর্তী অঞ্চলটি দেখতে চান; মান বিচ্যুতি = 2; [০.৫,২] এর মধ্যে x এর সম্ভাবনা

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

3

উত্তরে উল্লিখিত উইকিপিডিয়া থেকে উদ্ধৃত সূত্রটি সাধারণ সম্ভাব্যতা গণনা করতে ব্যবহার করা যাবে না। সম্ভাব্যতা গণনা করার জন্য আপনাকে সেই সূত্রটি ব্যবহার করে একটি সংখ্যার একীকরণের আনুমানিক ফাংশনটি লিখতে হবে।

এই সূত্রটি সম্ভাব্যতা ঘনত্ব ফাংশনের জন্য মান গণনা করে। যেহেতু সাধারণ বিতরণ অবিচ্ছিন্ন, সম্ভাবনা পাওয়ার জন্য আপনাকে অবিচ্ছেদ্য গণনা করতে হবে। উইকিপিডিয়া সাইটে সিডিএফ উল্লেখ রয়েছে, যার সাধারণ বন্টনের জন্য কোনও বন্ধ ফর্ম নেই।


4
আপনার অবদানের জন্য আপনাকে ধন্যবাদ, যদিও আপনি যে উত্তরটির উল্লেখ করছেন তার মন্তব্যের জন্য এটি আরও উপযুক্ত হবে: যদি আমি ভালভাবে বুঝতে পারি তবে আপনি সত্যিকার অর্থেই মূল প্রশ্নের উত্তর দিচ্ছেন না। এইভাবে, প্রত্যেকে প্রথম নজরে দেখবে আপনি কী বলছেন।
পিয়েরে প্রিন্টেটি

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)

4
লিঙ্কটি একটি মূল্যবান উত্তর সরবরাহ করতে পারে, এসও ব্যবহারকারীরা তাদের কোডগুলি এখানে এসও লিঙ্কগুলিতে পোস্ট করতে বলেছে একটি রেফারেন্স হিসাবে দরকারী, তবে তারা কিছুক্ষণ পরে ভাঙবে, ভবিষ্যতের দর্শকদের জন্য সমাধানকে অ্যাক্সেসযোগ্য করে তুলবে।
মিঃ টি

0

আপনি কেবল ত্রুটি ফাংশনটি ব্যবহার করতে পারেন যা গণিতের গ্রন্থাগারে অন্তর্নির্মিত রয়েছে, যেমন তাদের ওয়েবসাইটে বলা হয়েছে ।


পাইপথন 2-তেও @ ইউজার 2340146 না, ডকস.পিথন.আর / 2 / লাইব্রেরি
বল্টজম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.