Ghostwriting-Service Dr. Rainer Hastedt

Fachtexte, White Papers, statistische Auswertungen

Erfolgsmessung im Marketing - Folge 26: Konversionsvergleiche für mehr als zwei Gruppen (multiple Mittelwertvergleiche)

Ich bin in Folge 25 für mein Zahlenbeispiel mit einem Permutations-F-Test zu dem Ergebnis gekommen, dass die durchschnittlichen Konversionsraten für mindestens zwei Varianten der Landing-Page signifikant verschieden sind.

Für die insgesamt vier Varianten der Landing-Page hatten sich die folgenden durchschnittlichen Konversionsraten ergeben (siehe Folge 24):

H1T1: 0,77
H1T2: 0,51
H2T1: 0,57
H2T2: 0,46

Ich will jetzt prüfen, welche der vier Mittelwerte sich signifikant unterscheiden. Hierzu muss ich die durchschnittlichen Konversionsraten der vier Varianten paarweise vergleichen, was auf unterschiedliche Weise geht.

Die meiner Ansicht nach sinnvollste Vorgehensweise besteht in einem konservativen Ansatz, bei dem die Anforderungen an ein signifikantes Ergebnis hoch sind, frei nach dem Motto: »Lieber ein signifikantes Ergebnis übersehen als voreilig auf Unterschiede schließen, wo keine sind.« Ein konservativer Ansatz zielt darauf ab, signifikante Ergebnisse gut abzusichern.

Ich beschäftige mich zunächst mit der Frage, warum Verfahren zum Vergleich zweier Mittelwerte für multiple Mittelwertvergleiche nur in modifizierter Form geeignet sind. Danach untersuche ich mein Zahlenbeispiel. Ich mache sechs Mittelwertvergleiche mit Hilfe von Permutationstests und korrigiere die p-Werte mit dem Holm-Verfahren.

Die Irrtumswahrscheinlichkeit bei multiplen Mittelwertvergleichen

Man kann Wahrscheinlichkeiten als relative Häufigkeiten interpretieren. Ich wiederhole zum Beispiel das Zufallsexperiment »Eine Münze werfen« sehr oft und berechne in Form eines Prozentsatzes, wie oft ich das Ergebnis »Zahl« erhalten habe. Bei einer symmetrischen Münze wird »Zahl« in ungefähr 50 Prozent aller Fälle auftreten.

Ich mache dies am Computer mit meiner Statistiksoftware R, zu der die Funktion runif() gehört, die gleichverteilte Zufallszahlen zwischen 0 und 1 liefert. Hierbei deute ich Zufallszahlen < 0,5 als »Zahl« und Zufallszahlen ≥ 0,5 als »Kopf«. Ich wiederhole den Münzwurf nsim Mal und berechne, welchen Anteil das Ergebnis »Zahl« hat.

muenzwurf <- function(nsim) {
zahl <- 0
for (i in 1:nsim) {
 if (runif(1)<0.5) zahl <- zahl+1
 }
zahl/nsim
}

Ich zeichne jetzt die relative Häufigkeit von »Zahl« in Abhängigkeit von der Anzahl der Münzwürfe nsim. Hierzu variiere ich nsim in 500er-Schritten von 500 bis 50.000.

wuerfe <- seq(500,50000,by=500)
anteil_zahl <- sapply(wuerfe, muenzwurf)
ergebnisse <- data.frame(x=wuerfe, y=anteil_zahl)
library(ggplot2)
svg("emim-26-1.svg", width=4.3, height=3.1, bg="transparent")
ggplot(data=ergebnisse, aes(x=x,y=y)) +
geom_hline(yintercept=0.5, colour="#00DD00") +
geom_line() +
labs(x="nsim",y='Anteil "Zahl"', title="Genauigkeit der Schätzung\nin Abhängigkeit von nsim") +
theme_bw() +
theme(plot.title=element_text(size=rel(1)), axis.text=element_text(size=rel(0.7)), axis.title=element_text(size=rel(0.9)), plot.background=element_rect(colour=NA, fill="transparent"))
dev.off()

Simulation: Genauigkeit der Schätzung

Der Schätzwert für die Wahrscheinlichkeit von »Zahl« liegt ab nsim=15.000 ziemlich dicht beim korrekten Wert (0,5). Würde ich nsim wesentlich höher ansetzen, zum Beispiel nsim = 200.000 bis 250.000, so wäre meine Schätzung deutlich genauer als in der rechten Hälfte des obigen Diagramms.

