Power für A/B Tests

Methodenlehre
AdventskalendR
Autor:in

Gerrit Hirschfeld

Veröffentlichungsdatum

9. Dezember 2024

A/B Tests für conversion rate

A/B Tests gehören zu den Standardmethoden des online-Marketings. Dabei geht es darum, dass im mit Hilfe eines strengen Experiments zwei Webseitenvarianten miteinander vergleicht. Dabei wird sehr häufig die sog. Conversion Rate, also der Anteil derjenigen Webseitenbesucher, die etwas kaufen an der Anzahl der Gesamtbesucher als Ergebnismaß verwendet. Man vergleicht also zwei relative Häufigkeiten miteinander.

Power-Analysen

Wie bei anderen statistischen Tests auch, kann man sich vorab ausrechnen, wieviele Probanden man benötigt, um einen Effekt einer definierten Größe auch zu detektieren. In R erledigt das die Funktion ‘power.prop.test()’. Im folgenden Beispiel, habe ich mir einfach mal ausgeben lassen, wieviele Probanden man benötigt um einen Unterschied zwischen 5% und 10% conversion rate bei einem Alpha-Fehler-niveau von 5% und einer Power von 80% nachweisen zu können.

Obacht

Obacht, die erforderliche Stichprobenanzahl hängt dabei nicht nur von der Größe des Unterschiedes in der CR zwischen den beiden Gruppen ab, sondern auch von der Grund-CR. Derselbe Unterschied von 5% mehr CR erfordert also sehr unterschiedlich große Stichproben.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
p1 <- c(1, seq(5, 50, 5))/100
diff <- c(0.02, 0.03, 0.05, 0.05, 0.1)

scenarios <-expand.grid(p1, diff)

plotdat<-scenarios %>% 
  mutate(p1s = Var1, 
         p2s = Var1 + Var2,
         effect = factor(Var2)) %>%
  rowid_to_column() %>%
  group_by(rowid) %>%
  mutate(n= round(power.prop.test(p1 =p1s, p2 =p2s, sig.level=0.05, power = 0.8)$n) *2)

ggplot(plotdat, aes(x=p1s, y=n, col=effect)) +
  geom_point() +
  geom_line() +
  theme_bw() +
  ylab("Stichprobenumfang") + 
  xlab("Ausgangs Conversion-Rate")+
  ggtitle("Beziehung zwischen der Ausgangs Conversion Rate und dem Effekt")