\n",
"D. Malchiodi, Superhero data science. Vol 1: probabilità e statistica: Distribuzione geometrica.\n",
"
\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"# La distribuzione geometrica\n",
"\n",
"La *distribuzione geometrica* descrive il numero di insuccessi necessari affinché si verifichi il primo successo in una successione di esperimenti bernoulliani indipendenti e identicamente distribuiti. Questa distribuzione, che ha quindi come supporto l'insieme dei numeri naturali (zero incluso), è quindi completamente descritta specificando il parametro $p$ del corrispondente esperimento bernoulliano. Più precisamente, $p \\in (0, 1]$: il caso $p=0$ va infatti escluso a priori, altrimenti sarebbe impossibile avere come esito un successo (e dunque sarebbe impossibile contare il numero di insuccessi prima che si verifichi un successo). Il caso $p=1$ può essere incluso nell'insieme dei valori validi per il parametro, sebbene questa scelta identifichi un esperimento bernoulliano che ha sempre successo: in tal caso, la variabile aleatoria che conteggia il numero di insuccessi prima del primo successo degenera nel valore costante pari a zero."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"In alternativa sarebbe possibile definire la distribuzione geometrica contando il numero totale di esperimenti necessari per ottenere il primo successo. In questo modo si conteggerebbe un esperimento in più rispetto a quanto visto (l'esperimento in cui si ottiene il successo). Ovviamente la distribuzione ottenuta avrebbe delle proprietà (come per esempio il valore atteso e la varianza) diversi da quelli che otterremo.\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Un modo intuitivo di simulare dei valori estratti da una distribuzione geometrica consiste nel simulare ripetutamente l'esecuzione del relativo esperimento bernoulliano, conteggiando il numero di tentativi che precedono il primo successo. Tenuto conto del fatto che un esperimento bernoulliano di parametro $p$ si può simulare estraendo un numero pseudocasuale uniformemente distribuito in $[0, 1]$ (compito effettuato per esempio dalla funzione `random` nel modulo omonimo) e decretando un successo se il risultato è inferiore a $p$ e un fallimento altrimenti, la seguente funzione permette di ottenere valori per una generica distribuzione geometrica, specificando il valore del corrispondente parametro. L'implementazione verifica anche che il valore specificato per il parametro sia valido."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0, 5, 5, 0, 3, 0, 0, 1, 0, 2]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import random as rnd\n",
"\n",
"def geom(p):\n",
" assert p > 0 and p <= 1, '{} is not a valid parameter' \\\n",
" ' for the geometric distribution.'.format(p)\n",
" i = 0\n",
" while rnd.random() >= p:\n",
" i +=1\n",
" return i\n",
"\n",
"[geom(.3) for _ in range(10)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Si potrebbe dimostrare che esistono metodi che utilizzano approcci più efficienti per affrontare questa distribuzione, per esempio evitando l'uso di cicli. Un esempio di package `scipy.stats` mette a disposizione una classe `geom`, da inizializzare specificando come argomento il valore di $p$ e utilizzabile (tra le altre cose) per simulare un array di specificazioni invocando il metodo `rvs` che accetta come argomento la dimensione di tale array."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([4, 8, 3, 2, 4, 2, 4, 1, 3, 1])"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from scipy.stats import geom\n",
"\n",
"g = geom(.3)\n",
"g.rvs(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tenuto conto dell'indipendenza tra le ripetizioni dell'esperimento bernoulliano, richiedere che il primo successo sia avvenuto esattamente dopo $i$ insuccessi equivale a calcolare la probabilità di $i$ insuccessi successivi, seguiti da un successo. Pertanto la distribuzione geometrica ha la seguente funzione di massa di probabilità:\n",
"\n",
"\\begin{equation}\n",
"f_X(i; p) = p (1-p)^i \\mathrm I_{\\mathbb N \\cup \\{0\\}}(i).\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Si verifica facilmente che sommando i valori di massa di probabilità per tutte le specificazioni si ottiene come risultato 1:\n",
"\n",
"\\begin{equation}\n",
"\\sum_{i=0}^{+\\infty}f_X(i; p) = \\sum_{i=0}^{+\\infty}p (1-p)^i = p \\sum_{i=0}^{+\\infty}(1-p)^i = p \\frac{1}{1-(1-p)} = 1.\n",
"\\end{equation}\n",
"\n",
"La penultima uguaglianza è basata sulla convergenza della _serie geometrica_: $\\sum_{i=0}^{+\\infty} \\alpha^i = \\frac{1}{1-\\alpha}$ per ogni $\\alpha$ tale che $|\\alpha| < 1$. È da questo fatto che la distribuzione geometrica prende il suo nome.\n",
"\n",
"Nella cella seguente viene definita una funzione `geom_pdf` che accetta come argomenti rispettivamente un valore reale $x$ e un possibile parametro $p$ e restituisce il valore della funzione di probabilità geometrica. La funzione è costruito in modo da associare massa nulla ai punti al di fuori del dominio, verificando anche in questo caso che il parametro specificato assuma un valore valido."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def geom_pdf(x, p):\n",
" assert p > 0 and p <= 1, '{} is not a valid parameter ' \\\n",
" 'for the geometric distribution.'.format(p)\n",
" \n",
" return p * (1 - p)**x if x > 0 and x==int(x) else 0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"È quindi possibile visualizzare i valori di massa di probabilità, fissando per esempio $p=\\frac{1}{2}$ e usando un grafico a bastoncini (così da evidenziare che le masse di probabilità sono associate a singoli valori). Ovviamente la visualizzazione dovrà coinvolgere un sottoinsieme delle possibili specificazioni, essendo il dominio della distribuzione infinito. Nella versione interattiva degli appunti è possibile modificare il valore di $p$ rigenerando automaticamente il grafico."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "01cd9bd9641946fdbc63c649a0f8ab18",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"interactive(children=(FloatSlider(value=0.5, description='p', max=1.0, min=0.1), Output()), _dom_classes=('wid…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from ipywidgets import *\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"\n",
"def gr_geom_pdf(p):\n",
" x = np.arange(0, 10, 1)\n",
" plt.vlines(x, [0]*len(x), list(map(lambda _: geom_pdf(_, p), x)))\n",
" plt.plot(x, list(map(lambda _: geom_pdf(_, p), x)), 'o')\n",
" plt.ylim(ymax=1, ymin=0)\n",
" plt.xlim(xmax=11, xmin = -1)\n",
" plt.show()\n",
"\n",
"interact(gr_geom_pdf, p=(0.1, 1, 0.1))\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Procediamo ora a determinare il valore atteso e la varianza della distribuzione. Iniziamo mostrando un risultato intermedio."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lemma**. Per ogni $\\alpha \\in (-1, 1)$\n",
"\n",
"\\begin{equation}\n",
"\\sum_{i=0}^{+\\infty}i \\alpha^i = \\frac{\\alpha}{(1-\\alpha)^2}.\n",
"\\end{equation}\n",
"\n",
"Dimostrazione.\n",
"\n",
"\\begin{align}\n",
"\\sum_{i=0}^{+\\infty}i \\alpha^i &= \\alpha \\sum_{i=0}^{+\\infty}i \\alpha^{i-1} \\\\\n",
"&= \\alpha \\sum_{i=0}^{+\\infty} \\frac{\\mathrm d}{\\mathrm d \\alpha} \\alpha^i \\\\\n",
"&= \\alpha \\frac{\\mathrm d}{\\mathrm d \\alpha} \\sum_{i=0}^{+\\infty} \\alpha^i \\\\\n",
"&= \\alpha \\frac{\\mathrm d}{\\mathrm d \\alpha} \\frac{1}{1-\\alpha} \\\\\n",
"&= \\alpha \\frac{1}{(1-\\alpha)^2}.\n",
"\\end{align}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Questo risultto ci permette di calcolare agevolmente il valore atteso. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Proposizione**. Il valore atteso della distribuzione geometrica di parametro $p$ è pari a $\\frac{1-p}{p}$.\n",
"\n",
"Dimostrazione. Innanzitutto\n",
"\n",
"\\begin{align}\n",
"\\mathrm E(X) &= \\sum_{i=0}^{+ \\infty} i f_X(i; p)\\\\\n",
" &= \\sum_{i=0}^{+ \\infty} i p (1-p)^i \\\\ \n",
" &= p \\sum_{i=0}^{+ \\infty} i (1-p)^i,\n",
"\\end{align}\n",
"\n",
"e quindi per il lemma appena dimostrato si ha, ponendo $\\alpha = 1-p$,\n",
"\n",
"\\begin{equation}\n",
"\\mathrm E(X) = p \\frac{1 - p}{p^2} = \\frac{1-p}{p}.\n",
"\\end{equation}\n",
"\n",
"Visualizziamo graficamente l'andamento del valore atteso in funzione del parametro $p$."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"