🌟 Ejercicio 1: Test de Proporciones - ¿Cupón 20% OFF o Envío Gratis?

Contexto: Ripley quiere mejorar las conversiones en su campaña de email marketing. Tienes estos datos de Google Analytics almacenados en el archivo datos_email.csv :

Variable Tipo de Dato Descripción Ejemplo de Valor
user_id Character Identificador único del usuario (anonimizado). “USER_45782”
grupo Factor Grupo asignado aleatoriamente (A: 20% OFF, B: Envío gratis). “A” o “B”
conversion Integer Binaria: 1 si el usuario compró, 0 si no. 0 o 1

Carga de bases de datos:

datos_email=read.csv("datos_email.csv")

head(datos_email)
##   user_id grupo conversion
## 1       1     A          1
## 2       2     A          0
## 3       3     A          0
## 4       4     B          0
## 5       5     A          0
## 6       6     B          0
  • Objetivo: Queremos probar si el envío gratis (B) es realmente mejor que el descuento del 20% (A) para generar conversiones.

  • En términos de negocio:

    • “¿Vale la pena cambiar toda la campaña a envío gratis, o nos quedamos con el descuento?”

📊 Análisis Descriptivo

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(datos_email, aes(x = grupo, fill = factor(conversion))) +
  geom_bar(position = "fill") +
  scale_fill_manual(values = c("#FF9AA2", "#FFB7B2"), 
                    labels = c("No convirtió", "Convirtió")) +
  labs(title = "¿Qué cupón genera más conversiones?",
       y = "Porcentaje de conversión")

🔍 Test de Hipótesis

Hipótesis Nula (H₀):
“La tasa de conversión del grupo B (envío gratis) es igual o menor que la del grupo A (20% OFF).”

H0:pB≤pA​

Hipótesis Alternativa (H₁):
“La tasa de conversión del grupo B (envío gratis) es mayor que la del grupo A (20% OFF).”

H1:pB>pA​

prop.test(
  x = c(sum(datos_email$conversion[datos_email$grupo == "B"]), 
       sum(datos_email$conversion[datos_email$grupo == "A"])),
  n = c(sum(datos_email$grupo == "B"), sum(datos_email$grupo == "A")),
  alternative = "greater"
)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(sum(datos_email$conversion[datos_email$grupo == "B"]), sum(datos_email$conversion[datos_email$grupo == "A"])) out of c(sum(datos_email$grupo == "B"), sum(datos_email$grupo == "A"))
## X-squared = 31.193, df = 1, p-value = 1.168e-08
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.01894271 1.00000000
## sample estimates:
##    prop 1    prop 2 
## 0.1468517 0.1199046

Resultados Clave

Métrica Grupo A (20% OFF) Grupo B (Envío Gratis)
Tasa de Conversión 11.99% 14.69%
Diferencia Observada +2.7% (B - A)
p-value 1.168e-08 (≈ 0.00000001168) ¡Significativo!
IC 95% (Diferencia) [1.89%, 100%]

💡 Conclusiones Potentes

  • El envío gratis (B) aumenta significativamente las conversiones (p < 0.05)..

  • Recomendación: Usar el envío gratis como gancho principal.

  • Escenario Ripley:

    • Si envían 1 millón de emails:

      • Conversiones esperadas con A (20% OFF): 119,904.

      • Conversiones esperadas con B (Envío Gratis): 146,852.

      • Ganancia neta: +26,948 conversiones (¡Solo con cambiar el texto!).

  • ROI Estimado:

    • Si cada conversión vale S/100 en ganancias:

      • Beneficio adicional: S/2.7 millones (por cada millón de emails).

Recomendaciones para el Equipo de Marketing

  1. Implementar el envío gratis en la próxima campaña (evidencia estadística sólida).

  2. Monitorear el ticket promedio: Asegurarse de que el mayor volumen no reduzca el margen.

  3. Testear combinaciones: Ejemplo: “¿Envío gratis + 10% OFF funciona mejor?” (nuevo test A/B/C).

🛒 Ejercicio 2: Test t - ¿Dónde colocar el botón “Comprar”?

Contexto: Oechsle probó dos diseños para su página de producto.

Origen: Datos de Google Analytics y Heatmaps.

Objetivo: Comparar el tiempo de sesión en dos diseños de botón “Comprar” en la página de producto de Oechsle.

🔍 Estructura de la Base de Datos

Variable Tipo de Dato Descripción Ejemplo de Valor
diseño Factor Grupo A/B: A (abajo) = Botón al final de la página, B (flotante) = Botón visible siempre. “A (abajo)”
segundos Numeric Tiempo en segundos que el usuario permaneció en la página antes de comprar o salir. 105.3 segundos

##Carga de la base de datos
tiempo_en_pagina=read.csv("tiempo_en_pagina.csv")
head(tiempo_en_pagina)
##      diseño  segundos
## 1 A (abajo)  63.12957
## 2 A (abajo) 102.43551
## 3 A (abajo) 106.01749
## 4 A (abajo)  62.22215
## 5 A (abajo)  75.71286
## 6 A (abajo)  83.51878
shapiro.test(tiempo_en_pagina$segundos[tiempo_en_pagina$diseño == "A (abajo)"])
## 
##  Shapiro-Wilk normality test
## 
## data:  tiempo_en_pagina$segundos[tiempo_en_pagina$diseño == "A (abajo)"]
## W = 0.99714, p-value = 0.5384
shapiro.test(tiempo_en_pagina$segundos[tiempo_en_pagina$diseño == "B (flotante)"])
## 
##  Shapiro-Wilk normality test
## 
## data:  tiempo_en_pagina$segundos[tiempo_en_pagina$diseño == "B (flotante)"]
## W = 0.99848, p-value = 0.9473

📈 Análisis Exploratorio

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
tiempo_en_pagina %>%
  group_by(diseño) %>%
  summarise(
    n_usuarios = n(),
    tiempo_promedio = mean(segundos),
    desviacion = sd(segundos),
    mediana = median(segundos)
  )
## # A tibble: 2 × 5
##   diseño       n_usuarios tiempo_promedio desviacion mediana
##   <chr>             <int>           <dbl>      <dbl>   <dbl>
## 1 A (abajo)           500            92.0       19.4    91.7
## 2 B (flotante)        500           110.        24.7   110.

Diferencia observada: +18.41 segundos (B vs A, +20% de aumento).

📊 Análisis Visual

library(ggridges)
## Warning: package 'ggridges' was built under R version 4.4.3
ggplot(tiempo_en_pagina, aes(x = segundos, y = diseño, fill = diseño)) +
  geom_density_ridges() +
  scale_fill_manual(values = c("#A0E7E5", "#B5EAD7")) +
  labs(title = "Distribución del Tiempo en Página",
       x = "Segundos", y = "")
## Picking joint bandwidth of 5.73

Validez del Test:

  • “¿Por qué usamos un test t en lugar de un Mann-Whitney aquí?” → Porque los datos siguen una distribución normal (ver histogramas).

🔍 Test Estadístico

Hipótesis Nula (H₀):
“El tiempo promedio en página no aumenta con el botón flotante (B) comparado con el botón tradicional (A).”

H0:μB≤μA​

Hipótesis Alternativa (H₁):
“El tiempo promedio en página es mayor con el botón flotante (B) que con el botón tradicional (A).”

H1:μB>μA​

  • Objetivo del Test: Determinar si el botón flotante (siempre visible) retiene más tiempo a los usuarios que el botón al final de la página.

  • En términos de negocio:

    • “¿Vale la pena invertir en rediseñar la interfaz para implementar el botón flotante?”
t.test(segundos ~ diseño, data = tiempo_en_pagina, alternative = "less")
## 
##  Welch Two Sample t-test
## 
## data:  segundos by diseño
## t = -13.088, df = 945.2, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group A (abajo) and group B (flotante) is less than 0
## 95 percent confidence interval:
##     -Inf -16.092
## sample estimates:
##    mean in group A (abajo) mean in group B (flotante) 
##                   91.96299                  110.37072

📌 Resultados Clave

Métrica Valor Interpretación
Diferencia de Medias 110.37 - 91.96 = 18.41s El botón flotante (B) retuvo 18.41 segundos más en promedio por sesión.
Estadístico t -13.088 Valor extremo (fuera de la zona de aceptación de H₀).
p-value < 2.2e-16 (≈ 0) Evidencia abrumadora contra H₀ (la diferencia es estadísticamente significativa).
IC 95% (unilateral) [-Inf, -16.092] Con 95% de confianza, la diferencia real es al menos 16.092 segundos a favor de B.
  • Proyección para Oechsle:

    • Si el sitio recibe 500,000 visitas/mes, el botón flotante podría generar:

      • +9,205 horas adicionales de engagement (18.41s × 500,000).

      • +6,000 conversiones adicionales (asumiendo el 1.2% de mejora).

🎯 Ejercicio 3: Mann-Whitney - Descuento % vs Monto Fijo

Contexto: Saga Falabella quiere saber qué tipo de descuento genera mayor valor de compra:

Objetivo: Comparar el valor de compra promedio entre dos tipos de promociones:

  • A (% descuento): Ej. “30% OFF en toda la tienda”.

  • B (S/ fijos): Ej. “S/ 50 de descuento en compras mayores a S/ 200”.

Variable Tipo de Dato Descripción Ejemplo de Valor
promocion Factor Tipo de promoción asignada aleatoriamente: “% descuento” o “S/ fijos”. “% descuento”
valor_compra Numeric Monto total gastado por el cliente (en S/). Distribución no normal. 185.50

#Carga de datos
ventas=read.csv("ventas.csv")
head(ventas)
##     promocion valor_compra
## 1 % descuento    110.52770
## 2 % descuento     65.51758
## 3 % descuento     52.73959
## 4 % descuento     39.74649
## 5 % descuento    118.97741
## 6 % descuento     26.16210

📊 Análisis Exploratorio

library(dplyr)
ventas %>%
  group_by(promocion) %>%
  summarise(
    n_transacciones = n(),
    valor_promedio = mean(valor_compra),
    mediana = median(valor_compra),
    desviacion = sd(valor_compra)
  )
## # A tibble: 2 × 5
##   promocion   n_transacciones valor_promedio mediana desviacion
##   <chr>                 <int>          <dbl>   <dbl>      <dbl>
## 1 % descuento             300           102.    83.5       72.0
## 2 S/ fijos                300           177.   160.        96.4

📊 Visualización

library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.4.3
ggboxplot(ventas, x = "promocion", y = "valor_compra",
          color = "promocion", palette = c("#FFD700", "#C9E4CA")) +
  labs(title = "¿Qué promo genera mayor ticket?")

🔍 Test No Paramétrico

Hipótesis Estadísticas

Hipótesis Nula (H₀):
“El valor mediano de compra con descuentos en S/ fijos (B) es menor o igual al de descuentos en % (A).”

H0:MedianaB≤MedianaA​

(Usamos la mediana por la distribución no normal de los datos).

Hipótesis Alternativa (H₁):
“El valor mediano de compra con descuentos en S/ fijos (B) es mayor que con descuentos en % (A).”

H1:MedianaB>MedianaA​

wilcox.test(
  valor_compra ~ promocion,
  data = ventas,
  alternative = "greater",  # Queremos probar si B > A
  conf.int = TRUE           # Para calcular el IC de la diferencia
)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  valor_compra by promocion
## W = 22895, p-value = 1
## alternative hypothesis: true location shift is greater than 0
## 95 percent confidence interval:
##  -80.34775       Inf
## sample estimates:
## difference in location 
##              -69.73388

💡 Hallazgos Brutales

  • p-value = 1: No hay evidencia para rechazar H₀.

    • Traducción: Los datos no apoyan que los descuentos en S/ fijos generen mayores ventas que los descuentos en %.
  • Diferencia estimada: -69.73 (negativa).

    • Indica que, en realidad, el grupo A (% descuento) tuvo valores de compra mayores que el grupo B (contrario a lo esperado).
  • IC 95%: [-80.35, Inf].

    • El intervalo incluye valores negativos, lo que refuerza que B no es mejor que A.