data > opinion

Tom Alby

R Beispiel-Notebook für Analytics-Artikel in der Websiteboosting 59

2019-12-27


Sie sind hier: start / blog / r beispiel notebook f%C3%BCr analytics artikel in der websiteboosting 59 /

Laden der Libraries und der Daten

library(tidyverse)
## ── Attaching packages ───────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.2.1     ✓ purrr   0.3.3
## ✓ tibble  2.1.3     ✓ dplyr   0.8.3
## ✓ tidyr   1.0.0     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.4.0
## ── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(stringr)
library(modelr)

Laden der Daten: Achtung, das sind 15MB an Daten! Sie stammen von meiner eigenen Seite für den Oktober 2019. Sie wurden aus einer stark angepassten Implementierung von Google Analytics generiert.

data <- read_csv("https://alby.link/websiteboostingdata", 
    col_types = cols(dimension3 = col_character()))

Wir schauen uns die Daten einmal an:

head(data)
## # A tibble: 6 x 11
##   clientID dimension2 dimension3 browser sourceMedium pagePath deviceCategory
##   <chr>    <chr>      <chr>      <chr>   <chr>        <chr>    <chr>         
## 1 d9209cd… pageview   157005321… Intern… google / or… /erfahr… desktop       
## 2 d9209cd… event      157005340… Intern… google / or… /erfahr… desktop       
## 3 d9209cd… event      157005363… Intern… google / or… /erfahr… desktop       
## 4 d9209cd… event      157005381… Intern… google / or… /erfahr… desktop       
## 5 d9209cd… event      157005381… Intern… google / or… /erfahr… desktop       
## 6 d9209cd… event      157005401… Intern… google / or… /erfahr… desktop       
## # … with 4 more variables: eventCategory <chr>, eventAction <chr>,
## #   eventLabel <chr>, eventValue <dbl>

Die Spalten enthalten die folgenden Daten:

Data Cleaning

Die Daten sind noch nicht ganz sauber. Mit der Library Stringr haben wir die Möglichkeit reguläre Ausdrucke zu nutzen, um Muster zu entfernen.

data <- data %>%
  mutate(pagePath = str_replace(pagePath,"\\?highlight.*","")) %>%
  mutate(pagePath = str_replace(pagePath,"\\?fbclid.*","")) %>%
  mutate(pagePath = str_replace(pagePath,"\\?s=.*","search")) %>%
  mutate(pagePath = str_replace(pagePath,"\\?.*","")) 

Besonders die Facebook-ClickID ist nervig, da eine URL dann mit verschiedenen IDs zu unterschiedlichen URLs wird. Die Reihenfolge der Mutationen ist wichtig!

Transformation von Daten

Wir erstellen zunächst einmal eine Liste der Seiten mit der Häufigkeit ihrer jeweiligen Aufrufe:

(top_pages <- data %>%
  filter(dimension2 == "pageview") %>%
  group_by(pagePath) %>%
  summarize(n=n()) %>%
  arrange(desc(n)))
## # A tibble: 267 x 2
##    pagePath                                                             n
##    <chr>                                                            <int>
##  1 /wie-man-ganz-viel-zeit-mit-einer-nas-verschwenden-kann/          2111
##  2 /erfahrungen-als-airbnb-vermieter/                                1992
##  3 /1-jahr-erfahrung-mit-scalable-capital/                           1351
##  4 /eigene-high-performance-cloud-fuer-261e/                          846
##  5 /                                                                  709
##  6 /erfahrungen-mit-tado-gute-idee-schlechte-ausfuehrung/             656
##  7 /mensch-gegen-maschine-anlageberater-gegen-scalable-capital/       513
##  8 /archiv/pc69/                                                      432
##  9 /erfahrungen-scalable-capital-und-quirion-im-direkten-vergleich/   331
## 10 /5-gruende-warum-du-google-trends-falsch-verstehst/                295
## # … with 257 more rows

Danach erstellen wir eine Liste aller Seiten und wie häufig sie bis “zum Ende” gelesen worden sind, in dem Fall meiner Seite bis das YARPP-Element auf dem Bildschirm des Nutzers sichtbar ist.

(cv <- data %>%
  group_by(pagePath) %>%
  filter(eventLabel == "YARPP Visibility") %>%
  summarize(cv = n()) %>%
  arrange(desc(cv)))
