Distribuzione Multinomiale: 6 Esercizi Progressivi Risolti con Formule e Python

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Geometria della Probabilità La Distribuzione Multinomiale

Quando si studia calcolo delle probabilità, il primo approccio con i modelli discreti avviene quasi sempre attraverso la distribuzione binomiale. È rassicurante: c’è un successo e c’è un fallimento, un “sì” o un “no”. La realtà, però, non ama i binari semplici. I geni si esprimono in molteplici varianti, i prodotti di una catena di montaggio possono essere perfetti, graffiati o inutilizzabili, e un dado ha sei facce, non due.

Per mappare questa complessità serve fare un passo avanti.

La distribuzione multinomiale è lo strumento matematico che ci permette di gestire esperimenti con più di due esiti possibili.

In questa guida affronteremo 6 esercizi progressivi svolti, pensati per guidarti passo dopo passo dalla teoria combinatoria di base fino alle simulazioni computazionali e all’inferenza statistica, esplorando anche i casi in cui la teoria classica mostra i suoi limiti pratici.

Pubblicità

Esercizio 1 – Lancio di un dado truccato

Il Testo

Un dado a 6 facce è truccato in modo che le probabilità di uscita delle singole facce siano:

[math]p_1 = p_2 = p_3 = 0.10[/math]

[math]p_4 = p_5 = 0.15[/math]

[math]p_6 = 0.40[/math]

Il dado viene lanciato 20 volte.

Calcola la probabilità che le frequenze osservate delle facce da 1 a 6 siano esattamente:

[math](X_1, X_2, X_3, X_4, X_5, X_6) = (2, 2, 2, 3, 3, 8)[/math]

Soluzione e Calcolo

La distribuzione multinomiale generalizza la binomiale a [math]k[/math] categorie mutualmente esclusive con probabilità [math]p_1, \dots, p_k[/math] (la cui somma è sempre pari a 1). Se l’esperimento viene ripetuto [math]n[/math] volte in modo indipendente, la probabilità di osservare esattamente il vettore di conteggi [math]x = (x_1, \dots, x_k)[/math] (con [math]\sum x_i = n[/math]) è definita dalla funzione di massa di probabilità (PMF):

[math]\displaystyle P(X = x) = \frac{n!}{x_1! \, x_2! \cdots x_k!} \prod_{i=1}^{k} p_i^{x_i}[/math]

Nel nostro caso abbiamo [math]n = 20[/math] lanci, [math]k = 6[/math] categorie, ed esiti [math]x = (2, 2, 2, 3, 3, 8)[/math].

Il coefficiente multinomiale rappresenta il numero di modi in cui possiamo disporre questi esiti nei 20 lanci:

[math]\displaystyle \frac{20!}{2! \, 2! \, 2! \, 3! \, 3! \, 8!} = 209,513,304,000[/math]

Moltiplichiamo ora questo coefficiente per il prodotto delle probabilità associate a ciascun esito elevato alla rispettiva frequenza:

[math]\displaystyle (0.10)^2 (0.10)^2 (0.10)^2 (0.15)^3 (0.15)^3 (0.40)^8 = (0.10)^6 (0.15)^6 (0.40)^8 \approx 7.465 \times 10^{-15}[/math]

Moltiplicando i due termini otteniamo la probabilità esatta:

[math]\displaystyle P(X = x) \approx 209,513,304,000 \times 7.465 \times 10^{-15} \approx 0.001564[/math]

Python


import math
from scipy.stats import multinomial

n = 20
x = [2, 2, 2, 3, 3, 8]
p = [0.10, 0.10, 0.10, 0.15, 0.15, 0.40]

# Calcolo manuale diretto
coeff = math.factorial(n) / (math.factorial(2)**3 * math.factorial(3)**2 * math.factorial(8))
prob = coeff * (0.10**6) * (0.15**6) * (0.40**8)
print(f"Probabilità calcolata manualmente: {prob:.6f}")

# Usando scipy
prob_scipy = multinomial.pmf(x, n, p)
print(f"Probabilità con scipy: {prob_scipy:.6f}")
    
Probabilità calcolata manualmente: 0.001564
Probabilità con scipy: 0.001564

