Previsione di una singola serie temporale dai dati di Google Analytics


In questo tutorial imparerai a creare un modello di serie temporali per eseguire previsioni per singole serie temporali utilizzando la tabella di esempio google_analytics_sample.ga_sessions.

La tabella ga_sessions contiene informazioni su una porzione dei dati di sessione raccolti da Google Analytics 360 e inviati a BigQuery.

Obiettivi

In questo tutorial utilizzerai quanto segue:

  • L'istruzione CREATE MODEL: per creare un modello di serie temporali.
  • La funzione ML.ARIMA_EVALUATE: per valutare il modello.
  • La funzione ML.ARIMA_COEFFICIENTS: per esaminare i coefficienti del modello.
  • Funzione ML.FORECAST: per prevedere le visite totali giornaliere.
  • La funzione ML.EXPLAIN_FORECAST consente di recuperare i vari componenti delle serie temporali, ad esempio stagionalità e tendenza, da utilizzare per spiegare i risultati della previsione.
  • Looker Studio: per visualizzare i risultati della previsione.

Costi

Questo tutorial utilizza i componenti fatturabili di Google Cloud, tra cui:

  • BigQuery
  • BigQuery ML

Per ulteriori informazioni sui costi di BigQuery, consulta la pagina Prezzi di BigQuery.

Per ulteriori informazioni sui costi di BigQuery ML, consulta Prezzi di BigQuery ML.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. BigQuery viene abilitato automaticamente nei nuovi progetti. Per attivare BigQuery in un progetto preesistente, vai a

    Attiva l'API BigQuery.

    Abilita l'API

Passaggio 1: crea il set di dati

Crea un set di dati BigQuery per archiviare il tuo modello ML:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai alla pagina di BigQuery

  2. Nel riquadro Explorer, fai clic sul nome del tuo progetto.

  3. Fai clic su Visualizza azioni > Crea set di dati.

    Crea il set di dati.

  4. Nella pagina Crea set di dati, segui questi passaggi:

    • In ID set di dati, inserisci bqml_tutorial.

    • Per Tipo di località, seleziona Più regioni e poi Stati Uniti (più regioni negli Stati Uniti).

      I set di dati pubblici vengono archiviati in US più regioni. Per semplicità, archivia il tuo set di dati nella stessa località.

    • Lascia invariate le restanti impostazioni predefinite e fai clic su Crea set di dati.

      Pagina Crea set di dati.

(Facoltativo) Passaggio due: visualizza le serie temporali da prevedere

Prima di creare il modello, è utile vedere l'aspetto della serie temporale di input.

SQL

Puoi farlo utilizzando Looker Studio.

Nella seguente query GoogleSQL, la clausola FROM bigquery-public-data.google_analytics_sample.ga_sessions_* indica che stai eseguendo query sulle tabelle ga_sessions_* nel set di dati google_analytics_sample. Queste sono tabelle partizionate.

Nell'istruzione SELECT, la query analizza la colonna date dalla tabella di input al tipo TIMESTAMP e la rinomina in parsed_date. La query utilizza la clausola SUM(...) e la clausola GROUP BY date per accumulare totals.visits su base giornaliera.

#standardSQL
SELECT
PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
SUM(totals.visits) AS total_visits
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

Per eseguire la query, segui questi passaggi:

  1. Nella console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date
    
  3. Fai clic su Esegui.

    Il completamento della query richiede circa 7 secondi. Dopo l'esecuzione di questa query, l'output è simile allo screenshot seguente. Nello screenshot puoi vedere che questa serie temporale ha 366 punti dati. Fai clic sul pulsante Esplora i dati e poi su Esplora con Looker Studio. Looker Studio si apre in una nuova scheda. Completa i seguenti passaggi nella nuova scheda.

    Output query

    Nel riquadro Grafico, scegli Grafico delle serie temporali:

    Time_series_chart

    Nel riquadro Dati, sotto il riquadro Grafico, vai alla sezione Metrica. Aggiungi il campo total_visits e rimuovi la metrica predefinita Conteggio record. Ciò è mostrato nella figura seguente.

    Time_series_data_fields

    Dopo aver completato questi passaggi, viene visualizzato il seguente diagramma. Il grafico mostra che la serie temporale di input ha un modello stagionale settimanale.

    Result_visualization

