Processus de Poisson

Basé sur Poisson Process 1 et Poisson Process 2. On va commencer avec la première vidéo.

In [1]:
from IPython.display import YouTubeVideo
YouTubeVideo("31MoWKnPDaU")
Out[1]:

Définitions

$X =$ le nombre de voitures qui passent en une heure. $X$ est une variable aléatoire.
$E(X) = \lambda =$ l'espérance de X, ou le nombre moyen de voitures qui passent en une heure.

Calculs

$\lambda = np$, ou $n =$ le nombre de périodes et $p =$ le nombre moyen de voitures qui passent en une période.

Si $n = 60$, $\lambda = 60\frac{\lambda}{60}$. Donc on a une distribution binomiale.

$$P(X=k) = {60 \choose k} \left(\frac{\lambda}{60}\right)^k \left(1 - \frac{\lambda}{60}\right)^{(60-k)}$$

Mais $\frac{\lambda}{60}$ n'est pas une probabilité, parce qu'il peut être plus qu'un. Alors ça marche comment ?

Un peu de calcul infinitésimal

Et maintenant, la vidéo a une équation :

$$\lim_{x \rightarrow \infty}{\left(1 + \frac{a}{x}\right)^x} = e^a$$

Franchement, j'ai oublié tout ça. Il me faut réviser cette limite avant de continuer.

D'abord, je vais charger la bibliothèque sympy, qui peut faire les calculs formels (ou « symboliques »).

In [2]:
import sympy as sym
sym.init_printing()

Puis on va construire une expression formelle :

In [3]:
a, x, y, z = sym.symbols("a, x, y, z")
expr = (1 + a/x)**x
expr
Out[3]:
$$\left(\frac{a}{x} + 1\right)^{x}$$

Et prendre la limite :

In [4]:
sym.limit(expr, x, sym.oo)
Out[4]:
$$e^{a}$$

Merci, c'est très gentil, mais je veux la comprendre. Il y a une éxplication en anglais sur Yahoo. Je vais utiliser ça.

$$f = \lim_{x \rightarrow \infty}{\left(1 + \frac{a}{x}\right)^x}$$$$\log{f} = \log{\lim_{x \rightarrow \infty}{\left(1 + \frac{a}{x}\right)^x}}$$$$\log{f} = \lim_{x \rightarrow \infty}{x \log{\left(1 + \frac{a}{x}\right)}}$$

Soit $y$ égal à $1/x$ :

$$\log{f} = \lim_{y \rightarrow 0}{\frac{1}{y} \log{\left(1 + ay\right)}}$$

Et maintenant il nous faut la série Taylor. Soit $z = -ay$ :

In [5]:
approx = sym.series(sym.log(1 - z))
approx
Out[5]:
$$- z - \frac{z^{2}}{2} - \frac{z^{3}}{3} - \frac{z^{4}}{4} - \frac{z^{5}}{5} + \mathcal{O}\left(z^{6}\right)$$
In [6]:
approx = approx.subs({z: -(a*y)})
approx
Out[6]:
$$a y - \frac{a^{2} y^{2}}{2} + \frac{a^{3} y^{3}}{3} - \frac{a^{4} y^{4}}{4} + \frac{a^{5} y^{5}}{5} + \mathcal{O}\left(a^{6} y^{6}\right)$$

Et maintenant, utilisons l'$1/y$ dans :

$$\log{f} = \lim_{y \rightarrow 0}{\frac{1}{y} \log{\left(1 + ay\right)}}$$
In [7]:
sym.simplify((1/y) * approx)
Out[7]:
$$a - \frac{a^{2} y}{2} + \frac{a^{3} y^{2}}{3} - \frac{a^{4} y^{3}}{4} + \frac{a^{5} y^{4}}{5} + \mathcal{O}\left(a^{6} y^{5}\right)$$

Mais la limite de tous les termes avec $y$ est 0, et donc on a :

$$log{f} = \lim_{y \rightarrow \infty}{a} = a$$$$e^{log{f}} = f = e^a$$

D'accord, alors j'y crois.

La dérivation (enfin)

On reprend la dérivation avec la duxième vidéo.

In [8]:
YouTubeVideo("sWAqWRPqLok")
Out[8]:

Des équations de la vidéo :

$$E(X) = \lambda = np$$

(Il faut réviser l'espèrance d'une distribution binomiale.)

$$p = \text{probabilité d'une réussite} = \frac{\lambda}{n}$$

La probabilité que $k$ voitures passent :

$$\begin{aligned} P(X=k) & = \lim_{n \rightarrow\infty}{{n \choose k} \left(\frac{\lambda}{n}\right)^k \left(1-\frac{\lambda}{n}\right)^{n-k}} \\ & = \lim_{n \rightarrow\infty}{ \frac{n!}{(n-k)!k!} \frac{\lambda^k}{n^k} \left(1-\frac{\lambda}{n}\right)^n \left(1-\frac{\lambda}{n}\right)^{-k}} \\ & = \lim_{n \rightarrow\infty}{ \frac{n!}{(n-k)!n^k} \frac{\lambda^k}{k!} e^{-\lambda} 1^{-k}} \\ & = \lim_{n \rightarrow\infty}{ \frac{n(n-1)(n-2) \cdots (n-k+1)}{n^k} \frac{\lambda^k}{k!} e^{-\lambda}} \\ & = \lim_{n \rightarrow\infty}{ \frac{n^k + \mathcal{O}(n^{k-1})}{n^k} \frac{\lambda^k}{k!} e^{-\lambda}} \\ & = \frac{\lambda^k}{k!}e^{-\lambda} \end{aligned}$$

Un graphique

Enfin, c'est fini. On peut jouer avec les graphiques maintenant.

In [9]:
%pylab inline --no-import-all
Populating the interactive namespace from numpy and matplotlib
In [10]:
import math

def poisson(lambda_, k):
    return lambda_**k * math.exp(-lambda_) / math.factorial(k)

# Nos paramètres.
lambda_ = 7     # Le nombre moyen de voitures qui passent.
k = range(0,21) # Les probabilités de 0 à 20 voitures.

fig = plt.figure()
axes = fig.add_axes([0.1, 0.1, 0.8, 0.8])
axes.plot(k, map(lambda k: poisson(lambda_, k), k))
axes.set_xlabel("Voitures")
axes.set_ylabel("Prob")
axes.axvline(3, color='r')
axes.set_title("Distribution Poisson")
None

SciPy.stats : une biblioteque avec beaucoup de distributions

SciPy est une bibliothèque très populaire chez les scientifiques. SciPy fournit des outils pour toutes les distributions communes.

In [11]:
from scipy import stats

# Créer une distribution Poission avec lambda égal à 7. 
nv = stats.poisson(7)
# Trouver la moyenne et l'écart type.
nv.mean(), nv.std() 
Out[11]:
$$\begin{pmatrix}7.0, & 2.64575131106\end{pmatrix}$$

Fonction de masse (Probability mass function)

Voilà la même fonction qu'on a écrite ci-dessus.

In [12]:
def dessiner(titre, fonc, x):
    """Dessiner fonc(x)."""
    fig = plt.figure()
    axes = fig.add_axes([0.1, 0.1, 0.8, 0.8])
    axes.plot(x, fonc(x))
    axes.set_title(titre)

dessiner("Distribution Poisson", nv.pmf, range(0, 21))

Fonction de répartition (Cummulative distribution function)

Cette fonction est l'integral de la fonction de masse. Elle donne la probabilité qu'on a vu entre 0 et $k$ voitures, inclusif.

In [13]:
dessiner("Distribution Poisson (cdf)", nv.cdf, range(0, 21))

Fonction de survie (Survival function)

Cette fonction est 1 moins la fonction de répartition. Elle donne la probabilité qu'on a vu plus que $k$ voitures.

In [14]:
dessiner("Distribution Poisson (sf)", nv.sf, range(0, 21))