## # A tibble: 161 x 2
##    pagePath                                                                   cv
##    <chr>                                                                   <int>
##  1 /wie-man-ganz-viel-zeit-mit-einer-nas-verschwenden-kann/                 1211
##  2 /erfahrungen-als-airbnb-vermieter/                                       1194
##  3 /1-jahr-erfahrung-mit-scalable-capital/                                   722
##  4 /mensch-gegen-maschine-anlageberater-gegen-scalable-capital/              472
##  5 /eigene-high-performance-cloud-fuer-261e/                                 398
##  6 /erfahrungen-scalable-capital-und-quirion-im-direkten-vergleich/          207
##  7 /erfahrungen-mit-tado-gute-idee-schlechte-ausfuehrung/                    199
##  8 /vorwerk-thermomix-cook-key-cookidoo-von-unserioesen-beratern-und-weit…    97
##  9 /archiv/pc69/                                                              94
## 10 /5-gruende-warum-du-google-trends-falsch-verstehst/                        93
## # … with 151 more rows

Die einfachste Lösung wäre nun, eine Art Conversion Rate auszurechnen, indem die Conversions durch die Anzahl der Seitenaufrufe geteilt wird. Wir sortieren die Daten nach der geringsten Conversion Rate, denn wir wollen ja wissen, welche Seiten optimiert werden müssen.

new_ga_data <- merge(top_pages,cv)
new_ga_data %>%
  mutate(cvr = cv/n) %>%
  filter(n >50) %>%
  arrange(cvr)
##                                                                                                pagePath
## 1                                                                                         /archiv/pc69/
## 2                                                /erfahrungen-mit-tado-gute-idee-schlechte-ausfuehrung/
## 3                                                   /5-gruende-warum-du-google-trends-falsch-verstehst/
## 4     /vorwerk-thermomix-cook-key-cookidoo-von-unserioesen-beratern-und-weiteren-seltsamen-erfahrungen/
## 5  /warum-neue-und-wiederkehrende-besucher-in-google-analytics-manchmal-mit-vorsicht-zu-geniessen-sind/
## 6                       /warum-die-durchschnittliche-sitzungsdauer-in-analytics-kompletter-quatsch-ist/
## 7                                                                                 /lehrveranstaltungen/
## 8                                                             /eigene-high-performance-cloud-fuer-261e/
## 9                                                    /google-wifi-netzwerk-sonos-fritzbox-synology-nas/
## 10                                                              /1-jahr-erfahrung-mit-scalable-capital/
## 11                                             /wie-man-ganz-viel-zeit-mit-einer-nas-verschwenden-kann/
## 12                                                                   /erfahrungen-als-airbnb-vermieter/
## 13                                     /erfahrungen-scalable-capital-und-quirion-im-direkten-vergleich/
## 14                                                                 /woher-kommen-die-similar-web-daten/
## 15                                                                                          /cold-song/
## 16                                                      /erfahrungen-vorwerk-staubsauger-roboter-vr200/
## 17                                                                                             /archiv/
## 18                          /vergleich-zwischen-quirion-und-scalable-capital-die-fintech-robo-advisors/
## 19                                                        /google-wifi-versus-netgear-orbi-erfahrungen/
## 20                                           /was-ich-als-jugendlicher-gerne-ueber-geld-gelernt-haette/
## 21                                                           /archiv/software/kindle-clippings-manager/
## 22                       /lehrveranstaltungen/digital-analytics/analyse/statistik-i/standardabweichung/
## 23                                                      /synology-upload-geschwindigkeit-einschraenken/
## 24                           /lehrveranstaltungen/digital-analytics/analyse/statistik-i/standardfehler/
## 25                                         /mensch-gegen-maschine-anlageberater-gegen-scalable-capital/
##       n   cv       cvr
## 1   432   94 0.2175926
## 2   656  199 0.3033537
## 3   295   93 0.3152542
## 4   271   97 0.3579336
## 5   145   61 0.4206897
## 6   118   53 0.4491525
## 7   151   69 0.4569536
## 8   846  398 0.4704492
## 9   112   57 0.5089286
## 10 1351  722 0.5344189
## 11 2111 1211 0.5736618
## 12 1992 1194 0.5993976
## 13  331  207 0.6253776
## 14   65   41 0.6307692
## 15  109   69 0.6330275
## 16  109   69 0.6330275
## 17   88   56 0.6363636
## 18   67   46 0.6865672
## 19   69   49 0.7101449
## 20   87   62 0.7126437
## 21   56   40 0.7142857
## 22   53   38 0.7169811
## 23   73   61 0.8356164
## 24   61   54 0.8852459
## 25  513  472 0.9200780

Analyse mit Residuen

