Distribuzione Binominale

La distribuzione binominale in NumPy è uno degli strumenti più utili per simulare eventi con due soli possibili risultati, come successo o fallimento, vero o falso, testa o croce. Se stai iniziando a lavorare con Python e con il calcolo numerico, capire come funziona questa distribuzione ti aiuta a modellare molti casi reali in modo semplice e immediato.

In pratica, la distribuzione binomiale viene usata quando vuoi sapere quante volte un certo evento si verifica in un numero fisso di prove indipendenti. Un esempio classico è il lancio di una moneta: se la lanci 10 volte, quante volte esce testa? Oppure, in un contesto più concreto, quante vendite riesce a chiudere un team commerciale su 20 contatti, sapendo che ogni contatto ha una certa probabilità di andare a buon fine?

Con NumPy, questa simulazione diventa molto agevole grazie alla funzione binomial, presente nel modulo per la generazione casuale. È una funzione molto usata in statistica, data analysis, machine learning e in generale in tutti quei contesti in cui servono simulazioni rapide e realistiche.

Come generare campioni con la distribuzione binomiale in NumPy

Per lavorare con la distribuzione binomiale, in NumPy si usa normalmente numpy.random.binomial. Questa funzione permette di generare uno o più campioni partendo da tre elementi fondamentali:

  • n: il numero di prove eseguite
  • p: la probabilità di successo in ogni prova
  • size: il numero di campioni da generare

La forma più semplice è questa:

import numpy as np

campione = np.random.binomial(
    10,
    0.5
)

print(campione)

In questo esempio, NumPy simula 10 prove con probabilità di successo pari a 0.5. Il risultato è un singolo numero intero, che rappresenta il totale dei successi osservati.

Se invece vuoi generare più valori, puoi specificare il parametro size:

import numpy as np

campioni = np.random.binomial(
    10,
    0.5,
    size=20
)

print(campioni)

In questo caso ottieni un array con 20 simulazioni. Ogni elemento dell’array rappresenta il numero di successi ottenuti in 10 prove.

Questo approccio è molto utile quando vuoi capire il comportamento di un fenomeno su larga scala. Per esempio, puoi simulare centinaia o migliaia di esperimenti e osservare come si distribuiscono i risultati.

Ecco un caso molto comune per chi muove i primi passi: simulare il numero di acquisti completati da 100 utenti, sapendo che ognuno ha una probabilità del 30% di comprare e che ogni simulazione considera 8 opportunità di conversione:

import numpy as np

acquisti = np.random.binomial(
    8,
    0.3,
    size=100
)

print(acquisti)

La funzione è intuitiva, ma va usata con una certa attenzione. La probabilità p deve essere compresa tra 0 e 1, mentre n deve essere un numero intero non negativo. Inoltre, la distribuzione binomiale ha senso quando le prove sono indipendenti e la probabilità di successo rimane costante.

Sintassi di numpy.random.binomial spiegata in modo semplice

La sintassi generale è la seguente:

numpy.random.binomial(
    n,
    p,
    size=None
)

Vediamo il significato dei parametri in modo pratico:

  • n: indica quante prove fai in ogni esperimento
  • p: indica la probabilità che una singola prova abbia successo
  • size: definisce quante simulazioni vuoi ottenere

Se ometti size, NumPy restituisce un solo valore. Se lo imposti, riceverai un array NumPy con la forma desiderata. Ad esempio, puoi anche generare una matrice di risultati:

import numpy as np

matrice = np.random.binomial(
    12,
    0.4,
    size=(3, 4)
)

print(matrice)

Questo produce una matrice con 3 righe e 4 colonne, utile quando vuoi organizzare i campioni in una struttura più leggibile o lavorare su più gruppi contemporaneamente.

Quando usare davvero la distribuzione binominale con NumPy

La distribuzione binomiale è adatta quando ricorrono alcune condizioni precise:

  • esiste un numero fisso di prove
  • ogni prova ha solo due esiti possibili
  • le prove sono indipendenti
  • la probabilità di successo è costante

Se una di queste condizioni viene meno, potrebbe essere più corretto usare un altro modello statistico. Tuttavia, in moltissimi esercizi introduttivi, simulazioni aziendali e problemi didattici, la binomiale resta una delle distribuzioni più immediate da comprendere e da applicare.

Analizzare i campioni generati con la distribuzione binomiale NumPy

Dopo aver generato i campioni, il passo successivo è capire cosa ci stanno raccontando. Questa fase di analisi dei campioni è fondamentale, perché trasforma una semplice simulazione in un’informazione concreta.

Supponiamo di avere 1000 simulazioni di 10 prove con probabilità di successo pari a 0.5:

import numpy as np

campioni = np.random.binomial(
    10,
    0.5,
    size=1000
)

print(campioni)

Su questi dati puoi calcolare statistiche descrittive molto utili, come la media, la deviazione standard, il valore minimo e quello massimo:

import numpy as np

campioni = np.random.binomial(
    10,
    0.5,
    size=1000
)

media = np.mean(campioni)
dev_std = np.std(campioni)
valore_min = np.min(campioni)
valore_max = np.max(campioni)

print("Media:", media)
print("Deviazione standard:", dev_std)
print("Minimo:", valore_min)
print("Massimo:", valore_max)

Se il numero di campioni è abbastanza grande, la media dovrebbe avvicinarsi al valore teorico della distribuzione binomiale, che è dato da n × p. Nel nostro caso, quindi, il risultato atteso è 10 × 0.5 = 5.

Questo è un passaggio molto importante per chi studia statistica con Python: permette di vedere in modo tangibile il legame tra teoria e simulazione.

Distribuzione delle frequenze dei campioni binomiali

Un altro aspetto interessante consiste nel contare quante volte compare ciascun risultato. In questo modo puoi osservare la forma della distribuzione empirica ottenuta dai campioni.

import numpy as np

campioni = np.random.binomial(
    10,
    0.5,
    size=1000
)

valori, frequenze = np.unique(
    campioni,
    return_counts=True
)

print("Valori:", valori)
print("Frequenze:", frequenze)

Con np.unique puoi ottenere sia i valori distinti sia il numero di occorrenze. È un metodo semplice ma molto efficace per leggere la distribuzione dei risultati senza introdurre strumenti troppo avanzati.

Se vuoi un’analisi leggermente più ordinata, puoi unire i risultati in una struttura più chiara:

import numpy as np

campioni = np.random.binomial(
    10,
    0.5,
    size=1000
)

valori, frequenze = np.unique(
    campioni,
    return_counts=True
)

for valore, frequenza in zip(valori, frequenze)
{
    print(f"Successi = {valore}, Frequenza = {frequenza}")
}

Va però ricordato un punto pratico: in Python reale il blocco non usa parentesi graffe, ma l’indentazione. Se stai scrivendo codice eseguibile, la versione corretta è questa:

import numpy as np

campioni = np.random.binomial(
    10,
    0.5,
    size=1000
)

valori, frequenze = np.unique(
    campioni,
    return_counts=True
)

for valore, frequenza in zip(valori, frequenze):
    print(f"Successi = {valore}, Frequenza = {frequenza}")

In un contesto pratico, questa analisi può aiutarti a capire, ad esempio, quale numero di successi compare più spesso o quanto i risultati siano concentrati attorno alla media.

Istogramma e visualizzazione dei risultati simulati

Quando inizi a lavorare con i dati, visualizzare i campioni è spesso il modo più rapido per capirli. Un istogramma ti permette di osservare subito se i valori si concentrano attorno a certi numeri oppure se la distribuzione è più dispersa.

Per farlo, puoi usare Matplotlib insieme a NumPy:

import numpy as np
import matplotlib.pyplot as plt

campioni = np.random.binomial(
    10,
    0.5,
    size=1000
)

plt.hist(
    campioni,
    bins=range(12),
    edgecolor="black",
    align="left"
)

plt.title("Distribuzione Binomiale con NumPy")
plt.xlabel("Numero di successi")
plt.ylabel("Frequenza")
plt.show()

Un grafico di questo tipo è molto utile anche in fase didattica, perché rende la distribuzione binomiale immediatamente leggibile. Se stai studiando la documentazione NumPy o vuoi creare piccoli esperimenti per esercitarti, questo è uno dei modi più efficaci per consolidare i concetti.

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.