0Pricing
Pandas & NumPy Academy · Lezione

Rilevare e trattare gli outlier

Individui gli outlier con il criterio dell'IQR e gli Z-score, decida se limitarli, rimuoverli o segnalarli e documenti le decisioni.

Rilevare e trattare gli outlier è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Che cos'è un valore anomalo?

Un valore anomalo è un punto dati che differisce sostanzialmente dal resto del dataset. I valori anomali possono essere autentici (un singolo cliente aziendale con un ordine da 500.000 $ in un dataset in cui gli ordini hanno un valore medio di 100 $) oppure errati (un prezzo negativo o un refuso che ha trasformato 120 in 12.000). Il primo passaggio nel trattamento dei valori anomali consiste nel decidere se il valore estremo sia reale e significativo oppure un problema di qualità dei dati: il trattamento cambia radicalmente nei due casi.

import pandas as pd
import numpy as np

df = pd.read_parquet('sales_clean.parquet')
print(df['revenue'].describe())

Rilevamento visivo dei valori anomali: box plot

Un box plot è lo strumento visivo più rapido per individuare i valori anomali. Il box copre l'intervallo interquartile (IQR, da Q1 a Q3), i baffi si estendono fino a 1,5 × IQR e i punti esterni ai baffi vengono tracciati singolarmente come possibili valori anomali. Utilizzi df['revenue'].plot(kind='box') oppure sns.boxplot() di Seaborn per visualizzare immediatamente i valori anomali senza calcolare manualmente le soglie.

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(6, 4))
df['revenue'].plot(kind='box', ax=ax)
ax.set_title('Revenue Distribution — Box Plot')
plt.tight_layout()
plt.show()

Metodo dei limiti IQR

Il metodo dei limiti IQR calcola l'intervallo interquartile e definisce i limiti come Q1 − 1,5 × IQR e Q3 + 1,5 × IQR. I valori esterni a questi limiti vengono contrassegnati come valori anomali. Il moltiplicatore 1,5 è lo standard per i valori anomali moderati; utilizzi 3,0 solo per i valori anomali estremi. Questo metodo è robusto: a differenza degli Z-score, non presuppone una distribuzione normale.

Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outliers = df[(df['revenue'] < lower) | (df['revenue'] > upper)]
print(f'Q1={Q1:.0f}, Q3={Q3:.0f}, IQR={IQR:.0f}')
print(f'Bounds: [{lower:.0f}, {upper:.0f}]')
print(f'Outliers: {len(outliers)}')

Metodo dello Z-score per il rilevamento dei valori anomali

Lo Z-score misura di quante deviazioni standard un valore si discosta dalla media. Un valore con |Z| > 3 è convenzionalmente considerato anomalo e comprende il 99,7% dei dati con distribuzione normale. Tuttavia, gli Z-score sono sensibili proprio ai valori anomali che cercano di rilevare: i valori estremi spostano la media e aumentano la deviazione standard, nascondendo potenzialmente altri valori anomali.

mean = df['revenue'].mean()
std = df['revenue'].std()

df['revenue_z'] = (df['revenue'] - mean) / std
z_outliers = df[df['revenue_z'].abs() > 3]

print(f'Z-score outliers (|z|>3): {len(z_outliers)}')
print(z_outliers[['revenue', 'revenue_z']].head())

Contrassegnare o rimuovere i valori anomali

Non rimuova mai i valori anomali senza documentare e motivare la decisione. Innanzitutto, li contrassegni con una colonna booleana (is_outlier), quindi analizzi se condividono uno schema (stessa regione, stesso prodotto, stesso giorno). Se sono autentici, li mantenga e li gestisca esplicitamente nel modello. Se sono errori, li rimuova e registri il numero di rimozioni nella traccia di audit della pipeline.

df['is_revenue_outlier'] = (df['revenue'] < lower) | (df['revenue'] > upper)

print('Flagged rows:', df['is_revenue_outlier'].sum())
print(df.groupby('is_revenue_outlier')['revenue'].describe())

Limitazione (winsorizzazione) dei valori anomali

La limitazione (o winsorizzazione) sostituisce i valori oltre i limiti con il valore del limite stesso, invece di rimuovere la riga. In questo modo conserva tutte le righe del dataset riducendo al contempo la distorsione che i valori anomali causano nei modelli lineari e nelle statistiche riassuntive. Utilizzi clip(lower=, upper=) per applicare i limiti con un'unica operazione vettorializzata.

df['revenue_capped'] = df['revenue'].clip(lower=lower, upper=upper)

print('Original max:', df['revenue'].max())
print('Capped max:', df['revenue_capped'].max())
print('Rows changed:', (df['revenue'] != df['revenue_capped']).sum())

Trasformazione logaritmica per dati con asimmetria a destra