Wir schauen uns aber noch eine andere Lösung an. Wir plotten die Impressions und die Anzahl der Conversions pro Seite und ziehen dann mit einer linearen Regression eine Linie durch die Punkte. Die Linie zeigt nun die erwartete Anzahl von Conversions für eine Anzahl von Impressions. Die Punkte über und unter der Linie sind also über oder unter den Erwartungswerten. Der Abstand zwischen einem solchen Punkt und der Linie wird Residuum genannt.

plot(new_ga_data$n,new_ga_data$cv, xlab = "Impressions", ylab = "Read until the end")
mod <- lm(new_ga_data$cv ~ new_ga_data$n, data = new_ga_data)
abline(mod)

Und jetzt plotten wir einfach mal die Residuen, also nur die Abstände von den Erwartungswerten:

tada <- new_ga_data %>%  # "tada" war jetzt nicht so die vorbildliche Benennung für einen Data frame, sorry!
  add_residuals(mod)

tada %>% 
  filter(n > 50) %>%
  mutate(myPagePath = str_trunc(pagePath, 30)) %>%
  ggplot(aes(myPagePath, resid, group = 1)) + 
  theme(axis.text.x = element_text(angle = 90)) +
  geom_ref_line(h = 0) + 
  geom_line()

Warum sehen die Daten hier so anders aus als die CVR-Daten? Die Seite über die Synology-Uploadgeschwindigkeit hat eine CVR von über 83%, aber das Residuum ist nur knapp über der Linie. Da die Synology-Seite relativ selten aufgerufen worden ist, ist der Abstand der tatsächlichen zur erwarteten Conversion Rate nicht so hoch wie der über Mensch gegen Maschine. Warum macht man das überhaupt? Zum Beispiel weil bei einer geringen Anzahl von Seitenaufrufen die Aussagekraft der Conversion Rate eventuell nicht so hoch ist.

Wie sieht die Liste nun aus?

tada %>%
  select(resid,pagePath) %>%
  filter(resid < 0) %>%
  arrange(resid)
##            resid
## 1  -168.31656768
## 2  -147.83517473
## 3   -75.75167776
## 4   -72.08985851
## 5   -54.64542355
## 6   -34.64499668
## 7   -20.06214002
## 8   -15.42324876
## 9   -12.93715070
## 10   -6.16403061
## 11   -5.60384582
## 12   -5.57604196
## 13   -4.44181313
## 14   -4.00199792
## 15   -3.20107397
## 16   -2.91867170
## 17   -2.43719338
## 18   -2.19645422
## 19   -1.99737817
## 20   -1.43719338
## 21   -1.07608464
## 22   -1.00199792
## 23   -0.99737817
## 24   -0.87700859
## 25   -0.55756296
## 26   -0.51589985
## 27   -0.51589985
## 28   -0.51589985
## 29   -0.27978044
## 30   -0.07608464
## 31   -0.07608464
##                                                                                                pagePath
## 1                                                /erfahrungen-mit-tado-gute-idee-schlechte-ausfuehrung/
## 2                                                                                         /archiv/pc69/
## 3                                                             /eigene-high-performance-cloud-fuer-261e/
## 4                                                   /5-gruende-warum-du-google-trends-falsch-verstehst/
## 5     /vorwerk-thermomix-cook-key-cookidoo-von-unserioesen-beratern-und-weiteren-seltsamen-erfahrungen/
## 6                                                               /1-jahr-erfahrung-mit-scalable-capital/
## 7  /warum-neue-und-wiederkehrende-besucher-in-google-analytics-manchmal-mit-vorsicht-zu-geniessen-sind/
## 8                                                                                 /lehrveranstaltungen/
## 9                       /warum-die-durchschnittliche-sitzungsdauer-in-analytics-kompletter-quatsch-ist/
## 10                                                                      /data-science-meets-seo-teil-2/
## 11              /lehrveranstaltungen/digital-analytics/analyse/statistik-i/mittelwert-median-und-modus/
## 12                                                   /google-wifi-netzwerk-sonos-fritzbox-synology-nas/
## 13                                               /wie-aus-b4p-und-statista-alternative-fakten-enstehen/
## 14 /lehrveranstaltungen/digital-analytics/analyse/daten-analyse-mit-r/erste-schritte-mit-r-und-rstudio/
## 15                                                                   /erfahrungen-mit-scalable-capital/
## 16                                                           /wie-suchmaschinen-data-science-verwenden/
## 17                           /wird-mein-content-gelesen-sichtbarkeit-von-elementen-anstatt-scrolltiefe/
## 18                                 /lehrveranstaltungen/data-science-analytics/data-science-ressourcen/
## 19                                             /lehrveranstaltungen/hinweise-zu-referaten-hausarbeiten/
## 20                                                                       /asus-eeepc-erste-erfahrungen/
## 21                                                                                         /translate_c
## 22                                                              /clustering-mit-google-analytics-und-r/
## 23                                  /wird-mein-content-gelesen-scroll-tiefe-pro-artikel-als-conversion/
## 24                       /google-optimize-hacken-von-bayes-p-werten-a-a-tests-und-vergessenen-metriken/
## 25                                                                    /scalable-capital-und-der-brexit/
## 26                                                             /actionable-seo-reporting-mit-r-und-aws/
## 27 /mv-digital-warum-digitale-transformation-und-100-jahre-traditionsunternehmen-kein-widerspruch-sind/
## 28                                                                   /veroeffentlichungen/das-seo-buch/
## 29                               /lehrveranstaltungen/digital-analytics/das-business-problem-verstehen/
## 30                                                    /datengetriebene-personas-mit-assoziationsregeln/
## 31                                                                   /nachtrag-zum-vortrag-auf-der-smx/

