SciPy – Distribuzione normale o di Gauss (PDF)
In questi capitoli vedremo come è semplice utilizzare la libreria Scipy per risolvere complicati calcoli di algebra e statistica senza dover imparare a memoria funzioni complesse e svolgere singolarmente radici quadrate, esponenziali, quadrati e divisioni.
Distribuzione Gaussiana o normale
Uno dei primi esempi che andremo a provare sarà il calcolo della distribuzione normale la cui formula è nell’immagine sotto:
Per approfondimenti in merito al calcolo della distribuzione normale vi lascio alcuni link sotto, scrivetemi nei commenti se conoscete altri approfondimenti con spiegazioni più chiare e dettagliate:
- Video Distribuzione Gaussiana: https://youtu.be/oDaXrFmAd7Q
- Pagina Wikipedia: https://it.wikipedia.org/wiki/Distribuzione_normale
Con Scipy non è necessario memorizzare la tutta la formula per ricordarci come calcolarla, ovviamente è importante conoscerla per capire come applicarla ma per i nostri fini pratici più semplice e veloce è l’applicazione meglio è!
Esempi pratici…
Per capire subito come funziona Scipy iniziamo subito con qualche esempio che ci aiuti a capire come utilizzare la funzione per il calcolo della distribuzione.
Come primo esempio proviamo a calcolare la distribuzione normale di 0.
from scipy.stats import norm norm.pdf(0) >0.3989422804014327
Utilizziamo gli argomenti
Per la distribuzione normale standardizzata viene utilizzata una media=0 e una varianza=1 che inseriti nella formula si inseriscono rispettivamente con loc=0 e scale=1 quindi la formula diventa:
from scipy.stats import norm norm.pdf(0, loc=0, scale=1) >0.3989422804014327
Distribuzione normale di un array
Se volessimo calcolare la distribuzione standard di un array la prima cosa ci verrebbe in mente da fare è calcolarla per ogni singolo valore utilizzando un loop, ma non è l’approccio corretto, quello che possiamo fare con Scipy è calcolare in un colpo solo la distribuzione di tutto l’array in questo modo:
Utilizzando Numpy (a questo link la guida) creiamo un array r composto da 10 valori random che poi inseriremo nella funziona per il calcolo della deviazione standard.
from scipy.stats import norm import numpy as np r = np.random.randn(10) norm.pdf(r) Out[21]: array([0.22094967, 0.21152985, 0.21564142, 0.3969678 , 0.12117648, 0.37385954, 0.38260955, 0.39675999, 0.00643475, 0.3765106 ])
NOTA: Per questi esempi utilizziamo la funzione randn che restituisce un campione seguendo la distribuzione “standard normale”, maggiori dettagli li potete trovare nella guida ufficiale di SciPy a questo link: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.randn.html#numpy.random.randn
Distribuzione log-normale logpdf(r)
La distribuzione log-normale è una distribuzione statistica non gaussiana di valori con proprietà simili alla distribuzione normale gaussiana.
A questi link potete trovare maggiori dettagli:
- https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.logpdf.html?highlight=logpdf#scipy.stats.rv_continuous.logpdf
- https://it.wikipedia.org/wiki/Distribuzione_lognormale
- https://www.okpedia.it/distribuzione-log-normale
Vediamo un esempio:
from scipy.stats import norm import numpy as np r = np.random.randn(10) norm.logpdf(r) Out[22]: array([-1.77792239, -2.67572512, -0.92659316, -0.97464884, -1.07862644, -0.99047842, -2.03876956, -1.20834348, -1.83205278, -1.40589779])
Funzione di ripartizione (o funzione cumulativa)
La funzione di ripartizione (o funzione cumulativa) è una funzione di variabile reale che rappresenta le informazioni relative ad un fenomeno (un insieme di dati o un evento casuale) riguardanti la sua presenza o distribuzione prima o dopo un certo punto.
A questi link potete trovare maggiori dettagli:
- https://it.wikipedia.org/wiki/Funzione_di_ripartizione
- https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.cdf.html?highlight=cdf#scipy.stats.rv_continuous.cdf
Ecco un esempio:
from scipy.stats import norm import numpy as np r = np.random.randn(10) norm.cdf(r) Out[23]: array([0.90502257, 0.03043402, 0.4507643 , 0.36926628, 0.7140085 , 0.35261915, 0.06725519, 0.22338959, 0.91171317, 0.16185243])
Log della funzione di ripartizione
A questo punto possiamo calcolare allo stesso modo anche il logaritmo della funzione di ripartizione.
A questi link potete trovare maggiori dettagli:
Ecco l’esempio:
from scipy.stats import norm import numpy as np r = np.random.randn(10) norm.logcdf(r) Out[24]: array([-0.09979539, -3.49219411, -0.7968107 , -0.99623727, -0.33686042, -1.04236671, -2.69926112, -1.49883799, -0.09242985, -1.82107031])