8 votos

¿Cómo probar la diferencia en dos proporciones cuando los resultados no son binarios?

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))

5voto

John Puntos 1

La primera parte parece razonable.
En cuanto a la segunda parte, creo que estas proporciones no pueden manejarse como proporciones porque no están relacionadas con eventos binarios, lo que implica que no tenemos idea de cómo se distribuyen estas proporciones, lo que excluye la prueba z (bueno a menos que tengas una distribución normal empírica afortunada, pero mencionaste que no la tienes).

Primera Proposición: Prueba de Wilcoxon.
Mi sugerencia sería simplemente comparar estas proporciones mediante una prueba de wilcoxon.

>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)

Pensándolo bien, esta prueba trata "1 dólar comprado por 5 dólares" como seleccionado lo mismo que "100 dólares comprados por 500 dólares seleccionados". Entiendo por qué quieres evitarlo y favorecer tu proporción general.

Segunda Proposición: Prueba de Permutación.

Para mantener tu medida, entonces sugiero crear "tu propia prueba" con una prueba de permutación. Bajo la hipótesis nula de que estar en el grupo de control o tratamiento no marca ninguna diferencia. Entonces, la idea es volver a etiquetar aleatoriamente qué sujetos están en el grupo de control o tratamiento y contar cuántas veces una permutación aleatoria otorga una brecha igual o mejor entre el grupo de control y tratamiento que la que midiste inicialmente. Esta brecha se mide por la diferencia de tu proporción entre los dos grupos. Si divides este número de éxitos entre el número de intentos, obtienes un valor p.

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"])
tuBrecha<-abs(p1-p2)
L<-sales_data["target_control"]==1
LfilterOnlyBuyers<-sales_data["sale_success"]==1

count=0
for ( i in 1:10000) {
  Lperm=sample(L)
  p1_perm <- sum(sales_data[Lperm,"final_value"])/sum(sales_data[Lperm & LfilterOnlyBuyers,"initial_value"])
  p2_perm <- sum(sales_data[!Lperm,"final_value"])/sum(sales_data[!Lperm & LfilterOnlyBuyers,"initial_value"])
  if (abs(p1_perm-p2_perm)>=tuBrecha) {
    count=count+1
  }
}
pvalue=count/10000

Utiliza valores absolutos al calcular tu brecha si deseas realizar una prueba de dos colas.

En esta prueba de permutación, al igual que en el wilcoxon que sugerí, filtré a los no compradores. La idea detrás de esto es que no quieres que la primera hipótesis que probaste influya aquí. Puede que prefieras separar ambas suposiciones 1)compran menos/más a menudo 2)cuando compran está más cerca/lejos de la cantidad inicial seleccionada.

0 votos

Gracias por su respuesta. Si entiendo correctamente, este enfoque separa a aquellos clientes que finalizaron la venta y pregunta si hubo algún cambio en el comportamiento de estos clientes. Esta es una forma útil de analizar el problema, y algo que no había considerado adecuadamente. Aún sería interesante saber, ¿hay alguna forma de probar la diferencia en la conversión total de dólares? Es decir, la suma de las ventas finales sobre la suma de los valores iniciales.

0 votos

Gracias por tu comentario. Eché otro vistazo a tu pregunta y edité mi respuesta con una nueva solución. También explico por qué seleccioné compradores, incluso si veo que lo has captado correctamente.

0 votos

Oh! ¡Muy interesante :) Hice algunos cambios y he añadido el código actualizado a la pregunta - 1. p1 y p2 también necesitan filtrar solo los compradores; 2. tu sintaxis para establecer L y LfilterOnlyBuyers no funcionó para mí; 3. filtrar para compradores necesita ocurrir después de la inversión de Lperm. Además, si entiendo correctamente, ¿puedo almacenar la distribución y usar los cuantiles de la distribución para crear un intervalo de confianza?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X