Deviazione Standard in Python
Calcola la deviazione standard in Python con il modulo statistics, NumPy e pandas, con casi d'uso ML con scikit-learn.
La deviazione standard misura quanto i valori sono dispersi attorno alla loro media. È una delle statistiche più utilizzate nell'analisi dei dati e nel machine learning — dal verificare se un dataset segue una distribuzione normale al ridimensionamento delle feature prima di addestrare un modello. Questo capitolo spiega cos'è la deviazione standard, come calcolarla in Python con il modulo statistics, NumPy e pandas, e come si integra nei comuni flussi di lavoro ML.
Che cos'è la Deviazione Standard?
La deviazione standard (σ per una popolazione, s per un campione) quantifica la distanza media di ogni punto dati dalla media. Una deviazione standard piccola significa che i valori si raggruppano strettamente attorno alla media; una grande significa che sono ampiamente dispersi.
È la radice quadrata della varianza:
variance = Σ(xᵢ − x̄)² / N # population
variance = Σ(xᵢ − x̄)² / (N − 1) # sample (Bessel's correction)
std dev = √varianceDeviazione standard di popolazione vs. campione
| Termine | Divisore della formula | Quando usarlo |
|---|---|---|
| Std di popolazione | N | Si hanno tutti i punti dati (es. tutti i voti di test di una classe) |
| Std di campione | N − 1 | Si ha un sottoinsieme e si vuole stimare l'intera popolazione |
Il denominatore N − 1 (correzione di Bessel) corregge il bias introdotto quando si stima da un campione. In pratica, per dataset grandi la differenza è trascurabile, ma è importante per campioni piccoli.
Esempio manuale
data = [10, 20, 30, 40, 50]
mean = (10 + 20 + 30 + 40 + 50) / 5 = 30
Differences from mean: -20, -10, 0, 10, 20
Squared differences: 400, 100, 0, 100, 400
Population variance = (400 + 100 + 0 + 100 + 400) / 5 = 200
Sample variance = (400 + 100 + 0 + 100 + 400) / 4 = 250
Population std dev = √200 ≈ 14.14
Sample std dev = √250 ≈ 15.81Il Modulo statistics
Il modulo statistics integrato di Python è il modo più semplice per calcolare la deviazione standard su dataset piccoli — non sono necessarie librerie di terze parti.
stdev() solleva un StatisticsError se si passano meno di due valori, perché una lista con un solo elemento non ha una dispersione significativa.
NumPy std()
NumPy è la scelta standard quando si lavora con array, matrici o dataset di grandi dimensioni. La sua funzione np.std() usa come impostazione predefinita la deviazione standard di popolazione (ddof=0). Passare ddof=1 per ottenere invece la deviazione standard del campione.
NumPy consente anche di calcolare la deviazione standard lungo un asse specifico di un array 2D, utile quando ogni riga è un'osservazione e ogni colonna è una feature:
import numpy as np
# 3 samples, 2 features
X = np.array([[1, 10],
[2, 20],
[3, 30]])
print(np.std(X, axis=0, ddof=1)) # std per feature: [1. 10.]
print(np.std(X, axis=1, ddof=1)) # std per sample: [6.36 6.36 6.36] (approx)pandas std() e describe()
Quando i dati si trovano in un DataFrame, pandas fornisce std() direttamente su qualsiasi colonna o sull'intero frame. Per impostazione predefinita pandas usa ddof=1 (std del campione), seguendo la convenzione di R.
import pandas as pd
temps = [72, 68, 75, 80, 65, 70, 78]
df = pd.DataFrame({"temperature": temps})
print(df["temperature"].std()) # 5.4116 (sample std, ddof=1)
print(df["temperature"].mean()) # 72.5714describe() fornisce un rapido riepilogo statistico che include la deviazione standard per ogni colonna numerica:
import pandas as pd
df = pd.DataFrame({
"height_cm": [165, 170, 175, 160, 180],
"weight_kg": [55, 70, 80, 50, 90],
})
print(df.describe())La riga std nell'output mostra la deviazione standard del campione per ogni colonna:
height_cm weight_kg
count 5.000000 5.000000
mean 170.000000 69.000000
std 7.905694 16.733201
min 160.000000 50.000000
25% 165.000000 55.000000
50% 170.000000 70.000000
75% 175.000000 80.000000
max 180.000000 90.000000Deviazione Standard nel Machine Learning
Ridimensionamento delle feature con StandardScaler
Le feature grezze spesso coprono scale molto diverse (età in anni vs. reddito in migliaia). Algoritmi come la regressione lineare, gli SVM e i k-nearest neighbours sono sensibili a questo squilibrio. La standardizzazione (detta anche normalizzazione z-score) trasforma ogni feature in modo che abbia media = 0 e deviazione standard = 1:
z = (x − mean) / stdStandardScaler di scikit-learn applica questo automaticamente:
from sklearn.preprocessing import StandardScaler
import numpy as np
# 3 samples, 2 features
features = np.array([[1, 2],
[3, 4],
[5, 6]])
scaler = StandardScaler()
scaled = scaler.fit_transform(features)
print(scaled)
# [[-1.2247 -1.2247]
# [ 0. 0. ]
# [ 1.2247 1.2247]]Dopo il ridimensionamento, ogni colonna ha una media di 0 e una deviazione standard di 1. È possibile ispezionare i parametri appresi in seguito:
print(scaler.mean_) # [3. 4.]
print(scaler.scale_) # [1.6330 1.6330]Confronto della variabilità tra gruppi
La deviazione standard aiuta a stabilire se due gruppi sono davvero diversi o semplicemente rumorosi. Due classi possono avere una media simile ma differire notevolmente nella dispersione:
import statistics
scores_a = [78, 80, 82, 79, 81] # consistent group
scores_b = [60, 100, 55, 95, 70] # high-variance group
print(f"Group A — mean: {statistics.mean(scores_a)}, std: {statistics.stdev(scores_a):.2f}")
# Group A — mean: 80, std: 1.58
print(f"Group B — mean: {statistics.mean(scores_b)}, std: {statistics.stdev(scores_b):.2f}")
# Group B — mean: 76, std: 20.43Il Gruppo A e il Gruppo B hanno medie simili, ma la deviazione standard del Gruppo B è ~13× maggiore, indicando risultati molto meno prevedibili.
Rilevamento delle anomalie con i z-score
Uno z-score indica di quante deviazioni standard un valore si trova dalla media. I valori con |z| > 3 sono convenzionalmente candidati come outlier:
import numpy as np
values = np.array([2.0, 2.5, 3.0, 2.8, 100.0, 2.2, 3.1])
mean = np.mean(values)
std = np.std(values, ddof=1)
z_scores = (values - mean) / std
print(z_scores.round(2))
# [-0.39 -0.38 -0.37 -0.37 2.27 -0.39 -0.36]Il valore 100.0 ha uno z-score di 2.27, che — dato il dataset molto piccolo — spicca già fortemente come probabile outlier.
Comprensione dell'incertezza del modello
La deviazione standard compare anche quando si valuta un modello su più fold di cross-validation. Una deviazione standard elevata tra i fold suggerisce che il modello è instabile o che i dati hanno alta varianza. Consulta il capitolo sulla cross-validation per una guida completa.
Scegliere lo Strumento Giusto
| Situazione | Strumento consigliato |
|---|---|
| Calcolo rapido, nessuna dipendenza | statistics.stdev() / statistics.pstdev() |
| Operazioni su array o matrici | numpy.std() |
| Statistiche su colonne di DataFrame | pandas.DataFrame.std() |
| Pre-elaborazione delle feature ML | sklearn.preprocessing.StandardScaler |
Errori Comuni
ddoferrato: NumPy usa per defaultddof=0(popolazione) mentre pandas usaddof=1(campione). Verificare sempre quale si necessita prima di confrontare i risultati delle due librerie.- Liste con un solo elemento:
statistics.stdev()solleva un errore;np.std()restituisce0.0silenziosamente. - Addestrare lo scaler sui dati di test: chiamare sempre
scaler.fit_transform()sul training set escaler.transform()(nonfit_transform) sul test set. Addestrare sui dati di test fa trapelare informazioni e gonfia le metriche di performance. Consulta il capitolo sul train/test split per i dettagli. - Gli outlier distorcono la std: un singolo valore estremo può gonfiare notevolmente la deviazione standard, come mostrato nell'esempio di rilevamento delle anomalie. Considera di verificare prima la presenza di outlier (vedi il capitolo sulla distribuzione dei dati).
Capitoli Correlati
- Media, Mediana e Moda — altre misure di tendenza centrale che completano la deviazione standard
- Percentili — misure di dispersione basate sul rango, robuste agli outlier
- Distribuzione Normale dei Dati — la deviazione standard è il parametro centrale della distribuzione normale
- Scala — strategie di ridimensionamento delle feature più ampie oltre alla standardizzazione
- Distribuzione dei Dati — visualizzazione della dispersione e identificazione dell'asimmetria