Le distribuzioni dei ricavi e dei prezzi sono spesso asimmetriche a destra, con una lunga coda di valori elevati. Applicare una trasformazione logaritmica con np.log1p() (logaritmo del valore + 1, per gestire gli zeri) comprime la coda e rende la distribuzione più simmetrica. Molti modelli statistici e molte visualizzazioni presuppongono la normalità; perciò, trasformare logaritmicamente la colonna dei ricavi prima della modellazione migliora spesso i risultati.

df['log_revenue'] = np.log1p(df['revenue'])

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['revenue'].hist(bins=50, ax=axes[0])
axes[0].set_title('Original Revenue')
df['log_revenue'].hist(bins=50, ax=axes[1])
axes[1].set_title('Log Revenue')
plt.tight_layout()
plt.show()

Valori anomali in più colonne

Quando analizza molte colonne contemporaneamente, calcoli programmaticamente i limiti IQR dei valori anomali per tutte le colonne numeriche. Iteri sulle colonne numeriche, calcoli i limiti e memorizzi i risultati in un dizionario. In questo modo può generare un report completo dei valori anomali con poche righe di codice, invece di ripetere manualmente il calcolo dell'IQR per ogni colonna.

numeric_cols = df.select_dtypes(include=['number']).columns

outlier_report = {}
for col in numeric_cols:
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    n_out = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
    outlier_report[col] = n_out

print(pd.Series(outlier_report).sort_values(ascending=False))

Valori anomali bivariati con grafici a dispersione

Alcuni punti sono anomali solo se considerati in combinazione: un unit_price di 10 $ è normale, una quantità di 500 è insolita ma non impossibile, mentre un unit_price di 10 $ con una quantità di 500 per un articolo di lusso è sospetto. I valori anomali bivariati appaiono come punti isolati nei grafici a dispersione. Utilizzi df.plot.scatter('quantity', 'unit_price') per individuare i punti distanti dal gruppo principale.

fig, ax = plt.subplots(figsize=(8, 5))
df.plot.scatter(x='quantity', y='unit_price', alpha=0.3, ax=ax)
ax.set_title('Quantity vs. Unit Price — Bivariate Outliers')
plt.tight_layout()
plt.show()

Documentazione delle decisioni sui valori anomali

Ogni decisione relativa ai valori anomali deve essere registrata: la colonna, il metodo di rilevamento, la soglia utilizzata, il numero di righe contrassegnate e il trattamento applicato (mantenere, limitare o rimuovere). Questa documentazione tutela l'analista durante le revisioni del codice e gli audit. La memorizzi in un dizionario del registro di pulizia che viene salvato insieme al dataset di output.

outlier_log = {
    'column': 'revenue',
    'method': 'IQR 1.5x',
    'lower_bound': round(lower, 2),
    'upper_bound': round(upper, 2),
    'rows_flagged': int(df['is_revenue_outlier'].sum()),
    'treatment': 'cap (winsorise)'
}
for k, v in outlier_log.items():
    print(f'{k}: {v}')

Salvataggio del dataset trattato

Dopo aver contrassegnato e trattato i valori anomali, salvi il DataFrame aggiornato. Mantenga la colonna is_outlier nell'output, così gli utenti a valle potranno scegliere di escludere le righe contrassegnate per analisi specifiche. Salvi la versione sottoposta a limitazione in una colonna con un suffisso chiaro (_capped) accanto all'originale, così la pulizia sarà reversibile.

cols_to_save = [c for c in df.columns if c not in ['revenue_z']]
df[cols_to_save].to_parquet('sales_treated.parquet', index=False)
print('Outlier-treated dataset saved:', df.shape)

Verifica rapida

Verifichi la comprensione dei concetti di analisi dei dati trattati in questa lezione.

Riepilogo della lezione

In questa lezione ha imparato a: rilevare i valori anomali con i limiti IQR e gli Z-score, decidere se contrassegnare, limitare o rimuovere i valori anomali e applicare trasformazioni logaritmiche alle distribuzioni con asimmetria a destra. Ora passeremo alla standardizzazione delle etichette di categoria incoerenti nelle colonne di testo.

Domande Frequenti

La lezione «Rilevare e trattare gli outlier» è gratuita?

Sì — il testo completo di «Rilevare e trattare gli outlier» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Cosa imparerò in «Rilevare e trattare gli outlier»?

Individui gli outlier con il criterio dell'IQR e gli Z-score, decida se limitarli, rimuoverli o segnalarli e documenti le decisioni. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?

Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Rilevare e trattare gli outlier»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?

Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Rilevare e rimuovere i duplicati
  2. Rilevare e trattare gli outlier
  3. Uniformare le categorie incoerenti
  4. Validazione dello schema e asserzioni
← Torna a Pandas & NumPy Academy