Passons un accord – devriez-vous changer votre choix étant donné une option ?
Supposons que vous soyez dans un jeu télévisé où l’on vous demande de choisir entre trois portes, une avec une voiture et les deux autres avec des chèvres. Vous faites un choix, puis l’hôte révèle une porte qui a une chèvre. Gagnez-vous un avantage en changeant de porte, ou devriez-vous garder votre original ?
Intuitivement, cela pourrait sembler ne faire aucune différence, car la probabilité d’en obtenir un sur deux est de 1/2, n’est-ce pas ? Eh bien, mathématiquement, ce n’est pas valable. Vous avez donc plus de chances de gagner si vous changez de porte, et cela aussi par un énorme 2/3, confus ?
Ce puzzle a depuis été appelé le « problème de Monty Hall » basé sur le nom de l’animateur de l’émission télévisée « Faisons un marché », qui avait le même problème décrit ci-dessus.
Vos Savant a donné une explication à cela après que Steve Selvin ait écrit une lettre au Statisticien américain en 1975, citant le problème et si le candidat gagne quelque chose en changeant. Voyons donc pourquoi cela fait une différence.
Donc, il y a une voiture à la porte 1 et des chèvres aux portes 2 et 3.
Voyons donc ce qui se passe si vous décidez de vous en tenir à votre choix
Donc, comme vous pouvez le voir, vous gagnez seulement 1 fois sur 3
Maintenant, si vous décidez de changer, voyons ce qui se passe
Donc, comme vous le voyez, vous gagnez 2 fois sur 3.
Cette solution était contre-intuitive pour certains car ouvrir une porte qui ne contient pas la voiture rend la probabilité 1/2, et vous avez toujours le choix entre les deux, donc techniquement, vous faites toujours le choix de vous en tenir à la porte d’origine.
Cela est vrai si et seulement s’il existe un scénario véritablement aléatoire. Cependant, ils ignorent le fait que le hasard a déjà disparu lorsqu’une option incorrecte est supprimée de l’équation, c’est-à-dire que l’animateur du jeu télévisé a laissé entendre que parmi les deux choix restants, lequel n’avait pas la voiture, et donc il y a un très haut chance que parmi votre sélection et la porte restante, la porte restante ait la voiture. Pour le prouver, examinons une solution mathématique utilisant Python.
Donc, nous commençons avec une expérience qui fait ce qui suit :
- Faites un choix aléatoire parmi les portes 1, 2 et 3 pour marquer la bonne option (c’est-à-dire la porte qui contient la voiture)
- Choisissez au hasard une porte comme concurrent, c’est-à-dire le choix initial.
- Sur les deux portes restantes, ouvrez celle contenant une chèvre et retirez cette porte parmi les choix du concurrent.
- Maintenant, choisissez l’autre porte parmi les deux portes restantes, c’est-à-dire, changez de choix.
- Si le choix final (c’est-à-dire après la commutation) est le même que la porte qui contenait la voiture (calculé à l’étape 1), alors retournez 1 (succès); sinon, renvoie 0 (échec de marquage).
Nous effectuons ensuite plusieurs exécutions de cette expérience pour déterminer combien de fois nous avons réussi. Enfin, en utilisant ces données, nous renvoyons la probabilité de succès (c’est-à-dire le nombre d’exécutions réussies / le nombre total d’exécutions).
Nous exécutons à nouveau cet ensemble plusieurs fois et faisons un graphique cumulatif pour comprendre la probabilité que nous tendons à l’aide d’une bibliothèque de graphiques appelée matplotlib
.
Voici le code Python :
import random
import matplotlib.pyplot as pltdef switch_doors_experiment():
# compute the correct door randomly
correct_door = random.choice([1, 2, 3])
# choose a door randomly
door = random.choice([1, 2, 3])
# Among two remaining door, get a random incorrect door
doors = [1,2,3]
try:
doors.remove(door)
doors.remove(correct_door)
except:
pass
random_incorrect_door = random.choice(doors)
# Remove the random incorrect door from the options available to you
doors = [1, 2, 3]
doors.remove(random_incorrect_door)
# Now among your original choice of door and the new set of options,
# switch your choice
# Remove your original choice from the options
doors.remove(door)
# Now as only one option is there within
final_choice = doors[0]
# If the final choice is the correct door, then return 1, else return 0
if final_choice == correct_door:
return 1
else:
return 0
def probability_of_success_on_switch_door(precision):
switch_door = 0
# run the switch door experiment precision amount of times
# and increment the outcome in switch_door counter
for i in range(precision):
switch_door = switch_door + switch_doors_experiment()
# Probability of success while switching doors =
# num of times the experiment was successful / total number of runs
return switch_door/precision
# Do 100 runs with precision 100000
runs = 100
total = 0
x = []
y = []
precision = 100000
for i in range(runs):
total = total + probability_of_success_on_switch_door(precision)
x.append(i+1)
y.append(total/(i+1))
# Plot the probability vs runs on a matplotlib graph
plt.plot(x, y)
plt.xlabel('Runs')
plt.ylabel('Probability of Success while Switching')
plt.title('Monty Hall problem')
plt.ylim(0,1)
plt.xlim(1,runs)
plt.show()
print("Probability of Success on switching door for {} precision and {} runs is {}".format(precision, runs, total/runs))
Regardons maintenant le résultat lorsque nous l’exécutons
Lorsque nous exécutons le code, nous obtenons le graphique suivant
Et le résultat suivant :
Probability of Success on switching door for 100000 precision and 100 runs is 0.6664328
En utilisant la simulation informatique, nous obtenons une probabilité de succès en passant à 2/3, ce qui montre que nous devrions changer notre choix pour augmenter nos chances de gagner la voiture.
Eh bien, encore une fois, que se passerait-il si les gens faisaient des choix au hasard dans la seconde chance ? Modifions le code pour voir tous les scénarios et le hasard jouer les uns dans les autres.
Ici, nous allons faire ce qui suit :
- Permettre à une personne de faire un choix aléatoire entre switch/no-switch
- Gardez une trace du nombre total d’exécutions sans interrupteur et du nombre de fois où nous avons réussi
- Gardez une trace du nombre total d’exécutions de commutation et du nombre de fois où nous avons réussi
- Gardez une trace du nombre total de courses et du nombre de fois où nous avons réussi dans un scénario aussi aléatoire.
Nous exécutons l’expérience avec 10000 exécutions pour 1000 itérations pour générer un échantillon vraiment aléatoire et le tracer à l’aide de matplotlib.
Le code Python pour ce scénario est le suivant :
import random
import matplotlib.pyplot as pltdef experiment(switch_door):
# compute the correct door randomly
correct_door = random.choice([1, 2, 3])
# choose a door randomly
door = random.choice([1, 2, 3])
# Among two remaining door, get a random incorrect door
doors = [1,2,3]
try:
doors.remove(door)
doors.remove(correct_door)
except:
pass
random_incorrect_door = random.choice(doors)
# Remove the random incorrect door from the options available to you
doors = [1, 2, 3]
doors.remove(random_incorrect_door)
# Now among your original choice of door and the new set of options, switch your choice
# remove your original choice from the options
doors.remove(door)
# Now as only one option is there within
if switch_door:
final_choice = doors[0]
else:
final_choice = door
# If the final choice is the correct door, then return 1, else return 0
if final_choice == correct_door:
return 1
else:
return 0
def iteration(runs):
total = 0
switch_door_total = 0
switch_door_success = 0
no_switch_door_total = 0
no_switch_door_success = 0
for i in range(runs):
switch_door = random.choice([True, False])
experiment_success = experiment(switch_door)
if switch_door:
switch_door_total = switch_door_total + 1
switch_door_success = switch_door_success + experiment_success
else:
no_switch_door_total = no_switch_door_total + 1
no_switch_door_success = no_switch_door_success + experiment_success
total = total + experiment_success
return total/runs, switch_door_success/switch_door_total, no_switch_door_success/no_switch_door_total
def plot(x, y_total, y_switch, y_no_switch):
fig, ax = plt.subplots()
fig.subplots_adjust(right=0.75)
twin1 = ax.twinx()
twin2 = ax.twinx()
# Offset the right spine of twin2. The ticks and label have already been
# placed on the right by twinx above.
twin2.spines.right.set_position(("axes", 1.2))
p1, = ax.plot(x, y_total, "b-", label="Success Probability - Random Choice")
p2, = twin1.plot(x, y_switch, "r-", label="Success Probability - Switch")
p3, = twin2.plot(x, y_no_switch, "g-", label="Success Probability - No Switch")
ax.set_ylim(0, 1)
twin1.set_ylim(0, 1)
twin2.set_ylim(0, 1)
ax.set_xlabel("Runs")
ax.set_ylabel("Success Probability - Random Choice")
twin1.set_ylabel("Success Probability - Switch")
twin2.set_ylabel("Success Probability - No Switch")
ax.yaxis.label.set_color(p1.get_color())
twin1.yaxis.label.set_color(p2.get_color())
twin2.yaxis.label.set_color(p3.get_color())
tkw = dict(size=4, width=1.5)
ax.tick_params(axis='y', colors=p1.get_color(), **tkw)
twin1.tick_params(axis='y', colors=p2.get_color(), **tkw)
twin2.tick_params(axis='y', colors=p3.get_color(), **tkw)
ax.tick_params(axis='x', **tkw)
ax.legend(handles=[p1, p2, p3])
plt.show()
x = []
y_total = []
y_switch = []
y_no_switch = []
for i in range(1000):
total, switch_door, no_switch_door = iteration(10000)
y_total.append(total)
y_switch.append(switch_door)
y_no_switch.append(no_switch_door)
x.append(i+1)
plot(x, y_total, y_switch, y_no_switch)
Lorsque nous exécutons ce code, nous obtenons le graphique suivant :
Comme nous pouvons le voir sur le graphique, nous obtenons les résultats suivants :
- Si une personne choisit de changer, la probabilité de réussir dans 2/3
- Si une personne fait le choix de ne pas changer, la probabilité de réussir est de 1/3
- Dans une situation véritablement aléatoire, lorsque les gens font des choix sans parti pris, nous obtenons une probabilité de 1/2 de réussir.
C’est probablement le troisième point qui confond beaucoup de gens. Bien que je convienne que si vous faites véritablement un choix aléatoire, vous avez autant de chances de gagner que de perdre. Cependant, comme on le voit dans l’expérience ci-dessus, vous pouvez toujours augmenter les chances en votre faveur en changeant.
C’est le problème de Monty Hall et toute la confusion qu’il a causée en un mot.