Last active
November 19, 2019 09:42
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#------------------------------------------------------------------------------------------------------- | |
# 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