W3docs

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   = √variance

Deviazione standard di popolazione vs. campione

TermineDivisore della formulaQuando usarlo
Std di popolazioneNSi hanno tutti i punti dati (es. tutti i voti di test di una classe)
Std di campioneN − 1Si 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.81

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

python— editable, runs on the server

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.

python— editable, runs on the server

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

describe() 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.000000

Deviazione 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) / std

StandardScaler 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.43

Il 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

SituazioneStrumento consigliato
Calcolo rapido, nessuna dipendenzastatistics.stdev() / statistics.pstdev()
Operazioni su array o matricinumpy.std()
Statistiche su colonne di DataFramepandas.DataFrame.std()
Pre-elaborazione delle feature MLsklearn.preprocessing.StandardScaler

Errori Comuni

  • ddof errato: NumPy usa per default ddof=0 (popolazione) mentre pandas usa ddof=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() restituisce 0.0 silenziosamente.
  • Addestrare lo scaler sui dati di test: chiamare sempre scaler.fit_transform() sul training set e scaler.transform() (non fit_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
Was this page helpful?