Nella analisi dei dati, identificare anomalie (outlier detection) è un tema cruciale che può fornire parecchie informazioni importanti.

In questo articolo ci concentreremo sui metodi e tecniche utilizzati per identificare le anomalie nei dati. In particolare, esploreremo tecniche di visualizzazione dei dati e l'utilizzo di statistiche descrittive e test statistici.

La definizione di anomalia

Una anomalia, spesso riferita come outlier dall’inglese, è un valore che si discosta significativamente dagli altri valori del dataset. Questo discostamento può essere numerico o anche categoriale.

Ad esempio, un discostamento numerico è quando abbiamo un valore molto più grande o molto più piccolo rispetto alla maggior parte degli altri valori all'interno del dataset.

Un discostamento categoriale, invece, si verifica quando abbiamo delle etichette note come "altro" o "sconosciuto" che rappresentano una proporzione molto più alta rispetto alle altre etichette all'interno del dataset.

Può essere causata da errori di misurazione, errori di input, errori di trascrizione o semplicemente da dati che non seguono il normale andamento del dataset.

In alcuni casi, le anomalie possono essere indicative di problemi più ampi nel dataset o nel processo che ha prodotto i dati e possono offrire informazioni importanti alle persone che hanno sviluppato il processo di raccolta dati.

Come identificare le anomalie in un set di dati

Ci sono diverse tecniche che puoi utilizzare per identificare le anomalie nei tuoi dati. Ecco quelle che toccheremo in questo articolo

  • visualizzazione dei dati: che permette di identificare anomalie guardando la distribuzione dei dati facendo uso di grafici utili a tale scopo
  • utilizzo di statistiche descrittive, come la differenza interquartilica
  • utilizzo di score z
  • utilizzo di tecniche di clustering: che permette di individuare gruppi di dati simili e di identificare eventuali dati "isolati" o "non classificabili"

ognuno di questi metodi è valido per identificare le anomalie, e vanno scelti in base ai nostri dati. Vediamone uno per uno.

Visualizzazione dei dati

Una delle tecniche più comuni per trovare anomalie è attraverso l’analisi esplorativa dei dati e in particolare con la visualizzazione dei dati.

Utilizzando Python, puoi utilizzare librerie come Matplotlib o Seaborn per visualizzare i dati in modo tale da poter individuare facilmente eventuali anomalie.

Ad esempio, è possibile creare un istogramma o un boxplot per visualizzare la distribuzione dei tuoi dati e individuare eventuali valori che si discostano significativamente dalla media.

L’anatomia del boxplot può essere compresa da questo post su Kaggle.

Everything you need to know about boxplot | Data Science and Machine Learning
Everything you need to know about boxplot.

Utilizzo di statistiche descrittive

Un altro metodo per individuare le anomalie è l’utilizzo di statistiche descrittive. Ad esempio, la differenza interquartilica (IQR) può essere utilizzata per identificare i valori che si discostano significativamente dalla media.

La differenza interquartilica (IQR) è definita come la differenza tra il terzo quartile (Q3) e il primo quartile (Q1) del dataset. Gli outlier sono definiti come i valori al di fuori dell'intervallo IQR moltiplicato per un coefficiente tipicamente di 1,5.

Il boxplot precedentemente trattato è proprio un metodo che utilizza tale metrica descrittiva per identificare le anomalie.

Un esempio in Python per identificare gli outlier utilizzando la differenza interquartilica è il seguente:

import numpy as np

def find_outliers_IQR(data, threshold=1.5):
    # Calcola il primo e il terzo quartile
    Q1, Q3 = np.percentile(data, [25, 75])
    # Calcola l'IQR
    IQR = Q3 - Q1
    # Calcola la soglia inferiore e superiore
    lower_bound = Q1 - (threshold * IQR)
    upper_bound = Q3 + (threshold * IQR)
    # Identifica gli outlier
    outliers = [x for x in data if x < lower_bound or x > upper_bound]
    return outliers

Questo metodo calcola il primo e il terzo quartile del dataset, poi calcola l'IQR e la soglia inferiore e superiore. Infine, identifica gli outlier come quei valori che sono al di fuori della soglia inferiore e superiore.

Questa comoda funzione può essere utilizzata per identificare gli outlier in un dataset e può essere aggiunta al tuo toolkit di funzioni util in pressoché qualsiasi progetto.

Utilizzo di score z

Un altro modo per individuare le anomalie è attraverso dei punteggi z. Gli score z misurano quanto un valore si discosta dalla media in termini di deviazioni standard.

