here::here("code", "_common.R") |>
source()
# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(performance, see, datawizard, MASS)
24 Outlier
24.1 Introduzione
Quando analizziamo dati reali, ci imbattiamo spesso in osservazioni che sembrano molto diverse dalla maggior parte delle altre. Questi valori anomali, chiamati outlier, possono avere origini diverse. Ad esempio, potrebbero derivare da errori di misura o inserimento dati, oppure essere casi estremi ma comunque validi.
Identificare e trattare gli outlier in modo appropriato è importante per evitare che distorcano i risultati dell’analisi. Tuttavia, non esiste una definizione universale di outlier: dipende dal contesto e dall’obiettivo dell’analisi.
In questo capitolo, esploreremo diversi metodi per individuare gli outlier, concentrandoci su tecniche robuste che minimizzano l’influenza di questi valori anomali sulle statistiche descrittive (Simmons et al., 2011).
24.2 Individuare e Gestire gli outlier
Identificare ed eventualmente eliminare gli outlier rappresenta una fase cruciale dell’analisi dei dati, poiché la presenza di valori anomali può influenzare fortemente le conclusioni che si traggono da analisi statistiche. Gli outlier possono infatti alterare notevolmente statistiche descrittive come media e deviazione standard, ma anche misure di relazione come correlazioni e regressioni. Ciò avviene perché molte tecniche statistiche comuni (ad esempio, la media aritmetica o la regressione lineare con metodo dei minimi quadrati) sono particolarmente sensibili ai valori estremi.
Ad esempio, se stiamo analizzando il reddito medio di un gruppo di persone e includiamo erroneamente dati di reddito estremamente elevati o inseriti per errore, la media risultante sarà molto più alta del reale valore tipico del gruppo, producendo una rappresentazione fuorviante della situazione.
24.2.1 L’importanza della Visualizzazione dei Dati
La rappresentazione grafica dei dati è uno strumento fondamentale per individuare rapidamente la presenza di outlier. Grafici come boxplot, istogrammi e scatterplot consentono di identificare visivamente valori anomali che si discostano dalla distribuzione generale.
Tuttavia, queste tecniche sono efficaci principalmente per outlier unidimensionali o bidimensionali. Nel caso di outlier multidimensionali, l’analisi visiva diventa insufficiente e si rende necessario l’utilizzo di metodi statistici più avanzati, come il calcolo della distanza di Mahalanobis.
24.3 Come Identificare gli Outlier
Oltre alla visualizzazione grafica, esistono tecniche statistiche specifiche che consentono di identificare gli outlier in modo sistematico.
24.3.1 I Boxplot
Uno strumento semplice e intuitivo per individuare gli outlier è il boxplot. Il boxplot riassume la distribuzione di una variabile mostrando la mediana, il primo e il terzo quartile (Q1 e Q3) e due estremi, detti “whiskers”. I punti al di fuori di questi whiskers sono considerati potenziali outlier.
Esempio in R:
data <- data.frame(
value = c(rnorm(100, mean = 10, sd = 2), 30)
) # Aggiungiamo un outlier
ggplot(data, aes(y = value)) +
geom_boxplot() +
coord_flip()
Se il boxplot mostra un punto isolato lontano dagli altri dati, potrebbe essere un outlier.
24.3.2 Metodi Basati sulla Variabilità
24.3.2.1 Intervallo Interquartile (IQR)
John Tukey ha introdotto una definizione operativa di outlier basata sull’Interquartile Range (IQR), ovvero la differenza tra il terzo e il primo quartile:
- I valori inferiori a \(Q1 - 1.5 \times IQR\) o superiori a \(Q3 + 1.5 \times IQR\) sono considerati outlier moderati.
- I valori oltre \(Q1 - 3 \times IQR\) o \(Q3 + 3 \times IQR\) sono definiti far out outliers.
Esempio in R:
Questo metodo è efficace per distribuzioni simmetriche, ma potrebbe non funzionare bene con dati asimmetrici.
24.3.2.2 Median Absolute Deviation (MAD)
Un metodo più robusto rispetto all’IQR è il Median Absolute Deviation (MAD), che utilizza la mediana anziché la media per stimare la dispersione:
Il MAD è meno sensibile agli outlier rispetto alla deviazione standard ed è spesso preferito per dati con distribuzioni non normali.
24.4 Outlier Multivariati
Quando si considerano più variabili contemporaneamente, un valore potrebbe non apparire anomalo su una singola variabile, ma esserlo nel contesto dell’intero dataset. Un metodo comune per individuare questi outlier è la Distanza di Mahalanobis, che tiene conto delle correlazioni tra variabili.
- Con la distanza “normale” (come quella che misuri con un righello), se una persona è più alta o più pesante della media, la distanza è calcolata in modo “isolato”, senza considerare che altezza e peso sono spesso correlate (persone più alte tendono a pesare di più).
- Con la distanza di Mahalanobis, invece, si osserva il “contesto” dei dati. Se tutti nel gruppo hanno un’altezza e un peso che crescono in modo coordinato (ad esempio, ogni 10 cm in più corrispondono a 8 kg in più), questa distanza valuta se la nuova persona si allontana da questo schema generale. Ad esempio, una persona molto alta ma con peso medio potrebbe essere considerata più “anomala” di una persona altrettanto alta ma più pesante, perché viola la relazione tipica del gruppo.
Per comprendere intuitivamente la distanza di Mahalanobis, immaginiamo di avere una nube di punti che rappresentano individui, ciascuno con i propri valori di altezza e peso. Il “centro” di questa nube è un punto ideale che rappresenta una sorta di media multivariata (tenendo conto sia dell’altezza sia del peso). La distanza di Mahalanobis misura quanto ogni singolo individuo si allontana da questo centro, considerando la variabilità congiunta delle variabili (ad esempio, la correlazione tra altezza e peso). Se un individuo presenta caratteristiche molto diverse rispetto alla maggioranza, la sua distanza di Mahalanobis sarà elevata, segnalando un potenziale outlier.
Esempio in R:
Questo metodo è utile per dataset con più variabili correlate, come misure biometriche (altezza e peso).
Tuttavia, la versione classica di questa misura non è particolarmente robusta: la presenza stessa di outlier può distorcere il calcolo del “centro” e della variabilità complessiva, rendendo meno affidabile l’individuazione di altri valori anomali. Per questo motivo, si preferisce utilizzare una variante più resistente, la Minimum Covariance Determinant (MCD), che diminuisce l’influenza degli outlier stessi nel processo di identificazione.
All’interno del pacchetto {performance} in R, è possibile applicare questa variante robusta utilizzando la funzione check_outliers()
con l’argomento method = "mcd"
. In questo modo, è possibile individuare gli outlier multivariati in maniera più solida e coerente, anche quando si lavora con dati fortemente influenzati da valori estremi.
d <- mtcars[, c("mpg", "hp")]
outliers <- performance::check_outliers(d, method = "mcd", verbose = FALSE)
outliers
#> 2 outliers detected: cases 20, 31.
#> - Based on the following method and threshold: mcd (13.816).
#> - For variables: mpg, hp.
Si possono poi visualizzare questi outlier:
plot(outliers)
Sono disponibili anche altre varianti multivariate documentate nella help page della funzione.
24.5 Cosa Fare con gli Outlier?
Una volta identificati gli outlier, dobbiamo decidere se rimuoverli, correggerli o mantenerli (Leys et al., 2019). Alcuni approcci comuni includono:
- Verificare la fonte del dato: un errore di inserimento può essere corretto.
- Rimuovere gli outlier estremi: utile se il valore è chiaramente un errore di misura.
- Usare metodi robusti: strumenti come la mediana o il MAD sono meno influenzati dagli outlier.
- Trasformare i dati: applicare logaritmi o altre trasformazioni può ridurre l’impatto degli outlier.
- Winsorizzazione: invece di rimuovere gli outlier, possiamo limitarli a un massimo accettabile.
Nel pacchetto easystats, la funzione winsorize()
di datawizard semplifica il compito di Winsorizzazione:
winsorized_data <-
winsorize(data$value, method = "zscore", robust = TRUE, threshold = 3)
24.6 Importanza della Trasparenza
Qualunque decisione va documentata chiaramente: quanti outlier sono stati individuati, con quale metodo, a quale threshold, come sono stati gestiti, e preferibilmente con il codice R utilizzato. La preregistrazione e la condivisione dei dati e del codice (ad es. su OSF) sono pratiche consigliate per garantire riproducibilità e trasparenza.
24.7 Riflessioni Conclusive
Abbiamo mostrato come identificare gli outlier in modo coerente e trasparente, allineandoci alle buone pratiche correnti. Tuttavia, la buona pratica non si limita alla scelta degli algoritmi: è fondamentale anche preregistrare le decisioni, essere coerenti, trasparenti e fornire giustificazioni.
24.8 Esercizi
Informazioni sull’Ambiente di Sviluppo
sessionInfo()
#> R version 4.5.0 (2025-04-11)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sequoia 15.5
#>
#> Matrix products: default
#> BLAS: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
#>
#> locale:
#> [1] C/UTF-8/C/C/C/C
#>
#> time zone: Europe/Rome
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] MASS_7.3-65 datawizard_1.1.0 performance_0.13.0
#> [4] thematic_0.1.6 MetBrewer_0.2.0 ggokabeito_0.1.0
#> [7] see_0.11.0 gridExtra_2.3 patchwork_1.3.0
#> [10] bayesplot_1.12.0 psych_2.5.3 scales_1.4.0
#> [13] markdown_2.0 knitr_1.50 lubridate_1.9.4
#> [16] forcats_1.0.0 stringr_1.5.1 dplyr_1.1.4
#> [19] purrr_1.0.4 readr_2.1.5 tidyr_1.3.1
#> [22] tibble_3.2.1 ggplot2_3.5.2 tidyverse_2.0.0
#> [25] rio_1.2.3 here_1.0.1
#>
#> loaded via a namespace (and not attached):
#> [1] generics_0.1.4 stringi_1.8.7 lattice_0.22-7
#> [4] hms_1.1.3 digest_0.6.37 magrittr_2.0.3
#> [7] evaluate_1.0.3 grid_4.5.0 timechange_0.3.0
#> [10] RColorBrewer_1.1-3 fastmap_1.2.0 rprojroot_2.0.4
#> [13] jsonlite_2.0.0 viridisLite_0.4.2 mnormt_2.1.1
#> [16] cli_3.6.5 rlang_1.1.6 withr_3.0.2
#> [19] tools_4.5.0 parallel_4.5.0 tzdb_0.5.0
#> [22] pacman_0.5.1 vctrs_0.6.5 R6_2.6.1
#> [25] lifecycle_1.0.4 htmlwidgets_1.6.4 insight_1.2.0
#> [28] pkgconfig_2.0.3 pillar_1.10.2 gtable_0.3.6
#> [31] glue_1.8.0 xfun_0.52 tidyselect_1.2.1
#> [34] rstudioapi_0.17.1 farver_2.1.2 htmltools_0.5.8.1
#> [37] nlme_3.1-168 labeling_0.4.3 rmarkdown_2.29
#> [40] compiler_4.5.0