Jak obliczyć prawdopodobieństwo w rozkładzie normalnym przy danej średniej, standardowej w Pythonie? Zawsze mogę jawnie zakodować własną funkcję zgodnie z definicją, tak jak zrobił to OP w tym pytaniu: Obliczanie prawdopodobieństwa zmiennej losowej w dystrybucji w Pythonie
Zastanawiam się tylko, czy istnieje wywołanie funkcji biblioteki, które pozwoli ci to zrobić. W moim wyobrażeniu wyglądałoby to tak:
nd = NormalDistribution(mu=100, std=12)
p = nd.prob(98)
W Perlu pojawia się podobne pytanie: jak mogę obliczyć prawdopodobieństwo w punkcie, który ma rozkład normalny w Perlu? . Ale nie widziałem żadnego w Pythonie.
Numpy
ma random.normal
funkcję, ale przypomina próbkowanie, a nie jest dokładnie tym, czego chcę.
źródło
scipy.stats.norm(100, 12).pdf(98)
, czy oznacza to prawdopodobieństwo uzyskania 98 w dystrybucji zmean 100
istddev 12
wynosi0.032
?rv.cdf(102) - rv.cdf(98)
tamrv = scipy.stats.norm(100, 12)
.Scipy.stats to świetny moduł. Aby zaoferować inne podejście, możesz to obliczyć bezpośrednio za pomocą
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
Wykorzystuje wzór znaleziony tutaj: http://en.wikipedia.org/wiki/Normal_distribution#Probability_density_function
testować:
>>> normpdf(7,5,5) 0.07365402806066466 >>> norm(5,5).pdf(7) 0.073654028060664664
źródło
Tutaj jest więcej informacji . Najpierw mamy do czynienia z rozkładem zamrożonym (w tym przypadku zamrożony oznacza, że jego parametry są ustawione na określone wartości). Aby utworzyć zamrożoną dystrybucję:
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
źródło
Zaczynając
Python 3.8
, biblioteka standardowa udostępniaNormalDist
obiekt jako częśćstatistics
modułu.Można go użyć do uzyskania funkcji gęstości prawdopodobieństwa (
pdf
- prawdopodobieństwo, że próbka losowa X będzie blisko podanej wartości x) dla danej średniej (mu
) i odchylenia standardowego (sigma
):from statistics import NormalDist NormalDist(mu=100, sigma=12).pdf(98) # 0.032786643008494994
Należy również zauważyć, że
NormalDist
obiekt zapewnia również skumulowaną funkcję rozkładu (cdf
- prawdopodobieństwo, że losowa próbka X będzie mniejsza lub równa x):NormalDist(mu=100, sigma=12).cdf(98) # 0.43381616738909634
źródło
W przypadku, gdy chciałbyś znaleźć obszar pomiędzy 2 wartościami x średnia = 1; odchylenie standardowe = 2; prawdopodobieństwo x między [0,5,2]
import scipy.stats scipy.stats.norm(1, 2).cdf(2) - scipy.stats.norm(1,2).cdf(0.5)
źródło
Cytowany w odpowiedziach wzór z Wikipedii nie może być użyty do obliczenia normalnych probabilitów. Aby obliczyć prawdopodobieństwo, należałoby napisać funkcję przybliżania całkowania numerycznego przy użyciu tego wzoru.
Ta formuła oblicza wartość funkcji gęstości prawdopodobieństwa. Ponieważ rozkład normalny jest ciągły, aby otrzymać prawdopodobieństwa, musisz obliczyć całkę. Witryna wikipedii wspomina o CDF, który nie ma zamkniętej formy dla normalnej dystrybucji.
źródło
Napisałem ten program, żeby zrobić dla ciebie matematykę. Wystarczy wejść w podsumowanie statystyk. Nie ma potrzeby dostarczania tablicy:
Test Z dla jednej próbki dla proporcji populacji:
Aby to zrobić dla średniej zamiast proporcji, odpowiednio zmień wzór na z
EDYCJA:
Oto treść z linku:
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)
źródło
Możesz po prostu użyć funkcji błędu wbudowanej w bibliotekę matematyczną, jak podano na ich stronie internetowej .
źródło