Skip to content

Instantly share code, notes, and snippets.

@mbaersch
Last active November 19, 2019 09:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mbaersch/bfed039df0a9373eed887f10d17754f2 to your computer and use it in GitHub Desktop.
Save mbaersch/bfed039df0a9373eed887f10d17754f2 to your computer and use it in GitHub Desktop.
Gewichtung von Mikrozielen für Engagement-Scoring in Analytics mit Random Forest in RStudio bestimmen
#-------------------------------------------------------------------------------------------------------
# Abhängigkeit zwischen Transaktionen / Makrozielen und Mikro-Zielerreichungen untersuchen
#-------------------------------------------------------------------------------------------------------
#VORBEREITUNG (einmalig): Installation der Pakete, wenn nicht bereits installiert
#Im Bedarfsfall hier das Kommentarzeichen "#" vor den beiden folgenden Zeilen entfernen und
#diese ebenfallsausführen
#install.packages("googleAnalyticsR")
#install.packages("h2o")
#install.packages("ggplot2")
#-------------------------------------------------------------------------------------------------------
# SETUP: Einstellungen an eigene Datenansicht und Ziele etc. anpassen, um das Script zu nutzen
#-------------------------------------------------------------------------------------------------------
#Hier die ID der Datenansicht eintragen.
#Steht in den Einstellungen der Datenansicht in GA oben in den Grundeinstellungen
checkId = "123456789"
#Anzahl der Tage, für die Daten abgerufen werden sollen - passend zur typischen Dauer bis zur Makroconversion
checkDays = 60
#Von welchem Makroziel soll die Abhängigkeit der Mikroziele untersucht werden?
#Beispiele: transactions oder goal1Completions
#Darunter einen sprechenden Namen angeben
macro_goal = "transactions"
macro_goal_name = "Kaufabschluesse"
#In welcher Benutzerdefinierten Dimension steht die ClientId?
#Zur Speicherung in den eigenen Daten siehe z. B.
#(GTM): https://www.simoahava.com/analytics/improve-data-collection-with-four-custom-dimensions/
#(GTAG.JS): https://www.simoahava.com/analytics/add-clientid-to-custom-dimension-gtag-js/
cliendIdDimension = "dimension5"
#Zu untersuchende Mikroziele (vermutlich Zielerreichungen) eintragen, die gewichtet werden sollen.
#Der Umfang der Liste ist je nach eigener Zielgestaltung und -anzahl variabel
#Darunter sprechende Namen in gleicher Reihenfolge angeben - macht die Ergebnisse leichter lesbar
micro_goals = c("goal2Completions", "goal3Completions", "goal4Completions", "goal5Completions")
micro_goal_names = c("Tel- und Mail-Links", "Kontaktformular", "Kommentar Blog", "Newsletter-Abo")
#ENDE SETUP. Ab hier muss nichts mehr geändert werden, nur noch alles ausgeführt. Das Ergebnis als
#Gewichtung ist am Ende des Vorgangs unten in der Console zu finden (siehe dort)
#Beispiel:
# Variable Importances:
# variable relative_importance scaled_importance percentage
#1 Newsletter-Abo 332.969299 1.000000 0.481998
#2 Kontaktformular 242.134705 0.727198 0.350508
#3 Tel- und Mail-Links 113.618210 0.341227 0.164471
#4 Kommentar Blog 2.088477 0.006272 0.003023
#-------------------------------------------------------------------------------------------------------
# Daten aus GA beziehen und vorbereiten
#-------------------------------------------------------------------------------------------------------
library(googleAnalyticsR)
ga_auth()
checkDateRange <- c(Sys.Date()-checkDays-1, Sys.Date()-1)
#Offline? Dann Cachefile einlesen, wenn vorher erzeugt (siehe unten)
#ga_dataset <- read.csv("sampledata_random_forest.csv")
#Daten via API aus Analytics ziehen
ga_dataset <- google_analytics(viewId = checkId, date_range = checkDateRange,
metrics = append(micro_goals, macro_goal),
dimensions = as.vector(cliendIdDimension),
anti_sample = TRUE)
#Cachefile aktualisieren? Dann auskommentieren
#write.csv(ga_dataset, file = "sampledata_random_forest.csv")
#unnütze konsolidierte Datensätze ohne ClientID und Spalte ClientID entfernen
ga_dataset <- subset(ga_dataset, ga_dataset[,1] != "(other)" & ga_dataset[,1] != "(not set)")
ga_dataset <- ga_dataset[ , !(names(ga_dataset) == cliendIdDimension)] #ClientIDs auch rauswerfen - werden hier nicht mehr benötigt
#Marker für Auftreten von Conversions und Zielen auf 0 oder 1 reduzieren
ga_dataset[,-1] <- (ga_dataset[,-1] != 0)*1
#Spaltenbezeichnungen anpassen
names(ga_dataset)[names(ga_dataset)==macro_goal] <- macro_goal_name
for(i in 0:length(micro_goals)) {
names(ga_dataset)[names(ga_dataset)==micro_goals[i]] <- micro_goal_names[i]
}
#Übersicht der Daten ausgeben: Alle Felder sollen Min=0 und Max=1 haben
summary(ga_dataset[,-1])
#Wie viele Zeilen mit Mikro- und Makrozielen sind vorhanden?
colSums(ga_dataset[,-1])
#Wie viele an Abschlüssen beteiligte Mikroziele gibt es?
#Dazu Daten auf Zeilen mit Abschlüssen reduzieren und dann summieren
ga_conversion_rows <- subset(ga_dataset, ga_dataset[, ncol(ga_dataset)] == 1)[,-1]
colSums(ga_conversion_rows)
#-------------------------------------------------------------------------------------------------------
# #Random Forest aus h2o für die Untersuchung der Daten nutzen
#-------------------------------------------------------------------------------------------------------
library(h2o)
h2o.init()
data <- as.h2o(ga_dataset)
#Aufteilen in Trainings- und Testdaten
sample <- h2o.splitFrame(data,0.75)
train <- sample[[1]]
test <- sample[[2]]
#Modell trainieren
m <- h2o.randomForest(micro_goal_names, macro_goal_name, train, nfolds=10, model_id = "RF_defaults")
#Modell mit Testdaten überprüfen.
#Zur Interpretation der auf der Console ausgegebenen Werte siehe
#http://docs.h2o.ai/h2o/latest-stable/h2o-docs/performance-and-prediction.html
#Wenn die Belastbarkeit zu gering ist, größeren Zeitraum für mehr Daten und/oder Wert für "nfolds" oben erhöhen
h2o.performance(m, test)
#Gewichtung der Mikroziele anhand der Wichtigkeit für die Erreichung des Makroziels auf der Console
#und rechts als Plot ausgeben. Siehe http://docs.h2o.ai/h2o/latest-stable/h2o-docs/variable-importance.html
#Nutzung: Werte der Spalte "scaled_importance" zur Gewichtung der Mikroziele im Engagement-Scoring verwenden
h2o.varimp_plot(m)
h2o.varimp(m)
#oder in schön / präsentationsfähig:
library(ggplot2)
ggplot(h2o.varimp(m)) + aes(y = percentage, x= reorder(variable, -percentage)) +
geom_bar(stat = "identity", fill="darkorange") +
xlab("Mikroziel") + ylab("Wichtigkeit") +
ggtitle(paste("Einfluss von Mikrozielen auf", macro_goal_name))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment