Come prevedere il traffico di ricerca con Python e GA4

Pubblicato: 2021-04-26

In qualsiasi strategia incentrata sull'ottimizzazione dei motori di ricerca (SEO), l'analisi dei dati è essenziale. Sono sempre di più gli specialisti in questo campo che scelgono di sviluppare la propria carriera nell'analisi del traffico di ricerca organico, che di per sé ha un comportamento e particolarità ben diverse dal resto: ricerca a pagamento, email, social organico, diretto, ecc. In in questo senso e grazie ad una vasta gamma di strumenti oggi disponibili, questo tipo di studi è riuscito ad evolversi in misura impensabile rispetto a pochi anni fa.

Questo importante passo avanti è dovuto principalmente alla comparsa di nuove metodologie e sviluppi che ci hanno permesso di generare modelli analitici senza dover fare affidamento su complicate operazioni matematiche. Abbiamo la fortuna di avere a nostra disposizione le tecniche e gli algoritmi già testati e pronti per iniziare a lavorarci.

Nell'articolo seguente, ci concentreremo sulla creazione di un modello predittivo per un insieme di dati di una serie temporale in cui il trend calcolato è adeguato alla stagionalità e alla periodicità precedente. In particolare, prevediamo il traffico di ricerca organico della nostra struttura da Google Analytics 4 (di seguito GA4). Ci sono molte opzioni per eseguire questa operazione, tuttavia per questo caso particolare ho deciso di eseguire lo sviluppo interamente in Python.
Lo script su cui si basa questo articolo è composto da tre parti chiaramente differenziate:

  • Estrazione dati . Come utilizzare passo dopo passo la nuova API GA4 per raccogliere traffico di ricerca organico.
  • Modellazione dei dati . Uso di Prophet, la libreria open source di Facebook per fare previsioni di serie temporali.
  • Visualizzazione dei dati . Mostra i cambiamenti di tendenza e la previsione modellata.

Estrazione dati GA4 tramite la sua API utilizzando Python

La prima cosa che dobbiamo sapere quando abbiamo a che fare con Google Analytics Data API (GA4) è che GA4 è il suo stato di sviluppo. Come dettagliato da Google sulla sua pagina, è attualmente in una versione in fase iniziale. In particolare, alla data di stesura di questo articolo, è ancora in fase Beta.

Si precisa che GA4 è stato pubblicato il 14 ottobre 2020. Sono passati solo pochi mesi. Infatti, chi aveva già una proprietà Universal Analytics e ne crea una nuova GA4 potrà continuare a utilizzare entrambe le versioni affiancate, senza alcun vincolo. Non si sa con certezza quando le proprietà di Universal Analytics smetteranno di funzionare. In ogni caso, la mia raccomandazione sarebbe quella di creare al più presto una nuova proprietà di tipo GA4. In questo modo avrai una cronologia dei dati più ampia. Va inoltre considerato che ogni giorno che passa GA4 integra nuove funzionalità o migliora quelle esistenti. Al momento è in continua evoluzione.

Per questo motivo, ovviamente potrebbero esserci piccole modifiche al codice descritto di seguito. Anche se di sicuro saranno minimi. Ad esempio, ho già riscontrato sciocchezze minori come rinominare il campo "entità" (fase alfa) come "proprietà" (fase beta) all'interno della classe RunReportRequest() .
Innanzitutto, prima di creare la richiesta API, è necessaria la comprensione di quali elementi sono disponibili. Fondamentalmente, si tratta di seguire la struttura seguente:

Tipi per RunReportRequest di GA4 Data v1 API Beta

A prima vista è abbastanza intuitivo, anche se la realtà è ben diversa. Per fare una richiesta è necessario avere sempre a portata di mano almeno la seguente documentazione:

  • Sviluppatore API di Google
  • Reporting dell'API dei dati di Google Analytics (GA4).

Questo semplicemente perché i nomi dei campi variano leggermente dalla documentazione ufficiale, che rappresenta i campi in formato JSON. Un esempio è il campo fieldname della classe Filter. In Python dovremmo descriverlo come field_name. Una buona regola generale sarà sempre quella di passare da un campo tipo cammello (come "fieldName") a un serpente (come "field_name").

Prima di continuare, fermiamoci un attimo per inizializzare il nostro progetto. Come nella stragrande maggioranza dei casi durante lo sviluppo di script in Python, dobbiamo dedicare del tempo all'importazione delle librerie necessarie e alla preparazione dell'ambiente di esecuzione.

  • Crea un nuovo progetto in Python. In questo caso è stato utilizzato il software PyCharm.
  • Abilita Google Analytics Data API in Google Cloud Platform e scarica il file dell'account di servizio creato (tipo JSON) e salvalo nella cartella in cui è stato creato il progetto Python. All'apertura di questo file, è necessario copiare il valore del campo client_email, che sarà qualcosa come [email protected].
  • Aggiungi questo valore client_email alla proprietà GA4 da cui verranno estratti i dati. Dovrai farlo nella sezione di gestione degli utenti. Come minimo, sarà necessario concedergli il livello di autorizzazione "Lettura e analisi".
  • Tramite il terminale client (PyCharm) installare la libreria Dati di Google Analytics nella directory del progetto con cui verranno effettuate le richieste API:
    pip install google-analytics-data

Da qui in poi non devi fare altro che creare la richiesta, che, come puoi vedere di seguito, è composta sostanzialmente da tre parti (client, richiesta e risposta), e visualizzare o salvare i dati raccolti.

Codice per fare una semplice richiesta a GA4

Qualsiasi dimensione, metrica, filtro, ordine dati, intervallo di date, ecc. aggiunti alla variabile di richiesta devono essere aggiunti come una classe (vedi immagine precedente "Tipi per RunReportRequest") collegata a una variabile ( metrics = [Metric (..)] ). Ciò rende molto più facile comprendere la struttura dei dati da raccogliere. In questo senso, per ogni classe di livello più alto deve essere effettuata una specifica importazione. Ovvero, se vuoi aggiungere una dimensione e una metrica per un intervallo di tempo specifico, saranno richiesti almeno i seguenti oggetti...

 da google.analytics.data_v1beta importa BetaAnalyticsDataClient
da google.analytics.data_v1beta.types importa RunReportRequest
da google.analytics.data_v1beta.types importa DateRange
da google.analytics.data_v1beta.types import Dimension
da google.analytics.data_v1beta.types import Metric

Naturalmente, è anche possibile aggiungere valori specifici a determinate variabili ( name = 'eventCount' ). Per questo motivo è fondamentale comprendere e approfondire la documentazione precedentemente descritta.

Oltre a ciò, occorre prestare particolare attenzione alla variabile os.environ [“GOOGLE_APPLICATION_CREDENTIALS”] , che conterrà il percorso del file precedentemente scaricato nel passaggio 2. Questa riga di codice eviterà alcuni problemi nella gestione dei permessi al API di Google.

Se il codice è stato eseguito correttamente, vedrai un risultato simile al seguente: {Date, Events}, {20210418, 934}, {…}, ….

Scansione dati³

Espandi la tua analisi con connessioni senza interruzioni a set di dati aggiuntivi. Analizza la tua strategia SEO in base ai dati su backlink, traffico SEO, classifiche e set di dati personalizzati dal tuo CRM, dalla soluzione di monitoraggio o da qualsiasi altra fonte.
Scopri di più

Previsione dei dati tramite Facebook Prophet

Al giorno d'oggi ci sono molte opzioni gratuite ed esistenti per effettuare qualsiasi tipo di previsione in base alla cronologia dei dati. In questo caso specifico ho scelto la libreria Prophet, ma di cosa si tratta veramente?

È una libreria open source (disponibile per R e Python) creata dal team di Data Science di Facebook per stimare il comportamento di un set di dati di serie temporali basato su un modello additivo in cui le tendenze non lineari sono adattate a una stagionalità giornaliera, settimanale e annuale tenere conto degli effetti dei giorni di ferie.
Tornando all'implementazione proposta (previsione organica del traffico di ricerca), la prima cosa da fare è installare le seguenti librerie:

  • Panda ( pip installa panda ). Gestire e analizzare le strutture dei dati.
  • Plotly ( pip install plotly ). Realizzazione di grafiche di ogni genere.
  • Prophet ( conda install -c conda-forge fbprophet -y ).

Poi, come sempre, devi effettuare le importazioni associate a queste librerie. Dopodiché, l'unica cosa che ti resta da fare è eseguire la modellazione della previsione e la relativa visualizzazione. Per fare ciò, nel caso di Prophet, devi solo seguire questo processo:

  • Inizializza un nuovo oggetto Prophet con gli attributi desiderati per generare la previsione.
  • Richiedi il metodo fit, passandogli i dati estratti da GA4 come dataframe. Questa richiesta può richiedere alcuni secondi in alcuni casi. Il dataframe con i dati raccolti deve essere costituito solo da due colonne i cui nomi sono sempre gli stessi: ds (campo tipo data) e y (metrica da studiare).
  • Crea un nuovo dataframe futuro impostando il numero di periodi fino a cui la previsione deve arrivare dall'intervallo di date selezionato e la frequenza con cui i dati verranno aggregati (settimanale, mensile, ecc.)
  • Richiedi il metodo predict, che assegnerà a ogni riga del nuovo dataframe futuro un valore previsto (yhat).
  • Richiedi il metodo della trama per poter visualizzare le previsioni generate.
  • Richiedi il metodo plot_components che aiuta a comprendere visivamente l'andamento e la stagionalità dei dati.
 m = Profeta()
m.fit(df)
futuro = m.make_future_dataframe(periodi=365)
previsione = m.predict(futuro)
m.plot (previsione)
m.plot_components (previsione)
plt.show()

Sebbene la previsione desiderata sia stata generata in soli sei passaggi e sembri relativamente semplice, è necessario considerare diversi elementi che saranno fondamentali per generare la previsione. Tutti influenzano la pertinenza della previsione in un modo o nell'altro. Alla fine, si tratta di generare una previsione conforme alla logica, nel caso di questo articolo, del nostro traffico di ricerca organico. Per questo, è necessario comprendere alcune impostazioni più avanzate di Prophet.

  • Giorni e vacanze speciali. C'è la possibilità di aggiungere giorni speciali.
  • Valori anomali. Devono essere eliminati se influiscono sul preventivo.
  • Punti di cambio. Rilevamento dei cambiamenti di tendenza nel tempo analizzato.
  • Diagnosi. Validazione basata sulla misurazione dell'errore di predizione secondo lo studio storico dei dati.
  • Aumento. Selezione tra lineare o logistico.
  • Stagionalità. Scelta tra additivo o moltiplicativo.

Tutto questo e molte altre opzioni sono perfettamente dettagliate in questa documentazione della libreria Prophet.

Creazione dello script completo per poter visualizzare la previsione del traffico

Tutto ciò che resta ora è unire tutti i pezzi del puzzle in un unico script. Il solito modo per affrontare questo tipo di puzzle è creare una funzione per ciascuno dei processi precedentemente dettagliati, in modo tale che possano essere eseguiti in modo ordinato e pulito:

 def ga4(id_proprietà, data_inizio, data_fine):
[…]

def forecasting(dim, met, per, freq):
[…]

if __name__ == "__main__":
dimensione, metrica = ga4(PROPERTY_ID, START_DATE, END_DATE)
previsione (dimensione, metrica, PERIODI, FREQ)

Prima di visualizzare il risultato finale della previsione, è una buona idea guardare il traffico di ricerca organico analizzato.

A prima vista, puoi vedere come le diverse strategie e azioni intraprese hanno avuto un effetto nel tempo. A differenza di altri canali (ad esempio le campagne di ricerca a pagamento), il traffico generato dalla ricerca organica presenta solitamente poche oscillazioni apprezzabili (valli o picchi). Tende a crescere o diminuire gradualmente nel tempo ed è talvolta influenzato da eventi stagionali. Di solito, fluttuazioni evidenti sono associate agli aggiornamenti nell'algoritmo del motore di ricerca (Google, Bing, ecc.).

L'output dello script può essere visto nelle immagini seguenti, in cui sono dettagliati fattori importanti come trend, stagionalità, previsione o frequenza dei dati.
Se analizziamo la previsione ottenuta, si potrebbe concludere in modo generico che “se continuiamo con la stessa strategia SEO implementata fino ad oggi, il traffico proveniente dai motori di ricerca continuerà a crescere gradualmente”. Possiamo garantire che "i nostri sforzi per migliorare le prestazioni del sito Web, generare contenuti di qualità, fornire collegamenti pertinenti, ecc. sono valsi la pena".

Visualizzazione trend, stagionalità e previsione, trend del traffico di ricerca organico

Per concludere, condividerò il codice nella sua interezza in modo che tu debba solo copiarlo ed eseguirlo nel tuo IDE (Integrated Development Environment) di Python. Inutile dire che tutte le librerie sopra menzionate devono essere state installate affinché questo funzioni correttamente.

 importa panda come pd
importa fbprophet
da fbprophet import Prophet
da fbprophet.plot import add_changepoints_to_plot
importa matplotlib.pyplot come plt
importare os

da google.analytics.data_v1beta importa BetaAnalyticsDataClient
da google.analytics.data_v1beta.types importa DateRange
da google.analytics.data_v1beta.types import Dimension
da google.analytics.data_v1beta.types import Metric
da google.analytics.data_v1beta.types filtro di importazione
da google.analytics.data_v1beta.types importa FilterExpression
da google.analytics.data_v1beta.types importa FilterExpressionList
da google.analytics.data_v1beta.types importa RunReportRequest

PROPRIETÀ_
START_DATE = '01-01-2020'
DATA_FINE = '31-03-2021'
PERIODI = 4
FREQ = 'M'

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "[Aggiungi qui il percorso del file json con le credenziali]"

def ga4(id_proprietà, data_inizio, data_fine):
client = BetaAnalyticsDataClient()

richiesta = RunReportRequest(proprietà='proprietà/' + id_proprietà,
dimensioni=[Dimensione(nome='data')],
metrics=[Metric(name='eventCount')],
date_ranges=[DateRange(inizio_data=inizio_data,
data_fine=data_fine)],
dimension_filter=EspressioneFiltro(
and_group=FilterExpressionList(espressioni=[
FilterExpression(filter=Filtro(field_name='sessionDefaultChannelGrouping',
string_filter=Filtro.StringFilter(
value='Ricerca organica',
match_type=Filtro.StringFilter.MatchType(
1)))),
FilterExpression(filtro=Filtro(nome_campo='nomeevento',
string_filter=Filtro.StringFilter(
valore='inizio_sessione',
match_type=Filtro.StringFilter.MatchType(
1))))
]))
)

risposta = client.run_report(richiesta)

x, y = ([] per i nell'intervallo(2))
per riga in response.rows:
x.append(row.dimension_values[0].value)
y.append(row.metric_values[0].value)
print(riga.valori_dimensioni[0].valore, riga.valori_metrici[0].valore)

restituire x, y

def previsione(x, y, p, f):
print('Profeta %s' % fbprofet.__versione__)

dati = {'ds': x, 'y': y}
df = pd.DataFrame(dati, colonne=['ds', 'y'])

m = Profeta(crescita='lineare',
punto di cambio_prior_scale=0.5,
seasonity_mode='additivo',
daily_seasonality=Falso,
settimana_stagionalità=Vero,
yearly_seasonality=Vero,
vacanze=Nessuno,
)
m.fit(df)
futuro = m.make_future_dataframe(periodi=p, freq=f)
previsione = m.predict(futuro)

print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())

fig = m.plot(forecast, xlabel='Data', ylabel='Visite')
add_changepoints_to_plot(fig.gca(), m, previsione)
m.plot_components (previsione)
plt.show()

if __name__ == "__main__":
channel_group, event_count = ga4(PROPERTY_ID, START_DATE, END_DATE)
previsione (gruppo_canali, conteggio_eventi, PERIODI, FREQ)

Spero che questo articolo ti sia servito da ispirazione e che ti sarà di grande utilità nei tuoi prossimi progetti. Se vuoi continuare a conoscere questo tipo di implementazione o saperne di più sul marketing digitale più tecnico, contattami. Puoi trovare maggiori informazioni nel mio profilo dell'autore qui sotto.