O Problema de Monty Hall

Cover Photo by fotografierende from Pexels
O Problema de Monty Hall
Nesse post vamos abordar um aspecto interessante sobre probabilidades, especificamente o problema de Monty Hall, também conhecido por paradoxo de Monty Hall, trata-se de um problema matemático e um paradoxo que surgiu a partir de um concurso televisivo dos Estados Unidos chamado Let’s Make a Deal, exibido na década de 1970.[1]
Para demonstrar os conceitos discutidos aqui vamos simular alguns cenários utilizando funções básicas em R
. Se você já conhece R
pode simplesmente ir copiando e colando no seu script os códigos, o exemplo é totalmente reproduzível :)
. No final desse post você vai achar links para o código usado, assim como links sobre como começar a utilizar R
.
Vamos começar…
O problema: escolha a sua sorte
O jogo consistia no seguinte: Monty Hall, o apresentador, apresentava três portas aos jogadores. Atrás de uma delas estava um prêmio (um carro) e, atrás das outras duas, dois bodes.
-
Na 1ª etapa o jogador escolhe uma das três portas (que ainda não é aberta)
-
Na 2ª etapa, Monty abre uma das outras duas portas que o jogador não escolheu, revelando que o carro não se encontra nessa porta e revelando um dos bodes
-
Na 3ª etapa Monty pergunta ao jogador se quer decidir permanecer com a porta que escolheu no início do jogo ou se ele pretende mudar para a outra porta que ainda está fechada para então a abrir. Agora, com duas portas apenas para escolher — pois uma delas já se viu, na 2.ª etapa, que não tinha o prêmio — e sabendo que o carro está atrás de uma das restantes duas, o jogador tem que tomar a decisão.
Qual é a estratégia mais lógica? Ficar com a porta escolhida inicialmente ou mudar de porta? Com qual das duas portas ainda fechadas o jogador tem mais probabilidades de ganhar? Por quê?
Intuitivamente pensamos que tanto faz mudar ou não, afinal temos duas portas, logo as chances são 50% para cada uma.
Agora vem um spoiler: A chances não são 50%, mas sim ~33.3% se você não mudar de porta e ~66.6% se você mudar.
O Físico Turista e o twitter
Esse problema veio até mim por meio do vídeo (link no fim do post) do canal Físico Turista do Caio Gomes, após assistir esse vídeo fiquei pensativo sobre o assunto e resolvi implementar uma simulação em R
para ver se de fato as coisas ocorriam como descritos pelo Caio.
Na época divulguei a implementação no twitter e o próprio Caio deu reply :)
Depois do último vídeo do @caiocgomes eu implementei em R uma demonstração do problema de Monty Hall, simulei as 2 estratégias 10 mil vezes. Os resultados batem perfeitamente.
— Ícaro Agostino (@icaroagostino) January 12, 2020
Link para o código: https://t.co/R8EPbaOx7D
Eixo X = probabilidade acumulada
Eixo Y = nº de repetições pic.twitter.com/4hyF4XbSZK
Simulando a sorte?
Quando estudamos probabilidade, a ideia é sempre pensar o que é mais provável acontecer, empiricamente podemos fazer esse tipo análise repetindo de forma aleatória muitas vezes um experimento e no fim analisar como em média os resultados se comportam.
Aqui vamos tratar cada decisão como uma estratégia, e implementar ambas utilizando funções de probabilidades, cada estratégia será simulada 10 mil vezes, no final vamos comparar os resultados graficamente.
- Estratégia 1 - Não muda de porta
- Estratégia 2 - Muda de porta
Primeiro vamos criar algumas variáveis para o experimento:
n <- 10000 # Numero de repeticoes
vitorias <- c() # Vetor onde serao gravadas as vitorias
portas <- c(1:3) # Vetor de portas
Estratégia 1 - Não muda de porta.
Aqui de uma forma simples, apenas utilizando funções básicas do R
vamos criar um loop com o número de repetições definidas anteriormente.
Vamos aleatoriamente sortear a porta_premio
e depois a escolha
do jogador. Depois comparamos se o jogador acertou de primeira, se sim computamos uma vitória, se não computamos a derrota de forma direta, já que nesse caso o jogador nunca mudará de porta.
###################################
# Estrategia 1 - Nao muda a porta #
###################################
for (i in 1:n){
porta_premio <- sample(x = portas, size = 1) # porta com premio
escolha <- sample(x = portas, size = 1) # escolha do jogador
# Se a escolha for igual a porta premiada vence [1]
if (porta_premio == escolha){
vitorias <- c(vitorias, 1)
# Se a escolha for diferente da porta premiada perde [0]
} else {
vitorias <- c(vitorias, 0)
}
}
Agora vamos salvar esses resultados para comparar no final.
# Computa resultados
data_estrategia1 <-
data.frame(rodada = c(1:n),
perc.ganha = cumsum(vitorias)/c(1:n))
Estratégia 2 - Muda de porta.
Assim como no caso anterior vamos criar um loop com o número de repetições definidas anteriormente.
Vamos novamente aleatoriamente sortear a porta_premio
e depois a escolha1
do jogador. Depois o apresentador vai excluir uma das portas diferente da escolha do jogador.
Agora o jogador tem a escolha1
e a porta que sobrou, nessa estratégia ele sempre muda para a que sobrou, aqui representada pela escolha2
. Por fim, comparamos se a nova escolha é a porta_premio
, se sim computamos uma vitória.
###############################
# Estrategia 2 - Muda a porta #
###############################
vitorias <- c() # Vetor onde serao gravadas as vitorias
for (i in 1:n){
porta_premio <- sample(x = portas, size = 1) # porta com premio
escolha1 <- sample(x = portas, size = 1) # primeira escolha do jogador
x <- portas[-c(porta_premio, escolha1)] # variavel auxliar
porta_eliminada <- if(length(x) > 1) sample(x, size = 1) else x # elimina
escolha2 <- portas[-c(escolha1,porta_eliminada)] # jogador muda de porta
# Se a escolha 2 for igual a porta premiada vence [1]
if (porta_premio == escolha2){
vitorias <- c(vitorias, 1)
# Se a escolha 2 for diferente da porta premiada perde [0]
} else {
vitorias <- c(vitorias, 0)
}
}
Agora vamos salvar esses resultados para comparar no final.
# Computa resultados
data_estrategia2 <-
data.frame(rodada = c(1:n),
perc.ganha = cumsum(vitorias)/c(1:n))
Resultados contra intuitivos?
Chegou a hora de ver os resultados das simulações, para plotar ambas as estratégias, vamos utilizar o pacote ggplot2.
Estratégia 1 - Não muda de porta.
library(ggplot2)
ggplot(data_estrategia1, aes(x = rodada, y = perc.ganha)) +
geom_line() +
geom_hline(yintercept=1/3,
color = "red")
Estratégia 2 - Muda de porta.
ggplot(data_estrategia2, aes(x = rodada, y = perc.ganha)) +
geom_line() +
geom_hline(yintercept=2/3,
color = "red")
Mas o que aconteceu? por que mudar sempre de porta parece ser a melhor escolha?
A verdade é que estatisticamente falando, a estratégia 2 sim é a melhor, ela não garante a vitória, mas têm a maior probabilidade de ganhar o jogo, agora vamos tentar entender porque isso acontece.
Uma informação que não levamos em consideração, e que muda a “sorte”, é que quando o apresentador revela uma das portas que não foi escolhida ele possui uma informação: ele sabe onde está o prêmio. Mas o que isso muda?
Sorte ou chance?
Como o show deve continuar o apresentador ao revelar umas das portas restantes ele sempre abrirá a porta onde o prêmio não está, assim o suspense continua e o jogo passa para a fase 2.
Sabendo disso quando analisamos novamente o cenário, temos duas possibilidades:
-
Cenário 1: você escolhe a porta certa de primeira (nesse caso a chance é de um terço), e o para o apresentador tanto faz qual ele revelará.
-
Cenário 2: você escolha aporta errada de primeira (nesse caso a chance é dois terços), e o apresentador será forçado a abrir uma porta onde o prêmio não está, logo sobra a sua escolha inicial e mais uma porta possível.
Sabendo disso quando aplicamos as duas estratégias temos o seguinte resultado:
-
Estratégia 1: se você escolher de primeira a porta certa, somente nesse caso você ganha, logo espera-se que isso ocorra em um terço das vezes (~33.3%).
-
Estratégia 2: se você não escolher de primeira a porta certa, você ganhará, pois o apresentador eliminará uma porta errada e como você escolheu uma errada inicialmente você muda e ganha o jogo, como a chance inicial de escolher a porta errada é maior, espera-se que isso ocorra em dois terços das vezes (~66,6%).
Se você estiver interessado em uma solução analítica para o problema pode encontrar aqui.
Chegamos ao fim
Espero que tenha gostado desse problema, se quiser acessar o script completo para reproduzir o exemplo basta clicar aqui.
R
é uma linguagem de programação open source. Todos os recursos, bibliotecas, dados e implementações são gratuitos e desenvolvidos pela comunidade.Se você tem interesse de aprender a instalar o R e os passos básicos para iniciar nesse mundo sugiro o tutorial básico desenvolvido pelo pessoal do curso-r: http://material.curso-r.com/instalacao/
Parte do texto inicial utilizado nesse post foi retirado da wikipedia, link aqui
Se você quiser ver o vídeo original do Caio, fica aqui o link:
Até o próximo post, bons estudos em R
:D
Você pode compartilhar esse post nas redes sociais utilizando os botões no fim dessa página.