La formula per convertire i dati in punteggi z è la seguente:

\[ z = \frac{x - \mu}{\sigma} \]

dove \( x \) è il valore originale, \( \mu \) è la media del dataset e \( \sigma \) è la deviazione standard del dataset. Il punteggio z indica quanti deviazioni standard il valore originale è distante dalla media. Un valore di punteggio z superiore a 3 (o inferiore a -3) è generalmente considerato un outlier.

Questo metodo è particolarmente utile quando si lavora con grandi dataset e quando si vuole identificare anomalie in modo oggettivo e riproducibile.

In sklearn in Python, la conversione in punteggi z può essere fatta così

from sklearn.preprocessing import StandardScaler

def find_outliers_zscore(data, threshold=3):
    # Standardizza i dati
    scaler = StandardScaler()
    standardized = scaler.fit_transform(data.reshape(-1, 1))
    # Identifica gli outlier
    outliers = [data[i] for i, x in enumerate(standardized) if x < -threshold or x > threshold]
    return outliers

Utilizzo di tecniche di clustering

Infine, le tecniche di clustering possono essere utilizzate per individuare eventuali dati "isolati" o "non classificabili". Questo può essere utile quando si lavora con dataset molto grandi e complessi, dove la visualizzazione dei dati non è sufficiente per individuare le anomalie.

In questo caso, un'opzione è di utilizzare l'algoritmo DBSCAN (Density-Based Spatial Clustering of Applications with Noise), che è un algoritmo di clustering che può identificare gruppi di dati in base alla loro densità e individuare eventuali punti che non appartengono a nessun cluster. Questi punti sono considerati come anomalie.

L'algoritmo DBSCAN può essere implementato sempre con sklearn di Python e può essere utilizzato per identificare anomalie in un set di dati.

Prendiamo ad esempio questo dataset visualizzato

L’applicazione di DBSCAN fornisce questa visualizzazione

Il codice per creare questi grafici è il seguente

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

def generate_data_with_outliers(n_samples=100, noise=0.05, outlier_fraction=0.05, random_state=42):
    # Genera dati casuali
    X = np.concatenate([np.random.normal(0.5, 0.1, size=(n_samples//2, 2)),
                         np.random.normal(1.5, 0.1, size=(n_samples//2, 2))], axis=0)
    
    # Aggiungi outlier
    n_outliers = int(outlier_fraction * n_samples)
    outliers = np.random.RandomState(seed=random_state).rand(n_outliers, 2) * 3 - 1.5
    X = np.concatenate((X, outliers), axis=0)
    
    # Aggiungi rumore ai dati per renderli verosimili
    X = X + np.random.randn(n_samples + n_outliers, 2) * noise
    
    return X

# Genera dati con outlier
X = generate_data_with_outliers(outlier_fraction=0.2)

# Applica DBSCAN per trovare cluster e outlier
dbscan = DBSCAN(eps=0.2, min_samples=5)
dbscan.fit(X)

# Ottieni gli indici dei punti outlier
outlier_indices = np.where(dbscan.labels_ == -1)[0]

# Visualizza dati e outlier
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_, cmap="viridis")
plt.scatter(X[outlier_indices, 0], X[outlier_indices, 1], c="red", label="Outliers", marker="x")
plt.xticks([])
plt.yticks([])
plt.legend()
plt.show()

Questo metodo crea un oggetto DBSCAN con i parametri eps e min_samples e lo adatta ai dati. Quindi identifica gli outlier come quei valori che non appartengono a nessun cluster, cioè quelli che sono etichettati come -1.

Questa è solo una delle molte tecniche di clustering che si possono utilizzare per identificare le anomalie. Ad esempio, un metodo basato sul deep learning si basa sugli autoencoder particolari reti neurali che sfruttano una rappresentazione compressa del dato per identificare caratteristiche distintive nei dati in input.

Conclusione

In questo articolo abbiamo visto diverse tecniche che possono essere utilizzate per identificare le anomalie nei dati.

Abbiamo parlato di visualizzazione dei dati, di utilizzo di statistiche descrittive e di score z, e di tecniche di clustering.

Ognuna di queste tecniche è valida e va scelta in base al tipo di dati che si sta analizzando. L'importante è ricordare che l'individuazione delle anomalie può fornire informazioni importanti per migliorare i processi di raccolta dati e per prendere decisioni migliori in base ai risultati ottenuti.