{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The following is a simulation the Monty Hall problem so my sister can see that it makes sense."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" The Monty Hall as described by Wikipedia: \n",
" \n",
">\"Suppose you're on a game show, and you're given the choice of three doors: Behind one door is a car; behind the others, goats. You pick a door, say No. 1, and the host, who knows what's behind the doors, opens another door, say No. 3, which has a goat. He then says to you, \"Do you want to pick door No. 2?\" Is it to your advantage to switch your choice?\"\n",
"\n",
" At first, it seems that switching wouldn't make a difference. Computationally, though, we'll see that switching doors is a better choice. To demonstrate this, we'll split the problem into 2 scenarios—one in which you *always* stay with your initial guess and another in which you *always* switch to another door after the host reveals one that does not contain a prize."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"%config InlineBackend.figure_format = 'svg'\n",
"\n",
"import random\n",
"import numpy as np\n",
"\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('ggplot')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Case 1: Player does not switch"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def games_no_switch():\n",
" results = []\n",
" for i in xrange(1000): \n",
" correct_door = random.choice([1,2,3])\n",
" contestant_choice = random.choice([1,2,3])\n",
"\n",
" if contestant_choice == correct_door:\n",
" results.append(True)\n",
" else:\n",
" results.append(False)\n",
" return np.mean(results)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 1000 trials of 1000 games\n",
"no_switch_results = [games_no_switch() for i in xrange(1000)]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Distribution is centered on 0.333989\n"
]
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sample_mean = np.mean(no_switch_results)\n",
"\n",
"plt.rcParams['figure.figsize'] = 8, 4\n",
"plt.hist(no_switch_results, bins=20, color='black')\n",
"plt.vlines(sample_mean, 0, 160, linestyles='--', color='red', linewidth=2)\n",
"plt.text(sample_mean + .002, 150, '$\\overline{x}=%s$' % sample_mean, size=15)\n",
"\n",
"plt.xlabel('Win Percentage')\n",
"plt.ylabel('count')\n",
"\n",
"plt.title('Distibution of Win Percentages (No Switch)')\n",
"print 'Distribution is centered on {}'.format(np.mean(no_switch_results))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The player wins about 1/3 of the time"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Case 2: Player switches doors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" The `if else` statement in the following function takes a second to understand. If you selected the correct door initially, switching to another will cause you to lose. If you chose an incorrect door initially, **switching will always cause you to win**. You selected one incorrect door and the host opens the other (he cannot open the door with the prize because that would ruin the gameshow). The door you switch to is the only one left—the one with the prize behind it."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#player switches doors every game\n",
"def games_with_switch():\n",
" \n",
" results = []\n",
" for i in xrange(1000):\n",
" correct_door = random.choice([1,2,3])\n",
" player_initial = random.choice([1,2,3])\n",
"\n",
" if player_initial == correct_door:\n",
" results.append(False)\n",
" else:\n",
" results.append(True)\n",
" return np.mean(results)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.67900000000000005"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"games_with_switch()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"switch_results = [games_with_switch() for i in xrange(1000)]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Distribution is centered on 0.665991\n"
]
},
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sample_mean = np.mean(switch_results)\n",
"\n",
"plt.hist(switch_results, bins=20, color='black')\n",
"plt.vlines(sample_mean, 0, 160, linestyles='--', color='red', linewidth=2)\n",
"plt.text(sample_mean + .002, 150, '$\\overline{x}=%s$' % sample_mean, size=15)\n",
"\n",
"plt.xlabel('Win Percentage')\n",
"plt.ylabel('count')\n",
"\n",
"plt.title('Distibution of Win Percentages (Switch)')\n",
"print 'Distribution is centered on {}'.format(np.mean(switch_results))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Player wins about 2/3 of the time"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(no_switch_results, label='no switch')\n",
"plt.hist(switch_results, label='switch')\n",
"\n",
"plt.xlabel('Win Percentage')\n",
"plt.ylabel('count')\n",
"plt.title('Distribution of Win Percentages by Strategy')\n",
"plt.legend(loc='upper center');"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
" In conclusion, switching doors doubles one's chances of winning the prize. If you switch, **you are betting that you initially guessed incorrectly**. The chances of you guessing incorrectly are 2/3 as opposed to the 1/3 probability that you guessed correctly at the outset."
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [default]",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 0
}