Skip to content
bq-banner2
Axel Storbacka6.9.2022 11:074 min read

Blogisarja: GA4+BQ= <3 - Osa 1: GA4-datan jalostaminen BigQueryssä

Google Analyticsin uusiutumisen yhteydessä moni asia tulee muuttumaan verkkoliikenneseurannassa. Googlen Universal Analytics käyttöliittymä on tullut monelle ajan saatossa niin tutuksi, että olisi ollut ihme, jos Google Analytics 4:ään siirtyminen olisi sujunut sataprosenttisen saumattomasti. Monelle UA:n käytön loppumisen tiukka takaraja tuottaa ahdistusta, mutta uudistumisen myötä tulee myös positiivisia asioita. Yksi näistä kehityksistä on GA4:n mukana tuleva ilmainen pääsy BigQuery-datasettiin, ja tämän luoma parannettu läpinäkyvyys GA:n tuottamaan dataan. 
 

Mikä on BigQuery?

 

BigQuery on Googlen datavarastointipalvelu, jota hyödyntämällä voidaan pyöritellä isoja datamassoja, joko palvelun käyttöliittymässä, tai yhdistämällä palvelu johonkin ulkopuoliseen järjestelmään.  

Ilmainen pääsy GA dataan BigQueryssä voimaannuttaa GA:n käyttäjät miettimään verkkoliikenneseurantansa uudelleen. Mitä jos Googlen tarjoamat yleiset mallinnukset eivät palvelekaan liiketoimintaamme? Mitä jos käyttäytyminen sivustollamme vaatiikin datan uudelleenmääritystä? GA4:n myötä, jopa pienemmänkin skaalan käyttäjät pystyvät itse vastaamaan näiden asioiden toteutuksesta.  

BigQueryssä on monta hienoa ominaisuutta, joilla voidaan melko saumattomasti rikastaa dataa. Tämän blogisarjan tarkoitus on esitellä muutama näistä ominaisuuksista käytännön esimerkkien kautta, käyttäen koodia, jota voi kopioida omiin BigQuery-projekteihin. Tässä blogissa tutustutaan GA4-datamalliin, ja määritetään oma sessiotunniste. Lopuksi lasketaan sessiokohtaisia avainlukuja, joita tullaan hyödyntämään seuraavassa osassa.  

BigQuery-dataa kysellään BQ:n omalla SQL-kieliversiolla. Se seuraa melko tarkasti muita suosittuja SQL-kieliversioita, mutta poikkeaa syntaksissa joissain asioissa. Kuitenkin vähimmäisvaatimus BigQueryn käyttöön on minkä tahansa SQL:n perusosaaminen – erikoisuudet opitaan helpoiten kantapään kautta googlaamalla. Tämän blogin oletuksena on, että lukija osaa itse navigoida omaan BQ:nsa Googlen Cloud Portalissa, ja että osaa jollain tasolla lukea SQL-kieltä. 

 

GA4-data BigQueryssä

 

Yksi suuri ero UA:n ja GA4:n välillä on se, että GA4:n data exportataan eventti-tasolla, kun taas UA-datan exportin alin taso on sessio. Muutenkin GA4:n datamalli on kompleksisempi, sillä se sisältää paljon ryhmitettyjä kenttiä (array tai BQ-kielellä repeated record), joita joudutaan purkamaan, jos niiden sisällä olevat tiedot halutaan käsitellä.  

 

axel_kuva1-k

 

Ryhmitetyllä kentällä tarkoitetaan periaatteessa sitä, että sen sijaan, että yhdessä sarakkeessa on yhdenlaista tietoa, on meillä yhdessä sarakkeessa erilaisia avain-arvo pareja – esimerkkinä avain voi olla merkkisarja ga_session_id (GA4:n sessiotunniste) ja arvo voi olla kyseinen tunniste.  

 

bq_Kuva2-

 

Tämä hankaloittaa datan käsittelyä, koska jotta näitä avain-arvo pareja voitaisiin hyödyntää, joudutaan ensin pilkkomaan ne erillisiksi kentiksi käyttämällä UNNEST komentoa. Esimerkiksi jos halutaan kyseinen ga_session_id käyttöön, joudutaan ensin purkamaan event_params ryhmitetty kenttä erillisiksi sarakkeiksi, ja sen jälkeen valitsemaan ainoastaan näistä sarakkeista tarvittavat tiedot. 

SELECT  

*, 

(SELECT  

value.int_value  

FROM UNNEST(event_params) WHERE key = "ga_session_id") AS ga_session_id 

FROM`[project_id.dataset_id].events_20220829`

Tämä tarkoittaa sitä, että jotta dataa pystyy analysoimaan sessiotasolla GA4:n datamallissa, täytyy ensin muotoilla data oikeanmalliseksi, ja sen jälkeen laskemaan relevantit tiedot analysoitavalla tasolla. Vaikka tämä menetelmä on hankalampi, sisältää se kuitenkin myös hyviä puolia. Esimerkiksi, jos mielestämme Googlen määrittely sessiolle on jostain syystä riittämätön, voimme yhtä hyvin rakentaa oman määrityksen.  

 

Oman sessiotunnisteen luominen

 

Luodaksemme oman sessiotunnisteen joudumme ensin miettimään kyseisen tunnisteen logiikkaa.  Sessio määritetään saman käyttäjän eventtien perusteella, niin että sessio päättyy, kun jotkut ehdot täyttyvät. Google käyttää esimerkiksi määrittelyssään session eventtien välisenä maksimi aikana 30 minuuttia, jonka lyhentämistä voisimme harkita. 

Ensimmäinen askel on laskea aikaleimaperusteinen indeksi käyttäjäkohtaisille eventeille, sekä laskea samalla tavalla eventtien välisen minuuttimäärän. Sen jälkeen valitaan näistä eventeistä ne, jotka täyttävät session aloitusehdot – tässä tapauksessa valitaan eventit joiden indeksi on 1 tai joiden eventtien välinen aika on yli 15 minuuttia. Kun tehdään tälle listalle uusi käyttäjäkohtainen indeksointi, saadaan sessionumerointi, jota voidaan liittää käyttäjätunnisteeseen, josta muodostuu sessiotunniste. Tätä näkymää voidaan sitten liittää eventtitauluun, jotta pystymme jatkossa hyödyntämään uutta sessiotunnistetta.  

SELECT 

user_pseudo_id, 

minutes_since_previous_event, 

event_id AS min_event, 

event_timestamp AS min_timestamp, 

LEAD(event_id) OVER(PARTITION BY user_pseudo_id ORDER BY event_id) AS max_event, 

LEAD(event_timestamp) OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS max_timestamp, 

CONCAT(user_pseudo_id, "-", ROW_NUMBER() OVER(PARTITION BY user_pseudo_id)) AS session_id, 

ROW_NUMBER() OVER(PARTITION BY user_pseudo_id) AS session_number 

 

FROM

 

SELECT  

 

user_pseudo_id, 

event_timestamp, 

ROW_NUMBER() OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS event_id, 

(event_timestamp - LAG(event_timestamp) OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp))/1000000/60AS minutes_since_previous_event 

FROM `[project_id.dataset_id].events_2022*`  

WHERE user_pseudo_id IS NOT NULL

AND user_pseudo_id <> "null" 

) x 

 

WHERE event_id = 1 OR minutes_since_previous_event >= 15 

Kätevin tapa järjestää tämä kokonaisuus, on luoda siitä näkymä, joka sisältää yllä olevan logiikan. Kun se on luotu, voidaan aina kysellä näkymää, kun haluamme hyödyntää uuden sessiotunnisteemme. 

 

CREATE OR REPLACE VIEW `[project_id.dataset_id].events_with_session2022` AS 

WITH sessions AS(

SELECT 

user_pseudo_id, 

minutes_since_previous_event, 

event_id AS min_event, 

event_timestamp AS min_timestamp, 

LEAD(event_id) OVER(PARTITION BY user_pseudo_id ORDER BY event_id) AS max_event, 

LEAD(event_timestamp) OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS max_timestamp, 

CONCAT(user_pseudo_id, "-", ROW_NUMBER() OVER(PARTITION BY user_pseudo_id)) AS session_id, 

ROW_NUMBER() OVER(PARTITION BY user_pseudo_id) AS session_number 

 

FROM

 

SELECT  

 

user_pseudo_id, 

event_timestamp, 

ROW_NUMBER() OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS event_id, 

(event_timestamp - LAG(event_timestamp) OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp))/1000000/60AS minutes_since_previous_event 

FROM `[project_id.dataset_id].events_2022*`  

WHERE user_pseudo_id IS NOT NULL

AND user_pseudo_id <> "null" 

) x 

 

WHERE event_id = 1 OR minutes_since_previous_event >= 15), 

events AS( 

SELECT  

*, 

ROW_NUMBER()OVER(PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS event_id 

FROM `[project_id.dataset.id].events_2022*` 

 

WHERE user_pseudo_id IS NOT NULL

AND user_pseudo_id <>"null") 

 

SELECT 

e.*, 

s.session_id, 

s.min_event, 

s.max_event, 

s.min_timestamp, 

s.max_timestamp, 

s.session_number, 

FROM events AS e 

 

LEFT JOIN sessions AS s 

ON s.user_pseudo_id = e.user_pseudo_id 

AND e.event_id >= s.min_event 

AND e.event_id <IFNULL(s.max_event, 99999999999999)

Kun tämä näkymä on luotuna, voidaan käyttää sitä laskemaan sessiokohtaisesti lukuja. Lasketaan käyttäjien klikkimäärät, sivustolla vietettyä aika minuuteissa, sekä uniikit eventtikokonaisuudet. 

SELECT  

session_id, 

SUM(CASE WHEN event_name = “click” THEN 1 ELSE 0 END)AS clicks, 

(MAX(event_timestamp)-MIN(event_timestamp))/1000000/60AS minutes_on_site, 

COUNT(DISTINCT event_bundle_sequence_id)AS events 

 

FROM`[project_id.dataset.id].events_with_session2022`  

 

GROUP BY session_id 

 

Tässä blogissa on käsitelty GA4:n datamallia, luotu oma sessiotunniste ja hyödynnetty tunnistetta laskemaan sessiokohtaisia lukuja käyttäjistämme. Seuraavassa osassa otetaan käyttöön BigQueryn mallintamistyökalut, ja tehdään käyttäjädatan perusteella asiakassegmentointia. 

 

Onko BigQueryn ja GA4:n käytön aloitus ajankohtainen?

Lue lisää data- ja analytiikka-palveluistamme ja ota yhteyttä!

 

LUE LISÄÄ >>