Il paraît que tout mathématicien apprécie un bon paradoxe. Et il semblerait aussi qu’il n’y ait pas de bon blog de maths sans paradoxe, comme nous le prouvent par exemple Freakonometrics, Science étonnante ou encore la chaîne youtube Science4All ! Donc aujourd’hui on inaugure la section paradoxe de ce blog avec un petit problème dû à Alexander (1989).
Imaginez une tombola où il y a n = 3 prix distribués. Une même personne ne pourra recevoir qu’un seul prix, mais il n’y a pas de limite dans le nombre de tickets que chacun peut acheter pour maximiser ses chances de remporter un lot. Le tirage se déroule comme suit : on met tous les tickets dans l’urne et on tire le gagnant du premier lot. Si la personne tirée possédait plusieurs tickets, on les retire tous de l’urne, et on recommence jusqu’à ce que les trois prix aient été attribués.
Obtenir un de ces prix vous tient très à cœur et vous achetez 225 000 tickets de loterie ! Votre éternel rival (noté R) lui aussi veut un de ces lots à tout prix et achète également 225 000 tickets. 50 000 autres personnes ont joué à la loterie, mais elles n’ont acheté qu’un seul ticket chacune.
Vous manquez malheureusement le tirage mais vous croisez votre rival qui en sort, tout dépité. Logiquement, vous devriez vous réjouir, non ? Le fait qu’il n’ait pas gagné malgré ses 225 000 tickets devrait vous donner mécaniquement plus de chances. En termes plus mathématiques, on devrait donc avoir :
\(\Pr(vous~perdez~|~R~a~perdu) \leq \Pr(vous~perdez) \)
On peut très simplement faire des simulations de cette loterie en R (et avec l’aide du package foreach, que j’apprécie beaucoup). On va faire 100000 simulations parce que la différence entre les deux probabilités n’est pas très élevée :
library(foreach)
N <- 500000
multiTickets <- 225000
id_self <- 1
id_rival <- 2
pop <- c(rep(1,multiTickets),rep(2,multiTickets),3:(N-2*multiTickets))
n <- 3
nSim <- 100000
successive_sample <- function(pop, n) {
sample_set <- rep(0,n)
popTemp <- pop
k <- 1 ## temp size of sample
cont <- TRUE
while(cont) {
drawn_unit <- sample(popTemp,1)
sample_set[k] <- drawn_unit
k <- k+1
popTemp <- popTemp[popTemp != drawn_unit]
if( k > n ) {
cont <- FALSE
}
}
return(sample_set)
}
sim_lottery <- foreach(k = 1:nSim, .combine=rbind) %do% {
successive_sample(pop, n)
}
p_lost <- sum(as.numeric(
apply(sim_lottery,1, function(x) { return(!(id_self %in% x)) } )
)) / nSim
sim_rival_lost <- sim_lottery[apply(sim_lottery,1,function(x) { return(!(id_rival %in% x)) }),]
p_lost_conditional <- sum(as.numeric(
apply(sim_rival_lost,1,
function(x) { return(!(id_self %in% x)) })
)) / nrow(sim_rival_lost)
Et on observe :
> p_lost
[1] 0.02871
> p_lost_conditional
[1] 0.03449465
C’est-à-dire :
\(\Pr(vous~perdez~|~R~a~perdu) > \Pr(vous~perdez) \)
Donc contrairement à notre intuition, le fait de savoir que notre rival a perdu ne doit pas nous réjouir, car nous avons maintenant moins de chances de gagner que sans cette information !
Plutôt rigolo, non ? Vous pouvez essayer de faire tourner le code précédent avec des allocations en tickets un peu moins “bizarres”. Vous observerez par exemple que pour 1000 tickets distribués parmi 1000 joueurs différents, la condition “intuitive” est bien vérifiée. Le “paradoxe d’Alexander” a en fait des applications en statistique théorique et en sondages.
Image de couverture © The Pokémon Company