DataFrame BigQuery

Prima di provare questo esempio, segui le istruzioni per la configurazione di BigQuery DataFrames nella guida rapida di BigQuery sull'utilizzo di BigQuery DataFrames. Per maggiori informazioni, consulta la documentazione di riferimento di BigQuery DataFrames.

Per eseguire l'autenticazione su BigQuery, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configurare l'autenticazione per un ambiente di sviluppo locale.

import bigframes.pandas as bpd

# Start by loading the historical data from BigQuerythat you want to analyze and forecast.
# This clause indicates that you are querying the ga_sessions_* tables in the google_analytics_sample dataset.
# Read and visualize the time series you want to forecast.
df = bpd.read_gbq("bigquery-public-data.google_analytics_sample.ga_sessions_*")
parsed_date = bpd.to_datetime(df.date, format="%Y%m%d", utc=True)
visits = df["totals"].struct.field("visits")
total_visits = visits.groupby(parsed_date).sum()

# Expected output: total_visits.head()
# date
# 2016-08-01 00:00:00+00:00    1711
# 2016-08-02 00:00:00+00:00    2140
# 2016-08-03 00:00:00+00:00    2890
# 2016-08-04 00:00:00+00:00    3161
# 2016-08-05 00:00:00+00:00    2702
# Name: visits, dtype: Int64

total_visits.plot.line()

Il risultato è simile al seguente: Result_visualization

Passaggio 3: crea il modello di serie temporali

In seguito, crea un modello di serie temporali utilizzando i dati di Google Analytics 360. La seguente query GoogleSQL crea un modello utilizzato per prevedere totals.visits.

La clausola CREATE MODEL crea e addestra un modello denominato bqml_tutorial.ga_arima_model.

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'parsed_date',
   time_series_data_col = 'total_visits',
   auto_arima = TRUE,
   data_frequency = 'AUTO_FREQUENCY',
   decompose_time_series = TRUE
  ) AS
SELECT
  PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
  SUM(totals.visits) AS total_visits
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

La clausola OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) indica che stai creando un modello di serie temporali basato su ARIMA. Per impostazione predefinita, auto_arima=TRUE, quindi l'algoritmo auto.ARIMA ottimizza automaticamente gli iperparametri nei modelli ARIMA_PLUS. L'algoritmo adatta decine di modelli candidati e sceglie quello migliore con il criterio delle informazioni Akaike (AIC) più basso. Inoltre, poiché il valore predefinito è data_frequency='AUTO_FREQUENCY', il processo di addestramento deduce automaticamente la frequenza dei dati della serie temporale di input. Infine, l'istruzione CREATE MODEL utilizza decompose_time_series=TRUE per impostazione predefinita e gli utenti possono comprendere ulteriormente come viene prevista la serie temporale recuperando i componenti separati delle serie temporali, come la stagionalità e l'effetto delle festività.

Esegui la query CREATE MODEL per creare e addestrare il modello:

  1. Nella console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
    OPTIONS
     (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'parsed_date',
      time_series_data_col = 'total_visits',
      auto_arima = TRUE,
      data_frequency = 'AUTO_FREQUENCY',
      decompose_time_series = TRUE
    ) AS
    SELECT
     PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
     SUM(totals.visits) AS total_visits
    FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date
    
  3. Fai clic su Esegui.

    Il completamento della query richiede circa 43 secondi, dopodiché il modello (ga_arima_model) viene visualizzato nel pannello di navigazione. Poiché la query utilizza un'istruzione CREATE MODEL per creare un modello, non vengono visualizzati i risultati della query.

Passaggio 4: esamina le metriche di valutazione di tutti i modelli valutati

Dopo aver creato il modello, puoi utilizzare la funzione ML.ARIMA_EVALUATE per visualizzare le metriche di valutazione di tutti i modelli candidati durante il processo di ottimizzazione automatica degli iperparametri.

Nella seguente query GoogleSQL, la clausola FROM utilizza la funzione ML.ARIMA_EVALUATE rispetto al tuo modello, bqml_tutorial.ga_arima_model. Per impostazione predefinita, questa query restituisce le metriche di valutazione di tutti i modelli candidati.

Per eseguire la query ML.ARIMA_EVALUATE, segui questi passaggi:

  1. Nella console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.ga_arima_model`)
    
  3. Fai clic su Esegui.

  4. Il completamento della query richiede meno di un secondo. Una volta completata la query, fai clic sulla scheda Risultati sotto l'area di testo della query. I risultati dovrebbero essere simili al seguente screenshot:

    Output ML.ARIMA_EVALUATE.

    I risultati includono le seguenti colonne:

    • non_seasonal_p
    • non_seasonal_d
    • non_seasonal_q
    • has_drift
    • log_likelihood
    • AIC
    • variance
    • seasonal_periods
    • has_holiday_effect
    • has_spikes_and_dips
    • has_step_changes
    • error_message

    Le quattro colonne seguenti (non_seasonal_{p,d,q} e has_drift) definiscono un modello ARIMA nella pipeline di addestramento. Le tre metriche successive (log_likelihood, AIC e variance) sono pertinenti per il processo di adattamento del modello ARIMA.

    L'algoritmo auto.ARIMA utilizza prima il test KPSS per decidere che il miglior valore per non_seasonal_d è 1. Quando non_seasonal_d è 1, auto.ARIMA addestra in parallelo 42 diversi modelli ARIMA candidati. Tieni presente che, se non_seasonal_d non è 1, auto.ARIMA addestra 21 diversi modelli candidati. In questo esempio, tutti i 42 modelli candidati sono validi. Pertanto, l'output contiene 42 righe, ciascuna delle quali è associata a un modello ARIMA candidato. Tieni presente che, per alcune serie temporali, alcuni modelli candidati non sono validi in quanto non invertibili o non statici. Questi modelli non validi sono esclusi dall'output, perciò l'output avrà meno di 42 righe. Questi modelli candidati sono ordinati dall'AIC in ordine crescente. Il modello nella prima riga ha l'AIC più basso ed è considerato il modello migliore. Questo modello migliore viene salvato come modello finale e viene utilizzato quando chiami ML.EXPLAIN_FORECAST, ML.FORECAST e ML.ARIMA_COEFFICIENTS, come mostrato nei passaggi seguenti.

    La colonna seasonal_periods riguarda il pattern stagionale all'interno della serie temporale di input. Non ha nulla a che fare con la modellazione ARIMA, perciò ha lo stesso valore in tutte le righe di output. Segnala un andamento settimanale, che rientra nelle nostre aspettative, come descritto nel passaggio due sopra.

    Le colonne has_holiday_effect, has_spikes_and_dips e has_step_changes vengono compilate solo quando decompose_time_series=TRUE. Riguardano l'effetto delle festività, i picchi e i cali e i cambiamenti di passi all'interno delle serie temporali di input, che non sono correlati alla modellazione ARIMA. Di conseguenza, sono gli stessi in tutte le righe di output, ad eccezione dei modelli con errori.

    La colonna error_message mostra che si è verificato il possibile errore durante il processo di adattamento di auto.ARIMA. È possibile che le colonne selezionate non_seasonal_p, non_seasonal_d, non_seasonal_q e has_drift non siano in grado di stabilizzare le serie temporali. Per recuperare il possibile messaggio di errore di tutti i modelli candidati, imposta show_all_candidate_models=true.

Passaggio cinque: esamina i coefficienti del modello

La funzione ML.ARIMA_COEFFICIENTS recupera i coefficienti del modello del modello ARIMA_PLUS, bqml_tutorial.ga_arima_model. ML.ARIMA_COEFFICIENTS prende il modello come unico input.

Esegui la query ML.ARIMA_COEFFICIENTS:

  1. Nella console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.ga_arima_model`)
    
  3. Fai clic su Esegui.

    Il completamento della query richiede meno di un secondo. I risultati dovrebbero essere simili ai seguenti:

    Output ML.ARIMA_COEFFICIENTS.

    I risultati includono le seguenti colonne:

    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    ar_coefficients mostra i coefficienti della parte autoregressiva (AR) del modello ARIMA. Analogamente, ma_coefficients mostra i coefficienti del modello della parte della media mobile (MA). Sono entrambi array, le cui lunghezze sono rispettivamente uguali a non_seasonal_p e non_seasonal_q. Dall'output di ML.ARIMA_EVALUATE, il modello migliore della riga superiore ha un non_seasonal_p di 2 e un non_seasonal_q di 3. Di conseguenza, ar_coefficients è un array di lunghezza 2, mentre ma_coefficients è un array di lunghezza 3. intercept_or_drift è il termine costante nel modello ARIMA.

