CLASSE TERZA • MODULO 3.2

Statistiche con NumPy

Capire i dati: mediana, deviazione standard, percentili e molto altro

Il tuo percorso NumPy

1
2
3
4
Fondamenta
(Completato)
Statistiche
(Questo modulo)
Filtri & 2D
(Modulo 3.3)
Per l'AI
(Modulo 3.4)

📝 Ripasso Lampo del 3.1

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.

📊 Funzioni Statistiche: Capire i Dati

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

I dati di esempio

Useremo questi punteggi di un videogioco:

import numpy as np
punteggi = np.array([1200, 1500, 980, 1750, 1320, 1100, 1680, 1050, 1420, 1290])

Minimo, Massimo e Somma

print("Minimo:", punteggi.min())    # 980
print("Massimo:", punteggi.max())   # 1750
print("Somma:", punteggi.sum())     # 13290

La Media (mean)

La media e' il valore che otterresti se distribuissi equamente il totale tra tutti.

print("Media:", punteggi.mean())  # 1329.0
📝 Come si calcola la media: Somma: 1200+1500+980+1750+1320+1100+1680+1050+1420+1290 = 13290 Quanti: 10 valori Media = 13290 / 10 = 1329.0

💡 Analogia: la Media e' come dividere una pizza equamente

Se 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 (il valore “di mezzo”)

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.0
📝 Come si calcola la mediana: 1. Ordina i punteggi dal piu' piccolo al piu' grande: 980, 1050, 1100, 1200, 1290, 1320, 1420, 1500, 1680, 1750 2. Con 10 valori (numero pari), la mediana e' la media dei due centrali: I due centrali sono: 1290 e 1320 Mediana = (1290 + 1320) / 2 = 1305.0

💡 Quando usare la mediana invece della media?

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

📈 Deviazione Standard e Varianza

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())              # ~59781

💡 Analogia: Deviazione Standard = quanto sono “sparsi” i dati

Immagina 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”!

🔍 Come si calcola (semplificato)?

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²).

📊 I Percentili

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

💡 Analogia: i Percentili sono come le posizioni in classifica

Immagina 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! 🎉

📝 Esempio concreto con i nostri punteggi: Punteggi ordinati: 980, 1050, 1100, 1200, 1290, 1320, 1420, 1500, 1680, 1750 25° percentile = 1087.5 Il 25% dei punteggi (i piu' bassi) sta sotto 1087.5 50° percentile = 1305.0 Meta' dei punteggi sta sotto 1305 (= la mediana!) 75° percentile = 1545.0 Il 75% dei punteggi sta sotto 1545

🔍 Trovare la Posizione di Min e Max

print("Posizione del minimo:", punteggi.argmin())  # 2
print("Posizione del massimo:", punteggi.argmax()) # 3

🔍 Spieghiamo: .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.

🔍 Nota: perche' alcune funzioni si chiamano diversamente?

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!

🎨 Bonus: La Distribuzione Normale (Campana di Gauss)

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")

🔍 Spieghiamo: 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.

✅ Checklist: Cosa sai fare ora?

💪 ESERCIZI

Esercizio 1: Statistiche Voti Facile

Crea un array: np.array([5, 7, 8, 4, 6, 9, 5.5, 7, 8.5, 6])

  • Calcola media, mediana e deviazione standard
  • Quanti voti sono sufficienti (≥ 6)? Usa np.sum(voti >= 6)
  • Calcola la percentuale di promossi
  • Trova il voto piu' alto e piu' basso e le loro posizioni con argmin() e argmax()

Esercizio 2: Convertitore Temperature Facile

Crea un array di 15 temperature con np.linspace(-10, 40, 15):

  • Convertile in Fahrenheit: fahrenheit = celsius * 9/5 + 32
  • Calcola media, mediana e deviazione standard in Fahrenheit
  • Quale percentile corrisponde a 0°C in Fahrenheit?

Esercizio 3: Simulatore Dadi Medio

Simula 1000 lanci di due dadi:

  • Crea: dado1 = np.random.randint(1, 7, size=1000) e dado2 uguale
  • Calcola la somma: somme = dado1 + dado2
  • Quante volte esce 7? Usa np.sum(somme == 7)
  • Qual e' la media, mediana e deviazione standard delle somme?

Esercizio 4: Altezze Studenti Medio

Genera 100 altezze: altezze = np.random.normal(loc=170, scale=10, size=100)

  • Calcola media, mediana, min, max
  • Quanti studenti sono piu' alti di 180cm?
  • Calcola i percentili 25, 50, 75
  • Normalizza (z-score): z = (altezze - altezze.mean()) / altezze.std()

🚀 Pronto per il prossimo livello?

Nel Modulo 3.3 imparerai a:

← Torna al 3.1 Vai al Modulo 3.3: Filtri e Matrici →