Je suis tombé sur l’énigme des deux enfants, proposé par science4all.

Problème

Un couple a deux enfants. L’un de ces enfants est un garçon. Quelle est la probabilité pour que l’autre enfant soit aussi un garçon ?

On fait les hypothèses suivantes:

  • le sexe d’un enfant n’est pas influencé par le sexe de l’enfant né précédemment (=évènements indépendants)
  • on a une chance sur deux d’avoir un garçon

Intuitivement on voudrait dire une chance sur deux.

Solution mathématique

On peut résoudre ce problème par la formule de Bayes. On pose A = “Au moins un enfant est un garçon” et B = “Le deuxième enfant est un garçon”. On veut donc savoir la probabilité d’avoir un garçon sachant qu’on a au moins un garçon parmi ces deux enfants, soit p(B|A).

\[p(B|A) = \frac{p(A|B)*p(B)}{p(A)}\]

On a p(A) = 3/4, car il a 4 cas possibles équiprobables : Soit le couple a eu un garçon puis une fille, soit une fille puis un garçon, soit deux garçons, soit deux filles.

On a p(B) = 1/2. Dans l’absolu, sans avoir d’informations supplémentaire, on a une chance sur deux d’avoir un nouvel enfant qui est un garçon.

On a p(A B) = 1. Si un enfant est un garçon, alors obligatoirement au moins un enfant est un garçon.
On a donc p(B A) = 1/3 (et non pas 1/2 comme on pouvait le penser initialement).

En fait ce qui est bien important de comprendre c’est que l’énonce ne dit pas “le couple a eu un garçon, puis un autre”, mais “Le couple a deux enfants, dont un garçon”. C’est cette information qui change tout: on se retrouve avec les possibilités GG, FG et GF, alors que dans le premier cas on aurait pu avoir que GG et GF.

Expérience

Testons par l’expérience “in silico”.

import random

# SIMULATION: pleins de couples avec deux enfants
couple_nombre = 10000
enfants = []
enfants_possibles = ['F', 'G']

for i in range(couple_nombre):
  # le couple fait un premier enfant:
  premier_enfant = random.sample(enfants_possibles, 1)[0]

  # le couple fait un deuxieme enfant:
  deuxieme_enfant = random.sample(enfants_possibles, 1)[0]

  enfants.append([premier_enfant, deuxieme_enfant])

# EXPERIENCE
# On va tester plein de fois l'experience suivante : on prend un couple qui a un garçon parmi deux enfants, et on regarde si le deuxième est un garçon.

# on filtre maintenant les données pour obtenir tous les couples où on a au moins un garçon
enfants_garcon = list(filter(lambda x: x[0] == 'G' or x[1] == 'G', enfants))


xp_nombre = 5000
nombre_soeurs = 0
nombre_freres = 0

for i in range(xp_nombre):
  # on prend un de ces couple d'enfants où il y a un garçon:
  couple_enfants = random.sample(enfants_garcon, 1)[0]

  # on test si on a un garçon ou un fille
  if couple_enfants[0] == 'F' or couple_enfants[1] == 'F':
    nombre_soeurs += 1
  else:
    nombre_freres += 1

print('La probabilité empirique d\'avoir un garçon est de {}'.format(nombre_freres/xp_nombre))

Résultats

La probabilité empirique d'avoir un garçon est de 0.3368

On applique ici la loi des grands nombres : la moyenne de n évènements qui suivent la même loi de probabilité converge vers l’espérance du phénomène. On trouve que pour n = 5000 couples, en moyenne on a 0.3368 chances d’avoir un garçon, ce qui correspond bien au 1/3 trouvé précédemment.