Eine E-Commerce-Website testet zwei verschiedene Designs für eine Checkout-Seite. Kunden, die die Checkout-Seite besuchen, erhalten zufällig eines der beiden Designs.
Die erste Metrik von Interesse, die Umsatzsteigerung, kann gemessen werden, indem der Anteil der Kunden, die den Verkauf abgeschlossen haben (ein binäres Ergebnis), für jedes der beiden Designs verglichen wird.
Es ist ziemlich einfach, diese mit einem Test für zwei Anteile zu vergleichen.
Eine zweite Zinsmetrik ist die Dollarumrechnung. Dies ist der endgültige Dollarwert des Verkaufs als Anteil am anfänglichen Dollarwert des eingehenden Einkaufswagens.
Beispiel: Ein Kunde kommt zur Kasse mit Artikeln im Wert von 160 USD im Warenkorb (Anfangswert). Der Kunde nimmt einige Artikel aus dem Warenkorb und schließt den Verkauf für Artikel im Wert von 40 USD ab (Endwert). Die Umsatzumrechnung beträgt 100% (wir haben dem Kunden noch etwas verkauft ), aber die Dollarumrechnung beträgt nur 25%.
Wie kann ich den Unterschied in der Dollarumrechnung für die beiden Gruppen gegen eine Nullhypothese ohne Unterschied testen?
Im Folgenden finden Sie einen R-Code, der das Problem spezifiziert:
# example data
set.seed(1)
total_customers <- 1000
target_control <- rbinom(total_customers, 1, 0.5)
sale_success <- rbinom(total_customers, 1, 0.1)
initial_value <- rexp(total_customers, rate=0.1)
final_value <- runif(total_customers, 0, 1.1) * initial_value * sale_success
sales_data <- data.frame(target_control, sale_success, initial_value, final_value)
# sales conversion - test for two proportions (two-tailed)
n1 <- sum(target_control)
n2 <- sum(!target_control)
p1 <- sum(sales_data[target_control==1,"sale_success"])/n1
p2 <- sum(sales_data[target_control==0,"sale_success"])/n2
pbar <- (p1*n1+p2*n2)/(n1+n2)
z <- (p1-p2)/sqrt(pbar*(1-pbar)/n1+pbar*(1-pbar)/n2)
pval <- 2*(1-pnorm(abs(z)))
# dollar conversion - ??
p1 <- sum(sales_data[target_control==1,"final_value"])/sum(sales_data[target_control==1,"initial_value"])
p2 <- sum(sales_data[target_control==0,"final_value"])/sum(sales_data[target_control==0,"initial_value"])
Einige Dinge zu beachten:
- Anfangswert und Endwert sind korreliert
- Anfangs- und Endwert folgen beide einer Long-Tail-Verteilung, z. B. der negativen Exponentialverteilung
- Manchmal ist der Endwert größer als der Anfangswert, z. B. fügt der Kunde dem Warenkorb mehr hinzu, bevor er den Verkauf abschließt
- Verkaufserfolg und Anfangswert sind korreliert, aber ich habe dies im Beispielcode nicht angegeben
Update 1: Brumar hat vorgeschlagen, dass die Verhaltensänderung auf Kundenebene für diejenigen Kunden, die einen Verkauf abschließen, mit einem Wilcoxon-Rang-Summen-Test verglichen werden kann:
sales_data\$ratios=final_value/initial_value
ratios_A=sales_data\$ratios[sale_success==1 & target_control==0]
ratios_B=sales_data\$ratios[sale_success==1 & target_control==1]
wilcox.test(ratios_A,ratios_B)
Ich bin immer noch daran interessiert zu wissen, ob es eine Möglichkeit gibt, den Unterschied in der gesamten Dollarumrechnung zu vergleichen, dh die Summe der Endwerte über die Summe der Anfangswerte.
Update 2: Gelöst von Brumar.
# permutation test (two-tailed)
p1 <- sum(sales_data[target_control==1 & sale_success==1,"final_value"])/sum(sales_data[target_control==1 &
p2 <- sum(sales_data[target_control==0 & sale_success==1,"final_value"])/sum(sales_data[target_control==0 &
yourGap<-p1-p2
L<-sales_data[,"target_control"]==1
LfilterOnlyBuyers<-sales_data[,"sale_success"]==1
nulldist <- vector(mode="numeric", length=10000)
for ( i in 1:10000) {
Lperm <- sample(L)
LpermInv <- !Lperm & LfilterOnlyBuyers
Lperm <- Lperm & LfilterOnlyBuyers
p1_perm <- sum(sales_data[Lperm,"final_value"])/sum(sales_data[Lperm,"initial_value"])
p2_perm <- sum(sales_data[LpermInv,"final_value"])/sum(sales_data[LpermInv,"initial_value"] )
nulldist[i] = p1_perm-p2_perm
}
pvalue=sum(abs(nulldist) > yourGap)/10000
alpha=0.05
ci_upper <- yourGap + quantile(nulldist, (1-alpha/2))
ci_lower <- yourGap - quantile(nulldist, (1-alpha/2))