{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"hide": true
},
"source": [
"# Python tech for distributions\n",
"\n",
"##### Keywords: bernoulli distribution, uniform distribution, empirical distribution, elections"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"hide": true
},
"outputs": [],
"source": [
"# The %... is an iPython thing, and is not part of the Python language.\n",
"# In this case we're just telling the plotting library to draw things on\n",
"# the notebook, instead of on a separate window.\n",
"%matplotlib inline\n",
"# See all the \"as ...\" contructs? They're just aliasing the package names.\n",
"# That way we can call methods like plt.plot() instead of matplotlib.pyplot.plot().\n",
"import numpy as np\n",
"import scipy as sp\n",
"import matplotlib as mpl\n",
"import matplotlib.cm as cm\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import seaborn.apionly as sns"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let us consider a table of probabilities that [PredictWise](http://www.predictwise.com/results/2012/president) made on October 2, 2012 for the US presidential elections. \n",
"PredictWise aggregated polling data and, for each state, estimated the probability that the Obama or Romney would win. Here are those estimated probabilities, loaded inmto a `pandas` dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Obama | \n",
" Romney | \n",
" States | \n",
" Votes | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.000 | \n",
" 1.000 | \n",
" Alabama | \n",
" 9 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.000 | \n",
" 1.000 | \n",
" Alaska | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.062 | \n",
" 0.938 | \n",
" Arizona | \n",
" 11 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.000 | \n",
" 1.000 | \n",
" Arkansas | \n",
" 6 | \n",
"
\n",
" \n",
" 4 | \n",
" 1.000 | \n",
" 0.000 | \n",
" California | \n",
" 55 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Obama Romney States Votes\n",
"0 0.000 1.000 Alabama 9\n",
"1 0.000 1.000 Alaska 3\n",
"2 0.062 0.938 Arizona 11\n",
"3 0.000 1.000 Arkansas 6\n",
"4 1.000 0.000 California 55"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise = pd.read_csv('data/predictwise.csv')\n",
"predictwise.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can set the states as an index..after all, each state has a unique name."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Obama | \n",
" Romney | \n",
" Votes | \n",
"
\n",
" \n",
" States | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Alabama | \n",
" 0.000 | \n",
" 1.000 | \n",
" 9 | \n",
"
\n",
" \n",
" Alaska | \n",
" 0.000 | \n",
" 1.000 | \n",
" 3 | \n",
"
\n",
" \n",
" Arizona | \n",
" 0.062 | \n",
" 0.938 | \n",
" 11 | \n",
"
\n",
" \n",
" Arkansas | \n",
" 0.000 | \n",
" 1.000 | \n",
" 6 | \n",
"
\n",
" \n",
" California | \n",
" 1.000 | \n",
" 0.000 | \n",
" 55 | \n",
"
\n",
" \n",
" Colorado | \n",
" 0.807 | \n",
" 0.193 | \n",
" 9 | \n",
"
\n",
" \n",
" Connecticut | \n",
" 1.000 | \n",
" 0.000 | \n",
" 7 | \n",
"
\n",
" \n",
" Delaware | \n",
" 1.000 | \n",
" 0.000 | \n",
" 3 | \n",
"
\n",
" \n",
" District of Columbia | \n",
" 1.000 | \n",
" 0.000 | \n",
" 3 | \n",
"
\n",
" \n",
" Florida | \n",
" 0.720 | \n",
" 0.280 | \n",
" 29 | \n",
"
\n",
" \n",
" Georgia | \n",
" 0.004 | \n",
" 0.996 | \n",
" 16 | \n",
"
\n",
" \n",
" Hawaii | \n",
" 1.000 | \n",
" 0.000 | \n",
" 4 | \n",
"
\n",
" \n",
" Idaho | \n",
" 0.000 | \n",
" 1.000 | \n",
" 4 | \n",
"
\n",
" \n",
" Illinois | \n",
" 1.000 | \n",
" 0.000 | \n",
" 20 | \n",
"
\n",
" \n",
" Indiana | \n",
" 0.036 | \n",
" 0.964 | \n",
" 11 | \n",
"
\n",
" \n",
" Iowa | \n",
" 0.837 | \n",
" 0.163 | \n",
" 6 | \n",
"
\n",
" \n",
" Kansas | \n",
" 0.000 | \n",
" 1.000 | \n",
" 6 | \n",
"
\n",
" \n",
" Kentucky | \n",
" 0.000 | \n",
" 1.000 | \n",
" 8 | \n",
"
\n",
" \n",
" Louisiana | \n",
" 0.000 | \n",
" 1.000 | \n",
" 8 | \n",
"
\n",
" \n",
" Maine | \n",
" 1.000 | \n",
" 0.000 | \n",
" 4 | \n",
"
\n",
" \n",
" Maryland | \n",
" 1.000 | \n",
" 0.000 | \n",
" 10 | \n",
"
\n",
" \n",
" Massachusetts | \n",
" 1.000 | \n",
" 0.000 | \n",
" 11 | \n",
"
\n",
" \n",
" Michigan | \n",
" 0.987 | \n",
" 0.013 | \n",
" 16 | \n",
"
\n",
" \n",
" Minnesota | \n",
" 0.982 | \n",
" 0.018 | \n",
" 10 | \n",
"
\n",
" \n",
" Mississippi | \n",
" 0.000 | \n",
" 1.000 | \n",
" 6 | \n",
"
\n",
" \n",
" Missouri | \n",
" 0.074 | \n",
" 0.926 | \n",
" 10 | \n",
"
\n",
" \n",
" Montana | \n",
" 0.046 | \n",
" 0.954 | \n",
" 3 | \n",
"
\n",
" \n",
" Nebraska | \n",
" 0.000 | \n",
" 1.000 | \n",
" 5 | \n",
"
\n",
" \n",
" Nevada | \n",
" 0.851 | \n",
" 0.149 | \n",
" 6 | \n",
"
\n",
" \n",
" New Hampshire | \n",
" 0.857 | \n",
" 0.143 | \n",
" 4 | \n",
"
\n",
" \n",
" New Jersey | \n",
" 0.998 | \n",
" 0.002 | \n",
" 14 | \n",
"
\n",
" \n",
" New Mexico | \n",
" 0.985 | \n",
" 0.015 | \n",
" 5 | \n",
"
\n",
" \n",
" New York | \n",
" 1.000 | \n",
" 0.000 | \n",
" 29 | \n",
"
\n",
" \n",
" North Carolina | \n",
" 0.349 | \n",
" 0.651 | \n",
" 15 | \n",
"
\n",
" \n",
" North Dakota | \n",
" 0.025 | \n",
" 0.975 | \n",
" 3 | \n",
"
\n",
" \n",
" Ohio | \n",
" 0.890 | \n",
" 0.110 | \n",
" 18 | \n",
"
\n",
" \n",
" Oklahoma | \n",
" 0.000 | \n",
" 1.000 | \n",
" 7 | \n",
"
\n",
" \n",
" Oregon | \n",
" 0.976 | \n",
" 0.024 | \n",
" 7 | \n",
"
\n",
" \n",
" Pennsylvania | \n",
" 0.978 | \n",
" 0.022 | \n",
" 20 | \n",
"
\n",
" \n",
" Rhode Island | \n",
" 1.000 | \n",
" 0.000 | \n",
" 4 | \n",
"
\n",
" \n",
" South Carolina | \n",
" 0.000 | \n",
" 1.000 | \n",
" 9 | \n",
"
\n",
" \n",
" South Dakota | \n",
" 0.001 | \n",
" 0.999 | \n",
" 3 | \n",
"
\n",
" \n",
" Tennessee | \n",
" 0.001 | \n",
" 0.999 | \n",
" 11 | \n",
"
\n",
" \n",
" Texas | \n",
" 0.000 | \n",
" 1.000 | \n",
" 38 | \n",
"
\n",
" \n",
" Utah | \n",
" 0.000 | \n",
" 1.000 | \n",
" 6 | \n",
"
\n",
" \n",
" Vermont | \n",
" 1.000 | \n",
" 0.000 | \n",
" 3 | \n",
"
\n",
" \n",
" Virginia | \n",
" 0.798 | \n",
" 0.202 | \n",
" 13 | \n",
"
\n",
" \n",
" Washington | \n",
" 0.999 | \n",
" 0.001 | \n",
" 12 | \n",
"
\n",
" \n",
" West Virginia | \n",
" 0.002 | \n",
" 0.998 | \n",
" 5 | \n",
"
\n",
" \n",
" Wisconsin | \n",
" 0.925 | \n",
" 0.075 | \n",
" 10 | \n",
"
\n",
" \n",
" Wyoming | \n",
" 0.000 | \n",
" 1.000 | \n",
" 3 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Obama Romney Votes\n",
"States \n",
"Alabama 0.000 1.000 9\n",
"Alaska 0.000 1.000 3\n",
"Arizona 0.062 0.938 11\n",
"Arkansas 0.000 1.000 6\n",
"California 1.000 0.000 55\n",
"Colorado 0.807 0.193 9\n",
"Connecticut 1.000 0.000 7\n",
"Delaware 1.000 0.000 3\n",
"District of Columbia 1.000 0.000 3\n",
"Florida 0.720 0.280 29\n",
"Georgia 0.004 0.996 16\n",
"Hawaii 1.000 0.000 4\n",
"Idaho 0.000 1.000 4\n",
"Illinois 1.000 0.000 20\n",
"Indiana 0.036 0.964 11\n",
"Iowa 0.837 0.163 6\n",
"Kansas 0.000 1.000 6\n",
"Kentucky 0.000 1.000 8\n",
"Louisiana 0.000 1.000 8\n",
"Maine 1.000 0.000 4\n",
"Maryland 1.000 0.000 10\n",
"Massachusetts 1.000 0.000 11\n",
"Michigan 0.987 0.013 16\n",
"Minnesota 0.982 0.018 10\n",
"Mississippi 0.000 1.000 6\n",
"Missouri 0.074 0.926 10\n",
"Montana 0.046 0.954 3\n",
"Nebraska 0.000 1.000 5\n",
"Nevada 0.851 0.149 6\n",
"New Hampshire 0.857 0.143 4\n",
"New Jersey 0.998 0.002 14\n",
"New Mexico 0.985 0.015 5\n",
"New York 1.000 0.000 29\n",
"North Carolina 0.349 0.651 15\n",
"North Dakota 0.025 0.975 3\n",
"Ohio 0.890 0.110 18\n",
"Oklahoma 0.000 1.000 7\n",
"Oregon 0.976 0.024 7\n",
"Pennsylvania 0.978 0.022 20\n",
"Rhode Island 1.000 0.000 4\n",
"South Carolina 0.000 1.000 9\n",
"South Dakota 0.001 0.999 3\n",
"Tennessee 0.001 0.999 11\n",
"Texas 0.000 1.000 38\n",
"Utah 0.000 1.000 6\n",
"Vermont 1.000 0.000 3\n",
"Virginia 0.798 0.202 13\n",
"Washington 0.999 0.001 12\n",
"West Virginia 0.002 0.998 5\n",
"Wisconsin 0.925 0.075 10\n",
"Wyoming 0.000 1.000 3"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise = predictwise.set_index('States')\n",
"predictwise"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## numpy\n",
"\n",
"Lets do a short intro to numpy. You can obtain a numpy array from a Pandas dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0. , 0. , 0.062, 0. , 1. , 0.807, 1. , 1. ,\n",
" 1. , 0.72 , 0.004, 1. , 0. , 1. , 0.036, 0.837,\n",
" 0. , 0. , 0. , 1. , 1. , 1. , 0.987, 0.982,\n",
" 0. , 0.074, 0.046, 0. , 0.851, 0.857, 0.998, 0.985,\n",
" 1. , 0.349, 0.025, 0.89 , 0. , 0.976, 0.978, 1. ,\n",
" 0. , 0.001, 0.001, 0. , 0. , 1. , 0.798, 0.999,\n",
" 0.002, 0.925, 0. ])"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise.Obama.values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A numpy array has a shape:"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(51,)"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise.Obama.values.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And a type...this makes them efficient..."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dtype('float64')"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise.Obama.values.dtype"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can construct a dub-dataframe in pandas with this strange selection notation below:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Obama | \n",
" Romney | \n",
"
\n",
" \n",
" States | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Alabama | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Alaska | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Arizona | \n",
" 0.062 | \n",
" 0.938 | \n",
"
\n",
" \n",
" Arkansas | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" California | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Colorado | \n",
" 0.807 | \n",
" 0.193 | \n",
"
\n",
" \n",
" Connecticut | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Delaware | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" District of Columbia | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Florida | \n",
" 0.720 | \n",
" 0.280 | \n",
"
\n",
" \n",
" Georgia | \n",
" 0.004 | \n",
" 0.996 | \n",
"
\n",
" \n",
" Hawaii | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Idaho | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Illinois | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Indiana | \n",
" 0.036 | \n",
" 0.964 | \n",
"
\n",
" \n",
" Iowa | \n",
" 0.837 | \n",
" 0.163 | \n",
"
\n",
" \n",
" Kansas | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Kentucky | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Louisiana | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Maine | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Maryland | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Massachusetts | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Michigan | \n",
" 0.987 | \n",
" 0.013 | \n",
"
\n",
" \n",
" Minnesota | \n",
" 0.982 | \n",
" 0.018 | \n",
"
\n",
" \n",
" Mississippi | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Missouri | \n",
" 0.074 | \n",
" 0.926 | \n",
"
\n",
" \n",
" Montana | \n",
" 0.046 | \n",
" 0.954 | \n",
"
\n",
" \n",
" Nebraska | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Nevada | \n",
" 0.851 | \n",
" 0.149 | \n",
"
\n",
" \n",
" New Hampshire | \n",
" 0.857 | \n",
" 0.143 | \n",
"
\n",
" \n",
" New Jersey | \n",
" 0.998 | \n",
" 0.002 | \n",
"
\n",
" \n",
" New Mexico | \n",
" 0.985 | \n",
" 0.015 | \n",
"
\n",
" \n",
" New York | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" North Carolina | \n",
" 0.349 | \n",
" 0.651 | \n",
"
\n",
" \n",
" North Dakota | \n",
" 0.025 | \n",
" 0.975 | \n",
"
\n",
" \n",
" Ohio | \n",
" 0.890 | \n",
" 0.110 | \n",
"
\n",
" \n",
" Oklahoma | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Oregon | \n",
" 0.976 | \n",
" 0.024 | \n",
"
\n",
" \n",
" Pennsylvania | \n",
" 0.978 | \n",
" 0.022 | \n",
"
\n",
" \n",
" Rhode Island | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" South Carolina | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" South Dakota | \n",
" 0.001 | \n",
" 0.999 | \n",
"
\n",
" \n",
" Tennessee | \n",
" 0.001 | \n",
" 0.999 | \n",
"
\n",
" \n",
" Texas | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Utah | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
" Vermont | \n",
" 1.000 | \n",
" 0.000 | \n",
"
\n",
" \n",
" Virginia | \n",
" 0.798 | \n",
" 0.202 | \n",
"
\n",
" \n",
" Washington | \n",
" 0.999 | \n",
" 0.001 | \n",
"
\n",
" \n",
" West Virginia | \n",
" 0.002 | \n",
" 0.998 | \n",
"
\n",
" \n",
" Wisconsin | \n",
" 0.925 | \n",
" 0.075 | \n",
"
\n",
" \n",
" Wyoming | \n",
" 0.000 | \n",
" 1.000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Obama Romney\n",
"States \n",
"Alabama 0.000 1.000\n",
"Alaska 0.000 1.000\n",
"Arizona 0.062 0.938\n",
"Arkansas 0.000 1.000\n",
"California 1.000 0.000\n",
"Colorado 0.807 0.193\n",
"Connecticut 1.000 0.000\n",
"Delaware 1.000 0.000\n",
"District of Columbia 1.000 0.000\n",
"Florida 0.720 0.280\n",
"Georgia 0.004 0.996\n",
"Hawaii 1.000 0.000\n",
"Idaho 0.000 1.000\n",
"Illinois 1.000 0.000\n",
"Indiana 0.036 0.964\n",
"Iowa 0.837 0.163\n",
"Kansas 0.000 1.000\n",
"Kentucky 0.000 1.000\n",
"Louisiana 0.000 1.000\n",
"Maine 1.000 0.000\n",
"Maryland 1.000 0.000\n",
"Massachusetts 1.000 0.000\n",
"Michigan 0.987 0.013\n",
"Minnesota 0.982 0.018\n",
"Mississippi 0.000 1.000\n",
"Missouri 0.074 0.926\n",
"Montana 0.046 0.954\n",
"Nebraska 0.000 1.000\n",
"Nevada 0.851 0.149\n",
"New Hampshire 0.857 0.143\n",
"New Jersey 0.998 0.002\n",
"New Mexico 0.985 0.015\n",
"New York 1.000 0.000\n",
"North Carolina 0.349 0.651\n",
"North Dakota 0.025 0.975\n",
"Ohio 0.890 0.110\n",
"Oklahoma 0.000 1.000\n",
"Oregon 0.976 0.024\n",
"Pennsylvania 0.978 0.022\n",
"Rhode Island 1.000 0.000\n",
"South Carolina 0.000 1.000\n",
"South Dakota 0.001 0.999\n",
"Tennessee 0.001 0.999\n",
"Texas 0.000 1.000\n",
"Utah 0.000 1.000\n",
"Vermont 1.000 0.000\n",
"Virginia 0.798 0.202\n",
"Washington 0.999 0.001\n",
"West Virginia 0.002 0.998\n",
"Wisconsin 0.925 0.075\n",
"Wyoming 0.000 1.000"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise[['Obama', 'Romney']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"...and when you get the `.values`, you get a 2D numpy array (see further down in this document)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0. , 1. ],\n",
" [ 0. , 1. ],\n",
" [ 0.062, 0.938],\n",
" [ 0. , 1. ],\n",
" [ 1. , 0. ],\n",
" [ 0.807, 0.193],\n",
" [ 1. , 0. ],\n",
" [ 1. , 0. ],\n",
" [ 1. , 0. ],\n",
" [ 0.72 , 0.28 ],\n",
" [ 0.004, 0.996],\n",
" [ 1. , 0. ],\n",
" [ 0. , 1. ],\n",
" [ 1. , 0. ],\n",
" [ 0.036, 0.964],\n",
" [ 0.837, 0.163],\n",
" [ 0. , 1. ],\n",
" [ 0. , 1. ],\n",
" [ 0. , 1. ],\n",
" [ 1. , 0. ],\n",
" [ 1. , 0. ],\n",
" [ 1. , 0. ],\n",
" [ 0.987, 0.013],\n",
" [ 0.982, 0.018],\n",
" [ 0. , 1. ],\n",
" [ 0.074, 0.926],\n",
" [ 0.046, 0.954],\n",
" [ 0. , 1. ],\n",
" [ 0.851, 0.149],\n",
" [ 0.857, 0.143],\n",
" [ 0.998, 0.002],\n",
" [ 0.985, 0.015],\n",
" [ 1. , 0. ],\n",
" [ 0.349, 0.651],\n",
" [ 0.025, 0.975],\n",
" [ 0.89 , 0.11 ],\n",
" [ 0. , 1. ],\n",
" [ 0.976, 0.024],\n",
" [ 0.978, 0.022],\n",
" [ 1. , 0. ],\n",
" [ 0. , 1. ],\n",
" [ 0.001, 0.999],\n",
" [ 0.001, 0.999],\n",
" [ 0. , 1. ],\n",
" [ 0. , 1. ],\n",
" [ 1. , 0. ],\n",
" [ 0.798, 0.202],\n",
" [ 0.999, 0.001],\n",
" [ 0.002, 0.998],\n",
" [ 0.925, 0.075],\n",
" [ 0. , 1. ]])"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise[['Obama', 'Romney']].values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A \"reshape\" can convert a 1-D numpy array into a 2D one..."
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0. ],\n",
" [ 0. ],\n",
" [ 0.062],\n",
" [ 0. ],\n",
" [ 1. ],\n",
" [ 0.807],\n",
" [ 1. ],\n",
" [ 1. ],\n",
" [ 1. ],\n",
" [ 0.72 ],\n",
" [ 0.004],\n",
" [ 1. ],\n",
" [ 0. ],\n",
" [ 1. ],\n",
" [ 0.036],\n",
" [ 0.837],\n",
" [ 0. ],\n",
" [ 0. ],\n",
" [ 0. ],\n",
" [ 1. ],\n",
" [ 1. ],\n",
" [ 1. ],\n",
" [ 0.987],\n",
" [ 0.982],\n",
" [ 0. ],\n",
" [ 0.074],\n",
" [ 0.046],\n",
" [ 0. ],\n",
" [ 0.851],\n",
" [ 0.857],\n",
" [ 0.998],\n",
" [ 0.985],\n",
" [ 1. ],\n",
" [ 0.349],\n",
" [ 0.025],\n",
" [ 0.89 ],\n",
" [ 0. ],\n",
" [ 0.976],\n",
" [ 0.978],\n",
" [ 1. ],\n",
" [ 0. ],\n",
" [ 0.001],\n",
" [ 0.001],\n",
" [ 0. ],\n",
" [ 0. ],\n",
" [ 1. ],\n",
" [ 0.798],\n",
" [ 0.999],\n",
" [ 0.002],\n",
" [ 0.925],\n",
" [ 0. ]])"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictwise['Obama'].values.reshape(-1,1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can construct a numpy array directly as well"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4])"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"my_array = np.array([1, 2, 3, 4])\n",
"my_array"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**In general you should manipulate numpy arrays by using numpy module functions** (`np.mean`, for example). This is for efficiency purposes."
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.5\n",
"2.5\n"
]
}
],
"source": [
"print(my_array.mean())\n",
"print(np.mean(my_array))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The way we constructed the numpy array above seems redundant. After all we already had a regular python list. Indeed, it is the other ways we have to construct numpy arrays that make them super useful. \n",
"\n",
"There are many such numpy array *constructors*. Here are some commonly used constructors. Look them up in the documentation."
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n"
]
},
{
"data": {
"text/plain": [
"array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(np.ones(10))\n",
"np.ones(10, dtype='int') # generates 10 integer ones"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"8"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.dtype(float).itemsize # in bytes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numpy gains a lot of its efficiency from being typed. That is, all elements in the array have the same type, such as integer or floating point. The default type, as can be seen above, is a float of size appropriate for the machine (64 bit on a 64 bit machine)."
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
"[ 0.09500079 0.56750287 0.88898257 0.03858948 0.22709491 0.46560001\n",
" 0.9110299 0.87729626 0.47123426 0.64749469]\n",
"The sample mean and standard devation are 0.031173 and 0.986213, respectively.\n"
]
}
],
"source": [
"print(np.zeros(10))\n",
"print(np.random.random(10))\n",
"normal_array = np.random.randn(1000)\n",
"print(\"The sample mean and standard devation are %f and %f, respectively.\" %(np.mean(normal_array), np.std(normal_array)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's plot a histogram of this normal distribution"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(normal_array, bins=30);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can normalize this histogram:"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAADQxJREFUeJzt3X+oX/ddx/Hna9k6pToG5oI1iSZiag1af3CN/jH8gUbTIqZFxdbhqHOEgHFbZdjiYEPLwCLYidTFsAUVimXQbQTNaKsOpsxqbkftlrYpoTKSMu1d55xlYhf79o/7zfz27ib33OT7vd9733k+4ML3nPPJPe+E5JX3/ZzPOSdVhSSpl9fMugBJ0uQZ7pLUkOEuSQ0Z7pLUkOEuSQ0Z7pLUkOEuSQ0Z7pLUkOEuSQ29dlYn3rp1a+3cuXNWp5ekTenxxx//QlXNrTZuZuG+c+dOFhYWZnV6SdqUknxuyDinZSSpIcNdkhoy3CWpIcNdkhoy3CWpIcNdkhoy3CWpIcNdkhoy3CWpoZndoSqtt/sefXbw2Dv3XT/FSqTps3OXpIYMd0lqyHCXpIYMd0lqyHCXpIYMd0lqyHCXpIYMd0lqyHCXpIYMd0lqyHCXpIYMd0lqyHCXpIYMd0lqyHCXpIYMd0lqyHCXpIYGhXuS/UlOJzmT5O5LjPvhJOeT/OLkSpQkrdWq4Z5kC3A/cBOwB7g9yZ6LjLsXeGTSRUqS1mZI574XOFNVz1XVy8CDwIEVxv0m8BDwwgTrkyRdhiHhvg04O7Z9brTva5JsA24FPjC50iRJl2tSF1TfD9xVVa9calCSg0kWkiwsLi5O6NSSpOVeO2DM88COse3to33j5oEHkwBsBW5Ocr6qPjY+qKqOAkcB5ufn63KLliRd2pBwPwnsTrKLpVC/DfiV8QFVtevC5yR/BvzV8mCXJK2fVcO9qs4nOQw8DGwBjlXVqSSHRsePTLlGSdIaDencqaoTwIll+1YM9aq648rLkiRdCe9QlaSGDHdJamjQtIw0C/c9+uygcXfuu37KlVy5Tr8XbQ527pLUkOEuSQ0Z7pLUkOEuSQ0Z7pLUkOEuSQ25FFK6AkOXOErrzc5dkhqyc5dWYEeuzc7OXZIaMtwlqSHDXZIaMtwlqSHDXZIaMtwlqSHDXZIaMtwlqSHDXZIaMtwlqSHDXZIaMtwlqSHDXZIaMtwlqSHDXZIaMtwlqSFf1qFNzxdrSF/Pzl2SGjLcJakhw12SGnLOXevOOXJp+uzcJakhw12SGjLcJakhw12SGhoU7kn2Jzmd5EySu1c4fiDJk0meSLKQ5E2TL1WSNNSqq2WSbAHuB/YB54CTSY5X1VNjw/4WOF5VleRG4MPADdMoWJK0uiGd+17gTFU9V1UvAw8CB8YHVNVLVVWjzWuBQpI0M0PCfRtwdmz73GjfqyS5NckzwF8Db51MeZKkyzGxC6pV9dGqugG4BbhnpTFJDo7m5BcWFxcndWpJ0jJDwv15YMfY9vbRvhVV1SeB70yydYVjR6tqvqrm5+bm1lysJGmYIeF+EtidZFeSa4DbgOPjA5J8V5KMPv8Q8HrgxUkXK0kaZtXVMlV1Pslh4GFgC3Csqk4lOTQ6fgT4BeAtSb4K/Dfwy2MXWCVJ62zQg8Oq6gRwYtm+I2Of7wXunWxpkqTL5R2qktSQ4S5JDRnuktSQ4S5JDRnuktSQ4S5JDRnuktSQ4S5JDRnuktSQ4S5JDRnuktSQ4S5JDRnuktSQ4S5JDRnuktSQ4S5JDRnuktSQ4S5JDQ16zZ6k9XHfo88OGnfnvuunXIk2Ozt3SWrIcJekhgx3SWrIOXdNzND5YknTZ+cuSQ3ZuWtVduTS5mPnLkkNGe6S1JDhLkkNGe6S1JDhLkkNuVpG2oR8Bo1WY+cuSQ0Z7pLUkOEuSQ0Z7pLUkOEuSQ0Z7pLUkEshpcZcMnn1GtS5J9mf5HSSM0nuXuH4m5M8meQzST6V5PsnX6okaahVwz3JFuB+4CZgD3B7kj3Lhv0r8ONV9X3APcDRSRcqSRpuSOe+FzhTVc9V1cvAg8CB8QFV9amq+o/R5mPA9smWKUlaiyHhvg04O7Z9brTvYn4d+PhKB5IcTLKQZGFxcXF4lZKkNZnoapkkP8lSuN+10vGqOlpV81U1Pzc3N8lTS5LGDFkt8zywY2x7+2jfqyS5EfggcFNVvTiZ8iRJl2NI534S2J1kV5JrgNuA4+MDknw78BHgV6vKF25K0oyt2rlX1fkkh4GHgS3Asao6leTQ6PgR4D3AtwB/kgTgfFXNT69sSdKlDLqJqapOACeW7Tsy9vltwNsmW5ok6XL5+AFJashwl6SGDHdJashwl6SGDHdJashwl6SGDHdJashwl6SGDHdJashwl6SGDHdJashwl6SGDHdJashwl6SGDHdJashwl6SGDHdJashwl6SGDHdJamjQO1TV032PPjvrEiRNiZ27JDVk5y5pTT/F3bnv+ilWokmxc5ekhgx3SWrIcJekhgx3SWrIcJekhgx3SWrIcJekhgx3SWrIcJekhgx3SWrIcJekhgx3SWrIcJekhgx3SWrIcJekhgaFe5L9SU4nOZPk7hWO35DkH5P8T5J3Tb5MSdJarPqyjiRbgPuBfcA54GSS41X11NiwLwJvB26ZSpWSpDUZ0rnvBc5U1XNV9TLwIHBgfEBVvVBVJ4GvTqFGSdIaDXnN3jbg7Nj2OeBHplOOpI1u6Cv5fB3fbK3rBdUkB5MsJFlYXFxcz1NL0lVlSLg/D+wY294+2rdmVXW0quaran5ubu5yvoUkaYAh4X4S2J1kV5JrgNuA49MtS5J0JVadc6+q80kOAw8DW4BjVXUqyaHR8SNJvhVYAN4AvJLkncCeqvryFGuXJF3EkAuqVNUJ4MSyfUfGPv8bS9M1kqQNwDtUJakhw12SGjLcJakhw12SGjLcJamhQatlNHtDb/mWJLBzl6SWDHdJashwl6SGDHdJashwl6SGDHdJashwl6SGXOcuaSp8Hd9s2blLUkOGuyQ1ZLhLUkOGuyQ1ZLhLUkOGuyQ15FJISZuCSyvXxs5dkhqyc58xX8IhaRrs3CWpIcNdkhoy3CWpIcNdkhoy3CWpIVfLSJopV4xNh527JDVk5y6pFe9kXWLnLkkN2bmvkV2BpM3Azl2SGrJznxJXAEiaJTt3SWrIcJekhgZNyyTZD/wRsAX4YFX9/rLjGR2/GfgKcEdVfXrCtV4WL4BKWi8bKW9W7dyTbAHuB24C9gC3J9mzbNhNwO7R10HgAxOuU5K0BkM6973Amap6DiDJg8AB4KmxMQeAv6iqAh5L8sYk11XV5ydeMdO5WOkFUOnqspG67GkYMue+DTg7tn1utG+tYyRJ62Rdl0ImOcjStA3AS0lOr9OptwJfWKdzTZJ1r7/NWrt1T8lvXfzQZdd+ie85xHcMGTQk3J8Hdoxtbx/tW+sYquoocHRIYZOUZKGq5tf7vFfKutffZq3dutffRq99yLTMSWB3kl1JrgFuA44vG3MceEuW/Cjwn9Oab5ckrW7Vzr2qzic5DDzM0lLIY1V1Ksmh0fEjwAmWlkGeYWkp5K9Nr2RJ0moGzblX1QmWAnx835GxzwX8xmRLm6h1nwqaEOtef5u1dutefxu69izlsiSpEx8/IEkNXRXhnuSeJE8meSLJI0m+bdY1DZXkD5I8M6r/o0neOOuahkjyS0lOJXklyYZdUXBBkv1JTic5k+TuWdczVJJjSV5I8tlZ17IWSXYk+USSp0Z/T94x65qGSPINSf45yb+M6v7dWdd0MVfFtEySN1TVl0ef3w7sqapDMy5rkCQ/A/zd6ML2vQBVddeMy1pVku8BXgH+FHhXVS3MuKSLGj1i41lgH0s34J0Ebq+qpy75CzeAJD8GvMTSHeLfO+t6hkpyHXBdVX06yTcDjwO3bPQ/89FztK6tqpeSvA74B+AdVfXYjEv7OldF534h2EeuBTbN/2hV9UhVnR9tPsbSPQQbXlU9XVXrdZPalfraIzaq6mXgwiM2Nryq+iTwxVnXsVZV9fkLDxesqv8CnmYT3NVeS14abb5u9LUh8+SqCHeAJO9LchZ4M/CeWddzmd4KfHzWRTTk4zNmKMlO4AeBf5ptJcMk2ZLkCeAF4NGq2pB1twn3JH+T5LMrfB0AqKp3V9UO4AHg8GyrfbXVah+NeTdwnqX6N4QhdUuXkuSbgIeAdy77CXvDqqr/raofYOmn6L1JNuR0WJvX7FXVTw8c+gBLa/bfO8Vy1mS12pPcAfwc8FO1gS6SrOHPfKMb9PgMTdZozvoh4IGq+sis61mrqvpSkk8A+4ENd0G7Ted+KUl2j20eAJ6ZVS1rNXpRym8DP19VX5l1PU0NecSGJmh0YfJDwNNV9YezrmeoJHMXVqwl+UaWLsJvyDy5WlbLPAR8N0urNz4HHKqqTdGZJTkDvB54cbTrsc2w0ifJrcAfA3PAl4AnqupnZ1vVxSW5GXg///+IjffNuKRBkvwl8BMsPaHw34H3VtWHZlrUAEneBPw98BmW/l0C/M7obvgNK8mNwJ+z9PfkNcCHq+r3ZlvVyq6KcJekq81VMS0jSVcbw12SGjLcJakhw12SGjLcJakhw12SGjLcJakhw12SGvo/i2tcXMAR/+cAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(normal_array, bins=30, normed=True, alpha=0.5);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Even better, you can use Seaborn's distplot, which overlays a kernel density estimate."
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(normal_array)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\n"
]
},
{
"data": {
"text/plain": [
"array([ 0.8, 0.1, 0.2, 0.4, 0.6])"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grid = np.arange(0., 1.01, 0.1)\n",
"print(grid)\n",
"np.random.choice(grid, 5, replace=False)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0. , 0.8, 0. , 0.6, 1. , 0.6, 0. , 0.8, 0.6, 0.3, 0.6,\n",
" 0. , 0.7, 1. , 0.6, 0.8, 0.2, 0.3, 0.2, 0.6, 0.6, 0.8,\n",
" 0.8, 0.6, 0.9])"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.random.choice(grid, 25, replace=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Vector operations\n",
"\n",
"What does this mean? It means that instead of adding two arrays, element by element, you can just say: add the two arrays. Note that this behavior is very different from python lists."
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 2., 2., 2., 2., 2.])"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first = np.ones(5)\n",
"second = np.ones(5)\n",
"first + second"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numpy supports a concept known as *broadcasting*, which dictates how arrays of different sizes are combined together. There are too many rules to list here, but importantly, multiplying an array by a number multiplies each element by the number. Adding a number adds the number to each element."
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 2. 2. 2. 2. 2.]\n",
"[ 4. 4. 4. 4. 4.]\n",
"[ 1. 1. 1. 1. 1.]\n",
"5.0\n"
]
}
],
"source": [
"print(first + 1)\n",
"print(first*4)\n",
"print(first*second) # itemwise\n",
"print(first@second) # dot product, identical to np.dot(first, second)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2D arrays\n",
"Similarly, we can create two-dimensional arrays."
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1. 1. 1. 1.]\n",
" [ 1. 1. 1. 1.]\n",
" [ 1. 1. 1. 1.]]\n",
"[[ 0.99510521 0.99719296 0.99950497 0.99616235]\n",
" [ 0.9913809 1.00196707 1.00545023 1.00486261]\n",
" [ 1.01868421 0.99814142 1.00291637 0.99805381]]\n",
"[[ 1. 0. 0.]\n",
" [ 0. 1. 0.]\n",
" [ 0. 0. 1.]]\n"
]
}
],
"source": [
"my_array2d = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ])\n",
"\n",
"# 3 x 4 array of ones\n",
"ones_2d = np.ones([3, 4])\n",
"print(ones_2d)\n",
"# 3 x 4 array of ones with random noise\n",
"ones_noise = ones_2d + .01*np.random.randn(3, 4)\n",
"print(ones_noise)\n",
"# 3 x 3 identity matrix\n",
"my_identity = np.eye(3)\n",
"print(my_identity)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numpy arrays have set length (array dimensions), can be sliced, and can be iterated over with loop. Below is a schematic illustrating slicing two-dimensional arrays. \n",
"\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Earlier when we generated the one-dimensional arrays of ones and random numbers, we gave `ones` and `random` the number of elements we wanted in the arrays. In two dimensions, we need to provide the shape of the array, ie, the number of rows and columns of the array."
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1., 1., 1., 1.],\n",
" [ 1., 1., 1., 1.],\n",
" [ 1., 1., 1., 1.]])"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"onesarray = np.ones([3,4])\n",
"onesarray"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3, 4)\n"
]
},
{
"data": {
"text/plain": [
"array([[ 1., 1., 1.],\n",
" [ 1., 1., 1.],\n",
" [ 1., 1., 1.],\n",
" [ 1., 1., 1.]])"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(onesarray.shape)\n",
"onesarray.T"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(4, 3)"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"onesarray.T.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Matrix multiplication is accomplished by `np.dot` (or `@`). "
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 4. 4. 4.]\n",
" [ 4. 4. 4.]\n",
" [ 4. 4. 4.]]\n"
]
},
{
"data": {
"text/plain": [
"array([[ 3., 3., 3., 3.],\n",
" [ 3., 3., 3., 3.],\n",
" [ 3., 3., 3., 3.],\n",
" [ 3., 3., 3., 3.]])"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(np.dot(onesarray, onesarray.T)) # 3 x 3 matrix\n",
"np.dot(onesarray.T, onesarray) # 4 x 4 matrix"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"12.0"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sum(onesarray)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The axis 0 is the one going downwards (the $y$-axis, so to speak), whereas axis 1 is the one going across (the $x$-axis). You will often use functions such as `mean`, `sum`, with an axis."
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([ 3., 3., 3., 3.]), array([ 4., 4., 4.]))"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sum(onesarray, axis=0), np.sum(onesarray, axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simulating a simple election model\n",
"\n",
"\n",
"Say you toss a coin and have a model which says that the probability of heads is 0.5 (you have figured this out from symmetry, or physics, or something). Still, there will be sequences of flips in which more or less than half the flips are heads. These **fluctuations** induce a distribution on the number of heads (say k) in N coin tosses (this is a binomial distribution).\n",
"\n",
"Similarly, here, if the probability of Romney winning in Arizona is 0.938, it means that if somehow, there were 10000 replications (as if we were running the election in 10000 parallel universes) with an election each, Romney would win in 9380 of those Arizonas **on the average** across the replications. And there would be some replications with Romney winning more, and some with less. We can run these **simulated** universes or replications on a computer though not in real life.\n",
"\n",
"\n",
"To do this, \n",
"we will assume that the outcome in each state is the result of an independent coin flip whose probability of coming up Obama is given by the Predictwise state-wise win probabilities. Lets write a function `simulate_election` that uses this **predictive model** to simulate the outcome of the election given a table of probabilities.\n",
"\n",
"### Bernoulli Random Variables (in scipy.stats)\n",
"\n",
"The **Bernoulli Distribution** represents the distribution for coin flips. Let the random variable X represent such a coin flip, where X=1 is heads, and X=0 is tails. Let us further say that the probability of heads is p (p=0.5 is a fair coin). \n",
"\n",
"We then say:\n",
"\n",
"$$X \\sim Bernoulli(p),$$\n",
"\n",
"which is to be read as **X has distribution Bernoulli(p)**. The **probability distribution function (pdf)** or **probability mass function** associated with the Bernoulli distribution is\n",
"\n",
"$$\\begin{eqnarray}\n",
"P(X = 1) &=& p \\\\\n",
"P(X = 0) &=& 1 - p \n",
"\\end{eqnarray}$$\n",
"\n",
"for p in the range 0 to 1. \n",
"The **pdf**, or the probability that random variable $X=x$ may thus be written as \n",
"\n",
"$$P(X=x) = p^x(1-p)^{1-x}$$\n",
"\n",
"for x in the set {0,1}.\n",
"\n",
"The Predictwise probability of Obama winning in each state is a Bernoulli Parameter. You can think of it as a different loaded coin being tossed in each state, and thus there is a bernoulli distribution for each state"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note: **some of the code, and ALL of the visual style for the distribution plots below was shamelessly stolen from https://gist.github.com/mattions/6113437/ **."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 0 0 0 1]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from scipy.stats import bernoulli\n",
"#bernoulli random variable\n",
"brv=bernoulli(p=0.3)\n",
"print(brv.rvs(size=20))\n",
"event_space=[0,1]\n",
"plt.figure(figsize=(12,8))\n",
"colors=sns.color_palette()\n",
"for i, p in enumerate([0.1, 0.2, 0.5, 0.7]):\n",
" ax = plt.subplot(1, 4, i+1)\n",
" plt.bar(event_space, bernoulli.pmf(event_space, p), label=p, color=colors[i], alpha=0.5)\n",
" plt.plot(event_space, bernoulli.cdf(event_space, p), color=colors[i], alpha=0.5)\n",
"\n",
" ax.xaxis.set_ticks(event_space)\n",
" \n",
" plt.ylim((0,1))\n",
" plt.legend(loc=0)\n",
" if i == 0:\n",
" plt.ylabel(\"PDF at $k$\")\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Running the simulation using the Uniform distribution\n",
"\n",
"In the code below, each column simulates a single outcome from the 50 states + DC by choosing a random number between 0 and 1. Obama wins that simulation if the random number is $<$ the win probability. If he wins that simulation, we add in the electoral votes for that state, otherwise we dont. We do this `n_sim` times and return a list of total Obama electoral votes in each simulation."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([328, 319, 308, ..., 329, 272, 332])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_sim = 10000\n",
"simulations = np.random.uniform(size=(51, n_sim))\n",
"obama_votes = (simulations < predictwise.Obama.values.reshape(-1, 1)) * predictwise.Votes.values.reshape(-1, 1)\n",
"#summing over rows gives the total electoral votes for each simulation\n",
"obama_votes.sum(axis=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first thing to pick up on here is that `np.random.uniform` gives you a random number between 0 and 1, uniformly. In other words, the number is equally likely to be between 0 and 0.1, 0.1 and 0.2, and so on. This is a very intuitive idea, but it is formalized by the notion of the **Uniform Distribution**.\n",
"\n",
"We then say:\n",
"\n",
"$$X \\sim Uniform([0,1),$$\n",
"\n",
"which is to be read as **X has distribution Uniform([0,1])**. The **probability distribution function (pdf)** associated with the Uniform distribution is\n",
"\n",
"\\begin{eqnarray}\n",
"P(X = x) &=& 1 \\, for \\, x \\in [0,1] \\\\\n",
"P(X = x) &=& 0 \\, for \\, x \\notin [0,1]\n",
"\\end{eqnarray}\n",
"\n",
"What assigning the vote to Obama when the random variable **drawn** from the Uniform distribution is less than the Predictwise probability of Obama winning (which is a Bernoulli Parameter) does for us is this: if we have a large number of simulations and $p_{Obama}=0.7$ , then 70\\% of the time, the random numbes drawn will be below 0.7. And then, assigning those as Obama wins will hew to the frequentist notion of probability of the Obama win. But remember, of course, that in 30% of the simulations, Obama wont win, and this will induce fluctuations and a distribution on the total number of electoral college votes that Obama gets. And this is what we will see in the histogram below. "
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"def simulate_election(model, n_sim):\n",
" simulations = np.random.uniform(size=(51, n_sim))\n",
" obama_votes = (simulations < model.Obama.values.reshape(-1, 1)) * model.Votes.values.reshape(-1, 1)\n",
" #summing over rows gives the total electoral votes for each simulation\n",
" return obama_votes.sum(axis=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Running the simulation using the Bernoulli distribution\n",
"\n",
"We can directly use the Bernoulli distribution instead"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 333., 327., 333., ..., 332., 322., 299.])"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_sim=10000\n",
"simulations = np.zeros(shape=(51, n_sim))\n",
"obama_votes = np.zeros(shape=(51, n_sim))\n",
"for i in range(51):\n",
" simulations[i,:] = bernoulli(p=predictwise.Obama.values[i]).rvs(size=n_sim)\n",
" obama_votes[i,:] = simulations[i]*predictwise.Votes.values[i]\n",
"obama_votes.sum(axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def simulate_election2(model, n_sim):\n",
" simulations = np.zeros(shape=(51, n_sim))\n",
" obama_votes = np.zeros(shape=(51, n_sim))\n",
" for i in range(51):\n",
" simulations[i,:] = bernoulli(p=predictwise.Obama.values[i]).rvs(size=n_sim)\n",
" obama_votes[i,:] = simulations[i]*predictwise.Votes.values[i]\n",
" return obama_votes.sum(axis=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following code takes the necessary probabilities for the Predictwise data, and runs 10000 simulations. If you think of this in terms of our coins, think of it as having 51 biased coins, one for each state, and tossing them 10,000 times each.\n",
"\n",
"We use the results to compute the number of simulations, according to this predictive model, that Obama wins the election (i.e., the probability that he receives 269 or more electoral college votes)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9960\n"
]
}
],
"source": [
"result = simulate_election(predictwise, 10000)\n",
"print((result >= 269).sum())"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9947\n"
]
}
],
"source": [
"result2 = simulate_election2(predictwise, 10000)\n",
"print((result2 >= 269).sum())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are roughly only 50 simulations in which Romney wins the election!\n",
"\n",
"## Displaying the prediction\n",
"\n",
"Now, lets visualize the simulation. We will build a histogram from the result of `simulate_election`. We will **normalize** the histogram by dividing the frequency of a vote tally by the number of simulations. We'll overplot the \"victory threshold\" of 269 votes as a vertical black line and the result (Obama winning 332 votes) as a vertical red line.\n",
"\n",
"We also compute the number of votes at the 5th and 95th quantiles, which we call the spread, and display it (this is an estimate of the outcome's uncertainty). By 5th quantile we mean that if we ordered the number of votes Obama gets in each simulation in increasing order, the 5th quantile is the number below which 5\\% of the simulations lie. \n",
"\n",
"We also display the probability of an Obama victory \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"def plot_simulation(simulation): \n",
" plt.hist(simulation, bins=np.arange(200, 538, 1), \n",
" label='simulations', align='left', normed=True)\n",
" plt.axvline(332, 0, .5, color='r', label='Actual Outcome')\n",
" plt.axvline(269, 0, .5, color='k', label='Victory Threshold')\n",
" p05 = np.percentile(simulation, 5.)\n",
" p95 = np.percentile(simulation, 95.)\n",
" iq = int(p95 - p05)\n",
" pwin = ((simulation >= 269).mean() * 100)\n",
" plt.title(\"Chance of Obama Victory: %0.2f%%, Spread: %d votes\" % (pwin, iq))\n",
" plt.legend(frameon=False, loc='upper left')\n",
" plt.xlabel(\"Obama Electoral College Votes\")\n",
" plt.ylabel(\"Probability\")\n",
" sns.despine()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAI1CAYAAADSCbU+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4FEX+x/H3FyEJ930qh4iCJ6gRAbMSURCJEm+URYMH4rGK4qJyadZFkd0FVFDWY38c4oqCiHJ7Aiq6ingiCAp4IMoRAeUKR/3+qJ4wmUySSQhmhM/refpJprqqunqme6a+3dXd5pxDREREREQkXpQp7QaIiIiIiIiEU5AiIiIiIiJxRUGKiIiIiIjEFQUpIiIiIiISVxSkiIiIiIhIXFGQIiIiIiIicUVBikgEM5tnZro3dxGY2eFm9l8zW2Nme81s0wFcVqqZOTPLPFDLOBiYWWbwPqWWdltEDiZmVjbYt14v7baIHMwUpMghwcxON7NxZvaNmW0Lpq/M7Ekza1Pa7TsIjAeuAN4E/g48FEuh4Me+l5m9aWYbzGynmf1oZi+aWacD2eA/AjNrHnSGPo8h76Qg7yUltOyDKlg3sxpmNjz4DthpZuvN7AUzOzaf/IeZWR8z+zj4vtgcvCdpxVx+CzObYGY/hG3ns82sfZS8ZYJlf25m24O2TjKzo6LkLW9mDwf1bjSzKWbWIEo+M7OFZja7OO0vYL0uNLO5wf67y8zWBe/ZGAXIsTOz84LtYYOZ7TCzVWb2nJkdHpHvFDMbamavBp+3M7NppdXuaMxsSNCulNJui/yxlS3tBogcSGZ2GDACuA3IBt4AXgL2AM2AbkAvM7vaOfdMqTX0D8zMEoGzgFedc1cVoVxdYDpwGvADMBXYADQBzgcuNrOxwA3Oud0l3e4/AufcV2a2EGhnZsnOuUXR8plZdeBC/Pv3SpA8GpgEfPe7NDaOmVlt4D3gKOBd/HfAEcDFQBczSw1/b82sDDAF/55+DTwNlAfSgRlmdrNzbkwRlp8OvADsxH8+3wG1gGSgDTA/osjTwDXAEuBRoD7+u6qTmbVzzi0LyzsSuAH/Wf8SlGtsZqc75/aG5bsBaAWcEGu7Y1ivB4ABwG/4ffk7IBFoCVwLVAbmldTyDlZm9hBwN/A9MBnYBBwOpAINgTVh2S8G7sFvS98ANX7Ptor8nhSkyMHuQXyA8hFwqXNudfhMM6uM/3Go9vs37aBRF39W9qdYC5hZOXxn7TTgCaCPc25n2Py6+I7kNfiO150l2eA/mP8D2gE9gahBCnAlvnM4xjm3C8A5twEftIg/u3cU8A/n3N2hxOBI73zg/8yspXMudObocnyAsgA41zm3I8g/EP9dMsLMZjjnvi9swcHZj//ig52OzrkfI+aXjXjdEb/dzwuWnR2kTwTmAI8BZwdphwV5n3DO3RSkLcJvM6cQbC/B/vQQ8Hfn3MpC360YmFkzoD+wGmjjnPs5Yn414LiSWNbBzMyuxP8GPQ9cHfq8w+ZH9tMm4QPoJUBjYMXv0U6RUuGc06TpoJyAo/FnTNYDtQvJmxj2/zzAAeWATGAV/qjVcuDmKGUbAPcDHwTL2onvkPwLqBwlf5HqD8okAf2AxfijlluAT4AhQLmIvCfjj8b9zL6jbUOBSkV8/3rhOzlbgV+Bt4GL8lmXyCkzhrpdUN7yyVMb38neAxwTlp4aWkbw/9vBe7IReAaoH6Wui/CdgJXAdnzg8zpwTpS84fWHOrG/AWvxHb3DgnzXAJ8H9a0ErotS1zHAP4PP6hdgB75zMSjycyvgvaoUtn6J+eT5MGjziWFpmUFaapT8l+LPKv4StP9rfLDYKJgf7TN1wLiibiORbcEfYf84WO404G/BvMvyWbcBwfzu+/FdsBbYDZSPMm96UP+fwtKeC9I6Rcl/ZzBvcIzL/r8g/xkx5n8hyN8uyrxXg3lNg9cNgtfXh+U5MUi7OCztv8F2F9M2F2M7uwfL+VcRykwMyjQGBgf7zQ7gK6APEd8FwPVB/h74ffj9YF9YFJanDHAj/vv3t2B6F0iPsvwWwHDg07Btf0mwjUV9b/DDWD8J2vkDfn+uFLTr9f18Dy3Y936hiN/PQflmQTumFbHc/UG5PPtqML9fMP/qiLb2xgfp2/C/QfOBrhFl3yH6d8fXEfmOxg8TXoMf5fA9/uxvrSjt6QS8hj8QthO/P78JXF5S27Om+JxKvQGaNB2oCXgg+HIcUsRy84JyU/DDF54AHsd3mB3QKyL/FfgO2jTgYfzwi4VB3g8if/yKUX8F/FAVB3wZ1D8CmBV8uVcLy3tR8CX+K77D/k98Z9Thf+ATYnwPHg/KrA6WNRpYF6T1C8vXM1hnF/yQZwZTaiH1h96fPJ3AiHxDg3wPhKWlBmlzg3V9EX/GLNSBWwnUjKhnadC+sUGd4/BDKvYQ1pmLqH82/sd4Cr5j82WQPgz4K5AV1Dc67LM7K6Kue4J5L+CD1lHAZxSxYxEsJ2pHHj98xwEfRqRnEiVIwQ8fcvgg9kl84PV8sD4XhpVdzb5gLTRdWNRtJKIts/GdyOeC5Q4EGgWfw+wo6xbqxGUBSWHpoc5ujxjfv73Amnzmhd6P+8LS3grSjo6S/+Jg3lsxLLcMvjP3U/D6dHyQ0xdIyafMOmAzUCbKvDuCZV8TvD4Mvw88FpYnI8iTHLzuFKx/1OUVdwI6B8t5pQhlQp/bjGD7GxVsO98G6cMj8oeClNn477opwXbzz7D398Ugz+fBNvh4WH23RNQ3CH8gKXx//DzIOyVKe28I5m3En8EaEWzvM4gSpADnREsv4P1IDvJPwo9suQD/nXETYQdmCihf3CCleX7rHMz/BH/goVJY2pNBmVXB+/BY8F464I6wfNfiz0A6fICeGUy3heVJCfaLHcFn8Q/8wYK9+IN14b9pFwZ1rcH/Vj4Y1Ps5MKkkt2lN8TeVegM0aTpQE/s6Gh2KWG4e+zr1VcLSmwO7gGUR+WsDFaPUM4goHali1D8iyP8UER0X/FCrssH/tYIv/pVAg4h8oSNjf41h/VODvJ9G/Eg1wB/B2gUcFZbehChH2Quovyy+w7GLsI5nPnk7BnW/GaV9Drg2Iv/fg/RREelHRqm7Lv7IaOQRvvD6u4SlVwzWf1tQrnHYvFOD/DMi6mpARGCI73g/FeSPqeMI/CnIPyvKvH8F826KSM8kIkgBugZpHwFVI/KXB2pEbqcltI2E2rIFOD5KfbPwgcoR+Szn0Yj0ogYp6yn8TMqzYWmTKfxMStSgJyJvqDP4HvCfsO0qNL0e/jkAVYP0j/Op7/xg/oNhaU/gO3fP4jvpW/Fn1srgz8B+DTwdy/tUlAmogu84uuDzu5rgDE8BZUKf249A3Yi6lgXr0SosPRSk7CbsTFfY/FtC2wdh3434Mx2L8J3gemHph5P3oJGx7yBAm7D0GviA+hdy7+uhtpZEkNI7yP/voL3h28ZeIoK2KOWLFaQEZT8M3p/I74Hjgzr/G2W9FhP2W4e/rutn/Pd5k7D0IeTz/YYflvo9PvBrHjHvyqDcw2Fpr+DPeEU7w5InTdPBNZV6AzRpOlAT/ui5i/wijKHcPKIcFY+Yl2cYV5S8NYjSeS9K/fgO/ZbgC71KIcvrG5TNcwoc32FZR9gwiQLqCf1gRxu289dg3r1haU2irWcB9dcN8q+NIW+LIO+XYWmpQdoy8g4PqYg/6v5L5Lx86g8dRW8Spf43ouR/OpiXZ6gPvjP4bYzvwSlBPZlF2C6X4ztr9cPSyuKHQGwn7OhjMC+TvEHK7Pw6D/ltiyW0jYTaEnVoEPuOlg6KSH8mSG8ZkV4/2DYK3CfC8k8I6hkakd4ueE8dMDMs/dog7S1yDwWthT/76YCtMSw3hX2d7E34TlhV/DDAacG858LyNwrS5uVTXyhYDT9zUiHYjtfgvyemAIcH84bg9/sawfs1Dx9AriWGAxYxrF9r/FCt8M71BnyQd3aU/KEg5a4o864m4mwK+4KUqEfM8Wc3NxJlqFbYNnVjjOuRa/sL2wYeKqCtkUFKheB9bhjj+xc6kLU7WJcz8AHWGew7c9u7gPL7E6TcHpS9LiL9wSA9Lcp+eEGUeu4J5g0ISysoSLk8mNc3n3Z9QnDmMXj9Cv43sGqs66bp4Jl04bxI/j6KkvZD8LcafkgVAGZ2Gf6oWCugOrlv711/P+pvgb9Dzmzn3JZC2nt68PcMM4t2wequoL7CtAz+Rt5xCPbdqadllHm/t3dd8CsW4pzbamaf4O821hg/NAMzq4e/yPc8/N1ykiLqqh/KG+bTKMtcW8C8n9j3GRAstwxwHX5Y3PH4o7AWsdxYjcV3IK7CD48A6IIP+v7rnIvl2TSnAducc+8UYbnRFHcbye/C/xn4o+vXmNkDzjlnZlWBS/CBda732zm3ln2fRSwG4Yc93WNmZ+CHYR6OH7q1BDgJf+Q65Bn8sKlU4HMzm4PfZtLxn3PDiPz5CX0PHIbvxD0XvN5sZlfgA89uZnani7igPlbOuW34m4PcFp4e3Fq5H/66oc34szlb8WdjWgP/NLOVzrmpxVlusOwPguX8Cb/PnRr8fylwqZk96JwbGKXo21HSQttkTNuNmVUBjsXvtwPNLDJL3eBvi7AyZfBDuK6i8P0x1I5o+0rU/Sf4LJZFm5eP0PZh+INLXwSv3zWzbvjvmb74s2Ul7Tn8Wdg/48/yYf5N7I4/8zg3LG9J/iaEviNPtOjPukoE6ppZteA77Xn8MLglZvYc/sDBOzH8HspBQEGKHMx+wv9AHY4/2lck+XwJhm6Fe1gowcz64TuN6/BHqtfgT6MD3If/0i1u/VWDv7F0YEK3orytwFyFqwLsds5lRZn3U1ie4tqID5hqmVmSC+6clI8jgr/ROqTr8ikTustQVfDPx8B3So/Ady5m4ztte/Gd0PZE/4yifT57Cpi3m7zfqaOAm/Fj5Kfi379sfBDaJ5/l5mc8fjhbT/YFKdcEf/8vxjqqBm3ZX8XdRn6OkoZzbndwu+mB+M7um/jOUnmCDtT+cM59Z2an4S/S74y/7e93+OBlDX6o1Lqw/LvM7Fx8YHsl/gDEJvxn+Aj+LG1+21+4zWH/T49o0w7zDwO8Bn9m7cew/FWJLpS+OZ/5QE5n8wl8ID/BzM7Hn7053Tn3ATDXzDrgr3EpdpASrMdefOd1frDssvizEI8DA8zshcggk+jvXa79Np954aoHf5vgv2fzUzHs/zH4IGU1/lqW0FClGsCt5N4fQ+1YH2N7iiP0Oa4OC1AAcM59bmargWPMrJJz7rcSWmao/p+D7a+jmR3hnPsBfwanMTDa5b7texVgRz6/WUX9TQj9TvUsJF9FYJNz7lkz24nfVvviz9TuNrNZ+GthSuRudRKfFKTIwWwhvhPaAd/pKXHBD/IgfAejpfO3fQ3Nq0vBP56xCB0dz/NwtihCPyDHutzPUSiqLUBZM6sRpRNaNyxPsQQd0kVAW+BM/AXv+ekQ/H0vyrw6+ZQJtTHUAbgOf+R7oHPuwfCMZjYGH6SUuODzvwl/NLStc2572LzT8UFKzJxzP5rZXPxzPU7HX3uUhu9wxbp9b6JoZ2/yU9xtxEVJC3kaHxRci1+f6/DX//x3P9vqF+xvF3xtZLqZDQn+XRSRfwd+/70vIv850fLnYwV+nY3ogUUorXywzM1mth5oamZlXO7nnIC/I1Ko3oJciz9bclLwunnw95OwPB/jzyiUqKBz+6T5h1R2x38HRwYpdfB3HQwXud/mqjZKWmj7etc5V+hDA4MHXPbCX1dxRvjBkeDs2q0RRULtqB2lurpR0opjecSyIoVvHyUapASeBc7FB+L/xJ9VCaWH24J/9k5l59yvEfOK+psQytfROfd6LAWcc1OAKcFtrVPwzwzqATQ3sxPcIfocrUOBnjgvB7Nx+KPlN5hZrYIyBg8kLI5a+CNI74UHKIEzillnuK/ww75OD4Y3FOSD4G+b/VxmqCNzZpR57SPyFNe44O89+WUIPrNe+M9wQpQsZ1jEGA8zq4gfcreJfWcMQk/pfiUir+EDpQPlSHzn9PXwACVQ3G0jdMbkGnyHohz+WqCCOv/hPgQqxPgk6D2Q8yyOSCW+jTj/DKPXgEuCDu6pwOQDOawjOMjQDX80PdYzCqGO3KTCMgbDf0L7ZbQn24fSws9uzcd/p0Tbj88L/i7Ib5nBgyv/gb+WYnnE7MSI/2Pdbooj1KnOMw4LPyQsUmibjDaUMg/n3C/468BOMLNKMRRpGrTltShnb6Ptj6F2RNtXSupJ6gvx295RZpYQPiN43ZR9tx8/EF7CHwjoETy76jL8jUTej8gX2pejHdCJtr+HzjhH++4o9u+Uc26Tc26G8w8NnokPvpsXUkz+wBSkyEHLObcCP+a2NjDTzBpH5jGzysFTk28o5mLW4Yd2nWJm5cPqrY+/fmC/BEeInsKfIv9XMKY6h5nVCXvY11j8D9pQM8vzxW1mVc3s5BgWGwoI7gs6/aHy9QhOtbP/R7fH4TvMZ5nZ6Cg/0HXwFxbXAkZG6WyB/3G6JiLtHvwwkIlhHffQE9cjOyK3c2CvrQktt214MGVmx+DPGBTHK/gLk7uxL4AbV4TyoaekPxJc85HDzJKCoXEhoTMkDaPUc6C2kSfx136EykYd6mVm9c2sRQyBeyh/OTNLikg7DH/nvGbAIy7vwwjz1B1cR3I1/s58L0fMaxS0qXxEsX8HfzODjmAo/5n462RWkfv6tCeDvw+E7xdm1gl/l6U3nXORZyHCDcdvI0PD0pYGf7sEdZXF3zlvaXhBM5toZs7MehRQfyhvGzPrHrnvBvOOwV/vA9Gv37g9ONMYyl+Ffc/DmVjYssOMwg/Leizy8w3qPSHsAFVof2wXsT+2wD9MMdI0/DU8vcN/O8w/AHhAtMaYWYVgG4i2z+ThnNuMvzakCnBXxOy7g/SXopxRKxHBELJp+DNufwVqkvcsCuzb3zMjfuca4Idg7cKvR0hB3x1T8SMP7jGz1pEzg/ewddjrP0X53TsM/9sA+4ZWy0FIw73kYDcAf6r8VmB5MAb3S3zn7ij8D3UVijnswTm3NxgydAfwsZnNxAcU5+OPiJbEUZ7B+A52L/zZg7n49h+DP1VfFz92d52Z/Rl/oeHnwZjdFfixvUfih12Mxz/4rKB1mhes001BPS8BCfi7stTB35mnoE5SoZxz2WaWjr9g+hagq5nNxh8xbIx//6rgO+D5nW15FRhjZmn4M07J+M9zFf5uUiHP4H/wR5tZKv4ahGT8kbyZ+CFTJS4YnvUS/tk1H5rZW/hhe13xF6VeUow6d5l/8vjt+OtaXnfOxXyNiXNuupmNYt/+MA3foWiEv1bjOnynBfyQq0uBF4PPZgfwqXNu+gHcRqbjx/s3AL5yzkW7wBr2DU25itg6tYcDn5jZq/jhcYn4fad5sMxBUcp8ZGYr8R35nfjt5Uz80fvLo3Qc/4vfT/9E7o75BPxnfT6wOPgOqoN/b7Pxz0UKHXnGOfeamY3Dj9n/KNiP6+Pf2834/SUqMzsLPwymo3NuZ9isufh95KngLNrJ+KFj/SKqCHUGYxk+cwS+Q/uYmc1n39ClZvh9KgF43DkXbVjcYuAzM3sB38G9BL8NjnDOfRzDskNG4+/QdjWQamZvsm/7ORF/VvU0YENwXdJ0/EXY/zOzecE6dAXmELE/OueyzCx00fpiM5uE3wcuAb4g+nd7O/zZwDfwAWUs7sZvV38PAtfP8EFDR/ytenMFUOZvihIKaCoHf08JthmAn51z0YKu/DyLH5b3t7DXuTjnXjezp/C/QV8E3xuJ+IMltfB36lodVuQtfMA5zMxa4rfbLOfc48657eZvNDMLeC/YJ5fi+6NN8L9TC/D7C/gDK7XM7B38vlsGOBv/Hk3b398iiXP7e3swTZr+CBO+gzEOPw56G/7HZgX+SG3riLzzyP/Wq+PIe8vaBOBefOdlR7CMzCA9z+1Ei1p/kF4ef/Q99ITzzfjT6/eT977/xwX1fI/vBG3AdwoeAlrE+H4Z/gcp9HTh3/B35Lk4St4mFOEWxBFly+EvSn4LH6Bk4y+Snwqcm0+Z1GB5mex74vxWfGf7GSKeEROUORnfefgleO/m4jsvmeS9TW9O/VHqyZO/oM8V34l4GD+cJ/S0+dvwQWNx37PQE8UdcGUB+Qpq6xX4jsCW4PNdgT/i3zAsT1n8gyu/xXckc7W3iNtIvm2Jkjf0XKA8t6kNy1PU56RUDbaNlfj9Zwv+qeTXEuWhiUGZv+M7jL+y78nkfyOfJ4Oz70nb0W67Wg4fbC/DBzxZ+GDwlHzqOgwfiC4JtpsN+IMPzQpYx0R8IPJMPvOPwQeeoSen3x4lz2f4oZKF3u4VfxChB75T+2VQLrT/zgQuKeBza4w/+LIqeD+WU8gT5wtoh+GD1XlBG3YE2+wc/HdLhYg2PxrM344PNv6CD9gcUZ4ng99XPg3auYYCnjhPEZ+TElauDr4zHnr6+g/B63pR8oaWkd/0dRGXXRYf2Dngf4W8zzfif0u2B/vFAsIe8BqR/1r879WOaO0KtoHH8ftkaJ/4DH9jiuSwfFfib2kd+u3Owp+Fv4UYH06s6Y87WbARiIiIlDozewN/ZPkIFzEESw4c8xclbwSGOeeiDmcqgWVMxJ8Ba+j83aRERPKla1JERCQumFkr/B3dXlKA8rtrhz+i/XBpN0REBHRNioiIlDIz644f45+BvzPQA6XbokOPc24W/onpIiJxQUGKiIiUthvwF5yvBK5yeR/+JyIihxhdkyIiIiIiInFF16SIiIiIiEhc0XCv/dC5c2c3Z86c0m6GiIiIiEg8ssKzRKczKfthw4YNpd0EEREREZGDjoIUERERERGJKwpSREREREQkrihIERERERGRuKIgRURERERE4oqCFBERERERiSsKUkREREREJK6UapBiZg3NbIqZbTazLWY21cwaxVj2QTN71cw2mpkzs55R8hxjZqPM7Esz+83M1prZK2bWssRXRkRERERESkSpBSlmVgF4E2gBZABXAUcDb5lZxRiquBUoD8woIE8noAMwDugK3AzUBt43s1OL3XgRERERETlgSvOJ872ApkBz59zXAGb2GbAC6A2MKKR8VefcXjNrBlydT55JwGPOORdKMLM3gdVAnwLKiYiIiIhIKSnN4V5dgfdDAQqAc24V8C6QXlhh59zeGPJsCA9QgrTNwHLg8CK3WEREREREDrjSDFKOB76Ikr4EOO5ALdTMagAnAEsP1DJERERERKT4SjNIqQH8EiU9C6h+AJc7CjDg4eIUNrOPQlPJNktERERERKB0r0n53ZlZf6A7cF34MDMREREREYkfpXkm5ReinzHJ7wzLfjGzG4EHgUHOuf8rbj3OuVNDU8m17o+pV69emBl33HFHset4+OGHmTp1agm2Krpx48ZhZqxevbrQvHv27GHMmDG0bt2aypUrU6lSJU477TQef/xx9uzZU6zlb9q0iczMTBYvXlys8iIiIiKHktIMUpbgr0uJdBzwZUkuyMyuAh4HhjvnHijJug9V27dv54UXXgDgv//9L7t37y5WPb9XkBKrXbt20bVrV/r06UNKSgovvvgiL730EmeeeSZ33HEH6enpxVrXTZs28be//U1BioiIiEgMSjNIeQVoY2ZNQwlm1gQ4I5hXIszsImAs8LRz7q8lVe+hbtq0aWzZsoUuXbqwbt065syZU9pNKhEPPPAAs2bNYvLkyYwYMYJOnTrRsWNHhg8fzgsvvMDMmTN54AHFuSIiIiIHUmkGKU/hn1fyspmlm1lX4GXge+CJUCYza2xmu83s3vDCZtbezC4FOgdJyWZ2aZAWynMm8BzwKTDOzNqETScf0LU7yI0fP57q1aszbtw4ypcvz/jx46Pm+/TTT7nooouoWbMm5cuXp3nz5gwdOhSAJk2a8O233/Lss89iZpgZPXv2BKBnz540adIkT32pqamkpqbmvN6xYwd33HEHJ5xwApUqVaJevXpccMEFLFu2rMjrtHPnTh5++GG6dOlCenreu2Cnp6dz3nnn8fDDD7Nz504g/2FkmZmZmBkAq1ev5sgjjwT2DZEzM8aNG5eT/6WXXuKMM86gUqVKVKlShdatW/PKK/ti9S1btvCXv/yFBg0akJiYSPPmzRk5ciThd9ieN28eZsa0adPo3bs3NWrUoFq1atx+++3s2bOHDz/8kJSUFCpWrMjxxx/P3Llz86zj/PnzOfvss6lcuTIVK1bk3HPP5Ysvot2ET0REROTAKbUL551zW82sAzASeAZ/x603gNudc7+FZTXgMPIGVH8D2oe9viWYQmXAP20+ETgF//yVcN8CTfZvLQ5NP/74I6+//jq9evWidu3aXHjhhUydOpVffvmF6tX3XWb0wQcfkJqaSrNmzRg5ciRHHHEEK1as4LPPPgN8x7xLly60bNmSzMxMAGrXrl2ktuzcuZMtW7bQv39/Dj/8cH755Rcef/xx2rZty9KlS6lXr17MdX300Uds3ryZrl275puna9euzJ49m8WLF9O2bduY6q1fvz5Tp07l4osvpn///jn1H3XUUQCMGjWK2267jQsvvJDx48dTqVIlFi9enBP47N27l7S0NBYvXsz999/PiSeeyMyZM+nbty/r16/nwQcfzLW822+/nYsvvpjnn3+eBQsWMGTIEPbs2cPrr79Ov379OPzwwxkyZAgXX3wx3377LbVq1QJg5syZpKenk5aWxsSJEwEYNmwYf/rTn/jss89o2LBhzO+liIiIyP4o1bt7Oee+Ay4pJM9q9gUd4empMdSfCWQWq3EH0sknw88/l3YroG5d+PjjIhebOHEie/bs4eqrrwYgIyOD5557jueff54bb7wxJ99f//pXatasyfvvv0+FChUA6NChQ878k08+mcTERGrVqkWbNm2KtQpVq1blP//5T87rPXv2cO6551K3bl2ee+65Il3U//333wNEPYMTEpr3/fffxxykJCYmcvLJ/sRd06ZNc63rli1bGDBgABdddFGua3POPffcnP9nzZrFO++8w9ixY3PONHXq1ImtW7cyfPhw+vbtmxNogH+PR4wYAUDHjh2ZOXMmo0eP5u233yYlJQXwgVPLli2ZOXMmGRlOBos3AAAgAElEQVQZAPTp04f27dvz8ssv59R11lln0bRpU4YPH87DDxfrrt0iIiIiRXZI3YI4bvz8M6xdW9qtKLbx48dz9NFH53TSzznnHBo0aMD48eNzgpRt27bx7rvv0q9fv5wA5UB54YUXGD58OF999RWbN2/OSf/qq68O6HJLwsKFC/ntt9+44YYb8s2zYMECypQpQ/fu3XOl9+jRg//85z+89957XHDBBTnp5513Xq58LVq0YPny5TkBSigN9gVmK1as4JtvvmHAgAG5bgxQoUIF2rZty4IFC4q/kiIiIiJFpCClNNStW9ot8IrRjkWLFvHll19y9913s2nTppz0iy++mNGjR7N8+XKOOeYYfvnlF/bu3csRRxxRki3OY/r06XTr1o2MjAzuu+8+atWqRZkyZejSpQs7duwoUl2hthZ0m+LQvJIa+rRx48Zcy44mKyuLGjVqkJCQkCs9NJQtKysrV3r4kDuAhIQEqlWrlicNyHmP1q1bB8B1113Hddddl6cNjRo1KnRdREREREqKgpTSUIwhVvEidIH8sGHDGDZsWJ75EyZMYMiQIVSvXp0yZcqwZs2aYi0nKSmJ7OzsPOkbN26kZs2aOa8nTZpEs2bNcl2EvmvXrjwd91gkJydTpUoVXnnlFXr37h01zyuvvELVqlU55ZRTctoJ5GlrKPgoTGiY1po1azjhhBOi5qlRowZZWVlkZ2fnClR++umnnPn7K/SeDh06lHPOOSfP/MgASUpXk3tmArD6obRSbomIiMiBUZp395I/mOzsbJ577jlOP/103nrrrTxTq1ateOaZZ3DOUaFCBVJSUpg4cSLbt2/Pt87ExMSo8xs3bszPP//M+vXrc9K++eabPEO4tm3bRtmyuWPtZ555plgPXUxMTOS2225j1qxZua7LCHn55ZeZPXs2ffr0ITExMaedQK47YO3evZtXX301T91AnnVt164dlSpV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UqWo67l06VK6dOlCcnIykyZNYufOnWRmZvLbb79x2GGHldj7KSIiIocg55ymYk6nnnqqK45WrVq5+vXrl/rUqlWrYrX/uOOOc61bt86V1qJFC9emTZtcaffdd5/zm5j3xhtvOMA98sgj+dY9duxYB7gVK1bkSp8+fboD3NixY3OlX3fddS4hIcGtX7/eOefcW2+95QB34YUX5qn7vvvuc1WqVHG//fZbTtodd9zhqlWr5rZt21bwSgdC9b/22mtR5wOuWbNmLjs7Oydt8uTJDnDvvvtuTlr79u2dmbmPP/44V/kFCxY4wI0fPz5X+sSJEx2Qkz8tLc1ddNFFBba1cePGrlq1ai4rKysn7cMPP3SAe/bZZ51zzu3evdvVqVPHpaam5ir79ttv5/msGjdu7DIyMnJed+/e3dWsWTPX+/ndd9+5cuXKucaNGxfYNtk/je+e4RrfPaO0myEiIlKYYvezNdyrFPz888+sXbu21Keff/65WO3PyMjggw8+YPny5QB88MEHLFu2LOeC+fy8+uqrmBm9evUq8jIXLFhAmTJl6N69e670Hj16kJ2dnevidoCLLrooTx033HAD27Zt47nnngP89SXjx4/n6quvpnz58kVuU346duxIuXLlcl6feOKJgB8SF65Jkya0atUqV9qcOXNISEjg0ksvZffu3TlTp06dAP8+AJx22mnMmjWLgQMH8s4775CdnR21LW3btqV69er5tuWrr75i3bp1/PnPf85VLiUlhcaNGzN//vx81/O9996jS5cuVKxYMSetYcOGnHHGGfmWEREREYmFhnuVgrp165Z2E4Dit6NHjx7079+fCRMmMGTIECZMmEBiYiLdunUrsNzGjRupUaNGsQKCrKwsatSoQUJCQq70evXq5cwPV79+/Tx1NGjQgPT0dP79739z/fXXM3nyZLKysujdu3eR21OQyLuShS6GD7+mJL82rlu3juzs7Fwd/3Cha4EGDBhAUlISEydO5MEHH6RSpUpceuml/POf/6RWrVoxtyX0vkVrS7169Qq8FfTatWujbkN169Zl1apV+ZYTERERKYyClFLw8ccfl3YT9kuDBg3o2LEjEydO5N577+X555/nggsuyHXEPppatWqRlZXF9u3bixyo1KhRg6ysLLKzs3MFKj/99FPO/HD5PZ/l5ptv5uyzz+ajjz7iiSee4E9/+hPHHXdckdpSUqK1sWbNmiQlJfH2229HLdOgQQMAypUrx913383dd9/NTz/9xIwZM+jbty/btm3j+eefj7kNofct9D6G++mnnzj11FPzLVu/fv2oZ+OKe4ZOREREJETDvaRYMjIy+Pbbb+nfvz8bNmwodKgXQKdOnXDO8fTTT+ebJ3Skf/v27bnS27dvz969e5k8eXKu9GeffZaEhATatm0bU7s7dOhAixYt6Nu3L++++y433nhjTOV+L507d2bHjh1s3ryZ5OTkPFMoSAlXr149rr/+es455xy++OKLIi2vefPm1K1bl0mTJuVKX7hwId9++23O7aSjadu2LbNmzWLr1q05ad9//z3vvvtukdogIiIiEklnUqRYLrzwQqpUqcLIkSOpU6dOTA9tPOuss7jkkkvo27cv33//PR06dGDXrl0sWLCAtLQ0UlNTc85qPPbYY2RkZFCuXDlOOukkzjvvPFJSUrjxxhtZv349xx9/PLNmzeLpp5+mf//+uYY4Feamm26iT58+1KpVK+rzXkpTamoqV155JZdeeil9+/aldevWlClThtWrVzNr1iyGDRvGMcccQ3p6Oi1btuSUU06hevXqfPzxx8yZM6fIQ9cOO+ww7r//fnr37k2PHj3o0aMHa9asYeDAgRx99NFce+21+ZYdNGgQkydPplOnTvTr14/s7GwyMzPjZjijiIiI/HHpTIoUS/ny5bn88stxztG9e/dct9YtyKRJk8jMzGTatGl07dqVa6+9liVLluRcE9GyZUsyMzOZPn06KSkpnHbaafz444+UKVOGmTNnkpGRwbBhw0hLS2PmzJmMGDGCBx54oEhtv+yyywDo2bNnXD48ceLEiWRmZjJlyhTS09O59NJLGT16NEcffXROAHDmmWfy6quvct1119G5c2fGjBnDXXfdxT/+8Y8iL++GG27gmWee4fPPPyc9PZ277rqLjh07Mn/+/HyvjQH/QMtZs2axbds2unXrxj333EOfPn04++yzi73uIiIiIgDmwh6EJ0WTnJzsFi1aVNrNkCJ66qmn6N27N8uXL6dZs2al3RyRImtyz0wAVj+UVsotERERKVD0i4RjoOFecsj48ssv+eabb7jvvvu48MILFaCIiIiIxCkFKXLIuPnmm1m4cCHt2rVj9OjRpd0cEREREcmHghQ5ZMybN6+0myAiIiIiMdCF8yIiIiIiElcUpIiIiIiISFxRkCIiIiIiInFFQYqIiIiIiMQVBSkiIiIiIhJXFKSIiIiIiEhcUZAiIiIiIiJxRc9JKSVN7plZqstf/VBaidc5b948zjrrLN566y1SU1NLvP6CNGnShNTUVMaNG1ekctOmTWPlypX07ds3V3pprouIiIjIoU5nUqTEnHLKKbz33nuccsoppd2UmE2bNo0RI0bkSf8jrouIiIjIwUJnUqTEVKlShTZt2pR2M0rEwbQuIiIiIn80OpMiRbJ8+XIuuugi6tSpQ1JSEo0aNeKyyy5j9+7dzJs3DzNj3rx5OflTU1NJSUlhzpw5tGrVivLly3PyySfzv//9j927dzNgwADq169PjRo16NmzJ1u3bs0pG60+gHHjxmFmrF69Ot92rl+/nt69e3PMMcdQoUIFGjZsSPfu3VmzZk1Onp49ezJ+/HjWrFmDmWFmNGnSJN9lO+cYOXIkzZs3JyEhgfr16/OXv/yFLVu25Fq2mTFo0CAeffRRjjzySCpXrkz79u1ZsmRJrnxz586lXbt2VK1alUqVKtG8eXPuv//+2D4IERERkYOYzqRIkaSlpVG9enXGjBlDrVq1WLNmDbNmzWLv3r35lvn666/p168fAwcOpFKlStx111107dqVrl27snv3bsaNG8fSpUvp168fderU4R//+Md+tzMrK4uEhASGDBlC3bp1Wbt2LcOHD+eMM85g2bJlJCUlMXjwYNavX8+HH37IK6+8AkBiYmK+dQ4cOJChQ4dyyy23cMEFF/Dll18yePBgPv30U+bPn0+ZMvti/okTJ9K8eXMeeeQRsrOz6devH+np6SxbtoyyZcuycuVKunbtyqWXXsq9995LQkICK1asYOXKlfu97iIiIiJ/dApSJGYbNmzg66+/5uWXX6Zr16456d27dy+w3MaNG1m4cCFNmzYFYO/evaSnp7Nq1Spef/11AM4991wWLFjA5MmTSyRIad68OaNGjcp5vWfPHs444wwaNWrE7NmzueiiizjqqKOoXbs2CQkJhQ7tysrKYvjw4WRkZDB69OicNteuXZurrrqKGTNm5HpPypUrx4wZMyhXrlxO2mWXXcYHH3xAu3btWLx4MdnZ2YwZM4YqVaoA0KFDh/1ebxEREZGDgYZ7Scxq1qxJ06ZNueeee3jqqadYsWJFTOWOOeaYnAAFoEWLFoDv5Idr0aIFP/zwA865EmnvmDFjaNmyJZUqVaJs2bI0atQIgK+++qrIdb3//vtkZ2fTo0ePXOlXXHEFZcuWZf78+bnSO3bsmCtAOfHEEwH47rvvAGjVqhXlypXjiiuuYMqUKaxbt67IbRIRERE5WClIkZiZGa+99hrJycn0798/J/gYM2ZMgeWqV6+e63VCQkK+6bt372bPnj373dZRo0Zx8803c8455zB16lQ++OAD3n//fQB27NhR5PqysrIAqF+/fq70smXLUrNmzZz5ITVq1Mj1OjSMLLTsZs2aMXfuXPbu3ctVV11FvXr1aNOmTZ5gR0RERORQpCBFiqRp06ZMmDCB9evX8/HHH9OhQwduvvlmZs+eXeLLSkpKAiA7OztX+saNGwstO2nSJM4++2yGDx9Op06dOO2006hTp06x2xIKOn766adc6bt372bjxo15gpJYnHXWWcyZM4dNmzbx+uuvU7ZsWdLS0tiwYUOx2ykiIiJyMFCQIsViZrRq1SrnGSNffPFFiS+jcePGUeueObPwB2Fu27Yt13ArgLFjx+bJl5iYyPbt2wutr02bNiQkJDBp0qRc6c8//zy7d+/erwc+JiYm0qFDB+666y62bt3KqlWril2XiIiIyMFAF85LzD777DP69OlDt27daNasGXv27GHcuHGULVuWDh068Ouvv5bo8urXr0/79u0ZOnQotWrVok6dOkycODGmO2B17tyZYcOG8eCDD9K6dWvefPNNpkyZkiffcccdR1ZWFmPGjCE5OZmkpKSc60fC1ahRgzvvvJOhQ4dSsWJFunTpwtKlSxk0aBApKSmkpaUVad3+/e9/s2DBArp06ULDhg3ZsGEDQ4cOpUGDBpxwwglFqktERETkYKMgpZSsfqhondp4UK9ePRo1asSIESP44Ycfcjr0M2bM4NRTT83zPJOSMHHiRG666SZuu+02kpKSuPbaaxk0aBC9evUqsNy9997Lpk2bGDlyJDt27KB9+/bMnTs31wX8ANdffz3vv/8+AwYMYNOmTTRu3Djf56888MAD1K5dm3//+988/vjj1KxZk6uvvpqhQ4fmuv1wLFq2bMns2bPp378/69ato0aNGqSkpPDss89Svnz5ItUlIiIicrCxkrqT0qEoOTnZLVq0qLSbISKHmCb3+CGPf8SDHSIickix4hbUNSkiIiIiIhJXFKSIiIiIiEhcUZAi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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with sns.plotting_context('poster'):\n",
" plot_simulation(result)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The model created by combining the probabilities we obtained from Predictwise with the simulation of a biased coin flip corresponding to the win probability in each states leads us to obtain a histogram of election outcomes. We are plotting the probabilities of a prediction, so we call this distribution over outcomes the **predictive distribution**. Simulating from our model and plotting a histogram allows us to visualize this predictive distribution. In general, such a set of probabilities is called a **probability mass function**. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Empirical Distribution"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is an **empirical Probability Mass Function**. \n",
"\n",
"Lets summarize: the way the mass function arose here that we did ran 10,000 tosses (for each state), and depending on the value, assigned the state to Obama or Romney, and then summed up the electoral votes over the states.\n",
"\n",
"There is a second, very useful question, we can ask of any such probability mass or probability density: what is the probability that a random variable is less than some value. In other words: $P(X < x)$. This is *also* a probability distribution and is called the **Cumulative Distribution Function**, or CDF (sometimes just called the **distribution**, as opposed to the **density**, or **mass function**). Its obtained by \"summing\" the probability density function for all $X$ less than $x$."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Obama Win CDF at votes= 200 is 0.0\n",
"Obama Win CDF at votes= 300 is 0.152\n",
"Obama Win CDF at votes= 320 is 0.4561\n",
"Obama Win CDF at votes= 340 is 0.8431\n",
"Obama Win CDF at votes= 360 is 0.9968\n",
"Obama Win CDF at votes= 400 is 1.0\n",
"Obama Win CDF at votes= 500 is 1.0\n"
]
}
],
"source": [
"CDF = lambda x: np.float(np.sum(result < x))/result.shape[0]\n",
"for votes in [200, 300, 320, 340, 360, 400, 500]:\n",
" print(\"Obama Win CDF at votes=\", votes, \" is \", CDF(votes))"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"votelist=np.arange(0, 540, 5)\n",
"plt.plot(votelist, [CDF(v) for v in votelist], '.-');\n",
"plt.xlim([200,400])\n",
"plt.ylim([-0.1,1.1])\n",
"plt.xlabel(\"votes for Obama\")\n",
"plt.ylabel(\"probability of Obama win\");"
]
}
],
"metadata": {
"anaconda-cloud": {},
"celltoolbar": "Edit Metadata",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 1
}