Zugabe (nicht in der Website Boosting): Wir können einen Kompromiss finden zwischen der Conversion Rate und den Residuen, indem wir die Daten logarithmisieren

mod <- lm(log(new_ga_data$cv) ~ log(new_ga_data$n), data = new_ga_data)

tada <- new_ga_data %>% 
  add_residuals(mod)

tada %>% 
  filter(n > 50) %>%
  mutate(myPagePath = str_trunc(pagePath, 30)) %>%
  ggplot(aes(myPagePath, resid, group = 1)) + 
  theme(axis.text.x = element_text(angle = 90)) +
  geom_ref_line(h = 0) + 
  geom_line()

Wie sieht die Reihenfolge hier aus?

tada %>%
  select(resid,pagePath) %>%
  filter(resid < 0) %>%
  arrange(resid)
##           resid
## 1  -1.496684215
## 2  -1.132709755
## 3  -0.874465766
## 4  -0.874465766
## 5  -0.874465766
## 6  -0.856625515
## 7  -0.792430598
## 8  -0.654500672
## 9  -0.568943443
## 10 -0.536966975
## 11 -0.510491306
## 12 -0.510491306
## 13 -0.510491306
## 14 -0.510491306
## 15 -0.510491306
## 16 -0.474364314
## 17 -0.460708896
## 18 -0.439562575
## 19 -0.439562575
## 20 -0.431357121
## 21 -0.417409528
## 22 -0.371757179
## 23 -0.348708244
## 24 -0.342424120
## 25 -0.332506851
## 26 -0.331807872
## 27 -0.329402737
## 28 -0.327143195
## 29 -0.251220763
## 30 -0.244870891
## 31 -0.234407066
## 32 -0.234407066
## 33 -0.234407066
## 34 -0.200488427
## 35 -0.181318585
## 36 -0.177837790
## 37 -0.176171756
## 38 -0.172992515
## 39 -0.160656594
## 40 -0.158035323
## 41 -0.145490292
## 42 -0.138801383
## 43 -0.121987687
## 44 -0.110389854
## 45 -0.094884884
## 46 -0.080883411
## 47 -0.074561560
## 48 -0.034097466
## 49 -0.034097466
## 50 -0.034097466
## 51 -0.034097466
## 52 -0.034097466
## 53 -0.031255669
## 54 -0.025622970
## 55 -0.009327655
##                                                                                                              pagePath
## 1                                                /lehrveranstaltungen/data-science-analytics/data-science-ressourcen/
## 2                                                                                                        /translate_c
## 3                                                                            /actionable-seo-reporting-mit-r-und-aws/
## 4                /mv-digital-warum-digitale-transformation-und-100-jahre-traditionsunternehmen-kein-widerspruch-sind/
## 5                                                                                  /veroeffentlichungen/das-seo-buch/
## 6                                          /wird-mein-content-gelesen-sichtbarkeit-von-elementen-anstatt-scrolltiefe/
## 7                                                                                                       /archiv/pc69/
## 8                                                            /lehrveranstaltungen/hinweise-zu-referaten-hausarbeiten/
## 9                                                                                      /asus-eeepc-erste-erfahrungen/
## 10                                                                         /wie-suchmaschinen-data-science-verwenden/
## 11                                                                     /ein-eigener-sichtbarkeitsindex-mit-r-und-aws/
## 12                                                                        /georg-schramm-lassen-sie-es-mich-so-sagen/
## 13                                      /logging-von-google-analytics-via-google-chrome-fuer-sendbeacon-beforeunload/
## 14                                                                              /screenshot-mit-dem-kindle-erstellen/
## 15                                    /weder-schwarz-noch-weiss-oder-was-die-zauberfloete-heute-noch-zu-sagen-vermag/
## 16                                     /google-optimize-hacken-von-bayes-p-werten-a-a-tests-und-vergessenen-metriken/
## 17                                                                /5-gruende-warum-du-google-trends-falsch-verstehst/
## 18                                                                  /datengetriebene-personas-mit-assoziationsregeln/
## 19                                                                                 /nachtrag-zum-vortrag-auf-der-smx/
## 20                                                /wird-mein-content-gelesen-scroll-tiefe-pro-artikel-als-conversion/
## 21                                                             /erfahrungen-mit-tado-gute-idee-schlechte-ausfuehrung/
## 22                                                             /wie-aus-b4p-und-statista-alternative-fakten-enstehen/
## 23                                                                                    /data-science-meets-seo-teil-2/
## 24                  /vorwerk-thermomix-cook-key-cookidoo-von-unserioesen-beratern-und-weiteren-seltsamen-erfahrungen/
## 25               /lehrveranstaltungen/digital-analytics/analyse/daten-analyse-mit-r/erste-schritte-mit-r-und-rstudio/
## 26                                                                                 /erfahrungen-mit-scalable-capital/
## 27                            /lehrveranstaltungen/digital-analytics/analyse/statistik-i/mittelwert-median-und-modus/
## 28                                                                                  /scalable-capital-und-der-brexit/
## 29                                             /benutzerdefinierte-vorlage-installieren-mac-office-version-15-und-16/
## 30               /warum-neue-und-wiederkehrende-besucher-in-google-analytics-manchmal-mit-vorsicht-zu-geniessen-sind/
## 31                                                                                    /data-science-meets-seo-teil-3/
## 32                                                                        /mehr-als-einen-kern-unter-mac-os-x-nutzen/
## 33                                                                      /r-via-serviceuser-mit-google-apis-verbinden/
## 34                                    /warum-die-durchschnittliche-sitzungsdauer-in-analytics-kompletter-quatsch-ist/
## 35                                                                                    /data-science-meets-seo-teil-5/
## 36 /lehrveranstaltungen/digital-analytics/analyse/grundlagen-der-analyse-in-der-gui-von-google-analytics/akquisition/
## 37                                             /lehrveranstaltungen/digital-analytics/das-business-problem-verstehen/
## 38                     /lehrveranstaltungen/digital-analytics/die-datenakquise/tracking/erweiterte-tracking-ansaetze/
## 39                                                                            /clustering-mit-google-analytics-und-r/
## 40                                                                                              /lehrveranstaltungen/
## 41                                       /lehrveranstaltungen/digital-analytics/das-testen/erstellen-einer-hypothese/
## 42                          /lehrveranstaltungen/digital-analytics/das-business-problem-verstehen/von-zielen-zu-kpis/
## 43                                                           /lehrveranstaltungen/digital-analytics/die-datenakquise/
## 44                                                     /chaos-auf-dem-schreibtisch-wie-man-den-papierkram-bewaeltigt/
## 45                                                            /neue-versus-wiederkehrende-benutzer-ein-nutzloser-kpi/
## 46                                                                 /google-wifi-netzwerk-sonos-fritzbox-synology-nas/
## 47             /lehrveranstaltungen/digital-analytics/das-business-problem-verstehen/von-daten-zur-handlungsrelevanz/
## 48                           /lehrveranstaltungen/data-science-analytics/data-acquisition/google-analytics-and-piwik/
## 49                                                                               /seo-monitoring-mit-r-aws-und-shiny/
## 50                                                                  /shiftphone-das-faire-smartphone-aus-deutschland/
## 51                                                                   /sistrix-traffic-google-adwords-keyword-planner/
## 52                                                                                                    /the-nomi-song/
## 53                                                                                                /archiv/fotografie/
## 54                                    /10-basics-zur-nutzung-von-google-analytics-oder-jedes-andere-web-analyse-tool/
## 55                           /lehrveranstaltungen/digital-analytics/die-datenakquise/tracking/implementierung-testen/

Fazit

Wir haben uns drei verschiedene Methoden angesehen, um Seiten zu identifizieren, die häufiger als andere nicht zuende gelesen werden:

Die Ergebnisse unterscheiden sich, indem sie die Anzahl der Impressions und der Conversions unterschiedlich stark gewichten.