Data Analysis - Programming - 1

Week 8

Onderwerpen week 8:

  • Python library import syntax
  • Monte Carlo simulatie

Python library import syntax (1)

  • Python wordt standaard geleverd met veel zogenoemde 'modules'
    met veelgebruikte functies, constanten en datatypen
  • het geheel van meegeleverder modules wordt
    de standard library genoemd
  • enkele voorbeelden van modules ben je al tegengekomen:
  • als je een bibliotheek hebt geïmporteerd met import,
    kun je met de dir()-functie kijken wat er 'geëxporteerd' wordt:
import(math)
dir(math)

Python library import syntax (2)

  • naast de standard library zijn er nog tienduizenden packages
    verkrijgbaar voor Python
  • de meeste daarvan zijn opgenomen in de Python Package Index,
    of pypi
  • de versie van Python die je hebt geïnstalleerd, Anaconda,
    wordt geleverd met een slordige 300 tot 400 van de meest-
    gebruikte packages
  • één voorbeeld daarvan ben je vandaag tegengekomen:
from scipy import stats

# X = aantal keer munt bij 10x gooien (eerlijke munt)
# bepaal P(X=3):
P = stats.binom.pmf(3, 10, 0.5)

Python library import syntax (3)

  • veel packages, zoals scipy, bestaan uit meerdere modules,
    zoals stats, die ook weer verschillende namen kunnen bevatten
  • import statements in Python kunnen dan ook op veel verschillende
    manieren geschreven worden:
import scipy
scipy.stats.binom.pmf(3, 10, 0.5)
# of
from scipy import stats
stats.binom.pmf(3, 10, 0.5)
# of
from scipy.stats import binom
binom.pmf(3, 10, 0.5)
  • merk op dat binom geen module is (maar een class),
    en from scipy.stats.binom import pmf werkt dan ook niet

Python library import syntax (4)

  • het is gebruikelijk om veelgebruikte packages een verkorte naam
    te geven, zodat je niet steeds lange samengestelde namen hoeft
    uit te schrijven in je code
  • in het onderstaande voorbeeld wordt de naam st gegeven
    aan de hele module stats in de package scipy:
import scipy.stats as st
st.binom.pdf(3, 10, 0.5)
  • zowel modules als functies kunnen op deze manier worden hernoemd
    tijdens de import:
from math import sin as sin_rad
from math import radians

sin_deg = lambda x: sin_rad(radians(x))
print(sin_deg(30))

Python library import syntax (5)

  • in veel Python notebooks op internet kom je ook het volgende
    nogal eens tegen:
%pylab
  • dit statement is speciaal voor IPython en het doet, in één keer,
    een aantal veelgebruikte imports:
import numpy
import matplotlib
from matplotlib import pylab, mlab, pyplot
np = numpy
plt = pyplot

from IPython.display import display
from IPython.core.pylabtools import figsize, getfigs

from pylab import *
from numpy import *

Monte-Carlosimulatie (1)

  • Monte-Carlosimulatie is een simulatietechniek waarbij een fysiek proces
    vele malen wordt gesimuleerd, elke keer met andere startcondities
  • het resultaat van zo'n verzameling simulaties is een verdelingsfunctie
    die het hele gebied van mogelijke uitkomsten weergeeft
  • de techniek wordt veel toegepast, bijvoorbeeld om processen met
    veel onzekerheid, zoals economische processen, te simuleren

Monte-Carlosimulatie (2)

  • voorbeeld: $\pi$ benaderen met een stochastisch model

  • in de bovenstaande afbeelding zie je een vierkant met de
    een ingeschreven kwartcirkel
  • wanneer we de zijden van het vierkant $1$ nemen,
    is de oppervlakte van het vierkant $1 \cdot 1 = 1$
    en de oppervlakte van de kwartcirkel $\large{\frac{\pi \cdot 1^2}{4} = \frac{\pi}{4}}$

  • we kunnen nu $n$ maal een willekeurig coordinaat in het vierkant kiezen en
    tellen hoe vaak het coordinaat in de cirkel ligt, of erbuiten

  • dan is $\frac{\textrm{aantal in cirkel}}{n}$ een benadering voor $\pi$

In [31]:
# Monte-Carlosimulatie - pi benaderen
import numpy as np

n = 1000  # aantal herhalingen experiment
aantal_in_cirkel = 0

for i in range(n):
    # experiment:
    x, y = np.random.uniform(0, 1), np.random.uniform(0, 1)
    in_cirkel = np.sqrt(x**2 + y**2) < 1
    if in_cirkel:
        aantal_in_cirkel += 1

# benadering pi:
print("Pi ~= {:.8f}".format(aantal_in_cirkel / n))


Pi ~= 0.77700000

Monte-Carlosimulatie (3)

  • het algemene patroon bij een Monte-Carlosimulatie verloopt als volgt:
    • maak een model voor je experiment
    • bepaal het domein van de inputvariabelen van je model
    • herhaal het experiment:
      • genereer willekeurige waarden voor de inputvariabelen
      • voer een deterministische berekening uit met de inputvariabelen
    • voeg de resultaten samen en analyseer

Monte-Carlosimulatie (4)

  • neem aan dat de kans op het krijgen van een jongen
    gelijk is aan de kans op een meisje (beide kansen zijn dus $1/2$)
  • we zijn geïnteresseerd in een gezin met $n$ kinderen,
    waarvan $m$ jongens en $n-m$ meisjes
  • de kans dat in een gezin met n kinderen, m daarvan een jongen zijn,
    kun je exact uitrekenen, maar je kunt die kans ook benaderen met een simulatie

  • beschrijf het experiment dat je zult gebruiken in een
    Monte-Carlosimulatie om bovenstaand probleem te simuleren

  • schrijf een Python programma om de Monte-Carlosimulatie uit te voeren

In [ ]: