Bitte zuerst lesen!

Dies ist eine etwas andere Version als im Buch, da ich noch einige Sachen hinzugefügt habe. Selbst wenn Sie keinen Zugriff auf eine eigene Webanalyse-Plattform haben, können Sie dieses Beispiel ausprobieren, da ich Ihnen einen Datensatz von meiner eigenen Website zur Verfügung stelle.

Libraries & Authentifizierung

Die folgenden Befehle auskommentieren (das “#” entfernen), um die Libraries zu installieren. Das muss nur einmal passieren.

#install.packages("arules")
#install.packages("arulesViz")
#install.packages("tidyverse")
#install.packages("googleAuthR")
#install.packages("googleAnalyticsR")
#install.packages("digest")

Am bequemsten werden Daten aus Google-APIs mit einem Service User abgefragt. Andere Möglichkeiten sind hier nachzulesen: http://code.markedmondson.me/googleAuthR/articles/google-authentication-types.html

Ich habe dei Autorisierungsdaten in meinem R-Stammverzeichnis in der Datei .Renviron gespeichert; in der Datei steht nur

GA_AUTH_FILE = “/Users/tom/Shiny-d1739b8e7809.json”

Das muss natürlich an die eigenen Gegebenheiten angepasst werden (und natürlich benötigt man auch eine eigene JSON-Datei).

library(tidyverse)
## Registered S3 methods overwritten by 'ggplot2':
##   method         from 
##   [.quosures     rlang
##   c.quosures     rlang
##   print.quosures rlang
## ── Attaching packages ──────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.1.1     ✔ purrr   0.3.2
## ✔ tibble  2.1.1     ✔ dplyr   0.8.1
## ✔ tidyr   0.8.3     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ─────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(googleAuthR)
options(googleAuthR.scopes.selected = "https://www.googleapis.com/auth/analytics")
library(googleAnalyticsR)
## 2019-07-04 14:25:01> Default Google Project for googleAnalyticsR is now set.  
##  This is shared with all googleAnalyticsR users. 
##  If making a lot of API calls, please: 
##  visit: https://bit.ly/2Evk6hn 
##  for instructions on setting your own Google Project
## Setting scopes to https://www.googleapis.com/auth/analytics.readonly
## Registered S3 method overwritten by 'openssl':
##   method      from
##   print.bytes Rcpp
## Successfully auto-authenticated via /Users/tom/Shiny-d1739b8e7809.json
library(arules)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following object is masked from 'package:tidyr':
## 
##     expand
## 
## Attaching package: 'arules'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
library(arulesViz)
## Loading required package: grid
## Registered S3 method overwritten by 'seriation':
##   method         from 
##   reorder.hclust gclus
library(digest)

Option 1: Abfragen der Daten über eine Google API (geht nicht mit Standard-Installation)

Durch den folgenden Befehl kann gesehen werden, zu welchen Properties und Views man ZUgriff hat. Wichtig ist die Spalte View ID, da damit später Daten abgefragt werden.

my_accounts <- ga_account_list()

The important bit here is the ViewID that we will now use for requests. You must change this to your ViewID if you want this to work. Also, you must have dimension1 to be set up to include a unique identifier. If you don’t have all of that, no worries, I provide a dataset further below.

ga_id = 1952687
dt <- google_analytics(ga_id,
date_range = c("2018-08-01", "2018-09-30"), 
metrics = c("ga:users"),
dimensions = c("ga:dimension1","ga:pagePathLevel1"),
max = -1
)
## 2019-07-04 14:21:27> Downloaded [9282] rows from a total of [9282].

Wir anonymisieren die Daten erst einmal, bevor wir sie zeigen:

i = 1
for (i in i:nrow(dt)) {
  dt$dimension1[i] <- digest(paste(dt$dimension1[i]))
  i <- i+1
}

dt

Option 2: Beispiel-Datensatz laden und verwenden

Den folgenden Code nur nutzen, falls kein eigener Datenset vorhanden ist. Hier kann mein Datensatz heruntergeladen werden.

(dt <- read_csv("https://tom.alby.de/analysis/data.csv"))
## Parsed with column specification:
## cols(
##   dimension1 = col_character(),
##   pagePathLevel1 = col_character(),
##   users = col_double()
## )

Transformation der Daten und Erstellen der Regeln

Zunächst müssen die Daten transformiert werden, danach erfolgt das Data Mining:

i <- split(dt$pagePathLevel1,dt$dimension1)
txn <- as(i, "transactions")
basket_rules <- apriori(txn, parameter = list(sup = 0.005, conf = 0.01, target="rules"))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##        0.01    0.1    1 none FALSE            TRUE       5   0.005      1
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 35 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[197 item(s), 7026 transaction(s)] done [0.00s].
## sorting and recoding items ... [29 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [61 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].

Wir schauen uns die Daten einmal sortiert nach Lift an:

myRules_Direct <- as(basket_rules, "data.frame");
myRules_Direct %>%
  filter(lift > 1.1) %>%
  arrange(desc(lift))

Visualisierung der Seiten-basierten Personas

Zum Schluß bauen wir aus den Regeln mit dem höchsten Lift einen eigenen Datensatz.

basket_rules_hi <- head(basket_rules, by ="lift",35)

Nun wird das visualisiert:

plot(basket_rules_hi, method="graph")