import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
import math
from scipy.integrate import quad
import arviz as az
import warnings
"ignore", category=UserWarning) warnings.filterwarnings(
35 Distribuzioni di v.c. discrete
Prerequisiti
Concetti e Competenze Chiave
Preparazione del Notebook
int = sum(map(ord, "discr_rv_distr"))
seed: = np.random.default_rng(seed=seed)
rng: np.random.Generator ="colorblind")
sns.set_theme(palette"arviz-darkgrid")
az.style.use(%config InlineBackend.figure_format = "retina"
Introduzione
La previsione è un processo che ci permette di formulare ipotesi su eventi incerti, sfruttando le regolarità osservate nei processi naturali, sociali e psicologici. Uno degli obiettivi principali della data science è proprio quello di prevedere fenomeni di cui non abbiamo ancora certezza, inclusi, ma non limitati a, eventi futuri.
La capacità di fare previsioni senza considerare ogni possibile risultato dipende dalla conoscenza della popolazione di riferimento. Gli esseri umani organizzano e rappresentano questa conoscenza in vari modi. In questo capitolo, esploreremo le implicazioni di un approccio specifico alla rappresentazione delle popolazioni: le distribuzioni di probabilità.
Supponiamo di avere una distribuzione di probabilità
In particolare, ci concentreremo sulle distribuzioni di probabilità discrete, essenziali per comprendere i fenomeni aleatori che presentano un numero finito o numerabile di esiti. Queste distribuzioni sono cruciali nella modellazione e nell’analisi di eventi che si verificano in contesti discreti, fornendo le basi per una comprensione più profonda delle dinamiche probabilistiche che governano tali fenomeni.
Ogni distribuzione di probabilità è caratterizzata da uno o più parametri, che consentono di controllare specifici aspetti della distribuzione stessa. Esploreremo diverse distribuzioni discrete, ciascuna con le sue caratteristiche e applicazioni:
- Distribuzione di Bernoulli
- Rappresenta esperimenti con due possibili esiti: “successo” o “insuccesso”
- Costituisce il nucleo dei processi Bernoulliani
- Parametro chiave: probabilità di successo in ciascuna prova
- Distribuzione Binomiale
- Descrive il numero totale di successi in un numero fisso di prove Bernoulliane
- Nasce dalla somma di prove Bernoulliane indipendenti
- Parametri: probabilità di successo in ciascuna prova e numero totale di prove
- Distribuzione di Poisson
- Modella eventi rari o che si verificano su intervalli di tempo o spazio variabili
- Adatta quando il numero di prove è una variabile casuale
- Parametro: tasso medio di successo per unità di tempo o spazio
- Distribuzione Beta-Binomiale
- Utilizzata quando la probabilità di successo in una serie di prove Bernoulliane non è costante
- Offre una rappresentazione più flessibile rispetto alla distribuzione binomiale
- Parametri: derivati dalla distribuzione Beta sottostante
- Distribuzione Uniforme Discreta
- Ogni evento all’interno di un determinato intervallo finito ha la stessa probabilità
- Utile quando non ci sono motivi per privilegiare un risultato rispetto a un altro
- Non dipende da parametri una volta stabilito il supporto della distribuzione
In sintesi, attraverso lo studio di queste distribuzioni, acquisiremo gli strumenti necessari per analizzare e prevedere una vasta gamma di situazioni reali.
35.1 Distribuzione di Bernoulli
In statistica, un esperimento che ammette solo due esiti possibili è modellato attraverso quella che viene chiamata “prova Bernoulliana”. Un esempio tipico è il lancio di una moneta, che può dare come risultato testa o croce.
Definizione 35.1 Una variabile casuale
dove
La distribuzione di Bernoulli descrive quindi un contesto in cui la probabilità di osservare l’esito 1 è
Calcolando il valore atteso e la varianza, otteniamo:
Esplicitando ulteriormente la formula della varianza con
Calcoliamo ora le singole parti dell’espressione: 1.
Sostituendo queste espressioni nell’equazione della varianza, otteniamo:
Semplificando:
In sintesi, la varianza di una variabile aleatoria binaria
# Define p values between 0 and 1
= np.linspace(0, 1, 100)
p
# Variance of a Bernoulli distribution is theta(1-theta)
= p * (1 - p)
variance
='Varianza', color='blue')
plt.plot(p, variance, label'Varianza di una variabile Bernoulliana in funzione di $p$')
plt.title('$p$')
plt.xlabel('Varianza')
plt.ylabel( plt.show()
Per indicare che la variabile casuale
Ad esempio, nel caso del lancio di una moneta equilibrata, la variabile di Bernoulli assume i valori
Generiamo dei valori casuali dalla distribuzione di Bernoulli. Iniziamo con un singolo valore:
# Probabilità di successo (p)
= 0.5
p
# Genera un valore casuale dalla distribuzione di Bernoulli
= rng.binomial(n=1, p=p)
bernoulli_sample print(bernoulli_sample)
1
Generiamo un campione di 10 valori:
# Genera un campione di 10 valori dalla distribuzione di Bernoulli
= rng.binomial(n=1, p=p, size=10)
bernoulli_sample print(bernoulli_sample)
[0 0 1 1 1 1 1 0 1 0]
35.2 Distribuzione Binomiale
La distribuzione binomiale è una distribuzione di probabilità discreta che modella il numero di successi
Definizione 35.2 La distribuzione binomiale descrive la probabilità di osservare esattamente
dove
La distribuzione binomiale si presta bene a esempi classici come il lancio ripetuto di una moneta o l’estrazione di biglie da un’urna. Ad esempio, nel caso del lancio di una moneta, questa distribuzione descrive la probabilità di ottenere un determinato numero di “teste” in un certo numero di lanci, con ogni lancio che segue una distribuzione di Bernoulli con probabilità di successo
Una caratteristica interessante della distribuzione binomiale è la sua proprietà di riproducibilità: se due variabili casuali indipendenti,
35.2.1 Calcolo delle Probabilità
Per chiarire il calcolo delle probabilità nella distribuzione binomiale, consideriamo una serie di prove di Bernoulli. Supponiamo di avere
La probabilità di ottenere esattamente
dove
Tuttavia, siamo interessati alla probabilità complessiva di ottenere esattamente
Quindi, moltiplicando la probabilità di una singola sequenza per il numero di sequenze possibili, otteniamo la probabilità di osservare esattamente
Questo risultato corrisponde alla formula della distribuzione binomiale.
35.2.2 Applicazioni Pratiche della Distribuzione Binomiale
Consideriamo un esempio pratico per illustrare l’applicazione della distribuzione binomiale. Supponiamo di osservare 2 successi in 4 prove Bernoulliane, dove la probabilità di successo in ogni prova è eq-binom-distr
:
Questo calcolo può essere replicato in Python. Utilizzando il modulo math
, possiamo calcolare direttamente:
= 4
n = 0.2
p = 2
y
= math.comb(n, y) * p**y * (1 - p) ** (n - y)
prob print(prob)
0.15360000000000007
In alternativa, possiamo sfruttare la libreria SciPy per eseguire calcoli analoghi. SciPy offre una vasta gamma di funzioni per la gestione delle distribuzioni statistiche, tra cui la distribuzione binomiale.
stats.binom.pmf(y, n, p)
0.15359999999999993
Utilizzando scipy.stats.binom.pmf(y, n, p)
, possiamo trovare le probabilità per ogni possibile valore
= np.arange(0, n + 1)
y print(y)
[0 1 2 3 4]
= stats.binom.pmf(y, n, p)
probabilities print(probabilities.round(3))
[0.41 0.41 0.154 0.026 0.002]
Visualizziamo la distribuzione di massa di probabilità:
plt.figure()"o", ms=8)
plt.plot(y, probabilities, 0, probabilities, linestyles="-", lw=1)
plt.vlines(y, f"Distribuzione binomiale: $n$={n}, $p$={p}")
plt.title("Numero di successi y")
plt.xlabel("Probabilità")
plt.ylabel(-0.5, n + 0.5)
plt.xlim(0, max(probabilities) + 0.05)
plt.ylim( plt.show()
Per esplorare ulteriormente, consideriamo la distribuzione di probabilità di diverse distribuzioni binomiali per due valori di
plt.figure()
for p in np.arange(0.3, 1.0, 0.3):
= np.arange(0, 25)
y = stats.binom.pmf(y, 20, p)
binom_dist "-o", label=f"theta = {p:.1f}")
plt.plot(y, binom_dist,
"Numero di successi y")
plt.xlabel("Probabilità")
plt.ylabel("Distribuzione binomiale al variare di $p$")
plt.title(
plt.legend() plt.show()
Consideriamo un altro esempio. Lanciando stats.binom.pmf()
.
2, n=5, p=0.5) + stats.binom.pmf(3, n=5, p=0.5) + stats.binom.pmf(4, n=5, p=0.5) + stats.binom.pmf(5, n=5, p=0.5) stats.binom.pmf(
0.8125
sum([stats.binom.pmf(k, n=5, p=0.5) for k in range(2, 6)]) np.
0.8125
Più facilmente, si trova la risposta usando la funzione di ripartizione stats.binom.cdf
.
1 - stats.binom.cdf(1, n=5, p=0.5)
0.8125
Rappresentiamo graficamente la funzione di ripartizione per una Binomiale di ordine
= 5
n = 0.5
theta = np.arange(0, n+1)
y
plt.figure()=n, p=p))
plt.plot(y, stats.binom.cdf(y, n=n, p=p))
plt.scatter(y, stats.binom.cdf(y, n1, color="k", alpha=0.7, linestyle="--", lw=1)
plt.axhline(f"Funzione di ripartizione binomiale: $n$={n}, $p$={p}", loc="left")
plt.title("y")
plt.xlabel(= plt.ylabel("Probabilità") _
Un’altra funzione utile è quella che trova il numero di successi in una distribuzione binomiale che corrisponde ad una data probabilità (nella coda sinistra della funzione ripartizione). Per l’esempio presente:
= 1 - 0.8125
target_probability stats.binom.ppf(target_probability, n, p)
1.0
Utilizzando la funzione punto percentuale (PPF), che è l’inverso della funzione di distribuzione cumulativa (CDF), possiamo trovare il numero di successi corrispondente alla probabilità target di
Facciamo un altro esempio. Consideriamo la probabilità cumulativa stats.binom.cdf(4, n=10, p=0.2)
calcola la probabilità che ci siano al massimo 4 successi in 10 tentativi, dove la probabilità di successo in ogni tentativo è del 20%.
= stats.binom.cdf(4, n=10, p=0.2)
target_probability target_probability
0.9672065024
Di conseguenza, la funzione inversa è:
=10, p=0.2) stats.binom.ppf(target_probability, n
4.0
Per generare una sequenza di valori casuali seguendo una distribuzione binomiale possiamo utilizzare la funzione random()
di NumPy. Dopo aver inizializzato rng = np.random.default_rng(RANDOM_SEED)
, per esempio,
= np.random.default_rng(42) rng
possiamo impiegare rng
per generare valori casuali da una distribuzione binomiale:
= rng.binomial(p=0.5, n=5, size=30)
x print(*x)
3 2 4 3 1 5 3 3 1 2 2 4 3 4 2 2 3 1 4 3 3 2 5 4 3 2 2 1 1 3
Per una discussione sulla generazione di numeri pseudo-casuali in Python, si veda il capitolo {ref}appendix-rng
.
35.2.3 Valore atteso e deviazione standard
La media (numero atteso di successi in
Dimostrazione. Dato che
Pertanto, la deviazione standard è data da
Per esempio, prendiamo in considerazione il caso di un esperimento in cui vengono lanciate quattro monete, ciascuna con una probabilità di ottenere testa (successo) pari a
Il valore atteso,
Questo significa che, in media, ci aspettiamo di ottenere circa 0.8 teste per ogni serie di quattro lanci.
Per quanto riguarda la varianza, che misura quanto i risultati individuali tendono a differire dalla media, nella distribuzione binomiale è calcolata come
La varianza di 0.64 suggerisce una certa dispersione intorno al valore medio di 0.8 teste.
Per confermare queste aspettative teoriche, possiamo eseguire una simulazione. Creiamo una serie di esperimenti simulati in cui lanciamo quattro monete per un gran numero di volte, registrando il numero di teste ottenute in ogni serie. Calcoliamo poi la media e la varianza dei risultati ottenuti per vedere quanto si avvicinano ai valori teorici calcolati.
= rng.binomial(p=.2, n=4, size=1000000) x
np.mean(x)
0.79956
=0) np.var(x, ddof
0.6397598064000003
35.2.4 Funzioni Python associate alle distribuzioni di probabilità
La seguente tabella riassume le funzioni di Python utilizzate per manipolare le distribuzioni di probabilità, illustrando i casi della distribuzione Binomiale e della Normale.
Tipo | Esempio: Binomiale (y | n, p) | Esempio: Normale (y | μ, σ) |
---|---|---|
Funzione di verosimiglianza | binom.pmf(y, n, p) |
norm.pdf(y, μ, σ) |
Prob Y=y | binom.pmf(y, n, p) |
sempre 0 per variabili continue |
Prob Y ≥ y, Y ≤ y, y1 < Y < y2 | binom.cdf(y, n, p) o binom.sf(y, n, p) |
norm.cdf(y, μ, σ) o norm.sf(y, μ, σ) |
Inversa della CDF | binom.ppf(q, n, p) |
norm.ppf(q, μ, σ) |
Generazione di dati simulati | rng.binomial(n, p, size) |
rng.normal(μ, σ, size) |
In seguito, useremo altre distribuzioni come Uniforme, Beta, ecc., ognuna delle quali ha un proprio insieme di funzioni disponibili in Python tramite il modulo scipy.stats
. Potete trovare una lista completa di queste distribuzioni nella documentazione ufficiale.
pmf
(probability mass function) viene utilizzata per distribuzioni discrete come la Binomiale, mentrepdf
(probability density function) si applica alle distribuzioni continue, come la Normale.cdf
(cumulative distribution function) esf
(survival function, che corrisponde a ) permettono di calcolare le probabilità cumulative.ppf
(percent point function) è l’inversa dellacdf
, e si usa per determinare il valore della variabile corrispondente a una certa percentuale di osservazioni.rvs
(random variates) serve a generare campioni casuali simulati secondo una determinata distribuzione.
35.3 Distribuzione Discreta Uniforme
La distribuzione discreta uniforme è un tipo particolare di distribuzione di probabilità, dove ogni risultato in un insieme finito e discreto
Consideriamo un esempio pratico con una variabile casuale discreta
Di conseguenza, la probabilità che
indicando che ogni evento ha la stessa probabilità di verificarsi.
Il valore atteso, o la media, di
A questo punto, dobbiamo calcolare la somma
Sostituendo questa formula nel nostro calcolo del valore atteso, otteniamo:
Quindi, abbiamo dimostrato che il valore atteso $ (X) $ per una variabile casuale
Per determinare quanto i valori di
Usando l’identità per la somma dei quadrati dei primi
possiamo sostituirla per trovare
La varianza di
Abbiamo già stabilito che
Per semplicare l’espressione della varianza, dobbiamo sottrarre il quadrato di
Quindi, la varianza
35.4 Distribuzione di Poisson
La distribuzione di Poisson è una distribuzione di probabilità discreta utilizzata per modellare il numero di eventi che si verificano in un dato intervallo di tempo o spazio, quando tali eventi sono indipendenti e accadono a un tasso costante.
Siméon Denis Poisson, un matematico francese, sviluppò questa teoria nel 1837. La distribuzione prende il suo nome perché descrive il processo di conteggio degli eventi casuali che si verificano indipendentemente l’uno dall’altro in un determinato intervallo.
La variabile casuale
La funzione di massa di probabilità della distribuzione di Poisson è:
dove:
è la probabilità di osservare esattamente eventi, è il tasso medio di eventi, è il numero di eventi, un intero non negativo.
Una proprietà chiave della distribuzione di Poisson è che il valore atteso (
Quale esempio, presentiamo qui sotto un grafico con la distribuzione di Poisson di parametro
# Tasso medio di occorrenza di eventi
= 2
lambda_value
# Creazione della distribuzione di Poisson con il tasso medio specificato
= stats.poisson(mu=lambda_value)
poisson_dist
# Calcolo della probabilità di avere un certo numero di eventi
= range(0, 11) # Consideriamo valori da 0 a 10
k_values
# Calcolo delle probabilità corrispondenti
= poisson_dist.pmf(k_values)
probabilities
plt.figure()
# Plot della distribuzione di massa di probabilità
=0.5)
plt.bar(k_values, probabilities, alpha'Numero di Eventi (k)')
plt.xlabel('Probabilità')
plt.ylabel('Distribuzione di Massa di Probabilità di Poisson')
plt.title( plt.show()
La probabilità di ottenere un singolo valore pmf
), dove l’argomento k
rappresenta il numero di eventi (mu
è uguale a
=3, mu=2) stats.poisson.pmf(k
0.18044704431548356
La probabilità di non più di 3 eventi, indicata come
= stats.poisson.pmf(k=0, mu=2) + stats.poisson.pmf(k=1, mu=2) + stats.poisson.pmf(k=2, mu=2) + stats.poisson.pmf(k=3, mu=2)
p p
0.857123460498547
La funzione ppf
, con la probabilità e
=2) stats.poisson.ppf(p, mu
3.0
La funzione di distribuzione cumulativa si calcola utilizzando cdf
. Ad esempio, per calcolare
3, mu=2) stats.poisson.cdf(
0.857123460498547
La generazione di numeri casuali dalla distribuzione di Poisson può essere ottenuta utilizzando rng
. Ad esempio:
= 2
mu = rng.poisson(mu, 1000000) x
Verifichiamo:
np.mean(x)
1.998219
=0) np.var(x, ddof
1.996941828039
Esempio. I dati provenienti dal reparto di maternità di un certo ospedale mostrano che c’è una media storica di 4.5 bambini nati in questo ospedale ogni giorno. Qual è la probabilità che domani nascano 6 bambini in questo ospedale?
Per prima cosa, calcoliamo la probabilità teorica di questo evento utilizzando dpois(). Il numero di successi che stiamo considerando è 6, quindi imposteremo x = 6. Inoltre, questa media storica di 4,5 nascite al giorno è il nostro valore per lambda, quindi imposteremo lambda = 6.
= stats.poisson.pmf(k=6, mu=4.5)
p print(f"La probabilità che domani in questo ospedale nasceranno 6 bambini è: {p:.4f}")
La probabilità che domani in questo ospedale nasceranno 6 bambini è: 0.1281
Simuliamo le nascite in questo ospedale per un anno (n = 365) utilizzando la funzione np.random.poisson
e confrontiamo la proporzione di giorni in cui ci sono stati 6 nascite con la probabilità teorica che abbiamo calcolato in precedenza.
# Simuliamo le nascite in un anno (365 giorni) con una media storica di 4.5 nascite al giorno
= 365
n_days = 4.5
mean_births_per_day = rng.poisson(mean_births_per_day, n_days)
simulated_births
# Calcoliamo la proporzione di giorni in cui sono nati esattamente 6 bambini nella simulazione
= np.mean(simulated_births == 6)
proportion_six_births
# Stampiamo la proporzione calcolata
print(f"La proporzione di giorni in cui, nella simulazione, sono nati 6 bambini è: {proportion_six_births:.4f}")
La proporzione di giorni in cui, nella simulazione, sono nati 6 bambini è: 0.1342
Visualizziamo i risultati della simulazione.
# Visualizziamo l'istogramma delle nascite simulate
=np.arange(12) - 0.5, density=True, alpha=0.5)
plt.hist(simulated_births, bins'Numero di bambini nati per periodo')
plt.xlabel('Proporzione')
plt.ylabel('365 nascite simulate in un ospedale con Poisson($\\mu$ = 4.5)')
plt.title(11)); plt.xticks(np.arange(
Calcoliamo la probabilità teorica della nascita di più di 6 bambini in un giorno.
= 1 - stats.poisson.cdf(6, mean_births_per_day)
prob_more_than_six print(f"La probabilità teorica di più di 6 bambini nati è: {prob_more_than_six:.4f}")
La probabilità teorica di più di 6 bambini nati è: 0.1689
Calcoliamo la proporzione corrispondente nella simulazione
= np.mean(simulated_births > 6)
proportion_more_than_six print(f"La proporzione di giorni con più di 6 bambini nati nella simulazione è: {proportion_more_than_six:.4f}")
La proporzione di giorni con più di 6 bambini nati nella simulazione è: 0.1808
= np.arange(12) - 0.5
bins = np.histogram(simulated_births, bins=bins, density=True)
hist, edges
# Disegna l'istogramma
for i in range(len(hist)):
if edges[i] >= 6:
= 'red' # Colore per x > 6
color else:
= 'blue' # Colore per x <= 6
color =1, align='edge', color=color, alpha=0.5)
plt.bar(edges[i], hist[i], width
# Imposta etichette e titolo
'Numero di bambini nati per periodo')
plt.xlabel('Proporzione')
plt.ylabel('365 nascite simulate in un ospedale con Poisson($\\mu$ = 4.5)')
plt.title(= plt.xticks(np.arange(11)) _
35.5 Distribuzione Beta-Binomiale
La distribuzione beta-binomiale rappresenta una estensione della distribuzione binomiale che tiene conto della variabilità nella probabilità di successo tra i vari tentativi. Viene descritta da tre parametri principali:
Nel dettaglio, la funzione di massa di probabilità per la distribuzione beta-binomiale è data da:
dove:
indica il numero di successi osservati. rappresenta il numero totale di tentativi. e sono i parametri della distribuzione beta, che modellano la variabilità nella probabilità di successo tra i tentativi.
La funzione
dove la funzione gamma
L’importanza della distribuzione beta-binomiale deriva dalla sua capacità di modellare situazioni in cui la probabilità di successo non è fissa, ma segue una distribuzione di probabilità, specificatamente una distribuzione beta. Ciò la rende particolarmente adatta per applicazioni in cui le probabilità di successo cambiano in maniera incerta da un tentativo all’altro, come può avvenire in contesti di ricerca clinica o in studi comportamentali. Rispetto alla distribuzione binomiale, che assume una probabilità di successo costante per tutti i tentativi, la beta-binomiale offre una rappresentazione più realistica e flessibile per dati empirici che presentano variabilità nelle probabilità di successo.
35.6 La Distribuzione Categorica
La distribuzione categorica è una distribuzione di probabilità discreta utilizzata per modellare eventi con più esiti distinti e non ordinati. È una generalizzazione della distribuzione Bernoulliana, che si limita a due esiti (successo e fallimento), ed è utile in situazioni in cui un evento può produrre uno tra molti esiti, ciascuno con una probabilità associata.
35.6.1 Definizione e Funzione di Massa di Probabilità
La distribuzione categorica può essere caratterizzata dalla sua funzione di massa di probabilità (PMF):
dove:
è il numero di esiti possibili, è la probabilità associata al -esimo esito, è una funzione indicatrice che vale 1 se e 0 altrimenti.
Le probabilità
che soddisfa la condizione:
In altre parole, la somma delle probabilità di tutti i possibili esiti è pari a 1, come richiesto da qualsiasi distribuzione di probabilità.
35.6.2 Proprietà Principali
Esiti Multipli: La distribuzione categorica è adatta per modellare eventi con più di due esiti distinti. Un esempio classico è il lancio di un dado a sei facce, dove ciascun esito ha una probabilità di
nel caso di un dado equo.Generalizzazione della Distribuzione Bernoulliana: La distribuzione categorica è una generalizzazione della distribuzione Bernoulliana. In particolare, la distribuzione Bernoulliana rappresenta un caso speciale della distribuzione categorica con due sole categorie (
), come il risultato di un lancio di una moneta (testa o croce).Probabilità in Forma di Simplex: Le probabilità degli esiti nella distribuzione categorica sono rappresentate da un vettore simplex. Un simplex è un vettore di probabilità non negative che sommano a 1, rispettando la condizione fondamentale delle distribuzioni di probabilità.
35.6.3 Utilizzo della Distribuzione Categorica in Stan
In Stan, la distribuzione categorica è impiegata per modellare la probabilità di un singolo esito tra diversi possibili risultati. Questo è particolarmente utile in contesti come le catene di Markov, dove ogni stato può evolvere verso uno tra molti altri stati con una certa probabilità.
Ad esempio, supponiamo di avere una matrice di transizione categorical
può essere utilizzata per modellare la probabilità di osservare una specifica transizione.
Consideriamo un esempio pratico: se uno studente si trova nello stato
Qui, la variabile aleatoria categorical
con le probabilità assegnate ai tre possibili esiti (stati
35.6.3.1 Applicazione nelle Catene di Markov
La distribuzione categorical
è particolarmente efficace nei modelli di catene di Markov, dove descrive le transizioni tra stati in un sistema dinamico. Ogni transizione tra stati è trattata come un evento discreto con più esiti possibili, ciascuno con la propria probabilità. Questo approccio è utile per modellare sistemi con molteplici stati e transizioni complesse, garantendo flessibilità e precisione nella simulazione delle dinamiche del sistema.
In sintesi, la distribuzione categorica in Stan permette di modellare eventi con molteplici esiti in modo semplice ed efficace, rendendola uno strumento prezioso per descrivere fenomeni dinamici, come le catene di Markov o qualsiasi altro processo con transizioni probabilistiche tra stati.
Di seguito, esaminiamo come simulare una distribuzione categorica utilizzando numpy e come creare un istogramma per visualizzare la distribuzione di massa:
# Definire le probabilità della distribuzione categorica
= [0.6, 0.3, 0.1] # Le probabilità per ciascun esito
probabilities
# Definire le categorie
= ["A", "B", "C"]
categories
# Numero di campioni da generare
= 1000
n_samples
# Simulare la distribuzione categorica
= np.random.choice(categories, size=n_samples, p=probabilities)
samples
# Creare un istogramma dei risultati
=np.arange(len(categories) + 1) - 0.5, edgecolor="black")
plt.hist(samples, binsrange(len(categories)), categories)
plt.xticks("Categorie")
plt.xlabel("Frequenza")
plt.ylabel("Istogramma della Distribuzione Categorica Simulata")
plt.title( plt.show()
Concludiamo chiarendo la relazione tra la distribuzione categorica e quella multinomiale.
La distribuzione categorica descrive l’esito di una singola prova con
Esempio: Lanciare un dado a sei facce una volta. Ciascuna faccia ha una probabilità di
La distribuzione multinomiale estende la distribuzione binomiale a più categorie e descrive il numero di esiti su un insieme di prove indipendenti che seguono una distribuzione categorica.
Esempio: Lanciare un dado dieci volte e contare quante volte appare ciascuna faccia.
La distribuzione categorica è un caso particolare della multinomiale quando si effettua una sola prova (
35.6.4 Implementazioni in NumPy
numpy.random.choice
: Campiona da una distribuzione categorica, restituendo uno o più esiti secondo le probabilità specificate.numpy.random.multinomial
: Usata per la distribuzione multinomiale, può simulare una distribuzione categorica impostando .
35.7 La Distribuzione Geometrica
La distribuzione geometrica è una distribuzione discreta che modella il numero di tentativi necessari per ottenere il primo successo in una sequenza di prove Bernoulliane indipendenti. Ogni prova ha due possibili esiti: successo (con probabilità
In termini pratici, la distribuzione geometrica può essere utilizzata per rispondere alla domanda: “Quante prove falliscono prima di ottenere il primo successo?”.
35.7.1 Funzione di Massa di Probabilità
La funzione di massa di probabilità (PMF) della distribuzione geometrica è definita come:
dove:
è il numero di tentativi fino al primo successo (incluso il tentativo in cui si ottiene il successo). è la probabilità di successo in ogni prova. è il numero di prove necessarie per ottenere il primo successo (un numero intero positivo, ).
35.7.2 Proprietà della Distribuzione Geometrica
- Valore Atteso (Media): La media del numero di prove fino al primo successo è data da:
Questo significa che, in media, ci si aspetta di avere
- Varianza: La varianza della distribuzione geometrica è:
- Memoria Assente: La distribuzione geometrica ha una proprietà interessante chiamata “assenza di memoria”. Ciò significa che, dato che non si è verificato alcun successo fino a un certo punto, la probabilità di successo nelle prove future è indipendente dal passato e rimane sempre
.
35.7.3 Applicazione nel Modello
Ad esempio, supponiamo di voler modellare quanti giorni passano prima che un animale venga adottato in un rifugio. Se la probabilità giornaliera di essere adottato è
Nel nostro modello di adozione, stiamo utilizzando la distribuzione geometrica per modellare i giorni fino all’adozione. La probabilità
35.8 Considerazioni Conclusive
In questo capitolo, abbiamo esplorato diverse distribuzioni discrete fondamentali, ciascuna con le sue specifiche applicazioni e peculiarità. Abbiamo iniziato con la distribuzione Bernoulliana, che modella esperimenti con due possibili esiti, come il lancio di una moneta. Abbiamo poi approfondito la distribuzione Binomiale, una generalizzazione della Bernoulliana, che si focalizza sul conteggio del numero di successi in un dato numero di prove indipendenti.
Abbiamo anche esaminato la distribuzione Beta-Binomiale, che estende ulteriormente il modello Binomiale incorporando la variabilità nella probabilità di successo, e la distribuzione di Poisson, utilizzata per modellare il numero di eventi che si verificano in un intervallo di tempo o spazio, quando questi eventi sono rari e indipendenti.
Infine, abbiamo discusso la distribuzione Discreta Uniforme, che attribuisce la stessa probabilità a ogni evento in un insieme finito e discreto. Questa distribuzione è particolarmente utile quando non abbiamo ragioni per assegnare probabilità diverse ai diversi esiti.
Queste distribuzioni formano il cuore dell’analisi statistica discreta e trovano applicazione in un’ampia gamma di settori. In particolare, nel contesto dell’analisi bayesiana, la comprensione della distribuzione Binomiale e Beta-Binomiale è cruciale, poiché queste distribuzioni forniscono le basi per l’aggiornamento bayesiano, un concetto chiave che sarà esplorato nei capitoli successivi.
Per coloro interessati a tecniche più avanzate, la generazione di valori casuali a partire da queste distribuzioni è trattata nell’appendice {ref}rng-appendix
. Questa sezione fornisce strumenti e approfondimenti utili per l’applicazione pratica di questi modelli probabilistici.
In conclusione, le distribuzioni discrete forniscono strumenti essenziali e versatili per modellare e analizzare fenomeni caratterizzati da eventi distinti e quantificabili. La comprensione approfondita di queste distribuzioni è cruciale per chiunque desideri esplorare il vasto campo della probabilità e della statistica.
35.9 Esercizi
Esercizio 35.1 Per ciascuna delle distribuzioni di massa di probabilità discusse, utilizza Python per:
- creare un grafico della funzione, scegliendo opportunamente i parametri;
- estrarre un campione di 1000 valori casuali dalla distribuzione e visualizzarlo con un istogramma;
- calcolare la media e la deviazione standard dei campioni e confrontarle con i valori teorici attesi;
- stimare l’intervallo centrale del 94% utilizzando i campioni simulati;
- determinare i quantili della distribuzione per gli ordini 0.05, 0.25, 0.75 e 0.95;
- scegliendo un valore della distribuzione pari alla media più una deviazione standard, calcolare la probabilità che la variabile aleatoria assuma un valore minore o uguale a questo valore.
35.10 Informazioni sull’Ambiente di Sviluppo
%load_ext watermark
%watermark -n -u -v -iv -w -m
Last updated: Tue May 21 2024
Python implementation: CPython
Python version : 3.12.3
IPython version : 8.24.0
Compiler : Clang 16.0.6
OS : Darwin
Release : 23.4.0
Machine : arm64
Processor : arm
CPU cores : 8
Architecture: 64bit
matplotlib: 3.8.4
seaborn : 0.13.2
pandas : 2.2.2
numpy : 1.26.4
arviz : 0.18.0
scipy : 1.13.0
Watermark: 2.4.3