La distribuzione Poisson NumPy è uno strumento molto utile quando si vogliono modellare eventi che accadono un certo numero di volte in un intervallo di tempo, spazio o quantità. È una distribuzione discreta molto nota in statistica e trova applicazione in numerosi contesti pratici: numero di chiamate ricevute in un minuto, visite a una pagina web, guasti su una linea produttiva o arrivi in un sistema di coda.
In NumPy, la distribuzione di Poisson si usa in modo semplice attraverso funzioni dedicate alla generazione casuale. Questo approccio è particolarmente comodo per chi lavora con simulazioni, analisi dati o piccoli esperimenti statistici in Python. Anche se il concetto matematico può sembrare inizialmente astratto, l’uso pratico è piuttosto diretto.
Quando si parla di Poisson, il parametro più importante è lambda, spesso indicato con il simbolo λ. Questo valore rappresenta il numero medio di eventi attesi nell’intervallo considerato. Se, ad esempio, ci si aspetta in media 4 ordini all’ora, allora λ sarà uguale a 4.
In NumPy, una delle forme più comuni per generare valori casuali da questa distribuzione è la seguente:
import numpy as np
campione = np.random.poisson(lam=4, size=10)
print(campione)
Questo codice crea un piccolo insieme di 10 valori casuali estratti da una distribuzione di Poisson con media pari a 4. Il risultato sarà una sequenza di interi non negativi, come 2, 5, 4, 3, 6 e così via.
Come generare campioni con la distribuzione di Poisson in NumPy
La funzione più conosciuta è np.random.poisson(). Serve a produrre uno o più valori casuali secondo la distribuzione di Poisson, partendo dal parametro medio desiderato. I due argomenti più importanti sono:
- lam: la media attesa degli eventi
- size: il numero di campioni da generare, oppure la forma dell’array risultante
Un esempio molto semplice può essere questo:
import numpy as np
valore = np.random.poisson(lam=3)
print(valore)
In questo caso viene generato un solo numero casuale. Se invece si desidera creare una serie di osservazioni, si può specificare una dimensione più ampia:
import numpy as np
campioni = np.random.poisson(lam=3, size=20)
print(campioni)
Se vuoi lavorare con matrici o array multidimensionali, NumPy lo consente senza difficoltà:
import numpy as np
matrice = np.random.poisson(lam=5, size=(3, 4))
print(matrice)
Questo è molto comodo nelle simulazioni, perché permette di generare molti dati in una sola istruzione. Per chi è alle prime armi, il vantaggio principale è evidente: si evita di costruire manualmente cicli complessi e si sfrutta la velocità nativa di NumPy.
Parametri principali della funzione NumPy per la Poisson
Vale la pena soffermarsi un momento sul significato concreto dei parametri. Il valore lam non è una soglia, ma una media teorica. I numeri generati non saranno tutti uguali a lambda, ma tenderanno a distribuirsi intorno a quel valore. In altre parole, se imposti lam=10, otterrai spesso valori vicini a 10, ma anche 7, 8, 11 o 13, in base alla casualità del campionamento.
Il parametro size, invece, definisce quanti valori vuoi ottenere. Può essere un intero oppure una tupla. Ad esempio:
import numpy as np
a = np.random.poisson(lam=2, size=5)
b = np.random.poisson(lam=2, size=(2, 3))
print(a)
print(b)
Il primo array contiene 5 valori. Il secondo produce una struttura con 2 righe e 3 colonne. È un dettaglio semplice, ma è uno di quei passaggi che aiutano molto a usare NumPy con maggiore sicurezza.
Quando usare davvero la distribuzione di Poisson
La distribuzione di Poisson è adatta quando si analizzano conteggi di eventi che accadono in modo indipendente, entro un intervallo definito. È spesso impiegata quando si vuole stimare quante volte un evento può verificarsi in una certa finestra temporale o spaziale.
Alcuni esempi comuni:
- numero di email ricevute in un’ora
- accessi a un sito web in un minuto
- difetti rilevati in un tratto di produzione
- arrivi di clienti in un punto vendita
Se i dati che stai trattando rappresentano conteggi e non misure continue, la Poisson può essere una scelta molto sensata. Naturalmente, nella pratica reale bisogna sempre verificare che le ipotesi di base siano plausibili, ma per simulazioni e apprendimento è uno strumento eccellente.
Analizzare i campioni generati con NumPy e la distribuzione Poisson
Dopo aver generato i campioni, il passo successivo è capire se i dati ottenuti sono coerenti con le aspettative. Una prima verifica utile consiste nel calcolare la media campionaria. Se il numero di osservazioni è abbastanza grande, questa media tende ad avvicinarsi al valore di lambda.
import numpy as np
campioni = np.random.poisson(lam=4, size=1000)
media = np.mean(campioni)
print(media)
In molti casi, il valore stampato sarà vicino a 4. Non necessariamente identico, ma ragionevolmente simile. È proprio questo uno degli aspetti più interessanti della simulazione: vedere in modo concreto come la teoria statistica si traduce in dati reali.
Si può anche analizzare la frequenza dei valori generati:
import numpy as np
campioni = np.random.poisson(lam=4, size=1000)
valori, frequenze = np.unique(campioni, return_counts=True)
print(valori)
print(frequenze)
Con np.unique() e l’opzione return_counts=True ottieni l’elenco dei valori presenti e quante volte compaiono. È una soluzione rapida e molto pratica per osservare la forma della distribuzione senza introdurre subito strumenti più avanzati.
Media, varianza e comportamento dei dati
Una caratteristica importante della distribuzione di Poisson è che, a livello teorico, media e varianza coincidono. Questo la distingue da altre distribuzioni discrete e rappresenta un tratto tipico da tenere a mente durante l’analisi.
Con NumPy puoi controllare facilmente anche questi aspetti:
import numpy as np
campioni = np.random.poisson(lam=6, size=5000)
media = np.mean(campioni)
varianza = np.var(campioni)
print("Media:", media)
print("Varianza:", varianza)
In un campione sufficientemente ampio, i due numeri saranno spesso abbastanza vicini. Non perfettamente uguali, perché si tratta comunque di dati casuali, ma abbastanza simili da riflettere il comportamento atteso.
Per una lettura più chiara dei risultati, molti principianti trovano utile confrontare diverse simulazioni cambiando il valore di lambda. Questo permette di vedere subito come cresce il centro della distribuzione e come cambia la dispersione.
import numpy as np
for lam in [2, 5, 10]
{
campioni = np.random.poisson(lam=lam, size=1000)
print("Lambda:", lam)
print("Media:", np.mean(campioni))
print("Varianza:", np.var(campioni))
}
Dal punto di vista didattico, è un esercizio molto efficace. Aiuta a sviluppare intuizione statistica e a comprendere come NumPy traduca le impostazioni del modello in dati effettivi.
Errori comuni da evitare con NumPy Poisson
Uno degli errori più frequenti consiste nel confondere la distribuzione di Poisson con una semplice generazione casuale di numeri interi. In realtà, qui non si stanno estraendo valori uniformi, ma dati che seguono una precisa legge di probabilità.
Un altro errore tipico è usare un campione troppo piccolo e aspettarsi risultati perfettamente aderenti alla teoria. Con poche osservazioni è normale ottenere scostamenti evidenti. Se vuoi una stima più affidabile di media e varianza, è preferibile aumentare il numero di campioni.
Inoltre, è utile sapere che l’API moderna di NumPy propone anche il generatore casuale basato su default_rng(), considerato più attuale rispetto all’uso diretto di np.random. Ecco un esempio:
import numpy as np
rng = np.random.default_rng()
campioni = rng.poisson(lam=4, size=10)
print(campioni)
Questo approccio è consigliato soprattutto nei progetti nuovi, perché rende la gestione della casualità più ordinata e moderna. Se stai studiando la documentazione NumPy più recente, incontrerai spesso questa modalità.