13.9 Valori anomali e valori mancanti

I dati reali spesso contengono valori mancanti, valori anomali o qualche forma di disorganizzazione. In questo caso, il loro trattamento può risultare problematico.

Valori anomali

I valori anomali (outlier) sono osservazioni molto diverse dalla maggior parte delle altre osservazioni della serie storica. Possono essere degli errori o potrebbero essere semplicemente dei valori inusuali. (Si veda la Sezione 7.3 per una discussione sugli outlier nel contesto della regressione.) Nessuno dei metodi che sono stati considerati in questo libro funzionerà bene se ci sono outlier rilevanti nei dati. In questo caso, si vorrebbe sostituirli con dei valori mancanti o con una stima che sia più coerente con gli altri dati.

Una semplice sostituzione degli outlier senza una riflessione sui motivi della loro presenza risulta spesso una pratica pericolosa. Queste possono fornire utili informazioni sulla natura del processo generatore dei dati, che dovrebbe sempre essere considerato quando si fa previsione. Comunque, if se siamo convinti che gli outlier siano davvero degli errori, o che questi non si presenteranno nel periodo di previsione, allora sostituirli può semplificare la procedura di previsione.

La Figura 13.11 descrive il numero di visitatori nella regione di Adelaide Hills nell’Australia del Sus. È evidente che c’è un’osservanione anomala nel quarto trimestre del 2002.

tourism %>%
  filter(
    Region == "Adelaide Hills", Purpose == "Visiting"
  ) %>%
  autoplot(Trips) +
  labs(title = "Serie trimestrale di viaggi di una sola notte nella regione di Adelaide Hills",
       y = "Numero di viaggi")
Numero di soggiorni di una sola notte nella regione di Adelaide Hills nell'Australia del Sud.

Figura 13.11: Numero di soggiorni di una sola notte nella regione di Adelaide Hills nell’Australia del Sud.

Un modo efficace di individuare gli outlier è applicare la funzione STL() alla serie utilizzando l’opzione robust=TRUE. Poi tutti gli outlier dovrebbero evidenziarsi nella serie dei residui. I dati in Figura 13.11 non evidenziano alcuna stagionalità, quindi si applica STL senza la componente stagionalel, ponendo period=1.

ah_decomp <- tourism %>%
  filter(
    Region == "Adelaide Hills", Purpose == "Visiting"
  ) %>%
  # Fit a non-seasonal STL decomposition
  model(
    stl = STL(Trips ~ season(period = 1), robust = TRUE)
  ) %>%
  components()
ah_decomp %>% autoplot()
Decomposizione STL per i visitatori della regione di Adelaide Hills nel sud dell'Australia, senza alcuna componente stagionale.

Figura 13.12: Decomposizione STL per i visitatori della regione di Adelaide Hills nel sud dell’Australia, senza alcuna componente stagionale.

Nell’esempio appena fatto, l’outlier era facile da identificare. In casi meno evidenti, può essere utile considerare il boxplot della serie dei residui. Possiamo identificare come outlier quelle osservazioni che distano dalla mediana più di 1.5 volte lo scarto interquartile (IQRs) degli scarti dalla mediana. Se i residui fossero distribuiti normalmente, questa procedura classificherebbe come outlier 7 osservazioni ogni 1000. Una regola più stringente è quella di definire come outlier quelli che sono maggiori di 3 volte il range interquartile (IQRs) degli scarti dalla mediana. Questo, in caso di gaussianità, porterebe a classificare come outlier solo 1 osservzione ogni 500.000. Questa è la regola preferita.

outliers <- ah_decomp %>%
  filter(
    remainder < quantile(remainder, 0.25) - 3*IQR(remainder) |
    remainder > quantile(remainder, 0.75) + 3*IQR(remainder)
  )
outliers
#> # A dable: 1 x 9 [1Q]
#> # Key:     Region, State, Purpose, .model [1]
#> # :        Trips = trend + remainder
#>   Region      State Purpose .model Quarter Trips trend remainder season_adjust
#>   <chr>       <chr> <chr>   <chr>    <qtr> <dbl> <dbl>     <dbl>         <dbl>
#> 1 Adelaide H… SA    Visiti… stl    2002 Q4  81.1  11.1      70.0          81.1

Questo individua quell’outlier che si sospettava dalla Figura 13.11. Una procedura simile può essere applicata all’intero dataset per identificare osservazioni anomale nelle altre serie.

Valori mancanti