Passaggio 6: usa il modello per prevedere le serie temporali

La funzione ML.FORECAST prevede i valori di serie temporali future con un intervallo di previsione utilizzando il tuo modello: bqml_tutorial.ga_arima_model.

Nella seguente query GoogleSQL, la clausola STRUCT(30 AS horizon, 0.8 AS confidence_level) indica che la query prevede 30 punti temporali futuri e genera un intervallo di previsione con un livello di confidenza dell'80%. ML.FORECAST prende il modello, oltre a un paio di argomenti facoltativi.

Per eseguire la query ML.FORECAST, segui questi passaggi:

  1. Nella console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                 STRUCT(30 AS horizon, 0.8 AS confidence_level))
    
  3. Fai clic su Esegui.

    Il completamento della query richiede meno di un secondo. I risultati dovrebbero essere simili ai seguenti:

    Output ML.FORECAST.

    I risultati includono le seguenti colonne:

    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound
    • confidence_interval_lower_bound (a breve deprecato)
    • confidence_interval_upper_bound (a breve deprecato)

    Le righe di output sono ordinate nell'ordine cronologico di forecast_timestamp. Nella previsione delle serie temporali, l'intervallo di previsione, acquisito dai limiti inferiore e superiore, è importante quanto forecast_value. forecast_value è il punto intermedio dell'intervallo di previsione. L'intervallo di previsione dipende da standard_error e confidence_level.

Passaggio 7: spiega e visualizza i risultati della previsione

Per comprendere come vengono previste le serie temporali e per visualizzare le serie temporali previste insieme alle serie temporali della cronologia e a tutti i componenti separati, la funzione ML.EXPLAIN_FORECAST prevede i valori delle serie temporali future con un intervallo di previsione utilizzando il tuo modello, bqml_tutorial.ga_arima_model, e allo stesso tempo restituisce tutti i componenti separati della serie temporale.

Come la funzione ML.FORECAST, la clausola STRUCT(30 AS horizon, 0.8 AS confidence_level) indica che la query prevede 30 punti temporali futuri e genera un intervallo di previsione con una confidenza dell'80%. La funzione ML.EXPLAIN_FORECAST prende il modello, nonché un paio di argomenti facoltativi.

Per eseguire la query ML.EXPLAIN_FORECAST, segui questi passaggi:

  1. Nella console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                         STRUCT(30 AS horizon, 0.8 AS confidence_level))
    
  3. Fai clic su Esegui.

    Il completamento della query richiede meno di un secondo. I risultati dovrebbero essere simili ai seguenti:

    Output1 di ML.EXPLAIN_FORECAST. Output2 di ML.EXPLAIN_FORECAST.

    I risultati includono le seguenti colonne:

    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_bound
    • trend
    • seasonal_period_yearly
    • seasonal_period_quarterly
    • seasonal_period_monthly
    • seasonal_period_weekly
    • seasonal_period_daily
    • holiday_effect
    • spikes_and_dips
    • step_changes
    • residual

    Le righe di output sono ordinate nell'ordine cronologico di time_series_timestamp. I vari componenti sono elencati come colonne dell'output. Per ulteriori informazioni, consulta la definizione di ML.EXPLAIN_FORECAST.

  4. Al termine della query, fai clic sul pulsante Esplora i dati e poi su Esplora con Looker Studio. Looker Studio si apre in una nuova scheda.

    Output dell'unione_tutte le query

  5. Nel riquadro Grafico, scegli Grafico delle serie temporali:

    Time_series_chart

  6. Nel riquadro Dati, segui questi passaggi:

    1. Nella sezione Dimensione intervallo di date, seleziona time_series_timestamp (Date).
    2. Nella sezione Dimensione, seleziona time_series_timestamp (Date).
    3. Nella sezione Metrica, rimuovi la metrica predefinita Record Count e aggiungi quanto segue:
      • time_series_data
      • prediction_interval_lower_bound
      • prediction_interval_upper_bound
      • trend
      • seasonal_period_weekly
      • step_changes

    Data_panel

  7. Nel riquadro Stile, scorri verso il basso fino all'opzione Dati mancanti e utilizza Interruzioni di riga invece di Linea a zero.

    Style_section

    Viene visualizzato il seguente diagramma:

    Result_visualization

