Capitolo 4 Il trattamento preliminare e la fase di pulizia dei dati
I dati che sono oggetto delle analisi esplorative spesso vengono acquisiti in una forma grezza e quindi possono presentare difetti, inaccuratezze o imperfezioni. Inoltre, la fase di acquisizione e raccolta dei dati e quella della loro organizzazione informatica in una base di dati hanno un carattere generale e non sempre si ha in mente la successiva analisi dei dati che può avre molteplici finalità. Pertanto i dati vanno preliminarmente trattati per renderli idonei e funzionali agli specifici obiettivi conoscitivi.
La fase di pulizia e trasformazione dei dati è di grande importanza e spesso la qualità delle successive analisi dipende in maniera cruciale da essa. Tale fase, per la quale spesso si usa il termine data wrangling o data munging, è quindi il processo di trasformazione e strutturazione dei dati da una forma grezza a un formato “pulito” con l’intento di migliorare la qualità dei dati e renderli più fruibili e utili.
Alcune delle tecniche di pre-trattamento dei dati richiedono conoscenze che vanno oltre gli aspetti elementari tipici di un corso come il presente che ha un carattere introduttivo, ciò nonostante possono essere formulati i concetti di base e compresi i temi e i problemi fondamentali.
4.1 Dati mancanti e valori anomali
4.1.1 Dati mancanti
Si è già avuto modo di osservare che alcune matrici dei dati, che poi in R
sono strutturati in dataframe
, hanno dei buchi, ovvero per alcune unità statistiche, in corrispondenza di una o più variabili, manca l’informazione. Si tratta di situazioni in cui non è stato possibile ottenere il valore della variabile per i motivi più svariati (se i dati provengono da indagini sulla popolazione i soggetti potrebbero avere rifiutato di fornire la risposta ad alcuni quesiti, lo strumento che doveva rilevare alcune variabili non ha funzionato, il dato è stato magari rilevato ma è palesemente errato per cui viene omesso).
Tale mancanza di informazione, come si è già visto, nel data frame in R
viene poi identificata con il codice speciale NA
(Not Available). Occorre prestare attenzione al fatto che, in alcuni casi, si decide di assegnare al valore mancante un codice numerico speciale (che non può corrispondere a nessuno dei valori previsti per la variabile, ad esempio il valore “999”) o un altra sigla. In tal caso, se si usa R
è consigliabile trasformare questi in NA
.
Le diverse funzioni di R
prevedono alcune soluzioni standard riguardo a come trattare la mancata risposta:
- per alcune funzioni, come ad esempio media()
, var()
, median
, se la variabile da analizzare contiene NA
, la funzione potrebbe non funzionare e occorre specificare esplicitamente come trattare il dato mancante attraverso il parametro na.rm=TRUE
, che è un parametro logico che indica se rimuovere o meno i valori mancanti, così che la funzione svolge i calcoli solo sui dati disponibili.
# Riprendiamo ancora i dati di AutoBi.
# L'ultima riga del summary del data frame contiene per ogni variabile
# il conteggio degli `NA`
summary(AutoBi)[7,]
## CASENUM ATTORNEY CLMSEX MARITAL
## NA NA "NA's :12 " "NA's :16 "
## CLMINSUR SEATBELT CLMAGE LOSS
## "NA's :41 " "NA's :48 " "NA's :189 " NA
## LOSSclass
## NA
## [1] NA
# essa non è calcolata per la presenza di valori mancanti, il default del parametro
# `na.rm` è FALSE
mean(AutoBi$CLMAGE, na.rm=T)
## [1] 32.53084
- Per altre funzioni, è presente una soluzione di default (ad esempio, vengono eliminati tutti i casi in cui il dato è mancante). Ad esempio se facciamo una tabella di una variabile categoriale i dati mancanti vengono ignorati semplicemente
##
## 1 2 3 4
## 624 650 15 35
# se si volessero evidenziare i dati mancanti allora si può utilizzare il parametro `useNA`
table(AutoBi$MARITAL, useNA="ifany")
##
## 1 2 3 4 <NA>
## 624 650 15 35 16
- La gestione dei dati mancanti diviene più complessa se si analizzano più variabili congiuntamente. Se, ad esempio, si devono analizzare congiuntamente una coppia di variabili (o anche più di due variabili, tema questo che sarà oggetto dei prossimo capitoli), potrebbe diminuire notevolmente il numero di casi disponibili in quanto viene esclusa ogni unità per cui in almeno una della variabili oggetto di analisi vi sia un
NA
.
auto<-na.omit(AutoBi) # tale funzione conserva solo i casi completi
anyNA(auto) # con questo comando si controlla che nel data set non ci siano dati mancanti
## [1] FALSE
## [1] 1091 9
Si vedrà più avanti che, in casi simili, nelle funzioni adatte ad analisi di più variabili, si possono specificare altre strategie riguardo l’esclusione dei dati mancanti.
Vi sono molte soluzioni che sono state proposte per il trattamento e la compensazione dei dati mancanti, tuttavia esse coinvolgono spesso metodi e concetti che vanno oltre quello che è il livello di un corso introduttivo all’analisi dei dati. Si fornisce tuttavia una breve introduzione intuitiva a alcune idee e tecniche per compensare i dati mancanti.
4.1.1.1 Le caratteristiche dei dati mancanti
Come già ricordato, è sempre indispensabile avere consapevolezza di quanti dati validi sono disponibili per l’analisi di ciascuna variabile. Occorre sempre tenere a mente che quando per una variabile non vengono rilevati dati per tutti le unità del collettivo esaminato, questo può dare origine a problemi:
- a seguito della eliminazione dei dati mancanti, i casi disponibili potrebbero ridursi in misura così marcata da rendere l’analisi priva di significato;
- vi è la possibilità che i dati mancanti, anche quando essi riguardano una piccola porzione dell’intero collettivo oggetto di analisi, possano essere relativi a unità con caratteristiche diverse da quelle per le quali l’informazione è disponibile. I dati mancanti in tal caso sono selettivi e limitare l’analisi ai soli dati disponibili porterebbe a una raffigurazione dei fenomeni parziale, distorta e non veritiera. Si pensi, ad esempio, al caso in cui si sono raccolte con un questionario informazioni sul reddito da lavoro e si voglia svolgere una analisi descrittiva su tale variabile. Se i dati mancanti riguardassero in larga prevalenza coloro che hanno i redditi più elevati (spesso i più restii a fornire il dato), l’analisi dei dati disponibili fornirebbero una raffigurazione distorta del fenomeno.
La soluzione di ignorare semplicemente i dati mancanti e utilizzare solo i casi disponibili può quindi essere ritenuta ragionevole se:
- la proporzione di casi mancanti è una quota molto limitata, una porzione molto piccola del totale dei casi presenti nel data frame e
- vi sono buone ragioni per escludere che questa (possibilmente piccola) porzione di dati mancanti non sia del tutto diversa dai dati disponibili. In particolare, se vale questa seconda proprietà, può essere accettabile anche una proporzione maggiore di dati mancanti.
Al fine poi di fornire supporto all’idea che i dati mancanti siano o meno selettivi, può essere talvolta utile vedere se per le altre variabili del data frame, per le quali si dispone dell’osservazione completa, vi siano o meno differenze distributive per il gruppo dei dati osservati e dei dati mancanti. Si badi bene però che, anche se questo accadesse, esso sarebbe solo un indizio che non vi sia mancata risposta selettiva, ma non una prova. Può infatti accadere che le due variabili abbiano uguale distribuzione riguardo ad altre variabili ma continui ad essere presente selettività.
4.1.1.2 Tipi di dati mancanti
Le caratteristiche fondamentali del fenomeno dei dati mancanti fanno riferimento alla formalizzazione probabilistica di alcuni concetti esposti sopra. Nella letteratura sui dati mancanti si parla di
- “dati mancanti totalmente a caso” (MCAR), in cui occorre immaginare che i dati che non si osservano abbiano caratteristiche del tutto simili a quelli osservati;
- “dati mancanti a caso” (MAR), in cui i dati mancanti hanno caratteristiche simili a quelli osservati all’interno di gruppi specifici. Ad esempio, si immagini di studiare la statura e che per tale variabile sia assente l’informazione per un buona parte dei casi. Si immagini poi che per l’intero collettivo si osservi però il genere. Se nei dati osservati si osserva una quota simile di maschi e femmine mentre nei dati per cui manca la statura sono quasi tutti maschi: i dati sulla statura disponibili mostreranno una tendenza ad avere valori più bassi perchè vi sono più donne che sono tendenzialmente di statura minore. In questo caso, i valori mancanti sono relativi più spesso a casi con statura più elevata ma solo perchè vi è una selettività che riguarda un’altra variabile (che però si osservo completamente) e non perchè vi è minore propensione ad osservare le stature alte. I dati quindi sono “mancanti completamente a caso” all’interno dei due gruppi “maschio” e “femmina”. Possiamo eventualmente correggere la distorsione tenendo conto della maggiore propensione a non osservare la statura nei due gruppi di diverso genere.
- “dati mancanti non casualmente” (MNAR). È il caso peggiore perchè i dati mancanti sono diversi da quelli disponibili e i possibili correttivi potrebbero non eliminare la distorsione dovuta alla osservazione parziale del fenomeno.
Esistono ragionevoli soluzioni proposte per risolvere o alleviare il problemi legati alla presenza dei dati mancanti nei primi due casi.
4.1.1.3 Illustrazione dei meccanismi di dati mancanti
La possibilità di potere compensare per i dati mancanti dipende in modo cruciale dai meccanismi citati sopra. Per comprenederli meglio può servire un esempio in cui si simula l’esistenza di dati mancanti.
Consideriamo un data frame relativo ai dati sul diabete di un gruppo di indiani americani. Per illustrare il problema, l’insieme di dati è completo, ovvero senza dati mancanti. Ci concenteremo sulla variabile glucose
e sul fattore diabetes
che indica se il soggetto ha o meno il diabete (se diabetes=="pos"
ha il diabete)
```{r pima}. E si considera il caso semplificato in cui l’obiettivo sia esclusivamente quello di ottenere la media del glucosio per il collettivo esaminato.
## The following object is masked from package:datasets:
##
## pressure
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 56.0 99.0 119.0 122.6 143.0 198.0
# La quantità che ci interessa è la
# media di tale variabile
dia<-table(diabetes) # la variabile diabetes è un fattore con due modalità
# ed è completamente osservata.
Ora verrà simulata la situazione in cui vi sono dati mancanti, circa il 40%) nella variabile glucose
secondo i tre meccanismi e si osserverà
se in questo insieme di dati ridotto comunque si riesce ad avere una idea corretta del valore medio del glucosio.
Dapprima i dati mancanti completamente a caso (MCAR).
# creo dati mancanti completamente a caso MCAR
set.seed(1111)
n<-length(glucose)
MCAR<-sample(1:n, 0.4*n) # si seleziona casualmente un gruppo di casi (il 40%)
glucoseMCAR<-glucose
glucoseMCAR[MCAR]<-NA # si creano i dati mancanti
mean(glucoseMCAR)
## [1] NA
Il summary della variabile con il 40% di casi in meno mostra che, anche se sono tanti i casi mancanti, la media non si discosta di molto dal valore osservato per i dati completi.
Si crea ora un nuovo insieme di dati in cui ancora complessivamente ci sarà circa il 40% di casi mancanti. Tuttavia questi sono mancanti più spesso nel caso di coloro che hanno il diabete che però è una variabile completamente osservata. All’interno dei due gruppi tuttavia i dati mancano secondo un processo casuale. Si tratta di dati MAR
# si creano dati mancanti a caso MAR
MARneg<-sample(which(diabetes=="neg"),0.25*dia[1])
# si seleziona casualmente un gruppo di casi (il 25%) fra i non diabetici
MARpos<-sample(which(diabetes=="pos"),0.55*dia[2])
# si selezioa casualmente un gruppo di casi (il 55%) fra i diabetici
glucoseMAR<-glucose
# assegniamo ai valori selezionati il dato mancante
glucoseMAR[MARneg]<-NA
glucoseMAR[MARpos]<-NA
mean(glucoseMAR)
## [1] NA
Si noti che stavolta la media si discosta da quella dei dati completi (si ottiene una media del glucosio più bassa perchè mancano più spesso i diabetici).
Infine, si genera un insieme di dati in cui il 40% dei casi mancanti dipende dalla variabile oggetto di studio. Questi saranno NON mancanti a caso (MNAR).
# esempio creazione dati NON mancanti a caso NMAR
probMD=glucose/sum(glucose)
MNAR<-sample(1:n, 0.4*n, prob=probMD)
# si selezionano i dati mancati con probabilità proporzionale
# al valore del glucosio
glucoseMNAR<-glucose
glucoseMNAR[MNAR]<-NA
mean(glucoseMNAR)
## [1] NA
Come si vede anche in questo caso il summary
mostra che se analizzo i dati disponibili otterrei una visione distorta del fenomeno (un valore medio del glucosio più basso).
Si illustra ora una delle soluzioni più popolari per recuperare i dati mancanti: l’imputazione. Con essa si ricostruisce un data set completo da analizzare imputando un dato plausibile ove esso manca.
4.1.1.4 L’imputazione dei dati mancanti
Nel caso in cui i dati siano “mancanti completamente a caso” o “mancanti a caso”, l’uso di tecniche che prevedono la sostituzione del dato mancante con un valore presunto (si parla di imputazione del dato mancante) permettono di ricostruire artificialmente un data set completo senza comprometter la valutazione delle quantità di interesse.
La più semplice tecnica di imputazione del dato mancante è quella per cui si sostituisce ad esso un valore che è pari a una sintesi dei dati disponibili: un valore centrale ad esempio. Al posto del valore mancante, si può ad esempio sostituire la media dei dati disponibili (o la loro mediana).
# imputazione con la media: creo nuove variabili cui aggiungere i valori imputati
glucoseMCARi<-glucoseMCAR
glucoseMARi<-glucoseMAR
glucoseMNARi<-glucoseMNAR
# Imputo con la media nel caso di dati mancanti completamente a caso
glucoseMCARi[is.na(glucoseMCAR)] <- mean(glucose, na.rm = TRUE)
mean(glucoseMCARi)
## [1] 123.1477
# Imputo con la media nel caso di dati mancanti a caso
glucoseMARi[is.na(glucoseMAR)] <- mean(glucose, na.rm = TRUE)
mean(glucoseMARi)
## [1] 120.7636
# Imputo con la media nel caso di dati NON mancanti a caso
glucoseMNARi[is.na(glucoseMNAR)] <- mean(glucose, na.rm = TRUE)
mean(glucoseMNARi)
## [1] 121.6324
Come si vede, l’imputazione con la media dei casi disponibili, nel caso MAR e MNAR, non elimina la sottostima che avevamo osservato.
Tuttavia, nel caso di dati “mancanti a caso” si potrebbe, ad esempio, imputare non la media di tutti i casi disponibili, ma la media di specifici gruppi. Riprendendo il caso, riportato per illustrare i dati “mancanti a caso”, si dovrebbe imputare la media delle stature dei rispondenti donna, se il caso mancante riguardava una unità di sesso femminile, o la media degli uomini, nei restanti casi.
# preparo le variabili per le imputazioni con le medie per sesso
glucoseMARim<-glucoseMAR
glucoseMNARim<-glucoseMNAR
# Imputo con la media per sesso nel caso MAR
glucoseMARim[is.na(glucoseMAR)&diabetes=="neg"] <-
mean(glucose[diabetes=="neg"], na.rm = TRUE)
glucoseMARim[is.na(glucoseMAR)&diabetes=="pos"] <-
mean(glucose[diabetes=="pos"], na.rm = TRUE)
mean(glucoseMARim)
## [1] 122.9941
# Imputo con la media per sesso nel caso di dati NON MAR
glucoseMNARim[is.na(glucoseMAR)&diabetes=="neg"] <-
mean(glucose[diabetes=="neg"], na.rm = TRUE)
glucoseMNARim[is.na(glucoseMAR)&diabetes=="pos"] <-
mean(glucose[diabetes=="pos"], na.rm = TRUE)
mean(glucoseMNARim)
## [1] NA
Si noti che l’uso di imputazione con la media per i due gruppi ha eliminato la distorsione nel caso dei dati mancanti a caso (MAR) e la riduce (ma non la elimina) nel caso MNAR.
L’idea di utilizzare un metodo di imputazione che tenga conto di altre variabili, osservate completamente o in misura molto ampia, è peraltro alla base delle tecniche di imputazione più sofisticate che non saranno trattati con completezza qui (anche se richiameremo brevemente il tema più avanti quando parleremo di analisi di regressione). Si possono usare tecniche di imputazione in cui si tiene conto contemporaneamente di più varaibili, completamente o quasi completamente osservate, nel fare l’imputazione.
Va tenuto comunque a mente che anche se si usano tali tecniche, non sarà mai garantito che la presenza di dati mancanti non distorca le analisi perchè non si può escludere a priori il caso dei dati non mancanti a caso. È sempre consigliabile quindi riportare all’inizio delle analisi le statistiche sui dati mancanti per ciascuna delle variabili e segnalare l’eventuale uso di tecniche di imputazione.
Ovviamente esistono in R
numerosi pacchetti che consentono l’imputazione di dati mancanti, anche utilizzando tecniche molto sofisticate che qui non sono trattate poiché coinvolgono modelli di analisi e algoritmi predittivi più avanzati.
4.1.2 Gli outliers (valori anomali)
Un valore anomalo, o, in inglese outlier (letteralmente “che giace al di fuori”) è un dato che si discosta in modo “significativo” dalla maggioranza dei dati. È quindi un valore “strano” cui viene naturale dedicare una speciale attenzione. Si noti che si parla di valori anomali in particolare quando si è interessati all’analisi di variabili quantitative. Non viene in genere definito un concetto analogo nel caso di variabili categoriali: per esse, al più, si potrà notare che alcune modalità sono molto rare.
L’identificazione di un outlier deriva dal confronto di ciascun dato con le altre osservazioni del collettivo che si vuole analizzare, non viene quindi definito in termini assoluti: il valore della statura di 2.10 cm. può essere un valore anomalo se riferito alla popolazione generale, ma non lo sarebbe se considero la popolazione dei giocatori di basket maschi. La sua definizione è poi strettamente legata alle caratteristiche del fenomeno che si sta analizzando. Nei dati sulla variabile LOSS
del dataframe AutoBi
si sono trovati valori elevatissimi ma che potrebbero essere del tutto coerenti con la natura di una variabile caratterizzata da forte asimmetria positiva con lunga coda a destra.
Esistono metodi, alcuni molto complessi, computazionalmente onerosi e/o che coinvolgono strumenti di statistica inferenziale, per identificare valori anomali. I vari metodi si propongono di assegnare a ciascuna valore un punteggio che ne denoti il grado di anomalia (rispetto alla massa dei dati): si tratta cioè di segnalare i valori sospetti. In questa sede ci limiteremo a elencare solo i più semplici strumenti analitici e grafici.
Tuttavia una volta chi si decide di usare un metodo che identifichi un valore come anomalo, nella fase di preparazione dei dati, occorre decidere come agire: si tiene il dato, lo si elimina dall’insieme dei dati da analizzare, lo si trasforma o lo si sostituisce?
4.1.2.1 Come individuare i valori anomali
Nella precedente sezione è stata introdotta il diagramma a scatola con baffi, boxplot. Si è visto che nel grafico vengono riportati i singoli valori che risultano lontani dal centro della distribuzione. I centro della distribuzione è rappresentato dalla scatola che, ricordiamo, ha come limiti il I e il III quartile. Nel boxplot vengono rappresentati individualmente quei valori che sono distanti dagli estremi della scatola più di una volta e mezza la lunghezza della scatola stessa (che è pari allo scarto interquartile SI).
Dati i valori osservati della variabile \(X\), sono quindi da guardare con attenzione quei valori che sono al di fuori dell’intervallo \[I=[x_{0.25}-1.5SI~~;~~x{0.75}+1.5SI]\] Tali valori devono essere esaminate con attenzione in quanto sono potenziali valori anomali. Inoltre, i valori sono distanti dalla scatola più di 3 volte la lunghezza della scatola stessasono ancora più sospetti e vengono definiti come potenziali “ouliers distanti” (far outliers).
Tale criterio deriva dalla aspettativa che la variabile osservata presenti una distribuzione simmetrica e con code regolari (in particolare, con curtosi bassa). In effetti non appena la distribuzione della variabile esibisce una marcata simmetria il numero di valori che vengono segnalati come outliers da un boxplot diventa molto elevato: in tal caso è difficile pensare che si tratti di valori anomali.
Sotto è riportato il summary e il boxplot relativo alla variabile età per i dati di AutoBi
.
summary(AutoBi$CLMAGE)
boxplot(AutoBi$CLMAGE)
Come si vede vengono evidenziati 7 valori che sono superiori a 80. Trattandosi di età è difficile ritenere un’anomalia che su oltre un migliaio di casi vi siano 7 casi di persone con oltre 80 anno (si noti che il valore più eevato è 95). Diverso sarebbe stato se avessimo osservato un valore pari, ad esempio, a 132: in tal caso si sarebbe trattato di un valore molto anomal, “sospetto” e certamente frutto di un errore.
La logica generale che è dietro alla segnalazione dei valori sospetti nel boxplot è quella di prendere come riferimento un valore centrale (ad esempio, la media, la mediana o la scatola stessa) e considerare valori anomali quelli che si discostano in valore assoluto dal valore centrale più \(k\) moltiplicato per una opportuna misura di variabilità. Il valore di \(k\) è in larga misura arbitrario salvo per il caso in cui ci aspettiamo che i dati abbiano una distribuzione ben precisa.
Se, ad esempio, ci aspettassimo che i dati siano ben rappresentati da un comportamento simile a quello di una gaussiana allora diventerebbe efficace un critero che segnali come outlier valori esterni all’intervallo \[[media-k*sqm ~~;~~media+k*sqm]\] ove \(sqm\) rappresenta lo scarto quadratico medio delle osservazioni. In effetti se si trattasse di dati dal comportamento comparabile con quello di una gaussiana allora ci aspettiamo che, ponendo ad esempio k=3.3, si osservino valori esterni a quell’intervallo in meno di 1 caso su 1000.
Più generale, è un criterio simile in cui consideriamo un indice di tendenza centrale e un indice di variabilità più resistente (così che non risulti influenzato dalla presenza di valori anomali). Questo condurrebbe al seguente intervallo (criterio di Hampel) per la definizione di valori anomali: \[[mediana-k*MAD ~~;~~mediana+k*MAD]\] \(k\) viene spesso posto pari a 1.5 o a 3.
Come detto, esistono metodi più sofisticati per definire i valori sospetti che non tratteremo in questa sede e va inoltre ricordato che l’individuazione o la definizione di un valore anomale quando si analizzano più variabili congiuntamente può rivelarsi un’operazione estremamente più complicata.
Tuttavia, una volta identificato un valore che sembra molto diverso da tutti gli altri si presenta il problema di decidere come agire.
4.1.2.2 Cosa fare con i valori anomali?
Possiamo identificare 3 principali azioni conseguenti all’identificazione dei valori anomali: 1. rimozione dei valori anomali; 3. valutazione dell’impatto dei valori anomali sulle analisi e uso di metodi resistenti; 2. trasformazione delle variabili.
4.1.2.2.1 Rimozione dei valori anomali
La rimozione dei valori anomali è da evitare.
Vi sono almeno due casi in cui è però possibile procedere all’eliminazione del dato:
- quando dall’esame del valore sospetto emerge con certezza che il dato sia conseguente ad un errore di misurazione, di trascrizione, di riporto. Se misuro stature di maschi adulti (in cm.) e osservo misure anomale come 475cm. o 1.82cm, sono certo che si tratta di misure errate perchè tali valori sono impossibili. Non posso fare altro che eliminare tale dato.
In questo caso, si può attribuire al valore anomalo il valore
NA
e quindi trattarlo come un dato mancante. Ovviamente se è possibile correggere il dato avendo identificato l’errore questo porta a sostituire il valore errato con quello corretto. Nell’esempio sopra potrei avere verificato che la misura dell’altezza 1.82 era sbagliata perchè riportata in metri e non in cm.. Oppure, se posso tornare sui dati originali, potrei verificare che è stata male riportata la prima cifra e che invece di 475 il valore della statura era 175. - Se si verifica che il valore (o i valori anomali) sono relativi a unità che appartengono a una popolazione diversa da quella che si intende sottoporre ad analisi. Se si sta conducendo un’analisi sui consumi di autovetture con motore termico, potrebbe accadere che nella fase di rilevazione dati si inseriscano le misurazioni anche per alcune vetture ibride. Se osservassimo dei valori sospetti per queste vetture (consumi troppo bassi rispetto alle altre) si sarebbe autorizzati ad escluderle dall’analisi perchè non dovrebbero far parte del collettivo oggetto della analisi. In questo caso, la presenza di valori anomali è indicativa di errori nella fase di preparazione dei dati che possono eventualmente essere corretti tornando a effettuare la misura o ricontrollando il dato.
- La trasformazione del valore anomalo, può essere conseguente a una trasformazione della variabile per tutti i suoi valori (aspetto trattato nella successiva sezione), alla sostituzione del singola valore sospetto magari con una tecnica di imputazione (come fosse un dato mancante).
4.1.2.2.2 Valutazione dell’influenza dei valori anomali sull’analisi
Essendo in una fase esplorativa, non si hanno precise assunzioni sulla forma delle distribuzioni della variabili. Di solito non sappiamo, a priori, se la variabile oggetto di analisi ha una forma simmetrica o asimmetrica, se ha code pesanti o se ha una distribuzione irregolare (ad esempio multimodale). È noto però che alcune delle misure di sintesi o anche di visualizzazione grafica sono influenzate dalla presenza di valori eccezionalmente diversi da tutti gli altri:
- una primo passo è quindi quello di valutare che impatto ha la presenza di valori anomali sulle analisi. Questo implica che si svolga un’analisi dei dati includendo tutti i dati e una seconda analisi escludendo i valori anomali. Dal confronto dei due risultati possiamo giudicare quanto “influenti” sono i valori anomali presenti nel data set. Esistono, nel caso di analisi più complesse che coinvolgono più variabili, specifici metodi per valutare l’influenza di ciascuana osservazione. Se si osserva che alcuni dati sono “influenti” e quindi modificano sensibilmente l’analisi,
- un secondo aspetto porta a introdurre metodi di analisi che sono meno sensibili alla presenza di valori anomali. Abbiamo già definito alcune semplici tecniche di sintesi delle variabili come più “resistenti”. Esiste un filone di analisi statistiche che si adattano al caso in cui sono presenti dati anomali: si tratta di tecniche dette “robuste” per le quali l’idea è di pesare opportunamente i dati così che venga limitato l’impatto delle osservazioni aberranti.
4.1.2.2.3 Trasformazioni delle variabili
Le tecniche di identificazione dei valori anomali illustrate sopra non tengono in considerazione il fatto che alcuni fenomeni sono tali da generare raramente delle osservazioni molto diverse dalle altre. Questo riguarda, ad esempio, fenomeni estremi: se, ad esempio, si raccolgono dati sulla piovosità media giornaliera si troveranno misure che mostreranno
4.2 Trasformazione delle variabili e ricodifiche
4.2.1 (Ri)codifiche di variabili categoriali
Molto si è insistito sul distinguere con chiarezza, in tutte le fasi di analisi dei dati, se una variabile è quantitativa o categoriale perchè alcune tecniche di analisi o di rappresentazione grafica possono essere utilizzate in modo appropriato per ciascuna categori di variabili. Non posso calcolare media o varianza per una variabile categoriale e non è di solito una buona idea usare un barplot per variabili quantitative continue.
Tuttavia, risulterà utile poter dare una rappresentazione numerica adeguata anche per le variabili categoriali visto che in alcuni casi si dovranno analizzare congiuntamente variabili di diversa natura.
4.2.1.1 La codifica numerica di variabili qualitative (fattori) ordinali
Conviene considerare dapprima il caso di variabili qualitative ordinali: per esse la sostituzione con valori numerici è spesso considerata accettabile.
Ad esempio, si consideri la modalità con cui si rilevano le opinioni di un utente o di un consumatore su un prodotto o un servizio.
Si chiede di esprimere un giudizio scegliendo fra alcune modalità che sono ordinate in relazione al gradimento di un servizio indicando, ad esempio, in relazione a una frase che descrive la qualità del servizio, se si è “pienamente d’accordo”, “abbastanza d’accordo”, “indifferenti”, “poco d’accordo”,“per niente d’accordo”. Tale modalità di rilevazione è detta scala di Likert.
Si tratta, com’è evidente, di un fattore qualitativo ordinale e spesso ai fini di analisi successive si ricorre alla ricodifica numerica facendo corrispondere i valori da 1 a 5 ai diversi livelli.
A volta si usano scale simili su 7 livelli e si fanno corrispondere valori da 1 a 7.
Tale ricodifica numerica è considerata accettabile anche se va tenuto presente che i valori numerici implicano una precisa distanza fra le modalità che potrebbero costituire una forzatura se riferite alla variabile categoriale: cioè non è detto che fra essere “indifferenti” e essere “poco d’accordo” ci sia la medsima distanza che fra essere “poco d’accordo” e “completamente d’accordo”.
4.2.1.2 La codifica numerica di variabili categoriali (fattori)
Nel caso di variabili categoriali non ordinali la sostituzione delle modalità con valori numerici è di solito più arbitraria. Tuttavia esistono alcune ricodifiche rispettose dell’informazione contenuta ma che consentono di ottenere variabili numeriche.
Il caso più semplice è quello relativo a variabili categoriali dicotomiche (con due sole modalità). In tal caso, si è già visto come sia accettabile far corrispondere i valori 1 e 0 alle due modalità essendo la variabile di fatto di tipo booleano. Talvolta, per lo sviluppo di alcuni algoritmi, si usa anche la codifica -1 e 1.
Più complessa è la ricodifica numerica nel caso di fattori con più di due modalità.
4.2.1.2.1 One hot-encoding (disgiuntiva completa)
La tecnica più corretta è quella di creare tante variabili dicotomiche quante sono le modalità. Ogni variabile registra se per una data unità si osserva o meno la specifica modalità. Conviene vedere un esempio, utilizzando R
.
varcat<-factor(c("A","B","A","C","B","A","A","C","B","C"))
# consideriamo il fattore varcat
dataf<-data.frame(varcat)
hotenc<-model.matrix(~dataf$varcat-1,)
# questo crea le tre variabili
dataf<-data.frame(varcat,hotenc)
dataf
## varcat dataf.varcatA dataf.varcatB dataf.varcatC
## 1 A 1 0 0
## 2 B 0 1 0
## 3 A 1 0 0
## 4 C 0 0 1
## 5 B 0 1 0
## 6 A 1 0 0
## 7 A 1 0 0
## 8 C 0 0 1
## 9 B 0 1 0
## 10 C 0 0 1
Questo tipo di codifica è detto “one hot encoding”. Si noti che a volte è preferibile utilizzare la convenzione per cui si costituiscono tante variabili quante sono le modalità meno 1. La restante modalità può essere ottenuta per differenza da un vettore fatto tutto di “1”. Il difetto principale di tale ricodifica è che se la variabile ha molte modalità allora verranno create tante variabili nuove e crescerà di conseguenza la dimensione del data set.
# Differente, ma equivalente, forma di encoding
hotenc1<-model.matrix(~dataf$varcat)
# questo crea le tre variabili ma la prima è detta "intercetta",
# chiariremo più avanti perchè, ed è identicamente pario a 1
dataf1<-data.frame(varcat,hotenc1)
dataf1
## varcat X.Intercept. dataf.varcatB dataf.varcatC
## 1 A 1 0 0
## 2 B 1 1 0
## 3 A 1 0 0
## 4 C 1 0 1
## 5 B 1 1 0
## 6 A 1 0 0
## 7 A 1 0 0
## 8 C 1 0 1
## 9 B 1 1 0
## 10 C 1 0 1
4.2.1.2.2 Altre forme di ricodifica (sconsigliate)
Esistono altre forme di ricodifica che sono talvolta utilizzate, ad esempio nell’ambito di procedure di machine learning, ma che non sono sostenute da ragionamenti rigorosi e NON sono assolutamente da consigliare per analisi esplorative. Tuttavia le citiamo per completezza:
- Assegnare un valore numerico a ciascuna categoria, ad esempio basandosi sull’ordine alfabetico (di fatto anche
R
fa una cosa simile). Se questo può essere a volte comodo perchè poterbbe consentire di utilizzare minore spazio di memoria, non va assolutamente poi condotta un’analisi della variabile numerica ottenuta perchè risulterebbe priva di senso.
# si noti che `R` fa esattamente questo con i fattori ma conservando l'informazione
# sulla corrispondenza fra valori numerici e categorie. # Non sarà mai possibile su un fattore compiere analisi tipici di variabili numeriche
str(varcat)
## Factor w/ 3 levels "A","B","C": 1 2 1 3 2 1 1 3 2 3
## Warning in mean.default(varcat): argument is not numeric or
## logical: returning NA
## [1] NA
Tale procedura è detta “label encoding”.
Una altro tipo di ricodifica numerica, si utilizza quando l’interesse è sull’analisi di una altra variabile, diciamo \(Y\) (quantitativa o qualitativa) detta target, e si assegnano alla variabile categoriale \(X\), i valori medi di \(Y\), o la frequenza assoluta o relativa di \(Y\), in corrispondenza di ciascuna modalità di \(X\). Questa procedura, detta di “target encoding”, è utilizzata talvolta all’interno di alcuni algoritmi di machine learning.
Tuttavia anche tale procedura è in generale priva di solide giustificazioni teoriche e NON va mai usata per analisi esplorative.
4.2.2 Trasformazioni di variabili quantitative
Le variabili quantitative osservate sono di solito il risultato di misurazioni e valori ottenuti in relazione a un preciso sistema di riferimento. Questo implica che si possano effettuare trasformazioni delle variabili per riportarle a un’unità di misura convenzionale diversa. L’esempio che viene subito in mente è la temperatura per cui potrei avere ottenuto le misure in gradi centigradi e volere poi trasformare gli stessi in gradi fahrenait. In questo caso si tratta di una trasformazione lineare. O ancora si può pensare a esprimere misure monetarie utilizzando una diversa unità (ad es., conversione da dollari a euro).
In altri casi si ricorre a trasformazioni delle variabili per agevolare la rappresentazione grafica della variabile stessa o o per rendere più agevole il confronto di una variabile che in due collettivi ha ordini di grandezza molto diversi. Citiamo alcune trasformazioni il cui uso è consueto proprio per agevolare la rappresentazione grafica o l’analisi di taluni aspetti della variabile.
In generale, è spesso indispensabile operare delle trasformazioni quando si analizzano tante variabili congiuntamente ed è opportuno che esse siano tutte riportate a scale di misura comparabili.
Si ricorda infine che è una trasformazione di variabile quantitativa anche il raggruppamento in classi già introdotto per costruire tabelle per variabili quantitative o per rappresentarle graficamente con l’istogramma. In quel caso, si era già notato come il ridurre la variabile quantiativa alla stregua di un fattore ordinato comporta una perdità di dettaglio informativo.
4.2.2.1 La standardizzazione
Spesso si procede a operazioni molto semplici come aggiungere o togliere una costante o dividere/moltiplicare i dati per un valore. Si noti che in generale tali operazioni hanno un impatto noto sulle misure di centralità e dispersione principali.
In particolare se otteniamo una variabile \(Z\) a partire dai valori osservati su \(Y\), ad esempio \(Z_i = bX_i+a\) dove \(a\) e \(b\) sono costanti reali note, si noti che:
- \(M_Z=bM_X+a\) dove \(M_Z\) e \(M_X\) sono rispettivamente la media della variabile trasformata e di quella originale
- \(V_Z=b^2V_X\) dove \(V_Z\) e \(V_X\) sono rispettivamente la varianza della variabile trasformata e di quella originale.
Molto rilevante è la seguente trasformazione: \(Z_i=\frac{Y_i-M_Y}{\sqrt{V_Y}}= \frac{Y_i}{\sqrt{V_Y}}-\frac{M_Y}{\sqrt{V_Y}}\).
Essa è detta standardizzazione. Si verifica immediatamente che è
- \(M_Z=0\)
- \(V_Z=1\).
Questo premette di confrontare variabili in relazione a altri aspetti (l’asimmetria ad esempio) eliminando l’impatto di media e varianza. Inoltre se analizzo molte variabili, tutte con scala diversa, la standardizzazione le riporta tutte a unità di misure confrontabili.
L’aspetto più rilevante è che in questo caso, la forma della distribuzione è invariata.
4.2.2.2 La riduzione a un intervallo unitario
Se l’obiettivo della trasformazione è quello di riportare tante variabili su scale confrontabili, si può ricorrere a un semplice espediente così che ogni variabile assume valori compresi nel medesimo intervallo. Ad esempio, si considera di solito l’intervallo \([0,1]\) (o suoi multipli, \([0,100]\)). Tale operazione è spesso denotata come normalizzazione min-max (anche se non ha niente a che vedere con la distribuzione normale).
A tal fine, per i valori \(x_i,x_2,\dots,x_n\) di una generica variabile \(X\) basta porre \[y_i=\frac{x_i-x_{(1)}}{x_{(n)}-x_{(1)}}\] Si ricorda che la notazione \(x_{(1)}\) e \(x_{(n)}\) individua, rispettivamente, il più piccolo e il più grande fra i valori di X osservati.
La variabile \(Y\) assumerà valori compresi nell’intervallo \([0,1]\). Le variabili così normalizzate non avranno però tutte uguale media e varianza come nel caso della standardizzazione.
4.2.2.3 Trasformazioni non lineari
L’uso di trasformazioni non lineari è piuttosto consueto quando una variabile assume valori estremi e con code lunghissime. Questo accade spesso, ad esempio, con variabili che assumono valori solo positivi e rappresentano grandezze monetarie (si pensi alla variabile LOSS
già incontrata analizzando i dati di AutoBI
). In tali casi è utile ricorrere a trasformazioni come \(Z_i=Y_i^{1/k}\) con \(k>1\) (spesso si usa \(k=2\), la radice quadrata, o pari a 3, cubica).
In alcuni casi può essere opportuno considerare la trasfomazione reciproco \(Z_i=Y_i^{-1}\).
Una delle trasformazioni più utilizzate nel caso di variabile con coda destra lunga (asimmetria positiva) è la trasformazione logaritmica \(Z_i=log(Y_i)\) (si ricordi che era stata già utilizzata in occasione della illustrazione del boxplot) .
Ovviamente, si può ricorrere a trasformazioni come il reciproco o il logaritmo solo se la variabile originaria non contiene valori pari a 0 o negativi. Se si osservano valori pari a 0, talvolta si conviene di aggiungere ad essi un valore \(c>0\) molto piccolo (ad esempio 0.01) così da evitare il problema.
Si noti che in tutti questi casi, se pure si fosse già ottenuta la media della variabile originale, non è possibile ottenere media della variabile originale semplicemente applicando ad esse la medesima trasformazione (una conseguenza della disuguaglianza di Jensen).