Nå skal vi se på noen diskrete sannsynlighetsfordelinger. Vi starter med binomisk fordeling. Scipy sin stats-modul inneholder ferdig funksjonalitet for denne, og mange andre diskrete fordelinger.
La oss si at vi har en bøyd mynt som har 60% sjanse for kron. Vi kaster den 10 ganger. Hva er sannsynligheten for at vi får 0, 1, 2 eller 3 kron?
from scipy.stats import binom # Importerer / henter inn binom (Binomisk fordeling)
n = 10
p = 0.6
mynt_kron = binom.pmf([0, 1, 2, 3], n, p)
mynt_kron
Her bruker vi "pmf"-metoden til binom-fordelingen. PMF står for "Probability Mass Function". Vi sier at vi vil ha sannsynligheten for 0, 1, 2 og 3 kron (første parameter), med 10 kast (andre parameter). Hvert kast er uavhengig av tidligere kast, og har 60% (0.6) sjanse for kron.
Vi ser at vi får tilbake en liste. Første verdi er sannsynligheten for 0 kron, andre verdi for 1 kron osv. Hvis vi vil ha summen av sannsynlighetene, bruker vi "sum"-funksjonen til Python, slik:
sum(mynt_kron)
Vi ser dermed at det er ca 5.5% sjanse for at vi får 0, 1, 2 eller 3 kron på 10 kast, med denne bøyde mynten.
Videre kan vi også finne variansen til en binomisk fordeling, ved å bruke "var"-funksjonen til "binom". Her er parameterne 10 og 0.6 hhv. antall kast, og sannsynlighet for kron.
print('Varians:', binom.var(n, p))
print('Forventning:', n * p)
Vi kan plotte sannsynlighetsfordelingen ved å hente inn Series-objektet fra Pandas. Vi bruker "binom", som tidligere, men nå henter vi verdier for hele intervallet vi er interesserte i.
%matplotlib inline
from pandas import Series
import matplotlib.pyplot as plt
# Som over, men her henter vi for alle de diskrete verdiene, ikke bare 0, 1, 2, 3
mynt_alle = binom.pmf(range(n+1), n, p) # range(n+1) gir oss en liste med n elementer [0, ... n]
# Lage en Pandas-serie med datapunktene
data = Series(mynt_alle)
# Plotte fordelingen som et stolpediagram
data.plot.bar(width=0.1)
plt.show()
Alle de diskrete sannsynlighetsfordelingene i scipy.stats-modulen brukes på en ganske tilsvarende måte. Vi gir dem noen parametere inn i fordelingens "pmf"-funksjon. Man har også tilgang til f.eks. varians og standardavvik på en tilsvarende måte som i den binomiske sannsynlighetsfordelingen vi brukte over.
Vi skal nå se på den hypergeometriske sannsynlighetsfordelingen.
Eksempel: Vi har en blandingspose med peanøtter og cashewnøtter. Det er 20 peanøtter og 10 cashewnøtter igjen. Du snur posen opp ned, og det ramler ut åtte nøtter. Selv om peanøtter og cashewnøtter har litt ulik form, regner vi med at dette ikke har noen innvirkning på hva som faller ut av posen.
Hva er sannsynligheten for å færre enn tre cashewnøtter?
from scipy.stats import hypergeom
xs = [0, 1, 2]
n = 8
S = 10
N = 30
notter = hypergeom.pmf(xs, N, S, n)
sum(notter)
Altså rett over 45% sjanse. Som i forrige eksempel, kan vi også lage en figur med denne fordelingen.
notter_alle = hypergeom.pmf(range(n+1), N, S, n)
data = Series(notter_alle)
data.plot.bar(width=0.1)
plt.show()
Du skal på innebandykamp, og får vite at det scores i gjennomsnitt 12 mål per kamp. Hva er sannsynligheten for at det scores færre enn 8 mål i den kampen du skal på?
from scipy.stats import poisson
xs = range(9) # [0 ... 8] inklusiv 0 og 8
maal = poisson.pmf(xs, 12) # Alle sannsynlighetene f.o.m. 0 mål, t.o.m. 8 mål
sum(maal) # Sum av sannsynlighetene
data = Series(maal)
data.plot.bar(width=0.1)
plt.show()
PCen din har problemer med å koble på universitetets nettverk. Du skrur av og på WiFi på maskinen til du får koblet til. For hvert forsøk er det 34% sannsynlig at du får koblet til. Hva er sannsynligheten for at du får koblet til på mindre enn 3 forsøk?
from scipy.stats import geom
tilkobling = geom.pmf([1,2], 0.34) # Sannsynligheter for 1 og 2 tilkoblinger.
print('P(3 eller mindre tilkoblinger):', sum(tilkobling))
print('Forventning:', 1/0.34)
data = Series(geom.pmf(range(15), 0.34))
data.plot.bar(width=0.1)
plt.show()
Du er telefonselger, og får en bonus hvis du skaffer 5 nye kunder til Mirakelpiller AS iløpet av en time. Det er 20% sjanse for at en samtale resulterer i kjøp.
Hva er sannsynligheten for at du får solgt 5 mirakelpiller hvis du ringer til 15 personer i alt?
from scipy.stats import nbinom
fem_salg = nbinom.pmf(10, 5, 0.2)
fem_salg
data = Series(nbinom.pmf(10, range(15), 0.2))
data.plot.bar(width=0.1)
plt.show()