Dati mancanti possono presentarsi per varie ragioni, e vale la pena di considerare se essi possono indurre una qualche distorsione nel modello previsionale. Per esempio, supponiamo di stare studiando i dati delle vendite di un punto vendita, e che dei valori mancanti si presentino in corrispondenza di festività in cui il negozio è chiuso. Un aumento delle vendite il giorno dopo potrebbe essere solo una conseguenza di questa chiusura. Se non se ne tiene conto nel modello predittivo, probabilmente verranno sottostimate le vendite per il primo giorno dopo una festività e si sovra-stimeranno le vendite nei giorni successivi. Un modo per far fronte a questo tipo di situazione è quello di fare ricorso a modelli di regressione dinamica con delle variabili dummy che indicano se i giorni di festivi o il giorno dopo una festività. Nessun metodo è in grado di trattare in maniera automatica questo tipo di effetti perché essi dipendono dallo specifico contesto predittivo.

In altre situazioni, l’assenza dei dati può essere essenzialmente casuale. Per esempio, qualcuno potrebbe aver dimenticato di registrare l’ammontare delle vendite quel giorno, o il sistema di registrazione automatica potrebbe avere avuto un malfunzionamento. Se il tempo dei dati mancanti non è informativo per il problema della previsione, allora i valori mancanti possono essere gestiti più facilmente.

Infine, si potrebbe decidere di rimuovere eventuali osservaizoni anomale, creando noi stessi, in tal modo, dei valori mancanti nella serie.

Alcuni metodi permettono di essere applicati senza problemi anche in presenza di valori mancanti. Per esempio il metodo del previsore naive continua a funzionare, utilizzando come previsione per gli istanti futuri, il più recente valore non mancante. Allo stesso modo, tutti gli altri metodi benchmark introdotti nella Sezione 5.2 producono previsioni anche quando ci sono valori mancanti nella serie storica. Per modelli ARIMA, modelli di regressione dinamica e modelli NNAR, la funzione fable lavora correttametne senza causare errori. Tuttavia, altre funzioni, inlcuse ETS() ed STL(), non sono in grado di trattare valori mancanti.

Quando i valori mancanti generano degli errori, ci sono almeno due modi di gestire questo problema. Una prima possibilità è considerare solamente i dati successivi all’ultimo valore mancante. Ciò ha successo se la serie è sufficientemente lunga da produrre previsioni abbastanza precise. In alternativa, è possibile sostituire i valori mancanti con delle stime. A tal fine, prima si adatta ai dati contenenti i valori mancanti un modello ARIMA e poi si usa il modell per interpolare le osservazioni mancanti.

Noi sostituiremo l’outlier identificato in Figura 13.12 con una stima ottenuta con un modello ARIMA.

ah_miss <- tourism %>%
  filter(
    Region == "Adelaide Hills",
    Purpose == "Visiting"
  ) %>%
  # Remove outlying observations
  anti_join(outliers) %>%
  # Replace with missing values
  fill_gaps()
ah_fill <- ah_miss %>%
  # Fit ARIMA model to the data containing missing values
  model(ARIMA(Trips)) %>%
  # Estimate Trips for all periods
  interpolate(ah_miss)
ah_fill %>%
  # Only show outlying periods
  right_join(outliers %>% select(-Trips))
#> # A tsibble: 1 x 9 [?]
#> # Key:       Region, State, Purpose [1]
#>   Region      State Purpose Quarter Trips .model trend remainder season_adjust
#>   <chr>       <chr> <chr>     <qtr> <dbl> <chr>  <dbl>     <dbl>         <dbl>
#> 1 Adelaide H… SA    Visiti… 2002 Q4  8.50 stl     11.1      70.0          81.1

La funzione interpolate() utilizza un modello ARIMA per stimare tutti i valori mancanti della serie. In questo caso, l’outlier di 81.1 è stato sostituito con 8.5. La Figura 13.13 mostra la serie risultante.

La serie ah_fill può essere ora modellata con una procedura che non ammette valori mancanti.

ah_fill %>%
  autoplot(Trips) +
  autolayer(ah_fill %>% filter_index("2002 Q3"~"2003 Q1"),
    Trips, colour="#D55E00") +
  labs(title = "Serie trimestrale di soggiorni nelal regione di Adelaide Hills",
       y = "Numero di soggiorni")
Numbero di viaggi di una sola notte nella regione di Adelaide Hills nell'Australia del sud, con l'outlier 2002Q4 sostituito da una interpolazione da un modello ARIMA.

Figura 13.13: Numbero di viaggi di una sola notte nella regione di Adelaide Hills nell’Australia del sud, con l’outlier 2002Q4 sostituito da una interpolazione da un modello ARIMA.