Das anhand des Münzwurfs beschriebene Simulationsverfahren ist universell anwendbar. Sie können auf diese Weise auch Wahrscheinlichkeiten schätzen, die sich nicht oder nur sehr schwer berechnen lassen.

Ich verwende das Verfahren jetzt für die hier interessierenden Mittelwertvergleiche.

Als erstes beschäftige ich mich mit dem Vergleich zweier Mittelwerte. Ich bilde hierfür zwei normalverteilte Zufallsvariablen mit gleichem Mittelwert und gleicher Varianz. Für diese Zufallsvariablen erzeuge ich 100.000 Mal jeweils 140 Beobachtungswerte und teste meine Nullhypothese H0 (»Beide Mittelwerte stimmen in der Grundgesamtheit überein«). Weil H0 richtig ist, müsste mein Signifikanzniveau (p-Wert) bei jedem der insgesamt 100.000 Tests größer als 0,5 sein.

nsim <- 100000
fehler <- 0
for (i in 1:nsim) {
 NW.1 <- rnorm(140,mean=0.6,sd=0.4)
 NW.2 <- rnorm(140,mean=0.6,sd=0.4)
 if (t.test(NW.1,NW.2)$p.value <= 0.05)
 fehler <- fehler+1
}
fehler/nsim # 0.04909

Wenn ich meine Simulation wiederhole, erhalte ich im Allgemeinen ein etwas anderes Ergebnis als vorher. Alle relativen Häufigkeiten liegen jedoch beim korrekten Wert (0,05).

Mein Signifikanztest führt demnach in ungefähr fünf Prozent der Fälle zu einer Fehleinschätzung (p-Wert ≤ 0,05 und daher H0 als falsch eingestuft).

Ich verwende das Verfahren jetzt für den Vergleich von vier Mittelwerten. Hierzu bilde ich vier normalverteilte Zufallsvariablen mit jeweils 0,6 als Mittelwert und 0,4 als Varianz. Die Nullhypothese H0 »Beide Mittelwerte stimmen in der Grundgesamtheit überein« ist daher für jeden paarweisen Vergleich richtig.

Ich erzeuge jeweils 140 Werte der vier Zufallsvariablen, mache dann alle sechs möglichen paarweisen Mittelwertvergleiche und prüfe, ob mindestens einer dieser Mittelwertvergleiche ein falsches Ergebnis geliefert hat. Finde ich mindestens ein falsches Ergebnis, so erhöhe ich den Wert der Variablen »fehler« um eins. Ich wiederhole diese Vorgehensweise 100.000 Mal und bestimme zum Abschluss den Anteil der fehlerhaften Durchgänge.

nsim <- 100000
fehler <- 0
for (i in 1:nsim) {
 NW.1 <- rnorm(140,mean=0.6,sd=0.4)
 NW.2 <- rnorm(140,mean=0.6,sd=0.4)
 NW.3 <- rnorm(140,mean=0.6,sd=0.4)
 NW.4 <- rnorm(140,mean=0.6,sd=0.4)
 if (
  t.test(NW.1,NW.2)$p.value <= 0.05 |
  t.test(NW.1,NW.3)$p.value <= 0.05 |
  t.test(NW.1,NW.4)$p.value <= 0.05 |
  t.test(NW.2,NW.3)$p.value <= 0.05 |
  t.test(NW.2,NW.4)$p.value <= 0.05 |
  t.test(NW.3,NW.4)$p.value <= 0.05
 )
 fehler <- fehler+1
}
fehler/nsim # 0.20071

Die auf diese Weise ermittelte Wahrscheinlichkeit für einen fehlerhaften Test (mindestens einer der sechs p-Werte kleiner oder gleich 0,05) liegt bei 0,20 bis 0,21 und damit etwa viermal so hoch wie meine Irrtumswahrscheinlichkeit bei den einzelnen t-Tests.

Es wäre demnach ungünstig, ein Verfahren für den Vergleich zweier Mittelwerte in unveränderter Form für den Vergleich von vier Mittelwerten zu verwenden. Die Gefahr, Mittelwertdifferenzen zu diagnostizieren wo keine sind wäre viel zu groß.

p-Wert-Korrektur nach Bonferroni und Holm

Ich beschäftige mich jetzt mit meinem Zahlenbeispiel. Hierzu lese ich meine als Excel-Tabelle vorliegenden Daten und erstelle die Spalte für die Gruppeneinteilung (»Variante«).

library(readxl)
daten <- read_excel("0025.xlsx")
library(dplyr)
daten2 <- mutate(daten, Variante=paste(Headline, Beschreibung, sep=""))

Die ersten fünf Zeilen ohne die Kennzahl-Spalte:

Headline Beschreibung Konversion Variante
H1 T1 0 H1T1
H2 T1 1 H2T1
H1 T1 1 H1T1
H2 T1 1 H2T1
H1 T1 0 H1T1

Ich ermittle für jede Variante die zugehörigen Werte aus der Spalte Konversion:

H1T1 <- filter(daten2, Variante=="H1T1")$Konversion
H1T2 <- filter(daten2, Variante=="H1T2")$Konversion
H2T1 <- filter(daten2, Variante=="H2T1")$Konversion
H2T2 <- filter(daten2, Variante=="H2T2")$Konversion

Ich vergleiche jetzt die Mittelwerte der vier Gruppen, was auf sechs Permutationstests hinausläuft (Einzelheiten dazu finden Sie in Folge 21 und Folge 22):

library(DAAG)
pwerte <- c(
 twotPermutation(H1T1, H1T2, nsim=20000),
 twotPermutation(H1T1, H2T1, nsim=20000),
 twotPermutation(H1T1, H2T2, nsim=20000),
 twotPermutation(H1T2, H2T1, nsim=20000),
 twotPermutation(H1T2, H2T2, nsim=20000),
 twotPermutation(H2T1, H2T2, nsim=20000)
)

Die Ergebnisse:

vergleich pwerte
H1T1/H1T2 0,049
H1T1/H2T1 0,125
H1T1/H2T2 0,014
H1T2/H2T1 0,806
H1T2/H2T2 0,814
H2T1/H2T2 0,470

Nach meinen Ausführungen im letzten Abschnitt sind die in der Tabelle angegebenen p-Werte für meine Zwecke als Entscheidungskriterium unbrauchbar. Ich muss die p-Werte daher korrigieren.

Die einfachste Möglichkeit besteht im Bonferroni-Verfahren, bei dem ich die p-Werte mit der Anzahl der paarweisen Vergleiche multipliziere. Für mein Zahlenbeispiel muss ich daher jeden p-Wert mit sechs multiplizieren und jedes den Wert eins überschreitende Ergebnis gleich eins setzen (Wahrscheinlichkeiten sind maximal gleich eins).

Mit dem Bonferroni-Verfahren stellen Sie sicher, dass die Wahrscheinlichkeit, bei den sechs paarweisen Vergleichen eine richtige Nullhypothese H0 abzulehnen nicht größer ist als die vorgegebene Irrtumswahrscheinlichkeit (0,05).

Das Holm-Verfahren ist eine Verbesserung des Bonferroni-Verfahrens. Beim Holm-Verfahren wird wie folgt gerechnet:

  • kleinster p-Wert mal Anzahl der paarweisen Vergleiche (0,014*6)
  • zweitkleinster p-Wert mal Anzahl der paarweisen Vergleiche - 1 (0,049*5)
  • drittkleinster p-Wert mal Anzahl der paarweisen Vergleiche - 2 (0,125*4)

Ich erhalte die modifizierten p-Werte mit der Funktion p.adjust():

p.adjust(pwerte,"bonferroni")
p.adjust(pwerte, "holm")

Die Ergebnisse:

vergleich pwerte bonferroni holm
H1T1/H1T2 0,049 0,296 0,247
H1T1/H2T1 0,125 0,750 0,500
H1T1/H2T2 0,014 0,084 0,084
H1T2/H2T1 0,806 1,000 1,000
H1T2/H2T2 0,814 1,000 1,000
H2T1/H2T2 0,470 1,000 1,000

Alle mit dem Holm-Verfahren korrigierten p-Werte sind größer als 0,05. Signifikante Unterschiede zwischen den vier Gruppenmittelwerten (den vier durchschnittlichen Konversionsraten) sind demnach nicht erkennbar.

Nach meinem Permutations-F-Test aus Folge 25 unterscheiden sich mindestens zwei der insgesamt vier Mittelwerte signifikant. Meine paarweisen Mittelwertvergleiche widerlegen diese Einschätzung nicht. Das Holm-Verfahren, eine konservative Vorgehensweise, läuft darauf hinaus, signifikante Mittelwertdifferenzen im Zweifelsfall zu verneinen.

Ein möglicher Ausweg besteht darin, die Fragestellung auf andere Weise zu untersuchen.