Nota: La probabilità è pari allo 0.156% (circa 1 possibilità su 640). Questo valore è estremamente piccolo non perché l’evento sia “anomalo”, ma perché lo spazio campionario multidimensionale di 20 lanci si frammenta in una quantità enorme di combinazioni specifiche possibili.

Domanda di riflessione

Quale proprietà fondamentale hai usato per poter semplicemente moltiplicare le probabilità dei singoli lanci tra loro?

Risposta: Abbiamo sfruttato l’indipendenza stocastica dei lanci. Poiché l’esito di un lancio non influenza in alcun modo i successivi, la probabilità dell’intersezione degli eventi equivale al prodotto delle loro singole probabilità.



Esercizio 2 – Controllo qualità e analisi di dipendenza

Il Testo

Un’azienda produce chip elettronici classificati in tre categorie qualitative:

  • Categoria A (Perfetto): probabilità [math]p_A = 0.70[/math]
  • Categoria B (Lieve difetto): probabilità [math]p_B = 0.20[/math]
  • Categoria C (Grave difetto): probabilità [math]p_C = 0.10[/math]

In un lotto di [math]n = 150[/math] chip estratti in modo indipendente, definiamo [math]X_A, X_B, X_C[/math] i conteggi per ciascuna categoria.

  • Calcola il valore atteso e la varianza del numero di chip di tipo A.
  • Determina la covarianza e il coefficiente di correlazione lineare tra [math]X_A[/math] e [math]X_B[/math].

Soluzione e Calcolo

La distribuzione marginale di una singola variabile [math]X_i[/math] in un modello multinomiale è una distribuzione Binomiale con parametri [math]n[/math] e [math]p_i[/math]. Pertanto, le formule per il valore atteso e la varianza sono immediate:

[math]\displaystyle E[X_i] = n p_i \quad \text{e} \quad Var(X_i) = n p_i (1 – p_i)[/math]

Per la categoria A:

[math]\displaystyle E[X_A] = 150 \times 0.70 = 105[/math]

[math]\displaystyle Var(X_A) = 150 \times 0.70 \times 0.30 = 31.5 \implies SD(X_A) = \sqrt{31.5} \approx 5.61[/math]

Le componenti di una distribuzione multinomiale non sono indipendenti tra loro perché sono legate dal vincolo fisico della somma fissa ([math]\sum X_i = n[/math]). La loro covarianza è sempre negativa (o nulla se una delle probabilità è zero) ed è definita da:

[math]\displaystyle Cov(X_i, X_j) = – n p_i p_j \quad (i \neq j)[/math]

Calcoliamo la covarianza tra [math]X_A[/math] e [math]X_B[/math]:

[math]\displaystyle Cov(X_A, X_B) = – 150 \times 0.70 \times 0.20 = -21.0[/math]

Per comprendere la forza di questo legame, calcoliamo il coefficiente di correlazione lineare di Pearson ([math]\rho[/math]):

[math]\displaystyle \rho(X_A, X_B) = \frac{Cov(X_A, X_B)}{\sqrt{Var(X_A) \cdot Var(X_B)}}[/math]

Calcoliamo prima la varianza di [math]X_B[/math]:

[math]\displaystyle Var(X_B) = 150 \times 0.20 \times 0.80 = 24.0[/math]

[math]\displaystyle \rho(X_A, X_B) = \frac{-21.0}{\sqrt{31.5 \times 24.0}} = \frac{-21.0}{\sqrt{756}} = \frac{-21.0}{27.495} \approx -0.7638[/math]

Python


import numpy as np

n = 150
p_A, p_B = 0.70, 0.20

E_A = n * p_A
Var_A = n * p_A * (1 - p_A)
Var_B = n * p_B * (1 - p_B)
Cov_AB = - n * p_A * p_B
rho = Cov_AB / np.sqrt(Var_A * Var_B)

print(f"E[X_A] = {E_A}")
print(f"Var(X_A) = {Var_A:.2f} (SD = {np.sqrt(Var_A):.2f})")
print(f"Cov(X_A, X_B) = {Cov_AB:.1f}")
print(f"Correlazione (rho) = {rho:.4f}")
    
E[X_A] = 105.0
Var(X_A) = 31.50 (SD = 5.61)
Cov(X_A, X_B) = -21.0
Correlazione (rho) = -0.7638

Nota: Una correlazione pari a [math]-0.7638[/math] indica un legame negativo estremamente forte. Poiché le categorie A e B costituiscono insieme il 90% della produzione totale, se estraiamo molti chip perfetti (A), lo spazio rimanente per i chip con difetti lievi (B) si riduce drasticamente, forzando una compensazione quasi lineare.

Forse potrebbe interessarti anche:  Teorema di Bayes e filtri antispam: come funziona la matematica dietro la posta indesiderata

Domanda di riflessione

Cosa accadrebbe alla correlazione se impostassimo la probabilità dei chip gravi a zero ([math]p_C = 0[/math]), lasciando [math]p_A = 0.50[/math] e [math]p_B = 0.50[/math]?

Risposta: Se [math]p_C = 0[/math], le uniche categorie possibili sono A e B, riducendo il sistema a una binomiale pura dove [math]X_B = n – X_A[/math]. In questo scenario la relazione è deterministica e lineare: la correlazione [math]\rho[/math] diventa esattamente [math]-1.0[/math].



💡 Approfondimento Teorico: Il Motore della Multinomiale

1. La Funzione Generatrice delle Probabilità (PGF)

Perché le formule di media, varianza e covarianza funzionano in questo modo? La risposta elegante risiede nella Funzione Generatrice delle Probabilità (PGF) della distribuzione multinomiale, definita per un vettore di variabili reali [math]t = (t_1, \dots, t_k)[/math] come:

[math]\displaystyle G(t_1, \dots, t_k) = E\left[\prod_{i=1}^{k} t_i^{X_i}\right] = (p_1 t_1 + p_2 t_2 + \dots + p_k t_k)^n[/math]

Da questa singola funzione, tramite derivazione parziale valutata nel punto [math]t = (1, \dots, 1)[/math], possiamo ricavare istantaneamente tutti i momenti della distribuzione:

  • Valore Atteso ([math]E[X_i][/math]):[math]\displaystyle \frac{\partial G}{\partial t_i} = n(p_1 t_1 + \dots + p_k t_k)^{n-1} p_i \implies \left. \frac{\partial G}{\partial t_i} \right|_{t=\mathbf{1}} = n p_i[/math]
  • Momento secondo incrociato ([math]E[X_i X_j][/math] per [math]i \neq j[/math]):[math]\displaystyle \frac{\partial^2 G}{\partial t_i \partial t_j} = n(n-1)(p_1 t_1 + \dots + p_k t_k)^{n-2} p_i p_j \implies \left. \frac{\partial^2 G}{\partial t_i \partial t_j} \right|_{t=\mathbf{1}} = n(n-1)p_i p_j[/math]

Da cui la covarianza:

[math]\displaystyle Cov(X_i, X_j) = E[X_i X_j] – E[X_i]E[X_j] = n(n-1)p_i p_j – (np_i)(np_j) = -n p_i p_j[/math]

2. La Matrice di Covarianza Completa ([math]\Sigma[/math])

