Last active
April 1, 2018 00:19
-
-
Save bdoohan/04e642fd162fd04364fec0a0f5e9a220 to your computer and use it in GitHub Desktop.
Mo Results with Age Added
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<script>\n", | |
"code_show=true; \n", | |
"function code_toggle() {\n", | |
" if (code_show){\n", | |
" $('div.input').hide();\n", | |
" } else {\n", | |
" $('div.input').show();\n", | |
" }\n", | |
" code_show = !code_show\n", | |
"} \n", | |
"$( document ).ready(code_toggle);\n", | |
"</script>\n", | |
"<form action=\"javascript:code_toggle()\"><input type=\"submit\" value=\"Click here to toggle on/off the raw code.\"></form>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 1, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from IPython.display import HTML\n", | |
"\n", | |
"HTML('''<script>\n", | |
"code_show=false; \n", | |
"function code_toggle() {\n", | |
" if (code_show){\n", | |
" $('div.input').hide();\n", | |
" } else {\n", | |
" $('div.input').show();\n", | |
" }\n", | |
" code_show = !code_show\n", | |
"} \n", | |
"$( document ).ready(code_toggle);\n", | |
"</script>\n", | |
"<form action=\"javascript:code_toggle()\"><input type=\"submit\" value=\"Click here to toggle on/off the raw code.\"></form>''')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Ward D Election Results" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Brendan Doohan \n", | |
"March 29, 2018" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"import seaborn as sns; sns.set()\n", | |
"import warnings\n", | |
"warnings.filterwarnings('ignore')\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"#os.chdir(\"C:\\\\Users\\\\nwdoohanbr\\\\Desktop\\\\WardD\\\\Jersey-City-Ward-D-Election\")\n", | |
"os.chdir(\"/Users/brendandoohan/Desktop/Jersey City Ward D Election/Jersey-City-Ward-D-Election\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"ages = pd.read_csv(\"JC_WARD_D_2017_NOV_GEN_W_DOB.csv\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from datetime import datetime\n", | |
"from datetime import *\n", | |
"TODAY = datetime.today()\n", | |
"ages[\"bday\"] = ages[ages['BIRTH DATE'] != 'UNITED STATES']['BIRTH DATE'].fillna('2/20/2018').astype(str).apply(lambda x: datetime.strptime(x, '%m/%d/%Y'))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import datetime\n", | |
"\n", | |
"def age(dob):\n", | |
" #dob = datetime.date(dob)\n", | |
" today = datetime.date.today()\n", | |
" years = today.year - dob.year\n", | |
" if today.month < dob.month or (today.month == dob.month and today.day < dob.day):\n", | |
" years -= 1\n", | |
" return years" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"ages[\"Age\"] = ages['bday'].apply(lambda x: age(x))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 102, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ages = ages[ages.DISTRICT != \"JERSEY CITY\"].copy()\n", | |
"ages[\"DISTRICT\"] = ages.DISTRICT.astype(float)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"age_df = pd.DataFrame(\n", | |
" ages[ages.Age < 110].groupby('DISTRICT')[\"Age\"].mean()\n", | |
")\n", | |
"age_df[\"District\"] = age_df.index\n", | |
"age_df.to_csv(\"Age_info.csv\", index=False)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/District%20Guide.jpeg?raw=true\" alt=\"Districts\" height=\"600\" width=\"600\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This whitepaper analyzes the results of Jersey City city council race for Ward D that was held on November 7th. In that election, incumbent Michael Yun (\"Yun\") ran against Moriah Kinberg (\"Mo\"), Carmen Vega (\"Vega\") and Rafael Torres (\"Torres\"). Yun won the election.</p> \n", | |
"\n", | |
"- Yun won with **2,613** votes \\* \n", | |
"- Mo had **1,335** votes \n", | |
"- Vega had **397** votes \n", | |
"- Torres had **131** votes\n", | |
"\n", | |
"<sub>* These numbers are taken from the voting machine printouts from November 7th. The final totals cannot be broken out from the data given by the Board of Elections.</sub> \n", | |
"<p>This paper breaks down the results by district, race, and candidate. The predictive model used to identify likely voters is also analyzed.</p>\n", | |
"<br clear=\"left\"></br>\n", | |
"<p>Specifically, this paper addresses the following questions:</p> " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results = pd.read_csv(\"JC_WARD_D_edited.csv\", header=0, error_bad_lines=False, verbose=False, encoding=\"UTF-7\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results = results.drop('Unnamed: 8', axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Questions to Ask" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"1. How was turnout by district?\n", | |
"2. What was the racial makeup of those who did vote?\n", | |
"3. Did Mo's supporters come out and vote? \n", | |
"4. Where did Mo perform best? How about the rest of the candidates?\n", | |
"5. Was the [Random Forest model](https://en.wikipedia.org/wiki/Random_forest) successful in identifying likely voters?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The paper then concludes by aggregating these insights to summarize what can be learned from the results of election. The insights aim to shed light on the voting behavior of Ward D--a ward experiencing rapid changes in terms of development and demographics." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Let's look at Age by district first" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Let;s first look at the distribution of ages across the districts. Districts with big bumps on the left side are younger than average; those with bumps on the right hand side are older.\n", | |
"\n", | |
"District 1, for example, is younger than District 29." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 135, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nbd68mYcsHjJLTKusXr1aN954I+dnE5klrp9++qkWLVqkN998U127dtXLL7+s+++/X+vXrycZ7yGz\nxHTAgAFKSkrSfffdJ5fLpVtuuUVt2rRReHi4dzvmMGaJY30Mw6hxfhqG4ZP7G1PeIX300UfVEzlV\nCQkJ0YoVK5STk6M2bdpo7ty5euyxx2p9f4sWLS7YFhoaesEfuN27d6u8vNx3HUe9zBTXgwcPavLk\nyQoNDdXLL7+s1q1be7g3kMwT07179+pvf/tb9c+33HKLDh48qG+++caT3cH/Z5a4vvbaa/roo480\nbtw43X333Tp79qzGjRunkpISL/bK2cwS0127dmndunU1thmGwQWrl8wS144dO6pHjx7q37+/pHNJ\n+YqKCu3bt8/TXXI8s8S0yptvvqkJEyZ4sAeojVni+t577+maa66pnhx6ypQp+te//qXjx497ukuO\nZ5aYlpaWauDAgXrttde0du3a6kmImSy6ccwSx/pceuml+vrrr6t//vrrr6uHAjaF6RJBe/bs0eLF\ni5WYmFhj+65du3TTTTepR48euueee3THHXfoo48+knTuYDd0YKOiouRyuapLrXbu3Klf//rXqqys\nbNT70TRmimtpaakSEhI0atQoPfnkkxdkgdE4Zorp4cOH9cADD+jYsWOSpNdff109e/ZU27ZtfbGr\njmKmuL766qv685//rPXr1+v5559Xs2bNtH79el1yySU+2ltnMFNMQ0JC9Oijj1YnCFauXKkrr7zS\nJxc0TmOmuA4dOlT79+/Xjh07JEkffPCBXC4X8wR5yEwxlaRvvvlGX375pX7605/6YO+cy0xx7dOn\njz744AMdOXJE0rm5Rzp37qx27dr5Ylcdw0wx/frrr5WQkKDS0lJJ0rPPPqtf/OIXVHg1gpniWJ8b\nb7xRa9asUXl5uU6ePKk33nij3pV2GyvoQ8OqnvBK5y4QL7roIj3wwAPVpVRVevfurZ///Oe65ZZb\n1KJFCzVr1kzp6emSpBEjRmjBggVyu911fk5ERITy8vKqM3rh4eHKy8tTREREjfePHz/eb/vqJGaO\na35+vg4ePKiCggIVFBRUb//jH/9I4qAeZo7pgAEDdO+99+r2229XaGioOnbsqEWLFvn+INiQmeMK\n75g5pr169VJ6erqmTZumiooKderUSQsWLPD9QbAhM8e1Q4cOWrRokR555BGdOXOmug0moa2fmWMq\n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\nf69W4fxtPLP97ZWIny+Y+Twlvt4z6zWwFMS4GgH26quvGtnZ2YZhGMaxY8eMYcOGGatXrzaWLl3q\nVXtnz541xo0bV2PbL3/5S2Pv3r1GZWWlcddddxk7duzwqu3Zs2cbq1atMhYsWGBs3LjRqzacwpdx\n9VdMiadnrHKuEtfG4zy1J1/F1R8xJZ6B5c9rosZ4/vnnjZtuusmYOHGiYRiGcc899xh//etfDcMw\njIyMDON//ud/jB07dhgJCQlGZWWlceDAAWPChAl+64/ZWOV7tQrnb/3M/LfXMIift6xynhJfz1jh\nGtgwAhvXgA8NGz16tH77299W/xwaGqodO3Zoy5YtmjJlitLS0lRaWtro9nbt2qUzZ84oMTFRt99+\nuz744AOVlZWpa9eucrlcGjJkiLZt2+ZxPz/66CN99tlnmjRpknbu3Kk1a9YoPj5e8+bNU3l5ucft\n2Z0v4+qPmBJPz1nhXCWunuE8tSdfxdXXMSWegeeva6LG6tq1q/Ly8qp/3rlzZ/UTzKFDh+r999/X\n3//+dw0ZMkQul0s/+tGPVFFRoWPHjvmtT2Zihe/VKpy/DTPr316J+DWFFc5T4us5s18DS4GPa8AT\nQZGRkWrZsqVKS0s1ffp0JScnq1+/fpo5c6by8/PVpUsXLVq0qNHtNWvWTFOnTtXSpUv1yCOPaNas\nWWrevHmNzzt16pTH/XzuueeUlJQkSbruuuuUkZGh/Px8ffvtt1q1apXH7dmdL+Pqj5gST89Z4Vwl\nrp7hPLUnX8XV1zElnoHnr2uixoqNjVVY2PezDhiGIZfLVeOzS0tL1bJly4D1yUys8L1ahfO3YWb9\n2ysRv6awwnlKfD1n9mtgKfBxDfgcQZJ06NAhJSUlKT4+XmPHjtXJkyfVunVrSVJMTIzmzJnT6La6\nd++ubt26yeVyqXv37mrVqpVOnDhR/frp06er226skydP6t///rcGDRokSbrllluq27jxxhv19ttv\ne9SeU/gqrr6OKfH0npnPVeLqHc5Te/JFXH0ZU+IZHP64JmqKkJDvnzdWfXbLli11+vTpGtur5llw\nAjN/r1bh/G08s/3tlYifL5j5PCW+3jPrNbAUnLgGvCLoyJEjSkxM1IwZM3TrrbdKkqZOnap//vOf\nkqRt27bpqquuanR7r776qubNmydJKikp0ZkzZ9SiRQt9+eWXMgxD7733ngYMGOBRHz/44AP97Gc/\n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\nv/Lz87Vjxw7t379fjz32mMLDw1VWVqavv/5an332ma6//np99dVX/ufv27dPeXl5OnXqlHr06KGl\nS5fq73//e4vnJyYm+mOJjIxUXl6eLrroIknSiBEjdPToUdXX1ysyMlK//e1vVVhYqPT0dKs+Lkdw\nSk4vvfRSLV26VJGRkf7HNm3aZMln5gROyeucOXN05513KiwsTMeOHdOJEyf0D//wD1Z9bLbmlJxG\nRkbqo48+0q9//WstWLBAb7zxhlUfmSM4Ja/vvfeeevfurbvuukvHjh3T2LFj9cADD6hnz55WfXS2\n5ZScbtu2TbfffrtiY2MlSffee6++/vprSz4zJ3BKXpv7SZKUnZ2tOXPm6PLLLw/55+UETslpU1OT\n6uvrdfr0aYWFhamuro7RQO1wSl4rKyt1yy23+HM5fvx4bdiwQXfeeaclnxtsLNSVp9YqrIZhGAcP\nHjSuuOIKwzAMIyMjw/j1r39tfP7558aoUaP8ozU2bNhg7NixwzCMlhXSjIwM4xe/+IX/WM3Pr6+v\nN66++mpj586dhmEYxvvvv2/ceuutRmNjY6cqtE1NTcbixYuNe++997zHbrjhBkYE/X9uyenXX39t\n3HLLLVTN/z835LWwsNC48sorjTvvvNP45ptvgvoc3MTJOa2pqTGmTp1q/PWvfzVefPFFRgSdxcl5\nff31140lS5YYx48fN06fPm0sXLjQyMvL69Ln4QZOzuldd91lFBYWGvfcc48xadIkY/HixcZXX33V\npc/DLZyc12bNI+PPnDkT1GfgNk7P6YoVK4wrr7zS+OlPf2pMnz7dH5vXOTmvTz75pDF37lyjpqbG\nqKurMx544AFjwoQJXfo84E62mSzo8/nOuwL4j//4jxo6dKimTp2qgoICXX755a3OkZSkn/zkJ+fd\nd/DgQYWFhen666+X9G21dPv27Z2aI/nNN9/ovvvu06effqq8vLzA3xAcldNPP/1Ud955p0aNGqVZ\ns2Z18h16k5PyumTJEv35z3/WD37wA61cubJzb9CDnJDTFStWKDU11T9fHx1zQl5vuukmFRYWql+/\nfrrgggs0b948vf766wG+U+9wQk7PnDmjnTt36uGHH9Yrr7yimJgYZWVlBfhOvcUJeW32H//xH5o3\nb57n19zriBNyunXrVh06dEj/8z//ozfeeEOxsbEqKCgI8J16ixPyevfdd2vIkCGaOXOm5syZo1Gj\n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\nO783/UbbzPCcVJhc31PN2Fe/8PPOmtESbuTt1bD29naNj4//fC4uLlYikdDp6an6+/s1Ozurl5eX\njGYlk0m9vb1peHhYg4ODisfj+vj4UE1NjUKhkFpbWxWLxTxf4/n5uS4vL9Xb26uLiwsdHByor69P\nkUhEn5+fnucFhau2rrvSM3vsa2Fy2VX6nbZ09c7P+0rP7Pi56TfaZo7npMLk+p4qsa9+4dedlWgJ\nh/J98vT8/GwDAwN2eHho+/v7dn5+bmZm6+vrFolEMpqRTCZtd3fX0um0XV1dWTgctu7u7p/f9/b2\nbHV11fO1jY2NWSwWMzOzra0tu7m5sXQ6bfPz87a9ve15XtDk2tZ1V3rmjn0tTC66mv1OW7pmz4/7\nSs/c+LHpN9p6x3NSYXJ1TzVjX/3GbztrRku4k7f/ESRJd3d3GhsbU19fnzo6OpRKpVRVVSVJamtr\n0+LiYkZz6urqVFtbq1AopLq6OlVWVurp6enn99fX15+5mUqlUrq6ulJzc7Mkqaen52dGOBzWycmJ\np3lB46Kty670zB37WphcdZXct6Vr9vy4r/TMjR+bfqOtdzwnFSaX91SJffUTv+2sREu4lbdXwx4f\nHzU8PKzp6Wn9+fNHkjQyMqKzszNJUiwWU2NjY0az9vf3FYlEJEkPDw96e3tTeXm5bm5uZGaKRqNq\namrydH3xeFwtLS2SJDNTZ2en7u/vPV9bELlq67IrPXPDvhYml10l923pmh2/7is9s+fXpt9o6w3P\nSYXJ9T1VYl/9wo87K9ESboXMzPLxh5aWlnR0dKT6+vqf7yYmJrSysqLS0lJVV1drcXFRFRUV/zvr\n4+NDMzMzur29VSgU0tTUlIqKirS8vKyvry+1trZqcnLS0/VtbGyopKREQ0NDkqRoNKq1tTWVlZWp\noaFBc3NzKi0t9TQzKFy1ddmVnrlhXwuTy66S+7Z0zY5f95We2fNr02+09YbnpMLk+p4qsa9+4ced\nlWgJt/J2EAQAAAAAAIB/K2+vhgEAAAAAAODf4iAIAAAAAAAgIDgIAgAAAAAACAgOggAAAAAAAAKC\ngyAAAAAAAICA4CAIAAAAAAAgIDgIAgAAAAAACAgOggAAAAAAAALiL565gtUwkV75AAAAAElFTkSu\nQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x1a1b6b5d50>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"dists = set(ages.DISTRICT)\n", | |
"fig = plt.figure(figsize=(20,10))\n", | |
"fig.subplots_adjust(hspace=0.5, wspace=1)\n", | |
"for i in range(1, 30):\n", | |
" ax = fig.add_subplot(3, 10, i)\n", | |
" ax.hist(ages[(ages.Age < 110) & (ages.DISTRICT == i)][\"Age\"])\n", | |
" ax.set_title(\"District \" + str(i))\n", | |
"\n", | |
"fig.show()\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Districts where Mo performed well, i.e. Districts 1 through 10, are younger than average." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Q1. How was turnout by district?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://raw.githubusercontent.com/bdoohan/Jersey-City-Ward-D-Election/master/All%20Voters%20Prcnt%20Labels.jpeg\" alt=\"Districts\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart breaks down voter turnout by District. The colors correspond to the percent of total voters that each district represents. Blue colors show districts that had a high percentage of the total votes.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
" <p>This chart shows the percet of total voters from each district. District 4, for example, had about 4.8% of the total votes.</p>\n", | |
"<br clear=\"left\"></br>\n", | |
" <p>Districts 13, 4, 5, 7 and 15 had high turnout. Overall, <b>the East side of the Heights came out and voted.</b> This is a section where Mo had strong support. The districts will be broken out for each candidate in the later sections.</p>\n", | |
"<br clear=\"left\"></br>\n", | |
"\n", | |
"<p>Here are the vote percentages for each district:</p> " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style>\n", | |
" .dataframe thead tr:only-child th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: left;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th>Dist_VotI</th>\n", | |
" <th>1.0</th>\n", | |
" <th>2.0</th>\n", | |
" <th>3.0</th>\n", | |
" <th>4.0</th>\n", | |
" <th>5.0</th>\n", | |
" <th>6.0</th>\n", | |
" <th>7.0</th>\n", | |
" <th>8.0</th>\n", | |
" <th>9.0</th>\n", | |
" <th>10.0</th>\n", | |
" <th>11.0</th>\n", | |
" <th>12.0</th>\n", | |
" <th>13.0</th>\n", | |
" <th>14.0</th>\n", | |
" <th>15.0</th>\n", | |
" <th>16.0</th>\n", | |
" <th>17.0</th>\n", | |
" <th>18.0</th>\n", | |
" <th>19.0</th>\n", | |
" <th>20.0</th>\n", | |
" <th>21.0</th>\n", | |
" <th>22.0</th>\n", | |
" <th>23.0</th>\n", | |
" <th>24.0</th>\n", | |
" <th>25.0</th>\n", | |
" <th>26.0</th>\n", | |
" <th>27.0</th>\n", | |
" <th>28.0</th>\n", | |
" <th>29.0</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>District</th>\n", | |
" <td>1</td>\n", | |
" <td>2</td>\n", | |
" <td>3</td>\n", | |
" <td>4</td>\n", | |
" <td>5</td>\n", | |
" <td>6</td>\n", | |
" <td>7</td>\n", | |
" <td>8</td>\n", | |
" <td>9</td>\n", | |
" <td>10</td>\n", | |
" <td>11</td>\n", | |
" <td>12</td>\n", | |
" <td>13</td>\n", | |
" <td>14</td>\n", | |
" <td>15</td>\n", | |
" <td>16</td>\n", | |
" <td>17</td>\n", | |
" <td>18</td>\n", | |
" <td>19</td>\n", | |
" <td>20</td>\n", | |
" <td>21</td>\n", | |
" <td>22</td>\n", | |
" <td>23</td>\n", | |
" <td>24</td>\n", | |
" <td>25</td>\n", | |
" <td>26</td>\n", | |
" <td>27</td>\n", | |
" <td>28</td>\n", | |
" <td>29</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Voter_Prcnt</th>\n", | |
" <td>2.8481</td>\n", | |
" <td>2.8481</td>\n", | |
" <td>3.35443</td>\n", | |
" <td>4.84177</td>\n", | |
" <td>4.36709</td>\n", | |
" <td>3.25949</td>\n", | |
" <td>3.9557</td>\n", | |
" <td>3.59177</td>\n", | |
" <td>4.03481</td>\n", | |
" <td>3.84494</td>\n", | |
" <td>2.34177</td>\n", | |
" <td>3.79747</td>\n", | |
" <td>5.77532</td>\n", | |
" <td>2.43671</td>\n", | |
" <td>3.98734</td>\n", | |
" <td>2.54747</td>\n", | |
" <td>3.37025</td>\n", | |
" <td>2.86392</td>\n", | |
" <td>3.37025</td>\n", | |
" <td>4.38291</td>\n", | |
" <td>3.60759</td>\n", | |
" <td>3.60759</td>\n", | |
" <td>2.54747</td>\n", | |
" <td>2.2943</td>\n", | |
" <td>3.84494</td>\n", | |
" <td>3.08544</td>\n", | |
" <td>4.11392</td>\n", | |
" <td>1.17089</td>\n", | |
" <td>3.71835</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
"Dist_VotI 1.0 2.0 3.0 4.0 5.0 6.0 7.0 \\\n", | |
"District 1 2 3 4 5 6 7 \n", | |
"Voter_Prcnt 2.8481 2.8481 3.35443 4.84177 4.36709 3.25949 3.9557 \n", | |
"\n", | |
"Dist_VotI 8.0 9.0 10.0 11.0 12.0 13.0 14.0 \\\n", | |
"District 8 9 10 11 12 13 14 \n", | |
"Voter_Prcnt 3.59177 4.03481 3.84494 2.34177 3.79747 5.77532 2.43671 \n", | |
"\n", | |
"Dist_VotI 15.0 16.0 17.0 18.0 19.0 20.0 21.0 \\\n", | |
"District 15 16 17 18 19 20 21 \n", | |
"Voter_Prcnt 3.98734 2.54747 3.37025 2.86392 3.37025 4.38291 3.60759 \n", | |
"\n", | |
"Dist_VotI 22.0 23.0 24.0 25.0 26.0 27.0 28.0 \\\n", | |
"District 22 23 24 25 26 27 28 \n", | |
"Voter_Prcnt 3.60759 2.54747 2.2943 3.84494 3.08544 4.11392 1.17089 \n", | |
"\n", | |
"Dist_VotI 29.0 \n", | |
"District 29 \n", | |
"Voter_Prcnt 3.71835 " | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from IPython.display import display\n", | |
"pd.options.display.max_columns = None\n", | |
"tots = results[results.Dist_VotI!=31][\"Voter_ID\"].count()\n", | |
"adf = pd.DataFrame(\n", | |
" 100*(results[results.Dist_VotI!=31].groupby('Dist_VotI')[\"Voter_ID\"].count()/tots)\n", | |
")\n", | |
"adf[\"District\"] = adf.index\n", | |
"adf.columns = [\"Voter_Prcnt\", \"District\"]\n", | |
"adf[\"District\"] = adf.District.astype(int).copy()\n", | |
"adf[[\"District\", \"Voter_Prcnt\"]].astype(object).T" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Q2. What was the racial makeup of those who did vote?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Using [U.S. Census data](https://www.census.gov/topics/population/genealogy/data/2000_surnames.html), the race of each voter was identified. This method is not without its faults; however, it does serve as a functioning proxy for race classification." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### White voters" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Prcnt%20White%20Labels.jpeg?raw=true\" alt=\"White_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the percent of Ward D <b>white voters</b> for each District. Blue colors show districts that had a high percentage of the total <b>white voters</b>.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
" <p>Districts 4, 5, 7 and 9 have a high percentage of the total white votes. Overall, <b>the East side of the Heights is where much of the white voters live.</b> This is also a section where Mo had strong support.</p>\n", | |
"<br clear=\"left\"></br>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Hispanic voters" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Prcnt%20hispanic%20Labels.jpeg?raw=true\" alt=\"Hispanic_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the percent of Ward D <b>hispanic voters</b> for each District. Blue colors show districts that had a high percentage of the total <b>hispanic voters</b>.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
" <p>Districts 13, 20, 5, 27 and 22 have a high percentage of the total hispanic votes. Overall, <b>the North and West sides of the Heights are where much of the hispanic voters live.</b></p>\n", | |
"<br clear=\"left\"></br>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Black voters" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Prcnt%20Black%20Labels.jpeg?raw=true\" alt=\"Black_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the percent of Ward D <b>black voters</b> for each District. Blue colors show districts that had a high percentage of the total <b>black voters</b>.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
" <p>Districts 12, 13, and 20 have a high percentage of the total black votes. Overall, <b>the center of the Heights is where much of the black voters live.</b></p>\n", | |
"<br clear=\"left\"></br>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Asian voters" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Prcnt%20Asian%20Labels.jpeg?raw=true\" alt=\"Asian_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the percent of Ward D <b>Asian voters</b> for each District. Blue colors show districts that had a high percentage of the total <b>Asian voters</b>.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
" <p>Districts 22, 23, 25, 27 and 29 have a high percentage of the total Asian votes. Overall, <b>the westside of the Heights is where much of the Asian voters live.</b></p>\n", | |
"<br clear=\"left\"></br>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Q3. Did Mo's supporters come out and vote?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Mo%20Supporters%20Prcnt%20Labels.jpeg?raw=true\" alt=\"Mo_supporters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows where most of Mo's supporters live in Ward D. Blue colors show districts that had a high percentage of <b>Mo's supporters</b>.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
" <p>Districts 4, 7 and 13 have a high percentage of Mo's supporters. Overall, <b>Mo's supporters live east of Central Avenue and near Congress Street.</b></p>\n", | |
"<br clear=\"left\"></br>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Overall, **52%** of Mo's supporters voted on Election Day. Here is the **percent turnout** by District:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"results_mo[\"turnout_rate\"] = results_mo.voted.astype(float)/results_mo.mo_supporter.astype(float)\n", | |
"results_mo[\"turnout_rate\"] = results_mo[\"turnout_rate\"].astype(float)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_mo = results_mo[results_mo[\"Dist_VotI_y\"] != 'District'].copy()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_mo[\"Dist_VotI_x\"] = results_mo[\"Dist_VotI_x\"].astype(float)\n", | |
"results_mo[\"Dist_VotI_y\"] = results_mo[\"Dist_VotI_y\"].astype(float)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_mo[\"District\"] = results_mo[[\"Dist_VotI_x\", \"Dist_VotI_y\"]].max(axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"turnout = pd.DataFrame(results_mo.groupby(\"District\")[\"turnout_rate\"].mean())\n", | |
"turnout[\"District\"] = turnout.index\n", | |
"turnout = turnout[turnout.District.between(1,29)]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"turnout[\"District\"] = turnout.District.astype(int)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x1a0d61dad0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import math \n", | |
"turnout.set_index(turnout.District)\n", | |
"turnout.turnout_rate.plot(kind=\"bar\")\n", | |
"plt.xlabel(\"District\")\n", | |
"plt.ylabel(\"Turnout Rate\")\n", | |
"plt.title(\"Turnout Rate by District\", fontsize=20)\n", | |
"plt.axhline(y=0.5, color='r', linestyle='--')\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<p align=\"left\"> Districts <b>4, 5, 6, 7 and 19</b> stood out from the rest. Mo's base in <b>the eastern section of the Heights</b> did come out and vote. However, supporters outside of this section largely failed to come out on Election day.</p>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Q4. Where did Mo perform best? How about the rest fo the candidates?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**N.B.** Color coding is specific to each candidate. Red colors show where the candidate did worse relative to his/her average number of votes. Blue shows where they did above average." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Mo%20Total%20Labels.jpeg?raw=true\" alt=\"Mo_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the <b>total</b> votes for Mo for each District. Blue colors show districts with higher vote counts.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
" <p>Districts <b>3, 4, 5, 7, 8, 9 and 10</b> were the best for Mo.</p>\n", | |
"<br clear=\"left\"></br>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Yun" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Yun%20Total%20Labels.jpeg?raw=true\" alt=\"Yun_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the <b>total</b> votes for Yun for each District. Blue colors show districts with higher vote counts.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
"<p align=\"left\">Yun did well on the Western Slope and in the hispanic neighborhoods.</p> \n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Vega" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Carmen%20Total%20Labels.jpeg?raw=true\" alt=\"Yun_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the <b>total</b> votes for Vega for each District. Blue colors show districts with higher vote counts.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
"<p align=\"left\">Vega had low turnout in most districts.</p> " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Torres" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<img src=\"https://github.com/bdoohan/Jersey-City-Ward-D-Election/blob/master/Torres%20Totals%20Labels.jpeg?raw=true\" alt=\"Yun_Voters\" height=\"700\" width=\"700\" align=\"right\" hspace=0>\n", | |
"<p align=\"left\">This chart shows the <b>total</b> votes for Torres for each District. Blue colors show districts with higher vote counts.</p> \n", | |
"<br clear=\"left\"></br>\n", | |
"<p align=\"left\">Torres had low turnout across Ward D.</p> " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Q5. How did the model do at predicting whether someone was going to vote?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"For Mo's campaign a [Random Forest](https://en.wikipedia.org/wiki/Random_forest) model was used to predict who would vote. The model assigned a likelihood of voting to each voter. A likelihood close to 0 meant that the person was unlikely to vote; a value closer to 1 meant they were likely to vote. These predictions were then used to focus canvassing and phone banking efforts. \n", | |
"\n", | |
"Usually any likelihood greater than .50 (50%) is interpreted as a positive event. So, for example, if someone's likelihood was 0.55, they would be labelled as likely to vote. However, for this campaign, a decision was made to only label people with likelihoods of 0.85 or higher as people likely to vote. This made the model's predictions much more accurate. \n", | |
"\n", | |
"Using the 0.85 likelihood cutoff, the model had an accuracy of **75%**. This means that the model correctly predicted whether or not a voter would vote 75% of the time. Part of this success is due to the fact that turnout overall was low. Many people did not come out and vote, compared to previous elections. That is, having a high cutoff value of 85% meant that most people were predicted not to vote. This is exactly what happened since turnout was so low." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Summary" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"- **Demographic** \n", | |
" \n", | |
" - Mo won the white vote on the eastern side of the Ward \n", | |
" - Mo lost the Western Slope, which is predominantly asian \n", | |
" - Mo performed well among younger voters.\n", | |
"\n", | |
" \n", | |
"\n", | |
"- **Geographic** \n", | |
"\n", | |
" - Mo struggled west of Central Avenue\n", | |
" - Mo did well east of Central Avenue \n", | |
"\n", | |
" \n", | |
"\n", | |
"- **Base health** \n", | |
"\n", | |
" - 52% of Mo's supporters came out to vote\n", | |
" - Most of this turnout came from supporters east of Central Avenue\n", | |
"\n", | |
"\n", | |
"\n", | |
"- **Competitors** \n", | |
" \n", | |
" - Yun did well across most districts, with strong performance in the asian and hispanic neighborhoods\n", | |
"\n", | |
"\n", | |
"\n", | |
"- **Change Research Survey** \n", | |
" \n", | |
" - The survey indicated that those who knew Mo liked her and would vote for her\n", | |
" - Data from the election confirm this finding, showing that Mo did well where most of her supporters lived\n", | |
" - Survey had Yun with 62% and Mo with 30%; actual results were Yun 52% and Mo with 38%" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Code" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def get_last(string):\n", | |
" return(str(string).split(\"|\")[0])\n", | |
"def get_first(string):\n", | |
" try:\n", | |
" return(str(string).split(\"|\")[1])\n", | |
" except:\n", | |
" return(\"\")\n", | |
"def get_middle(string):\n", | |
" try:\n", | |
" return(str(string).split(\"|\")[2])\n", | |
" except:\n", | |
" return(\"\")\n", | |
"\n", | |
"results[\"last_name\"] = results.Voter_Name.apply(get_last)\n", | |
"results[\"first_name\"] = results.Voter_Name.apply(get_first)\n", | |
"results[\"middle_name\"] = results.Voter_Name.apply(get_middle)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"url = 'https://raw.githubusercontent.com/fivethirtyeight/data/master/most-common-name/surnames.csv'\n", | |
"races = pd.read_csv(url,index_col=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"races[\"last_name\"] = races.index\n", | |
"races = races.reset_index()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def get_race(arow): \n", | |
" if arow[\"pctblack\"]==\"((S))\":\n", | |
" arow[\"pctblack\"] = 0.00\n", | |
" if arow[\"pctaian\"]==\"((S))\":\n", | |
" arow[\"pctaian\"] = 0.00\n", | |
" try:\n", | |
" guess = arow[[\"pctwhite\", \"pctblack\", \"pctapi\", \"pctaian\", \"pct2prace\", \"pcthispanic\"]].astype(float).idxmax(axis=1)\n", | |
" return(guess)\n", | |
" except:\n", | |
" return(\"Unidentified\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mapping = {'(S)':.00001}\n", | |
"races = races.replace({'pctblack': mapping, 'pctaian': mapping,\n", | |
" 'pctwhite': mapping, 'pctapi': mapping, \n", | |
" 'pct2prace': mapping, 'pcthispanic': mapping})" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"races[\"guess\"] = races.apply(lambda x: get_race(x), axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"races[\"guess\"] = races.guess.str.replace(\"pct\", \"\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_race = pd.merge(results, races, on=\"last_name\", how=\"left\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_race.guess.fillna(\"Unidentified\", inplace=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_base = pd.read_csv(\"Election Day Mo Supporter List - Master 11052017.csv\", \n", | |
" names = [\"first_name\", \"last_name\", \"full_name\", \"address\", \"Dist_VotI\", \"email\", \"phone\"])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_base[\"mo_supporter\"] = int(1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results['first_name'] = results['first_name'].apply(lambda x: x.strip(\" \"))\n", | |
"results['first_name'] = results['first_name'].apply(lambda x: x.upper())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results['last_name'] = results['last_name'].apply(lambda x: x.strip(\" \"))\n", | |
"results['last_name'] = results['last_name'].apply(lambda x: x.upper())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_base['first_name'] = mo_base['first_name'].astype(str).apply(lambda x: x.strip(\" \"))\n", | |
"mo_base['last_name'] = mo_base['last_name'].astype(str).apply(lambda x: x.strip(\" \"))\n", | |
"mo_base['first_name'] = mo_base['first_name'].astype(str).apply(lambda x: x.split(',', 1)[0])\n", | |
"mo_base['last_name'] = mo_base['last_name'].apply(lambda x: x.upper())\n", | |
"mo_base['first_name'] = mo_base['first_name'].apply(lambda x: x.upper())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results[\"voted\"] = int(1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_mo = pd.merge(results, mo_base[[\"first_name\", \"last_name\", \"mo_supporter\", \"Dist_VotI\"]],\n", | |
" on=[\"last_name\", \"first_name\"], how=\"right\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_mo.drop_duplicates(inplace=True, subset=[\"Voter_ID\", \"last_name\", \"first_name\", \"voted\", \"mo_supporter\"])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_mo.fillna(0, inplace=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 45, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"results_race_mo = pd.read_csv(\"results_race_mo.csv\")\n", | |
"x = results_race_mo.groupby([\"Dist_VotI\", \"guess\"])[\"Voter_ID\"].count().unstack()\n", | |
"races_dist = pd.DataFrame(x)\n", | |
"races_dist[\"District\"] = races_dist.index" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"x = results_race_mo.groupby(\"Dist_VotI\")[\"Voter_ID\"].count()\n", | |
"votes = pd.DataFrame(x)\n", | |
"votes[\"District\"] = votes.index" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 47, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_groupby = mo_base.groupby(\"Dist_VotI\", as_index=False).mo_supporter.count() " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 48, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"results_race_mo[\"Dist_VotI\"] = results_race_mo.Dist_VotI.astype(str).copy()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 49, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_groupby[\"Dist_VotI\"] = mo_groupby.Dist_VotI.astype(str).copy()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 50, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_race_mo[\"Dist_VotI\"] = results_race_mo.Dist_VotI.copy()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 51, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_groupby = pd.DataFrame(\n", | |
" results_race_mo.groupby([\"Dist_VotI\", \"mo_supporter\"])[\"Voter_ID\"].count().fillna(0).replace('NaN', 0)\n", | |
" )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 53, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"results_groupby = results_groupby.unstack()\n", | |
"#results_groupby[\"Dist_VotI\"] = results_groupby.index\n", | |
"#results_groupby[\"Dist_VotI\"] = results_groupby[\"Dist_VotI\"].round(0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 54, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_groupby = mo_groupby.convert_objects(convert_numeric=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 60, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"results_groupby[\"Dist_VotI\"] = results_groupby.index" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 83, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mo_turnout = pd.merge(\n", | |
" results_groupby,\n", | |
" mo_groupby,\n", | |
" on=\"Dist_VotI\",\n", | |
" how=\"left\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 64, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_turnout.columns = [\"District\", \"Total_Voters\", \"Mo_Voters\", \"District_x\", \"Mo_supporters\"]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 65, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mo_turnout[\"turnout_rate\"] = mo_turnout[\"Mo_Voters\"]/ mo_turnout.Mo_supporters" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 137, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"#import plotly.plotly as py\n", | |
"# Learn about API authentication here: https://plot.ly/python/getting-started\n", | |
"# Find your api_key here: https://plot.ly/settings/api\n", | |
"\n", | |
"#y = mo_turnout.turnout_rate\n", | |
"#x = mo_turnout.District\n", | |
"#width = 1/1.5\n", | |
"#plt.bar(x, y, width, color=\"blue\")\n", | |
"#fig = plt.gcf()\n", | |
"#plot_url = py.plot_mpl(fig, filename='mpl-basic-bar')\n", | |
"#plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 68, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"probs = pd.read_csv(\"voters_with_petition_flag.csv\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 69, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"probs[\"Voter_ID\"] = probs[\"VOTER.ID\"].astype(str)\n", | |
"results_race_mo[\"Voter_ID\"] = results_race_mo[\"Voter_ID\"].astype(str) " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 70, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model_eval = pd.merge(probs[[\"Voter_ID\", \"LAST.NAME\", \"FIRST.NAME\", \n", | |
" \"likely_to_vote\"]], results_race_mo, on=\"Voter_ID\", how=\"left\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 71, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model_eval = pd.read_csv(\"model_eval.csv\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 72, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"#model_eval.to_csv(\"model_eval.csv\", index=False)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 73, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model_eval[\"pred_vote\"] = model_eval.likely_to_vote.apply(lambda x: 1 if x>0.85 else 0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 74, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import math\n", | |
"model_eval[\"act_vote\"] = model_eval.Voter_Name.apply(lambda x: 0 if pd.isnull(x) == True else 1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 75, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model_eval_deduped = pd.DataFrame(\n", | |
" model_eval.fillna(0).groupby([\"Voter_ID\", \"LAST.NAME\", \"FIRST.NAME\"])[[\"Dist_VotI\", \"pred_vote\", \"act_vote\"]].max()\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 76, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model_eval_deduped[\"Voter_ID\"] = model_eval_deduped.index.get_level_values(0)\n", | |
"model_eval_deduped[\"LAST.NAME\"] = model_eval_deduped.index.get_level_values(1)\n", | |
"model_eval_deduped[\"FIRST.NAME\"] = model_eval_deduped.index.get_level_values(2)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 77, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model_eval_deduped.sort_values(\"Voter_ID\", inplace=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 78, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from sklearn.metrics import cohen_kappa_score\n", | |
"from sklearn.metrics import accuracy_score" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 2", | |
"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.13" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment