La Funzione di Distribuzione Cumulativa (CDF) in Python

La Funzione di Distribuzione Cumulativa (CDF) è una funzione matematica che fornisce la probabilità che una variabile casuale sia minore o uguale a un certo valore. In altre parole, la CDF fornisce una panoramica della distribuzione di probabilità di una variabile casuale. In Python, è possibile utilizzare la CDF attraverso librerie come NumPy, SciPy o Statmodels. Queste librerie forniscono metodi per calcolare la CDF per diverse distribuzioni probabilistiche, come la distribuzione normale, la distribuzione binomiale, la distribuzione di Poisson, ecc.

Funzione di Distribuzione Cumulativa (CDF) header

La Funzione di Distribuzione Cumulativa (CDF)

La Funzione di Distribuzione Cumulativa (CDF) è un concetto fondamentale in statistica e teoria delle probabilità. Rappresenta la probabilità che una variabile casuale ( X ) assuma un valore minore o uguale a un certo numero ( x ). Formalmente, la CDF di una variabile casuale ( X ) è definita come:

 F_X(x) = P(X \leq x)

Proprietà della CDF

Non-decrescenza: La CDF è una funzione non decrescente. Ciò significa che se  a \leq b , allora  F_X(a) \leq F_X(b) .

Limiti:

 \lim_{x \to -\infty} F_X(x) = 0

 \lim_{x \to \infty} F_X(x) = 1

Continuità destra: La CDF è continua da destra, il che significa che per ogni punto  X :

 F_X(x) = \lim_{\epsilon \to 0^+} F_X(x + \epsilon) .

Interpretazione Grafica

Graficamente, la CDF è una curva che parte dal punto (-\infty, 0 ) e sale fino a (\infty, 1). Per una variabile casuale continua, la CDF sarà una funzione continua, mentre per una variabile discreta la CDF avrà dei “salti” nei punti in cui la variabile casuale assume valori specifici.

CDF per Variabili Discrete e Continue

Variabili Discrete: Per una variabile casuale discreta, la CDF è una funzione a gradino. Ad esempio, se  X è una variabile che assume i valori  x_1, x_2, \ldots, x_n con probabilità  p_1, p_2, \ldots, p_n , allora la CDF è data da:

F_X(x) = \begin{cases}0 & \text{se } x < x_1 \p_1 & \text{se } x_1 \leq x < x_2 \p_1 + p_2 & \text{se } x_2 \leq x < x_3 \\vdots & \vdots \1 & \text{se } x \geq x_n\end{cases}

Variabili Continue: Per una variabile casuale continua, la CDF è una funzione continua. Ad esempio, se  X ha una densità di probabilità  f_X(x) , allora la CDF è l’integrale della funzione di densità:

 F_X(x) = \int_{-\infty}^x f_X(t) \, dt

Utilizzo della CDF

Calcolo delle Probabilità: La CDF può essere utilizzata per calcolare la probabilità che  X si trovi in un intervallo ( [a, b] ):

 P(a \leq X \leq b) = F_X(b) - F_X(a)

Descrizione della Distribuzione: La CDF fornisce una descrizione completa della distribuzione della variabile casuale  X .

Simulazione e Generazione di Numeri Casuali: La CDF è utilizzata per trasformare numeri casuali uniformi in numeri casuali con una distribuzione specifica attraverso il metodo dell’inversione.

Esempi

Distribuzione Normale: La CDF di una variabile casuale normale X con media ( \mu ) e deviazione standard ( \sigma ) è data dalla funzione di errore (erf):

F_X(x) = \frac{1}{2} \left[ 1 + \text{erf} \left( \frac{x - \mu}{\sigma \sqrt{2}} \right) \right

Distribuzione Esponenziale: La CDF di una variabile casuale esponenziale con parametro di tasso  \lambda è:

 F_X(x) = 1 - e^{-\lambda x} \quad \text{per } x \geq 0

La Funzione di Distribuzione Cumulativa è uno strumento potente per comprendere il comportamento delle variabili casuali e per effettuare calcoli di probabilità. La sua importanza risiede nella capacità di descrivere completamente la distribuzione di una variabile casuale e di facilitare il calcolo delle probabilità associate a intervalli di valori.

Calcolare la Funzione di Distribuzione Cumulativa (CDF) in Python

In Python, ci sono diverse librerie che permettono di lavorare con la Funzione di Distribuzione Cumulativa (CDF). Le due librerie più comuni sono numpy e scipy. In questa guida, vedremo come usare entrambe per calcolare e visualizzare la CDF di una variabile casuale.

Utilizzo di numpy e matplotlib con una Variabile Discreta

Per calcolare la CDF di una variabile casuale discreta utilizzando numpy, possiamo semplicemente sommare le probabilità cumulative. Poi, possiamo usare matplotlib per visualizzare la CDF. Ecco un esempio:

import numpy as np
import matplotlib.pyplot as plt

# Generate random discrete data
np.random.seed(0)
data = np.random.randint(0, 10, size=100)

# Calculate relative frequencies
values, counts = np.unique(data, return_counts=True)
probabilities = counts / counts.sum()

# Calculate the CDF
cdf = np.cumsum(probabilities)

# Plot the CDF
plt.step(values, cdf, where='post')
plt.xlabel('Value')
plt.ylabel('CDF')
plt.title('CDF of a Discrete Variable')
plt.grid(True)
plt.show()

Eseguendo si otterrà la seguente rappresentazione grafica:

CDF of a Discrete Variable

Questo codice genera e visualizza la Funzione di Distribuzione Cumulativa (CDF) per un insieme di dati discreti casuali compresi tra 0 e 9. Poiché i dati sono generati con np.random.randint(0, 10, size=100), ci aspettiamo una distribuzione approssimativamente uniforme tra i valori da 0 a 9. Tuttavia, poiché il campione è relativamente piccolo (100 dati), potrebbe esserci una variazione significativa nelle frequenze relative di ciascun valore. Aumentare la dimensione del campione (size=100) può rendere la distribuzione dei dati più uniforme e la CDF più regolare.

Vediamo insieme che cosa abbiamo fatto nel codice. Per prima cosa importiamo le librerie necessarie come numpy e matplotlib.pyplot. numpy è una libreria per il calcolo numerico, mentre matplotlib.pyplot è utilizzata per creare grafici. Poi Impostiamo il seed del generatore di numeri casuali a 0 per rendere i risultati riproducibili. Generiamo 100 numeri interi casuali compresi tra 0 e 9 (inclusi) utilizzando np.random.randint.

np.random.seed(0)
data = np.random.randint(0, 10, size=100)

Utilizziamo np.unique per trovare i valori unici in data e contare quante volte ciascun valore appare. values contiene i valori unici e counts contiene il numero di occorrenze di ciascun valore. Calcoliamo le probabilità relative dividendo ciascun conteggio per la somma totale dei conteggi (counts.sum())

values, counts = np.unique(data, return_counts=True)
probabilities = counts / counts.sum()

Utilizziamo np.cumsum per calcolare la somma cumulativa delle probabilità. Questa operazione ci fornisce la CDF (Funzione di Distribuzione Cumulativa), che rappresenta la probabilità che una variabile casuale assuma un valore minore o uguale a un certo valore.

cdf = np.cumsum(probabilities)

Utilizziamo plt.step per creare un grafico a gradini della CDF. Il parametro where='post' indica che i passaggi avvengono dopo ciascun punto di values.Impostiamo le etichette degli assi x e y utilizzando plt.xlabel e plt.ylabel. Impostiamo il titolo del grafico con plt.title. Attiviamo la griglia del grafico con plt.grid(True).Infine, mostriamo il grafico con plt.show.

plt.step(values, cdf, where='post')
plt.xlabel('Value')
plt.ylabel('CDF')
plt.title('CDF of a Discrete Variable')
plt.grid(True)
plt.show()

Utilizzo di scipy con una Variabile Continua

Per una variabile casuale continua, possiamo usare la distribuzione normale come esempio. La libreria scipy fornisce funzioni pronte per l’uso.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# Parameters of the normal distribution
mu, sigma = 0, 1

# Generate random data
data = np.random.normal(mu, sigma, 1000)

# Create a range of values
x = np.linspace(min(data), max(data), 1000)

# Calculate the CDF
cdf = norm.cdf(x, mu, sigma)

# Visualize the CDF
plt.plot(x, cdf)
plt.xlabel('Value')
plt.ylabel('CDF')
plt.title('CDF of the Normal Distribution')
plt.grid(True)
plt.show()

Eseguendo il codice si otterrà la seguente rappresentazione grafica.

CDF of a Normal Distribution

Si visualizza la Funzione di Distribuzione Cumulativa (CDF) per una distribuzione normale con media 0 e deviazione standard 1. La CDF di una distribuzione normale è una curva a S (funzione sigmoide). Inizia da 0, aumenta lentamente all’inizio, accelera nel mezzo (intorno alla media), e poi rallenta di nuovo mentre si avvicina a 1. La CDF si avvicina a 1 man mano che (x) cresce. Questo riflette il fatto che la probabilità cumulativa di una variabile casuale normale tende a 1 per valori molto grandi di (x). Per la distribuzione normale standard, la CDF al punto (x = 0) sarà 0.5, dato che la metà dei valori si trova a sinistra della media (0) e l’altra metà a destra. La pendenza della curva intorno alla media riflette la deviazione standard; una deviazione standard maggiore renderebbe la transizione più graduale.

La CDF è utile per capire la probabilità cumulativa associata a un certo valore. In sintesi, il risultato del codice mostra una rappresentazione grafica della probabilità cumulativa di una variabile casuale che segue una distribuzione normale standard, fornendo una visione chiara di come i valori si distribuiscono e accumulano.

Vediamo insieme il codice utilizzato.

data = np.random.normal(mu, sigma, 1000)

In questa linea, stiamo generando 1000 punti dati casuali da una distribuzione normale con media (\mu) di 0 e deviazione standard (\sigma) di 1. Questi dati rappresentano una variabile casuale continua che segue la distribuzione normale standard.

x = np.linspace(min(data), max(data), 1000)

Qui, stiamo creando un array di 1000 valori equidistanti che coprono l’intervallo tra il minimo e il massimo dei dati generati. Questo range sarà usato per calcolare e visualizzare la CDF.

cdf = norm.cdf(x, mu, sigma)

In questa linea, stiamo calcolando la CDF per la distribuzione normale standard nei punti specificati dall’array (x). La funzione norm.cdf di scipy calcola la probabilità cumulativa fino a ciascun valore in (x). Infine inseriamo le righe relative alla visualizzazione con matplotlib.

plt.plot(x, cdf)
plt.xlabel('Value')
plt.ylabel('CDF')
plt.title('CDF of the Normal Distribution')
plt.grid(True)
plt.show()

Queste linee di codice creano un grafico della CDF:

  1. plt.plot(x, cdf): Traccia la CDF rispetto ai valori di (x).
  2. plt.xlabel(‘Value’): Etichetta l’asse (x) come “Value”.
  3. plt.ylabel(‘CDF’): Etichetta l’asse (y) come “CDF”.
  4. plt.title(‘CDF of the Normal Distribution’): Imposta il titolo del grafico.
  5. plt.grid(True): Aggiunge una griglia al grafico per una migliore leggibilità.
  6. plt.show(): Mostra il grafico.

Calcolo della CDF con statsmodels da Dati Empirici

Se hai un insieme di dati e vuoi calcolare la CDF empirica, puoi utilizzare la funzione ECDF dal pacchetto statsmodels.

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.distributions.empirical_distribution import ECDF

# Generate random data
data = np.random.normal(0, 1, 1000)

# Calculate the empirical CDF
ecdf = ECDF(data)

# Visualize the empirical CDF
plt.step(ecdf.x, ecdf.y, where='post')
plt.xlabel('Value')
plt.ylabel('CDF')
plt.title('Empirical CDF')
plt.grid(True)
plt.show()

Eseguendo si ottiene la seguente rappresentazione grafica

CDF of Empirical Data

Si visualizza la Funzione di Distribuzione Cumulativa Empirica (ECDF) per un insieme di dati campionati da una distribuzione normale standard. La ECDF appare come una serie di gradini che aumentano da 0 a 1. Ogni salto nel grafico rappresenta l’inclusione di un nuovo dato. L’altezza del salto dipende dal numero di dati uguali; in un set di dati continui, tutti i salti saranno della stessa altezza,  \frac{1}{N} dove  N è il numero di punti dati.La ECDF approssima la CDF teorica della distribuzione normale standard. Con un numero sufficiente di campioni, la ECDF dovrebbe essere molto vicina alla CDF teorica, mostrando una curva a S simile.

Vediamo insieme il codice utilizzato. Generiamo 1000 punti dati casuali da una distribuzione normale con media 0 e deviazione standard 1. Questi dati rappresentano una variabile casuale continua che segue la distribuzione normale standard.

data = np.random.normal(0, 1, 1000)

Poi calcoliamo la ECDF utilizzando la funzione ECDF della libreria statsmodels. La ECDF è una funzione che stima la CDF di una distribuzione empirica, ossia dei dati osservati.

ecdf = ECDF(data)

Infine visualizziamo il risultato tramite matplotlib, come visto negli esempi precedenti.

plt.step(ecdf.x, ecdf.y, where='post')
plt.xlabel('Value')
plt.ylabel('CDF')
plt.title('Empirical CDF')
plt.grid(True)
plt.show()

Lascia un commento