In contesti moderni di statistica multivariata e Machine Learning (ad esempio, quando si analizza il livello di output di uno strato Softmax in una rete neurale o nei modelli Latent Dirichlet Allocation), si definisce la matrice di covarianza completa [math]\Sigma[/math] di dimensione [math]k \times k[/math>:

[math]\displaystyle \Sigma = \begin{pmatrix}
n p_1(1-p_1) & -n p_1 p_2 & \cdots & -n p_1 p_k \\
-n p_2 p_1 & n p_2(1-p_2) & \cdots & -n p_2 p_k \\
\vdots & \vdots & \ddots & \vdots \\
-n p_k p_1 & -n p_k p_2 & \cdots & n p_k(1-p_k)
\end{pmatrix}[/math]

Proprietà algebrica fondamentale:
La matrice [math]\Sigma[/math] è singolare (il suo determinante è pari a zero, e il suo rango è al massimo [math]k-1[/math]). Questo accade perché la somma di ogni riga (e di ogni colonna) è esattamente pari a [math]0[/math]. Infatti:

[math]\displaystyle \sum_{j=1}^{k} Cov(X_i, X_j) = Cov\left(X_i, \sum_{j=1}^{k} X_j\right) = Cov(X_i, n) = 0[/math]

Questo implica che le variabili multinomiali giacciono su un iperpiano di dimensione [math]k-1[/math], un concetto chiave per capire perché l’approssimazione normale multivariata richieda la rimozione di una coordinata per evitare singolarità.

Esercizio 3 – Condizionamento e sotto-spazi di probabilità

Il Testo

In una determinata popolazione, la distribuzione storica del gruppo sanguigno è:

  • Gruppo A: [math]p_A = 0.40[/math]
  • Gruppo B: [math]p_B = 0.10[/math]
  • Gruppo AB: [math]p_{AB} = 0.05[/math]
  • Gruppo 0: [math]p_0 = 0.45[/math]

Selezioniamo casualmente un campione indipendente di 100 persone. Supponiamo che analisi preliminari abbiano confermato che il numero di persone con gruppo 0 è esattamente pari a 40 ([math]X_0 = 40[/math]).

Qual è la probabilità che, all’interno dello stesso campione, il numero di individui di gruppo A sia esattamente pari a 38 ([math]X_A = 38[/math])?

Soluzione e Calcolo

Questo esercizio testa una proprietà fondamentale della multinomiale: la sua trattabilità sotto condizionamento. Quando fissiamo il conteggio di una categoria (in questo caso [math]X_0 = 40[/math]), le restanti [math]n’ = n – X_0 = 60[/math] osservazioni devono distribuirsi sulle categorie rimanenti (A, B, AB).

La nuova distribuzione condizionata è ancora una multinomiale basata sulle probabilità rinormalizzate. La somma delle probabilità delle categorie superstiti è:

[math]\displaystyle P_{\text{rimanenti}} = p_A + p_B + p_{AB} = 0.40 + 0.10 + 0.05 = 0.55[/math]

Le nuove probabilità condizionate diventano:

[math]\displaystyle p’_A = \frac{0.40}{0.55} = \frac{8}{11} \approx 0.7273[/math]

Poiché siamo interessati unicamente alla categoria A rispetto a tutte le altre rimaste, possiamo ricondurre il problema a una distribuzione binomiale condizionata, dove il successo è “Gruppo A” (con probabilità [math]p’_A[/math]) e il fallimento è “Qualsiasi altro gruppo escluso lo 0” (con probabilità [math]1 – p’_A[/math]):

[math]\displaystyle X_A \mid (X_0 = 40) \sim \text{Binomiale}\left(n’ = 60, \, p’_A = \frac{8}{11}\right)[/math]

Calcoliamo la probabilità di osservare esattamente 38 successi su 60 prove:

[math]\displaystyle P(X_A = 38 \mid X_0 = 40) = \binom{60}{38} \left(\frac{8}{11}\right)^{38} \left(\frac{3}{11}\right)^{22} \approx 0.030298[/math]

Python


from scipy.stats import binom

n_cond = 60
pA_cond = 0.40 / 0.55
x_A = 38

prob = binom.pmf(x_A, n_cond, pA_cond)
print(f"P(X_A=38 | X_0=40) = {prob:.6f}")
    
P(X_A=38 | X_0=40) = 0.030298

Nota: Il valore esatto calcolato è circa il [math]3.03\%[/math]. La riduzione dello spazio campionario originario tramite il condizionamento ha semplificato drasticamente il problema, trasformando un calcolo multinomiale a 4 variabili in un modello binomiale a singola variabile.

Domanda di riflessione

Se decidessimo di condizionare contemporaneamente su due categorie fisse (es. [math]X_0 = 40[/math] e [math]X_{AB} = 5[/math]), come cambierebbero i parametri della distribuzione condizionata per le categorie rimanenti?

Risposta: Il numero di prove utili scenderebbe a [math]n” = 100 – 40 – 5 = 55[/math]. Le probabilità di A e B verrebbero rinormalizzate dividendo per la loro somma ([math]p_A + p_B = 0.50[/math]), portando a [math]p”_A = 0.40 / 0.50 = 0.80[/math] e [math]p”_B = 0.10 / 0.50 = 0.20[/math].

 

Esercizio 4 – Approssimazione normale multivariata e suoi limiti: un caso in cui fallisce

Il Testo

Prendiamo in considerazione il dado truccato dell’Esercizio 1 ([math]n = 20[/math], [math]p = [0.1, 0.1, 0.1, 0.15, 0.15, 0.40][/math]).

Vogliamo stimare la probabilità dell’evento congiunto:

[math]\displaystyle X_1 \le 3, \, X_2 \le 3, \, X_3 \le 3, \, X_4 \le 4, \, X_5 \le 4, \, X_6 \le 9[/math]

Forse potrebbe interessarti anche:  Simulazione Monte Carlo e Rischio di Credito: Calcolo di EL, UL e VaR con Python

Confronta il risultato ottenuto simulando l’approssimazione tramite normale multivariata con il valore calcolato in modo esatto.

Soluzione e Calcolo

Per applicare l’approssimazione normale multivariata, eliminiamo l’ultima dimensione ([math]X_6[/math]) per rimuovere la singolarità della matrice di covarianza [math]\Sigma[/math]. Definiamo quindi uno spazio ridotto a 5 dimensioni con media [math]\mu = n \cdot p_{\text{ridotto}}[/math] e matrice [math]\Sigma[/math] di dimensione [math]5 \times 5[/math].

Riscriviamo il vincolo su [math]X_6[/math] in termini delle altre variabili:

[math]\displaystyle X_6 \le 9 \implies 20 – \sum_{i=1}^{5} X_i \le 9 \implies \sum_{i=1}^{5} X_i \ge 11[/math]

Nota metodologica: La normale multivariata non ci permette di calcolare direttamente la probabilità richiesta su vincoli così complessi tramite una formula chiusa. Pertanto, approssimiamo l’integrale della densità nello spazio continuo generando un alto numero di campioni dalla normale (simulazione Monte Carlo) e confrontiamo il risultato con l’enumerazione discreta esatta.

Python

import numpy as np
from scipy.stats import multivariate_normal, multinomial

n = 20
p = np.array([0.10, 0.10, 0.10, 0.15, 0.15, 0.40])
k = len(p)

# Spazio ridotto a k-1 dimensioni per evitare singolarità
p_red = p[:-1]
mu = n * p_red

# Costruzione della matrice di covarianza Sigma (5x5)
Sigma = np.zeros((k-1, k-1))
for i in range(k-1):
    for j in range(k-1):
        if i == j:
            Sigma[i,i] = n * p_red[i] * (1 - p_red[i])
        else:
            Sigma[i,j] = - n * p_red[i] * p_red[j]

# Integrazione numerica tramite campionamento normale multivariato
N_sim = 500000

# Usiamo allow_singular=True per evitare il LinAlgError causato
# da possibili arrotondamenti floating point
samples = multivariate_normal.rvs(
    mean=mu, 
    cov=Sigma, 
    size=N_sim, 
    allow_singular=True
)

# Applicazione dei vincoli discreti adattati al continuo
cond_upper = np.all(samples <= [3, 3, 3, 4, 4], axis=1)
cond_sum = np.sum(samples, axis=1) >= 11
prob_approx = np.mean(cond_upper & cond_sum)

# Calcolo esatto per enumerazione esaustiva
prob_exact = 0
for x1 in range(4):
    for x2 in range(4):
        for x3 in range(4):
            for x4 in range(5):
                for x5 in range(5):
                    x6 = 20 - (x1+x2+x3+x4+x5)
                    if 0 <= x6 <= 9:
                        prob_exact += multinomial.pmf([x1, x2, x3, x4, x5, x6], n, p)

# Calcolo dell'errore relativo
errore_relativo = abs(prob_exact - prob_approx) / prob_exact

print(f"Probabilità approssimata (Normale Multivariata): {prob_approx:.5f}")
print(f"Probabilità esatta (Calcolo Combinatorio): {prob_exact:.5f}")
print(f"Errore relativo: {errore_relativo:.2%}")

Output dello script


Probabilità approssimata (Normale Multivariata): 0.05997
Probabilità esatta (Calcolo Combinatorio): 0.20990
Errore relativo: 71.43%
    

Analisi dei Risultati

  • Probabilità Approssimata: [math]\approx 0.060[/math]
  • Probabilità Esatta: [math]\approx 0.210[/math]
  • Errore Relativo:
    [math]\displaystyle \frac{|0.210 – 0.060|}{0.210} \approx 0.714 \implies 71.4\%[/math]

Questo esempio mostra deliberatamente un caso in cui l’approssimazione normale fallisce in modo vistoso.

L’algoritmo commette un errore relativo enorme, sottostimando la probabilità di quasi 3 volte.

Il motivo risiede nella violazione della soglia di sicurezza.

Una regola empirica frequentemente utilizzata suggerisce che le frequenze attese ([math]n p_i[/math]) dovrebbero essere superiori ad almeno [math]5[/math] (preferibilmente [math]10[/math]) affinché l’approssimazione normale sia ragionevole.

Nel nostro caso, per le prime tre facce abbiamo [math]n p_i = 20 \times 0.10 = 2[/math].

Approfondimento: Perché l’approssimazione normale fallisce?

La distribuzione multinomiale vive su uno spazio puramente discreto [math](X_1,\dots,X_k)[/math], dove ogni coordinata può assumere solo valori interi (non esiste l’esito “esce la faccia sei 4.2 volte”).

La normale multivariata, invece, mappa uno spazio continuo [math]\mathbb{R}^{k-1}[/math].

Quando la dimensione campionaria [math]n[/math] è molto piccola, lo “spazio” tra gli interi è troppo grande rispetto alla varianza della distribuzione. Solo all’aumentare di [math]n \to \infty[/math], il Teorema Centrale del Limite permette alla distribuzione discreta di appianarsi, colmando la distanza tra i due mondi matematici e convergendo verso una forma gaussiana.

Domanda di riflessione

Se aumentassimo il numero di lanci del dado a [math]n = 200[/math], mantenendo proporzionalmente gli stessi vincoli, l’approssimazione tramite simulazione normale diventerebbe affidabile?

Risposta:

Sì, l’approssimazione diventerebbe molto più affidabile, perché le frequenze attese di tutte le categorie salirebbero ad almeno [math]20[/math] ([math]n p_i = 200 \times 0.10 = 20[/math]), superando ampiamente le soglie di sicurezza. L’errore relativo rispetto al calcolo esatto tenderebbe a ridursi progressivamente all’aumentare di [math]n[/math].

Esercizio 5 – Verifica d’ipotesi con Test del Chi-Quadrato

Il Testo

Un dado a sei facce viene lanciato 120 volte ottenendo le seguenti frequenze empiriche di uscita per le facce da 1 a 6:

[math]\displaystyle O = (18, 22, 20, 19, 21, 20)[/math]

Verifica l’ipotesi nulla [math]H_0[/math] che il dado sia perfettamente bilanciato (ovvero [math]p_i = 1/6[/math] per ogni faccia) utilizzando un test di bontà dell’adattamento chi-quadrato. Riporta il valore della statistica test, i gradi di libertà e il relativo p-value.

Soluzione e Calcolo

Sotto l’ipotesi nulla [math]H_0[/math], le frequenze attese per ciascuna delle [math]k = 6[/math] categorie sono uniformi:

[math]\displaystyle E_i = n \cdot p_i = 120 \times \frac{1}{6} = 20 \quad \forall i[/math]

La statistica test del Chi-Quadrato di Pearson confronta gli scostamenti quadratici tra frequenze osservate ([math]O_i[/math]) e attese ([math]E_i[/math]), pesandoli su queste ultime:

[math]\displaystyle \chi^2 = \sum_{i=1}^{k} \frac{(O_i – E_i)^2}{E_i}[/math]

Sostituendo i nostri dati:

[math]\displaystyle \begin{aligned}
\chi^2 &= \frac{(18-20)^2}{20} + \frac{(22-20)^2}{20} + \frac{(20-20)^2}{20} \\
&+ \frac{(19-20)^2}{20} + \frac{(21-20)^2}{20} + \frac{(20-20)^2}{20} \\
&= \frac{4}{20} + \frac{4}{20} + 0 + \frac{1}{20} + \frac{1}{20} + 0 = \frac{10}{20} = 0.50
\end{aligned}[/math]

I gradi di libertà per questo test applicato a una distribuzione multinomiale sono pari a:

[math]\displaystyle df = k – 1 = 6 – 1 = 5[/math]

Ora calcoliamo il p-value, ovvero la probabilità di ottenere un valore della statistica test pari o superiore a 0.50 sotto l’ipotesi di un dado perfettamente bilanciato.

Python


import numpy as np
from scipy.stats import chi2

O = np.array([18, 22, 20, 19, 21, 20])
n = 120
E = n * np.array([1/6]*6)

chi2_stat = np.sum((O - E)**2 / E)
df = len(O) - 1
p_value = 1 - chi2.cdf(chi2_stat, df)

print(f"Statistica Chi-Quadrato: {chi2_stat:.4f}")
print(f"Gradi di libertà: {df}")
print(f"p-value: {p_value:.4f}")
    
Statistica Chi-Quadrato: 0.5000
Gradi di libertà: 5
p-value: 0.9921

Nota: Otteniamo un p-value estremamente alto (~0.992). Non vi è alcuna prova per rigettare l’ipotesi nulla [math]H_0[/math]. Anzi, una statistica pari a 0.50 indica che i dati empirici si adattano in modo quasi perfetto al comportamento teorico ideale.

Domanda di riflessione

Come cambierebbe il p-value se le frequenze osservate fossero state [math](10, 30, 20, 20, 20, 20)[/math]?

Risposta: In questo scenario gli scostamenti sarebbero molto più marcati. La statistica calcolata salirebbe a:

Forse potrebbe interessarti anche:  Distribuzione Gamma in Python: MLE, Bayes e mixture con 3 esercizi svolti

[math]\displaystyle \chi^2 = \frac{(10-20)^2}{20} + \frac{(30-20)^2}{20} = 5 + 5 = 10.0[/math]

Con 5 gradi di libertà, un valore di 10.0 produce un p-value di circa 0.075. Pur non essendo sufficiente per rifiutare l’ipotesi nulla al classico livello di significatività del 5%, indicherebbe un forte sospetto di sbilanciamento (un risultato decisamente “borderline”).



Esercizio 6 – Simulazione Monte Carlo per la stima di proporzioni

Il Testo

Genera computationalmente 10,000 campioni estratti da una distribuzione multinomiale con parametri [math]n = 30[/math] e vettore delle probabilità [math]p = (0.30, 0.40, 0.30)[/math].

  • Per ogni campione estratto, calcola la proporzione empirica di osservazioni registrate nella seconda categoria ([math]\hat{p}_2 = X_2 / n[/math]).
  • Stima la media e la varianza empirica di questa proporzione e confrontale con i rispettivi valori teorici.
  • Calcola la probabilità empirica che tale proporzione sia strettamente superiore a 0.45, confrontandola con il valore teorico stimato tramite approssimazione normale.

Soluzione e Calcolo

La teoria ci dice che la proporzione campionaria di una categoria [math]\hat{p}_i = X_i / n[/math] ha le seguenti proprietà:

[math]\displaystyle E[\hat{p}_i] = p_i \quad \text{e} \quad Var(\hat{p}_i) = \frac{p_i (1 – p_i)}{n}[/math]

Per la seconda categoria:

[math]\displaystyle E[\hat{p}_2] = 0.40[/math]

[math]\displaystyle Var(\hat{p}_2) = \frac{0.40 \times 0.60}{30} = \frac{0.24}{30} = 0.0080 \implies SD(\hat{p}_2) = \sqrt{0.0080} \approx 0.0894[/math]

Per trovare la probabilità teorica che la proporzione sia superiore a 0.45 usando l’approssimazione normale, standardizziamo la variabile senza applicare correzioni di continuità:

[math]\displaystyle Z = \frac{0.45 – 0.40}{\sqrt{0.0080}} = \frac{0.05}{0.08944} \approx 0.559[/math]

[math]\displaystyle P(\hat{p}_2 > 0.45) \approx 1 – \Phi(0.559) \approx 0.2881[/math]

Mettiamo ora a confronto questi risultati con una simulazione Monte Carlo in Python:

Python


import numpy as np
from scipy.stats import multinomial, norm

n = 30
p = np.array([0.3, 0.4, 0.3])
N_sim = 10000

# Generazione dei campioni sintetici
samples = multinomial.rvs(n, p, size=N_sim)

# Estrazione delle proporzioni empiriche della seconda categoria
prop2 = samples[:, 1] / n

# Calcolo delle metriche empiriche e teoriche
mean_emp = np.mean(prop2)
var_emp = np.var(prop2)
mean_theo = p[1]
var_theo = (p[1] * (1 - p[1])) / n

# Calcolo della probabilità di superamento della soglia
prob_emp = np.mean(prop2 > 0.45)
z_score = (0.45 - mean_theo) / np.sqrt(var_theo)
prob_theo = 1 - norm.cdf(z_score)

print(f"Media Empirica: {mean_emp:.4f} (Teorica: {mean_theo:.4f})")
print(f"Varianza Empirica: {var_emp:.4f} (Teorica: {var_theo:.4f})")
print(f"P(Proporzione > 0.45) Empirica: {prob_emp:.4f}")
print(f"P(Proporzione > 0.45) Teorica Normale: {prob_theo:.4f}")
    
Media Empirica: 0.4000 (Teorica: 0.4000)
Varianza Empirica: 0.0081 (Teorica: 0.0080)
P(Proporzione > 0.45) Empirica: 0.2895
P(Proporzione > 0.45) Teorica Normale: 0.2881

Domanda di riflessione

Se riducessimo la dimensione del campione a [math]n = 5[/math], l’approssimazione normale della proporzione [math]\hat{p}_2 > 0.45[/math] sarebbe ancora affidabile? In che modo potremmo calcolare la probabilità esatta?

Risposta: Con [math]n = 5[/math] l’approssimazione normale fallisce del tutto a causa della forte discretizzazione dello spazio campionario (la proporzione può assumere solo i valori discreti 0, 0.2, 0.4, 0.6, 0.8, 1). Per ottenere la probabilità esatta in questo scenario, dobbiamo utilizzare direttamente la funzione di ripartizione della distribuzione binomiale marginale: [math]X_2 \sim \text{Binomiale}(n=5, p=0.4)[/math].


Dalla distribuzione multinomiale ai modelli di Machine Learning

Molti algoritmi di Data Science assumono implicitamente che i dati seguano una distribuzione multinomiale. Comprendere a fondo questa distribuzione significa padroneggiare il fondamento probabilistico su cui si poggiano molti dei più avanzati algoritmi moderni di Intelligenza Artificiale. Ecco i campi in cui è la protagonista assoluta:

  • Naive Bayes Multinomiale per la classificazione automatica dei testi (es. filtri anti-spam e sentiment analysis). Modella i documenti come un “bag-of-words” in cui la frequenza di ogni termine segue una multinomiale.
  • Topic Modeling (LDA), dove i documenti sono visti come misture di argomenti, e ogni argomento è una distribuzione multinomiale di parole. (Curiosità matematica: la distribuzione di Dirichlet è la priori coniugata della multinomiale).
  • Regressione logistica multinomiale, l’estensione diretta della regressione logistica binaria per prevedere esiti con più di due categorie.
  • Funzione Softmax nelle reti neurali per la classificazione multiclasse. L’ultimo strato della rete genera un vettore di probabilità che definisce esattamente una distribuzione multinomiale, usata poi per la Cross-Entropy Loss.
  • Modelli linguistici (LLM come GPT) basati sulla previsione continua del token successivo da un enorme vocabolario. La scelta della parola successiva è un campionamento da una gigantesca distribuzione multinomiale; parametri come la Temperature modificano artificialmente le probabilità [math]p_i[/math] per controllare la creatività del testo.
  • Reinforcement Learning: quando un agente IA si muove in uno spazio d’azione discreto, la sua policy mappa lo stato corrente in una distribuzione multinomiale sulle azioni possibili (es. probabilità di andare “su”, “giù”, “destra”, “sinistra”).
  • Computer Vision (Segmentazione Semantica): quando un’IA di guida autonoma assegna ogni pixel a una classe (strada, pedone, cielo, veicolo), sta eseguendo una classificazione multinomiale simultanea su milioni di punti.

📚Distribuzione multinomiale, probabilità e applicazioni nella Data Science

La distribuzione multinomiale è l’estensione naturale della distribuzione binomiale quando ogni prova può produrre più di due risultati. Dai fondamenti teorici agli esercizi svolti, fino alle applicazioni in Python, NLP, marketing analytics e videogiochi, questi articoli offrono un percorso completo per studenti, data analyst e data scientist. :contentReference[oaicite:0]{index=0}

👉La distribuzione multinomiale: teoria, formula ed esempi introduttivi

👉Guida alla distribuzione multinomiale: 6 esercizi svolti dal livello base all’avanzato

👉Distribuzione multinomiale: 6 esercizi svolti e commentati dalla teoria alla pratica

👉Distribuzione multinomiale: formule, esempi reali e codice Python

👉Distribuzione multinomiale: guida pratica per Data Scientist, NLP e Python

👉Distribuzione multinomiale e probabilità di drop nei GdR: guida completa con esercizio

Pubblicità