Un sitio web de comercio electrónico está probando dos diseños diferentes para una página de pago. Los clientes que visitan la página de pago son presentados aleatoriamente con uno de los dos diseños.
La primera métrica de interés, el aumento de las ventas, se puede medir comparando la proporción de clientes que finalizaron la venta (un resultado binario) para cada uno de los dos diseños.
Es razonablemente sencillo comparar estos usando una prueba para dos proporciones.
Una segunda métrica de interés es la conversión de dólares. Este es el valor en dólares final de la venta, como una proporción del valor en dólares inicial del carrito de compras entrante.
Por ejemplo: Un cliente llega a la página de pago con \$160 en artículos en el carrito (valor inicial). El cliente elimina algunos artículos del carrito y finaliza la venta por \$40 en artículos (valor final). La conversión de ventas es del 100% (todavía vendimos al cliente algo), pero la conversión en dólares es solo del 25%.
¿Cómo puedo probar adecuadamente la diferencia en la conversión de dólares para los dos grupos contra una hipótesis nula de ninguna diferencia?
Consulte a continuación un código R que especifica el problema:
# datos de ejemplo
set.seed(1)
total_clientes <- 1000
objetivo_control <- rbinom(total_clientes, 1, 0.5)
venta_exitosa <- rbinom(total_clientes, 1, 0.1)
valor_inicial <- rexp(total_clientes, tasa=0.1)
valor_final <- runif(total_clientes, 0, 1.1) * valor_inicial * venta_exitosa
datos_ventas <- data.frame(objetivo_control, venta_exitosa, valor_inicial, valor_final)
# conversión de ventas - prueba de dos proporciones (de dos colas)
n1 <- sum(objetivo_control)
n2 <- sum(!objetivo_control)
p1 <- sum(datos_ventas[objetivo_control==1,"venta_exitosa"])/n1
p2 <- sum(datos_ventas[objetivo_control==0,"venta_exitosa"])/n2
pbar <- (p1*n1+p2*n2)/(n1+n2)
z <- (p1-p2)/sqrt(pbar*(1-pbar)/n1+pbar*(1-pbar)/n2)
valor_p <- 2*(1-pnorm(abs(z)))
# conversión en dólares - ??
p1 <- sum(datos_ventas[objetivo_control==1,"valor_final"])/sum(datos_ventas[objetivo_control==1,"valor_inicial"])
p2 <- sum(datos_ventas[objetivo_control==0,"valor_final"])/sum(datos_ventas[objetivo_control==0,"valor_inicial"])
Algunas cosas a considerar:
- El valor inicial y final están correlacionados
- El valor inicial y final siguen una distribución de colas largas, como la distribución exponencial negativa
- A veces el valor final será mayor que el inicial, por ejemplo, el cliente agrega más al carrito antes de finalizar la venta
- La venta exitosa y el valor inicial están correlacionados, pero no lo he especificado en el código de ejemplo
Actualización 1: Brumar ha sugerido que el cambio en el comportamiento a nivel de cliente, para aquellos clientes que sí finalizan una venta, se puede comparar utilizando una prueba de suma de rangos de Wilcoxon:
datos_ventas\$ratio=valor_final/valor_inicial
ratios_A=datos_ventas\$ratios[venta_exitosa==1 & objetivo_control==0]
ratios_B=datos_ventas\$ratios[venta_exitosa==1 & objetivo_control==1]
wilcox.test(ratios_A,ratios_B)
Todavía me interesa saber si hay alguna manera de comparar la diferencia en la conversión de dólares en general, es decir, la suma de los valores finales sobre la suma de los valores iniciales?
Actualización 2: Resuelto por Brumar.
# prueba de permutación (de dos colas)
p1 <- sum(datos_ventas[objetivo_control==1 & venta_exitosa==1,"valor_final"])/sum(datos_ventas[objetivo_control==1 &
p2 <- sum(datos_ventas[objetivo_control==0 & venta_exitosa==1,"valor_final"])/sum(datos_ventas[objetivo_control==0 &
tuDiferencia<-p1-p2
L<-datos_ventas[,"objetivo_control"]==1
LfiltrarSoloCompradores<-datos_ventas[,"venta_exitosa"]==1
nulldist <- vector(mode="numeric", length=10000)
for ( i in 1:10000) {
Lperm <- sample(L)
LpermInv <- !Lperm & LfiltrarSoloCompradores
Lperm <- Lperm & LfiltrarSoloCompradores
p1_perm <- sum(datos_ventas[Lperm,"valor_final"])/sum(datos_ventas[Lperm,"valor_inicial"])
p2_perm <- sum(datos_ventas[LpermInv,"valor_final"])/sum(datos_ventas[LpermInv,"valor_inicial"] )
nulldist[i] = p1_perm-p2_perm
}
valor_p=sum(abs(nulldist) > tuDiferencia)/10000
alfa=0.05
ci_superior <- tuDiferencia + quantile(nulldist, (1-alfa/2))
ci_inferior <- tuDiferencia - quantile(nulldist, (1-alfa/2))