(Facoltativo) Passaggio otto: visualizza i risultati della previsione senza abilitare decompose_time_series

Se decompose_time_series viene impostato su false nell'addestramento ARIMA_PLUS, puoi concatenare le serie temporali della cronologia e le serie temporali previste utilizzando la clausola UNION ALL e la funzione ML.FORECAST.

Nella query seguente, l'SQL prima della clausola UNION ALL forma la serie temporale della cronologia. L'SQL dopo la clausola UNION ALL utilizza la funzione ML.FORECAST per generare la serie temporale prevista e l'intervallo di previsione. La query utilizza campi diversi per history_value e forecasted_value per tracciarli in colori diversi.

Per eseguire la query, segui questi passaggi:

  1. Nella console Google Cloud, fai clic sul pulsante Crea nuova query.

  2. Inserisci la seguente query GoogleSQL nell'area di testo Editor query.

    #standardSQL
    SELECT
     history_timestamp AS timestamp,
     history_value,
     NULL AS forecast_value,
     NULL AS prediction_interval_lower_bound,
     NULL AS prediction_interval_upper_bound
    FROM
     (
       SELECT
         PARSE_TIMESTAMP("%Y%m%d", date) AS history_timestamp,
         SUM(totals.visits) AS history_value
       FROM
         `bigquery-public-data.google_analytics_sample.ga_sessions_*`
       GROUP BY date
       ORDER BY date ASC
     )
    UNION ALL
    SELECT
     forecast_timestamp AS timestamp,
     NULL AS history_value,
     forecast_value,
     prediction_interval_lower_bound,
     prediction_interval_upper_bound
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                 STRUCT(30 AS horizon, 0.8 AS confidence_level))
    
  3. Fai clic su Esegui.

  4. Al termine della query, fai clic sul pulsante Esplora i dati e poi su Esplora con Looker Studio. Looker Studio si apre in una nuova scheda. Completa i seguenti passaggi nella nuova scheda.

    Output dell'unione_tutte le query

  5. Nel riquadro Grafico, scegli Grafico delle serie temporali:

    Time_series_chart

  6. Nel riquadro Dati, sotto il riquadro Grafico, vai alla sezione Metrica. Aggiungi le seguenti metriche: history_value, forecast_value, prediction_interval_lower_bound e prediction_interval_upper_bound. Poi rimuovi la metrica predefinita Record Count.

    Data_section

  7. Nel riquadro Stile, scorri verso il basso fino all'opzione Dati mancanti e utilizza Interruzioni di riga invece di Linea a zero.

    Style_section

    Dopo aver completato questi passaggi, nel riquadro di sinistra viene visualizzato il seguente diagramma. Le serie temporali della cronologia di input sono in blu, mentre la serie prevista è in verde. L'intervallo di previsione è la regione tra la serie del limite inferiore e la serie del limite superiore.

    Result_visualization

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

  • Puoi eliminare il progetto che hai creato.
  • In alternativa, puoi mantenere il progetto ed eliminare il set di dati.

Elimina il set di dati

L'eliminazione del progetto rimuove tutti i set di dati e tutte le tabelle nel progetto. Se preferisci riutilizzare il progetto, puoi eliminare il set di dati creato in questo tutorial:

  1. Se necessario, apri la pagina BigQuery nella console Google Cloud.

    Vai alla pagina di BigQuery

  2. Nel menu di navigazione, fai clic sul set di dati bqml_tutorial che hai creato.

  3. Fai clic su Elimina set di dati sul lato destro della finestra. Questa azione elimina il set di dati, la tabella e tutti i dati.

  4. Nella finestra di dialogo Elimina set di dati, digita il nome del set di dati (bqml_tutorial) per confermare l'eliminazione, quindi fai clic su Elimina.

Elimina il progetto

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi