Capire i dati: mediana, deviazione standard, percentili e molto altro
import numpy as np
voti = np.array([5, 7, 8, 4, 6, 9])
print("Media:", voti.mean()) # 6.5
print("Massimo:", voti.max()) # 9
voti_aumentati = voti + 1 # Broadcasting!
print("Aumentati:", voti_aumentati)Se capisci tutto questo, sei pronto per il 3.2! Se qualcosa non e' chiaro, torna al Modulo 3.1.
Le statistiche servono a riassumere un gruppo di numeri con pochi valori significativi. Invece di guardare 1000 numeri uno per uno, puoi usare queste funzioni per capire subito “come vanno le cose”.
Useremo questi punteggi di un videogioco:
import numpy as np
punteggi = np.array([1200, 1500, 980, 1750, 1320, 1100, 1680, 1050, 1420, 1290])print("Minimo:", punteggi.min()) # 980
print("Massimo:", punteggi.max()) # 1750
print("Somma:", punteggi.sum()) # 13290La media e' il valore che otterresti se distribuissi equamente il totale tra tutti.
print("Media:", punteggi.mean()) # 1329.0Se 10 amici hanno guadagnato in totale 13290 punti e decidessero di redistribuirli equamente, ognuno avrebbe 1329 punti. Questa e' la media!
Attenzione: la media e' sensibile ai valori estremi. Se un amico avesse 50000 punti, la media salirebbe tantissimo anche se gli altri hanno punteggi bassi.
La mediana e' il valore che sta esattamente nel mezzo quando ordini tutti i numeri dal piu' piccolo al piu' grande.
print("Mediana:", np.median(punteggi)) # 1305.0Immagina 5 persone: 4 guadagnano 1000€/mese e 1 guadagna 100.000€/mese.
Media: (4×1000 + 100000) / 5 = 20.800€ — sembra che tutti siano ricchi!
Mediana: 1000€ — molto piu' rappresentativa della realta'!
La mediana e' piu' affidabile quando ci sono valori estremi che “distorcono” la media.
La deviazione standard (abbreviata “std”) ti dice quanto i valori si allontanano dalla media. In altre parole: i dati sono tutti simili tra loro, oppure sono molto diversi?
print("Deviazione standard:", punteggi.std()) # ~244.6
print("Varianza:", punteggi.var()) # ~59781Immagina due classi che fanno lo stesso compito:
Classe A — voti: [6, 6, 7, 7, 7, 7, 8, 8]
Media = 7, Dev. Std = 0.7 (piccola) → tutti hanno voti simili.
Classe B — voti: [3, 4, 5, 7, 7, 9, 10, 10]
Media = 6.9, Dev. Std = 2.5 (grande) → i voti sono molto diversi tra loro.
La media e' quasi uguale, ma la deviazione standard ti dice che la Classe B ha risultati molto piu' “sparsi”!
1. Calcoli la media dei dati.
2. Per ogni valore, calcoli quanto e' lontano dalla media.
3. Elevi al quadrato ogni differenza (per eliminare i segni negativi).
4. Calcoli la media di questi quadrati → questa e' la varianza.
5. Fai la radice quadrata della varianza → questa e' la deviazione standard.
Non devi calcolarla a mano: punteggi.std() fa tutto per te!
💡 Varianza vs Deviazione Standard?
La varianza = deviazione standard al quadrato. Si usa quasi sempre la deviazione standard perche' ha la stessa unita' di misura dei dati originali (es: cm vs cm²).
Il percentile ti dice: “sotto quale valore cade una certa percentuale dei dati?”
print("25 percentile:", np.percentile(punteggi, 25)) # ~1087.5
print("50 percentile:", np.percentile(punteggi, 50)) # = mediana!
print("75 percentile:", np.percentile(punteggi, 75)) # ~1545.0Immagina 100 studenti ordinati dal voto piu' basso al piu' alto:
25° percentile → il voto dello studente in posizione 25. Il 25% ha un voto uguale o inferiore.
50° percentile → lo studente in posizione 50 (meta' classe). Uguale alla mediana!
75° percentile → solo il 25% degli studenti ha un voto superiore a questo.
Se il tuo voto e' al 90° percentile, significa che hai fatto meglio del 90% degli studenti! 🎉
print("Posizione del minimo:", punteggi.argmin()) # 2
print("Posizione del massimo:", punteggi.argmax()) # 3.argmin() e .argmax()Queste funzioni non restituiscono il valore minimo/massimo, ma la sua posizione (indice) nell'array.
punteggi.argmin() restituisce 2 perche' il valore piu' piccolo (980) si trova in posizione 2 (si conta da 0!).
Per ottenere il valore dalla posizione: punteggi[punteggi.argmin()] → punteggi[2] → 980.
Alcune funzioni si chiamano sull'array (col punto): punteggi.min(), punteggi.mean(), punteggi.std()
Altre si chiamano su NumPy passando l'array tra parentesi: np.median(punteggi), np.percentile(punteggi, 25)
Non c'e' una logica precisa: semplicemente sono state implementate in modo diverso. L'importante e' sapere come usarle!
Molti dati nel mondo reale (altezze, pesi, voti) seguono la distribuzione normale: la maggior parte dei valori sta vicino alla media, e pochi valori sono molto lontani.
# Genera 100 altezze casuali con distribuzione normale
# media = 170cm, deviazione standard = 10cm
altezze = np.random.normal(loc=170, scale=10, size=100)
print(f"Media: {altezze.mean():.1f} cm") # ~170
print(f"Dev.std: {altezze.std():.1f} cm") # ~10
print(f"Minimo: {altezze.min():.1f} cm")
print(f"Massimo: {altezze.max():.1f} cm")np.random.normal(loc=170, scale=10, size=100)loc=170 → la media (il centro della campana). I numeri saranno “attorno” a 170.
scale=10 → la deviazione standard. Piu' e' grande, piu' i numeri sono “sparsi”.
size=100 → quanti numeri generare.
Crea un array: np.array([5, 7, 8, 4, 6, 9, 5.5, 7, 8.5, 6])
np.sum(voti >= 6)argmin() e argmax()Crea un array di 15 temperature con np.linspace(-10, 40, 15):
fahrenheit = celsius * 9/5 + 32Simula 1000 lanci di due dadi:
dado1 = np.random.randint(1, 7, size=1000) e dado2 ugualesomme = dado1 + dado2np.sum(somme == 7)Genera 100 altezze: altezze = np.random.normal(loc=170, scale=10, size=100)
z = (altezze - altezze.mean()) / altezze.std()Nel Modulo 3.3 imparerai a: