On définit les taux de conversion actuels et cibles, puis on calcule la taille d’échantillon nécessaire par groupe.
# Paramètres
p_control <- 0.10 # Taux actuel
mde_relatif <- 0.20 # On veut être capable de détecter au moins +20% de hausse
p_variant <- p_control * (1 + mde_relatif) # 0.12
alpha <- 0.05 # Seuil de significativité (5%)
power <- 0.80 # Puissance statistique (80%)
# Calcul du nombre de visiteurs requis par groupe
res_taille <- power.prop.test(
p1 = p_control,
p2 = p_variant,
sig.level = alpha,
power = power,
alternative = "two.sided"
)
n <- ceiling(res_taille$n)
cat("Nombre de visiteurs nécessaires par groupe :", n, "\n")
## Nombre de visiteurs nécessaires par groupe : 3841
cat("Taille totale de l'échantillon :", n * 2, "\n")
## Taille totale de l'échantillon : 7682
Sans générer de lignes individuellement, on calcule directement le nombre de conversions théoriques attendues pour chaque groupe.
# Nombre de succès (conversions) attendus
succes_control <- round(n * p_control)
succes_variant <- round(n * p_variant)
# Affichage des totaux agrégés
cat("Conversions Control :", succes_control, "sur", n, "\n")
## Conversions Control : 384 sur 3841
cat("Conversions Variant :", succes_variant, "sur", n, "\n")
## Conversions Variant : 461 sur 3841
On passe directement les totaux agrégés à la fonction prop.test().
# Test z de comparaison de proportions sur les agrégats
test_res <- prop.test(
x = c(succes_control, succes_variant),
n = c(n, n),
correct = FALSE
)
# Résultat détaillé
print(test_res)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: c(succes_control, succes_variant) out of c(n, n)
## X-squared = 7.8838, df = 1, p-value = 0.004988
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.034033226 -0.006060499
## sample estimates:
## prop 1 prop 2
## 0.09997397 0.12002083
# Décision rapide
if (test_res$p.value < alpha) {
cat("✅ Résultat significatif (p-value =", round(test_res$p.value, 4), ")\n")
} else {
cat("❌ Résultat non significatif (p-value =", round(test_res$p.value, 4), ")\n")
}
## ✅ Résultat significatif (p-value = 0.005 )