Distribuzione Poisson

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à.

Corsi correlati

Design Pattern per videogiochi

I Design Pattern sono soluzioni a problemi comuni che si incontrano nello sviluppo del software. Nel contesto dei videogiochi, questi pattern possono aiutare a gestire la complessità crescente dei giochi moderni. Sei appassionato di videogiochi? Hai mai pensato a come vengono progettati e sviluppati? Sei curioso di scoprire i segreti dietro la creazione dei tuoi giochi preferiti? Allora sei nel posto giusto! Questo corso è stato progettato per fornirti una solida comprensione dei Design Pattern, strumenti fondamentali per ogni sviluppatore di giochi. Attraverso esempi pratici e realistici, esploreremo insieme come questi pattern possono aiutarti a creare giochi più efficienti, flessibili e mantenibili.

Corso Fondamenti di Python

Python, uno dei linguaggi di programmazione più popolari al mondo, è ampiamente utilizzato da colossi dell’informatica e della tecnologia come Google, la Nasa e Mozilla.
Questo corso sui fondamenti di Python esplorerà le ragioni del suo successo duraturo. Impareremo la potente ed espressiva sintassi di Python, che consente di ottenere risultati impressionanti con poche righe di codice.

Blender Masterclass 2

I paesaggi, in generale, possono risultare intimidatori data la loro complessità, costituita da numerosi elementi che sembrano formare qualcosa di virtualmente infinito. Durante le lezioni di questo corso, ci concentreremo su una scomposizione delle diverse fasi coinvolte nella creazione di una scena, affrontandole una alla volta attraverso passi graduati.

Blender Masterclass 1

In questo corso di Blender 3D, Masha, in collaborazione con Gedemy, vi mostrerà il processo di modellazione, UV mapping, shading, e texture painting di un asset. Una volta apprese le basi, vedremo anche come effettuare il baking delle textures e la preparazione con successivo export della mesh in modo che possa essere utilizzabile all’interno di un qualsiasi altro software.

Crea il tuo account gratuito Gedemy

Gedemy è la prima piattaforma di formazione italiana che ti permette di sviluppare competenze in ambiti come Game Design, Programming, Arte, 3D, Tech, AI e molto altro.