Forecasting-Algorithmen finden heute in zahlreichen Feldern Anwendung. Auch Google Analytics Daten sind dabei ein geeigneter Ausgangspunkt. Allerdings ist die Validierung des Forecasts, also der Abgleich, ob die Zahlen im Forecast mit wirklich realisierten Zahlen übereinstimmen, nicht im Interface out-of-the-box möglich. Also bauen wir uns hierfür ein Tool.
Die Daten für Forecast
Als einfaches Startbeispiel erstellen wir einen Forecast der Sessions. Als erstes benötigen wir die Rohdaten, also einen Custom-Report aus Google Analytics, der das Datum und die Anzahl der Sessions wiedergibt. Der Report sollte mehrere Monate an Daten umfassen und das Enddatum sollte der gestrige Tag sein.
Wir exportieren der Report als Excel File. Damit haben wir eine Zeitreihe der Sessions. Für die weitere Bearbeitung löschen wir das erste Tabellenblatt (Summary) und auf dem verbleibenden Tabellenblatt entfernen wir die Zeitangaben, so dass nur noch die Sessions verbleiben. Die Datei speichern wir als TimeSeries_Session.xlsx.
ARIMA-Modell
Um den Forecast zu erstellen, nutzen wir R. R bietet eine Reihe von Bibliotheken, die entsprechende Algorithmen vorimplementiert mitbringen. Für einen ersten Forecast bietet sich das ARIMA-Modell (ARIMA = autoregressive integrated moving average) an.
Kurz (und oberflächlich) erklärt wird ein ARIMA-Modell erstellt, das bestmöglich auf die Zeitreihe passt und dann zukünftige Werte vorhersagt. Für kurzfristige Vorhersage ist es daher gut geeignet. Es arbeitet mit einer gewichteten Summe aus Messwerten, einer gewichteten Summe aus Zufallseinflüssen und verlangt, dass eine sogenannte Stationarität, also den gleichen Erwartungswert und die gleiche Varianz der Zeitreihe zu allen Zeitpunkten.
Die wird im ARIMA-Modell durch drei Parameter(p,d,q) als Integer ausgedrückt:
- p: Nicht saisonaler autoregressiver Polynomgrad
- d: Grad der nicht saisonalen Integration
- q: Nicht saisonaler gleitender durchschnittlicher Polynomgrad
Mehr zum ARIMA-Modell: https://en.wikipedia.org/wiki/Autoregressive_integrated_moving_average
Diese Parameter müssen nicht selbst festgelegt werden, sondern können errechnet werden. Der erste Teil des Quellcodes übernimmt daher das Einlesen der Excel-Datei mit den Session-Daten, und erstellt das ARIMA-Modell:
# Die benutzen Bibliotheken importieren - falls nicht bereits vorhanden, mit install(forecast) etc. installieren
library(forecast)
library(tseries)
library(readxl)
#Datei einlesen
file <- read_excel('Pfad zu TimeSeries_Session.xlsx')
#Zeitreihe erstellen, frequency gibt die Abstände (1=täglich) und start das Startdatum an
session <- ts(retail, frequency=1)
#Arima Model berechnen
arimaModel <- auto.arima(session)
Nachdem das Modell erstellt wurde, kann der Forecast berechnet werden. Hierfür können zwei Parameter angegeben werden. Einerseits wird confidence übergeben, zum andere der Parameter h. Confidence bestimmt die prozentuale Sicherheit der Vorhersage aufgrund des Modells. Je höher diese Angegeben ist, umso breiter wird der Korridor der Vorhersage, also die Abweichung des berechneten Maximal- und Minimalwertes für die Vorhersage zu einem Zeitpunkt. h gibt die Anzahl der vorherzusagenden Zeitpunkte an. Wird h=10 gewählt, sind es zehn Zeitpunkte im Abstand der Zeitreihe, auf der das Modell basiert.
#Forecast erstellen
forecastARIMA <- forecast(arimaModel, level = c(60), h = 10)
#Datenpunkt ansehen
forecastARIMA
#Datenpunkte graphisch darstellen
autoplot(forecastARIMA)
Eine Visualisierung der Vorhersage verdeutlicht das:
Die blaue Linie stellt den Mittelwert des Korridors (blau) dar. Nachdem die Vorhersage erstellt wurde, speichern wir diese Werte nun in einer CSV Datei.
Wir speichern den oberen, unteren, und mittleren Vorhersagewert. Um die Zeitreihen in der richtigen Reihenfolge zu halten, fügen wir einen Index an die Werte an, sowie am Ende eine 0, die wir später noch benötigen.
# Index für Datenwerte erzeugen - 1 bis 10 da 10 Datenpunkte
index<-c(1:10)
# Wert mit 0 (= false) für Send-Flag
send<-0
# Verbinden des Index, der Forecast-Werte und des Send Flags in einen dataframe
df<-cbind(index,forecastARIMA$mean,forecastARIMA$upper, forecastARIMA$lower,send)
#dataframe ansehen
df
#df in CSV schreiben
write.csv(df,"Pfad zu Speichern von forecast-session.csv", quote = FALSE, row.names = FALSE)
Den Forecast nach Google Analytics senden
Um die Daten des Forecasts mit den Daten in Google Analytics abzugleichen, ist es notwendig, die jeweilige Zeitreihe zum richtigen Zeitpunkt nach Google Analytics zu senden. Hierfür benutzen wir die Google Cloud Platform:
Die Daten zum Forecast speichern wir in BigQuery. Dafür wird ein Table mit folgenden Schema erstellt und die Datei mit den Forecast-Zahlen importiert. Die in die Daten angefügte Null, wird nun zu einem Marker (True/False), welche Daten bereits gesendet wurden. Nach dem Import sind alle Zeilen auf False, da noch keine Daten gesendet wurden.
Nun benötigen wir eine Cloud-Function, die einmal am Tag (entsprechend dem Abstand der Zeitreihen) die Höhe der vorhergesagten Sessions für diesen Tag erzeugt. Zusätzlich erzeugen wir Sessions in Höhe des oberen und unteren Vorhersagewert. Alle Events werden mit unterschiedlichen ClientIDs erzeugt, damit die Session im Interface von Google Analytics separiert werden können. Dafür eignen sich Events. Die Events werden mit einer nicht existenten ClientID per Measurement-Protocol erzeugt.
Event-Category ist dabei „Forecast“, Event-Action die jeweilige Zurodnung der Sessions (Mean, Upper, Lower) und Event-Label der Wert. Optional kann nach noch eine Custom Dimension mitgesendet werden, um den Measurement-Protocol Traffic von den gesammelten Daten auf der Webseite zu unterscheiden. Nachdem die Daten gesendet wurden, wird das Flag Send auf true gesetzt.
Die Cloud-Function ist dabei einfach aufgebaut:
Diese wird über einen HTTP-Trigger ausgelöst. Wir möchten diese Function jedoch nicht täglich manuell starten, daher nutzen wir den Cloud Scheduler, der die Function mit der Einstellung 30 23 * * * jeden Tag um 23:30 startet.
Google Analytics Konfiguration
Da wir per Measurement Protocol Sessions erzeugen, sollten diese Daten nicht in Views einlaufen, die für andere Auswertungen genutzt werden. Daher erstellen wir einen neuen View mit den gleichen Filtern wie die im View, aus denen der Report für das ARIMA Modell erstellt wurde. Zudem werden zu allen anderen Views Filter hinzugefügt, die die Events herausfiltern. Dies kann auf Basis der Event-Category oder der Custom-Dimension (wie im Bild) erfolgen
Auswertung in Google Analytics
Für den Vergleich unseres Session-Forecast mit realen Zahlen ist nun nur noch die Erstellung von vier Segmenten erforderlich:
Web Users:
Forecast Mean:
Forecast Upper:
Forecast Lower:
Auf einen Blick können nun die Werte direkt im Interface verglichen werden, nachdem die Cloud Function ausgeführt wurde (blau: reale User, orange: Arima Mittelwert, grün: Arima oberer Werte, Lila: Arima unterer Wert):
Wofür benötige ich das?
Sessions, Conversions, oder Ausgaben und viele andere Zeitreihen eigenen sich für einen Forecast. Doch nicht alle Daten liefern immer gute Forecasts. Der Abgleich von Ist-Zahlen mit vorberechneten Zahlen hilft einerseits, die Qualität der Vorhersage einzuschätzen, das heißt wie genau das Vorhersage-Modell ist. Dabei können die Zahlen direkt mit den von Google Analytics erfassten Zahlen kombiniert, gefiltert, etc. werden und so Auswirkungen für Abweichungen vom Modell mit Acquistion oder Conversion-Daten in Verbindung gebracht werden.
Zudem werden die Vorhersage-Daten und deren Abgleich damit auch anderen Nutzergruppen zugänglich gemacht, die bisher wenig Einblick in die Vorhersagen und deren Qualität hatten.
Dennoch ist diese Lösung eher nicht für den produktiven Einsatz geeignet, da evtl. die Daten auch in einem Dashboard aggregiert werden können. Zudem werden viele Hits erzeugt. Diese Lösung ist ein PoC und soll eher als Anregung dienen.
An dieser Stelle auch einen herzlichen Dank an Markus Baersch, der immer sehr konstruktives Feedback zu solchen Ideen beísteuert.
1 thought on “Forecasting Daten in Google Analytics abgleichen”