{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Science Demo: predicting Crime resolution in San Francisco" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The City of San Francisco publishes historical crime events on their http://sfdata.gov website. \n", "\n", "I have loaded this dataset into HIVE. Let's use Spark to do some fun stuff with it!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setting Up Spark" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we create a SparkContext:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Set up Spark Context\n", "from pyspark import SparkContext, SparkConf\n", "\n", "SparkContext.setSystemProperty('spark.executor.memory', '4g')\n", "conf = SparkConf()\n", "conf.set('spark.sql.autoBroadcastJoinThreshold', 200*1024*1024) # 200MB for map-side joins \n", "conf.set('spark.executor.instances', 12)\n", "\n", "sc = SparkContext('yarn-client', 'Spark-demo', conf=conf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now we create a HiveContext to enable Spark to access data from HIVE:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+-----------+---------+-------+\n", "| col_name|data_type|comment|\n", "+-----------+---------+-------+\n", "| incidentid| string| null|\n", "| category| string| null|\n", "|description| string| null|\n", "| dayofweek| string| null|\n", "| date_str| string| null|\n", "| time| string| null|\n", "| district| string| null|\n", "| resolution| string| null|\n", "| address| string| null|\n", "| longitude| string| null|\n", "| latitude| string| null|\n", "| location| string| null|\n", "| pdid| string| null|\n", "+-----------+---------+-------+\n", "\n" ] } ], "source": [ "# Setup HiveContext\n", "from pyspark.sql import HiveContext, Row\n", "hc = HiveContext(sc)\n", "hc.sql(\"use demo\")\n", "hc.sql(\"DESCRIBE crimes\").show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look at the dataset - first 5 rows:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
incidentidcategorydescriptiondayofweekdate_strtimedistrictresolutionaddresslongitudelatitudelocationpdid
0150331521LARCENY/THEFTGRAND THEFT FROM A BUILDINGWednesday04/22/201518:00BAYVIEWNONE2000 Block of EVANS AV-122.39631561912637.7478113603031(37.7478113603031, -122.396315619126)15033152106304
1150341605ASSAULTATTEMPTED SIMPLE ASSAULTSunday04/19/201512:15CENTRALNONE800 Block of WASHINGTON ST-122.4067271677137.7950566945259(37.7950566945259, -122.40672716771)15034160504114
2150341605ASSAULTTHREATS AGAINST LIFESunday04/19/201512:15CENTRALNONE800 Block of WASHINGTON ST-122.4067271677137.7950566945259(37.7950566945259, -122.40672716771)15034160519057
3150341605OTHER OFFENSESCRUELTY TO ANIMALSSunday04/19/201512:15CENTRALNONE800 Block of WASHINGTON ST-122.4067271677137.7950566945259(37.7950566945259, -122.40672716771)15034160528010
4150341702NON-CRIMINALAIDED CASE, MENTAL DISTURBEDSunday04/19/201512:03MISSIONEXCEPTIONAL CLEARANCE1100 Block of SOUTH VAN NESS AV-122.41655757821837.7547485110398(37.7547485110398, -122.416557578218)15034170264020
\n", "
" ], "text/plain": [ " incidentid category description dayofweek \\\n", "0 150331521 LARCENY/THEFT GRAND THEFT FROM A BUILDING Wednesday \n", "1 150341605 ASSAULT ATTEMPTED SIMPLE ASSAULT Sunday \n", "2 150341605 ASSAULT THREATS AGAINST LIFE Sunday \n", "3 150341605 OTHER OFFENSES CRUELTY TO ANIMALS Sunday \n", "4 150341702 NON-CRIMINAL AIDED CASE, MENTAL DISTURBED Sunday \n", "\n", " date_str time district resolution \\\n", "0 04/22/2015 18:00 BAYVIEW NONE \n", "1 04/19/2015 12:15 CENTRAL NONE \n", "2 04/19/2015 12:15 CENTRAL NONE \n", "3 04/19/2015 12:15 CENTRAL NONE \n", "4 04/19/2015 12:03 MISSION EXCEPTIONAL CLEARANCE \n", "\n", " address longitude latitude \\\n", "0 2000 Block of EVANS AV -122.396315619126 37.7478113603031 \n", "1 800 Block of WASHINGTON ST -122.40672716771 37.7950566945259 \n", "2 800 Block of WASHINGTON ST -122.40672716771 37.7950566945259 \n", "3 800 Block of WASHINGTON ST -122.40672716771 37.7950566945259 \n", "4 1100 Block of SOUTH VAN NESS AV -122.416557578218 37.7547485110398 \n", "\n", " location pdid \n", "0 (37.7478113603031, -122.396315619126) 15033152106304 \n", "1 (37.7950566945259, -122.40672716771) 15034160504114 \n", "2 (37.7950566945259, -122.40672716771) 15034160519057 \n", "3 (37.7950566945259, -122.40672716771) 15034160528010 \n", "4 (37.7547485110398, -122.416557578218) 15034170264020 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crimes = hc.table(\"crimes\")\n", "crimes.limit(5).toPandas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exploring the Dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What are the different types of crime resolutions?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
resolution
0LOCATED
1JUVENILE DIVERTED
2ARREST, CITED
3NOT PROSECUTED
4COMPLAINANT REFUSES TO PROSECUTE
5CLEARED-CONTACT JUVENILE FOR MORE INFO
6JUVENILE CITED
7PROSECUTED FOR LESSER OFFENSE
8EXCEPTIONAL CLEARANCE
9JUVENILE BOOKED
10UNFOUNDED
11PSYCHOPATHIC CASE
12JUVENILE ADMONISHED
13DISTRICT ATTORNEY REFUSES TO PROSECUTE
14PROSECUTED BY OUTSIDE AGENCY
15ARREST, BOOKED
16NONE
\n", "
" ], "text/plain": [ " resolution\n", "0 LOCATED\n", "1 JUVENILE DIVERTED\n", "2 ARREST, CITED\n", "3 NOT PROSECUTED\n", "4 COMPLAINANT REFUSES TO PROSECUTE\n", "5 CLEARED-CONTACT JUVENILE FOR MORE INFO\n", "6 JUVENILE CITED\n", "7 PROSECUTED FOR LESSER OFFENSE\n", "8 EXCEPTIONAL CLEARANCE\n", "9 JUVENILE BOOKED\n", "10 UNFOUNDED\n", "11 PSYCHOPATHIC CASE\n", "12 JUVENILE ADMONISHED\n", "13 DISTRICT ATTORNEY REFUSES TO PROSECUTE\n", "14 PROSECUTED BY OUTSIDE AGENCY\n", "15 ARREST, BOOKED\n", "16 NONE" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crimes.select(\"resolution\").distinct().toPandas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's define a crime as 'resolved' if it has any string except \"NONE\" in the resolution column.\n", "\n", "**Question**: How many crimes total in the dataset? How many resolved?" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1750133 crimes total, out of which 700088 were resolved\n" ] } ], "source": [ "total = crimes.count()\n", "num_resolved = crimes.filter(crimes.resolution != 'NONE').count()\n", "print str(total) + \" crimes total, out of which \" + str(num_resolved) + \" were resolved\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at the longitude/latitude values in more detail. Spark provides the describe() function to see this some basic statistics of these columns:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
summarylonglat
0count17501331750133
1mean-122.4226385340385837.771270995453996
2stddev0.0309396211305354960.4727448638706336
3min-122.5136437.70788
4max-120.590.0
\n", "
" ], "text/plain": [ " summary long lat\n", "0 count 1750133 1750133\n", "1 mean -122.42263853403858 37.771270995453996\n", "2 stddev 0.030939621130535496 0.4727448638706336\n", "3 min -122.51364 37.70788\n", "4 max -120.5 90.0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c1 = crimes.select(crimes.longitude.cast(\"float\").alias(\"long\"), \n", " crimes.latitude.cast(\"float\").alias(\"lat\"))\n", "c1.describe().toPandas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that the max values for longitude (-120.5) and latitude (90.0) seem strange. Those are not inside the SF area. Let's see how many bad values like this exist in the dataset: " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "143\n" ] }, { "data": { "text/plain": [ "[Row(long=-120.5, lat=90.0),\n", " Row(long=-120.5, lat=90.0),\n", " Row(long=-120.5, lat=90.0)]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c2 = c1.filter('lat < 37 or lat > 38')\n", "print c2.count()\n", "c2.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Seems like this is a data quality issue where some data points just have a fixed (bad) value of -120.5, 90." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computing Neighborhoods\n", "\n", "Now I create a new dataset called crimes2:\n", "1. Without the points that have invalid longitude/latitude\n", "2. I calculate the neighborhood associated with each long/lat (for each crime), using ESRI geo-spatial UDFs\n", "3. Translate \"resolution\" to \"resolved\" (1.0 = resolved, 0.0 = unresolved)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "hc.sql(\"add jar /home/jupyter/notebooks/jars/guava-11.0.2.jar\")\n", "hc.sql(\"add jar /home/jupyter/notebooks/jars/spatial-sdk-json.jar\")\n", "hc.sql(\"add jar /home/jupyter/notebooks/jars/esri-geometry-api.jar\")\n", "hc.sql(\"add jar /home/jupyter/notebooks/jars/spatial-sdk-hive.jar\")\n", "\n", "hc.sql(\"create temporary function ST_Contains as 'com.esri.hadoop.hive.ST_Contains'\")\n", "hc.sql(\"create temporary function ST_Point as 'com.esri.hadoop.hive.ST_Point'\")\n", "\n", "cf = hc.sql(\"\"\"\n", "SELECT date_str, time, longitude, latitude, resolution, category, district, dayofweek, description\n", "FROM crimes\n", "WHERE longitude < -121.0 and latitude < 38.0\n", "\"\"\").repartition(50)\n", "cf.registerTempTable(\"cf\")\n", "\n", "crimes2 = hc.sql(\"\"\"\n", "SELECT date_str, time, dayofweek, category, district, description, longitude, latitude,\n", " if (resolution == 'NONE',0.0,1.0) as resolved,\n", " neighborho as neighborhood \n", "FROM sf_neighborhoods JOIN cf\n", "WHERE ST_Contains(sf_neighborhoods.shape, ST_Point(cf.longitude, cf.latitude))\n", "\"\"\").cache()\n", "crimes2.registerTempTable(\"crimes2\")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
date_strtimedayofweekcategorydistrictdescriptionlongitudelatituderesolvedneighborhood
003/28/201521:00SaturdayLARCENY/THEFTRICHMONDGRAND THEFT FROM PERSON-122.51364206426537.77846921994670Seacliff
102/26/201509:45ThursdayLARCENY/THEFTRICHMONDGRAND THEFT FROM LOCKED AUTO-122.49676104137137.78596199890640Seacliff
202/09/201522:00MondaySUSPICIOUS OCCRICHMONDSUSPICIOUS OCCURRENCE-122.50964469377437.77520653673430Seacliff
312/11/201421:00ThursdayLARCENY/THEFTRICHMONDPETTY THEFT FROM LOCKED AUTO-122.51364206426537.77846921994670Seacliff
408/24/201420:00SundayVANDALISMRICHMONDMALICIOUS MISCHIEF, VANDALISM OF VEHICLES-122.51364206426537.77846921994670Seacliff
\n", "
" ], "text/plain": [ " date_str time dayofweek category district \\\n", "0 03/28/2015 21:00 Saturday LARCENY/THEFT RICHMOND \n", "1 02/26/2015 09:45 Thursday LARCENY/THEFT RICHMOND \n", "2 02/09/2015 22:00 Monday SUSPICIOUS OCC RICHMOND \n", "3 12/11/2014 21:00 Thursday LARCENY/THEFT RICHMOND \n", "4 08/24/2014 20:00 Sunday VANDALISM RICHMOND \n", "\n", " description longitude \\\n", "0 GRAND THEFT FROM PERSON -122.513642064265 \n", "1 GRAND THEFT FROM LOCKED AUTO -122.496761041371 \n", "2 SUSPICIOUS OCCURRENCE -122.509644693774 \n", "3 PETTY THEFT FROM LOCKED AUTO -122.513642064265 \n", "4 MALICIOUS MISCHIEF, VANDALISM OF VEHICLES -122.513642064265 \n", "\n", " latitude resolved neighborhood \n", "0 37.7784692199467 0 Seacliff \n", "1 37.7859619989064 0 Seacliff \n", "2 37.7752065367343 0 Seacliff \n", "3 37.7784692199467 0 Seacliff \n", "4 37.7784692199467 0 Seacliff " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "crimes2.limit(5).toPandas()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "**Question:** what is the percentage of crimes resolved in each neighborhood?" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " % resolved count\n", "neighborhood \n", "Downtown/Civic Center 0.571815 285122\n", "Mission 0.502114 190606\n", "Bayview 0.472574 119412\n", "Haight Ashbury 0.445869 41898\n", "Golden Gate Park 0.415417 15606\n", "South of Market 0.392870 241230\n", "Ocean View 0.384878 30724\n", "Bernal Heights 0.372881 38881\n", "Excelsior 0.371796 40810\n", "Outer Mission 0.368532 37123\n" ] } ], "source": [ "ngrp = crimes2.groupBy('neighborhood')\n", "ngrp_pd = ngrp.avg('resolved').toPandas()\n", "ngrp_pd['count'] = ngrp.count().toPandas()['count']\n", "ngrp_pd.columns = ['neighborhood', '% resolved', 'count']\n", "data = ngrp_pd.sort(columns = '% resolved', ascending=False)\n", "print data.set_index('neighborhood').head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And as a bar chart:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAskAAAH3CAYAAABJrcKtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtYlHX+//EXp4nDYKiUiEjmATmISqYVuHmkg1HulqBp\nbWX+2tZWa8t0rbSDWcvmN3NdtTZl1dTyfCjXSi3NJI/lIdDUzAzxRKYyIAww/P5wnZGbkybMEPN8\nXFfXxdxz3/CedzK85r4/9+fjUVpaWioAAAAAdp6uLgAAAACoawjJAAAAgAEhGQAAADAgJAMAAAAG\nhGQAAADAgJAMAAAAGHhXt0NWVpbS0tK0f/9++fv7q1evXurXr588PavP15s3b9ayZcv0008/ydvb\nW61atdLIkSN11VVX1UjxAAAAQG2oMiRbLBaNGzdOzZs318iRI3Xs2DHNnj1bNptNAwYMqPIbr127\nVmlpaerbt68efPBBFRQU6Ntvv1VJSUmNvgAAAACgplUZklevXq2ioiKNGDFCvr6+io2N1blz57Rw\n4UL17dtXfn5+FR539uxZzZo1S48++qh69uxp337DDTfUbPUAAABALahyzMSOHTvUoUMH+fr62rfF\nx8fLarUqMzOz0uO++uoreXh4qFu3bjVXKQAAAOAkVYbk7OxsNWvWrMy24OBgmUwmZWdnV3rc/v37\nFRoaqrVr1+rxxx/X/fffr+eff1779u2rmaqdJCMjw9Ul1An0wYFeONALB3rhQC8c6IUDvXCgFw51\nvRdVhmSLxSJ/f/9y281ms/Ly8io97syZM8rOztaKFSv0yCOP6IUXXlBAQIBeffVVnThx4sqrdpK6\n/j/PWeiDA71woBcO9MKBXjjQCwd64UAvHOp6L2plCrjS0lIVFBRo6NChuummmxQTE6NnnnlGPj4+\nWr16dW38SAAAAKDGVBmSzWaz8vPzy223WCwKCAio9LiAgAB5enoqMjLSvu2qq65S69atdfjw4Sso\nFwAAAKh9Vc5uERoaqiNHjpTZlpOTI6vVWm6s8sWaNWum0tLScttLS0srnF85IyOjzCn3lJSUagt3\nhrpSh6vRBwd64UAvHOiFA71woBcO9MKBXjjUpV4sWLDA/nVMTIxiYmKqDslxcXFasWKFCgoK7DNc\npKeny2QyKTo6utLjbrzxRi1evFiZmZlq166dJKmgoED79+/XnXfeWW7/C8VcrKobA50lMDBQubm5\n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\n8ODBNf8KAAAAgBpWZUiWpLCwMI0dO7bKfaZMmVJum7+/v4YOHfrrK6sDLpxud3f0wYFeONALB3rh\nQC8c6IUDvXCgFw51vRcepaWlpa4uAgAAAKhLmCcZAAAAMCAkAwAAAAbVjkmu74qLi3XgwAFde+21\natSokavLAeqk3NxcBQYGurqMOuH48eNq0qRJpc/v3r1bsbGxTqzIddavX6+4uDg1aNCg3HMWi0Xb\nt29Xt27dXFAZXKm4uFg2m00mk8m+bdu2bcrKylJ0dLQiIiJcWB1cqbS0VD/99JN++eUXlZSUlHv+\nhhtucEFVlXP7Mck2m02DBg3SCy+8UOcHkDtDaWmp1q9fr23btumXX34pN2uJJL3++usuqMz5Pvvs\nM0VGRl75wjb1wMCBA3XjjTeqe/fu6tixozw93fci1NChQ/XKK68oODi43HNbt27VW2+9pblz57qg\nMufr37+/xo8fr9atW5d77vvvv9dzzz2n+fPnu6Ay53v88ccVFRWlqKgoRUZGKjw83NUluczf//53\nBQcHa8iQIZKkFStWaO7cuTKZTLJarXrqqad0yy23uLjK2ldUVKQPP/xQnTp10nXXXefqclzu4MGD\nmjhxok6cOFHpPnXt/cLtzyR7enqqadOmslgsri6lTpgzZ44++ugjtWzZUqGhoeXCkIeHh4sqc77Z\ns2fr3LlzatCggSIjI+1//K6//nq36oMkPfbYY/r888+VmpqqoKAgdevWTd27d3fLDxAtW7bUK6+8\nopdfflkNGza0b9+wYYOmTp2qP/zhDy6sru7Iz8+Xt7f7/Im56667tGfPHs2fP18Wi0X+/v5l3jda\ntWolLy8vV5fpFN9//7169eol6fyJl48++kh33323HnjgAaWlpWnZsmVuEZJ9fHy0ZMmSKhdfcyfv\nvPOOfHx8NGrUqArzRV3kPu9gVRgwYIAWLlyo5s2bu+Uf/Yt9/vnnuu++++rUyoeukpaWph9//FF7\n9uzRnj17tHTpUp09e1a+vr6KiIhQZGSk7rvvPleX6RTdu3dX9+7ddfz4ca1bt07r16/X8uXLFRER\noe7duyshIaHMAkP12VNPPaU33njDHpQbNGigTz/9VGlpaRo4cKDuueceV5dYq7Zu3aqtW7faHy9a\ntKjccIvi4mLt3btXrVq1cnZ5LnP33Xfr7rvvtl9O3rt3r/bs2aNVq1bZz6K+9957ri7TKSwWi66+\n+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\ndX7u18zMzArf6C9MceUuZs2apYKCAv3jH/8os4zmjz/+qAkTJmjmzJkaPny4Cyt0nsGDBysqKsqt\n/tBXpmPHjnrvvff0888/VzrXp7vMepKfn6+DBw9q+PDhio2NrXC2kwceeMAFlTlfr1699P7776tB\ngwZlhp/s3bvXPhTDXUydOtXVJbjU7bffrptvvlmS9Oyzz2rYsGHllub29vZWcHCwW12JOXv2bKVL\nlIeHh5ebY7w+W7p0qe688049/PDDZbZ37dpVM2fO1NKlSwnJddFdd92lGTNmyNPT0/5LnpeXpy++\n+ELLli3TY4895uIKneebb77Rn/70p3LrzF933XUaNGiQ3nnnHRdV5nwX35Xv7tNbXRhrmp6ervT0\n9Ar3cZcbcTZv3mz/N7B79+4K93GXkHzPPfcoJydHkyZNsp9VHzt2rIqKipSYmGhfhMddlJSUaPv2\n7fYbtPr166fg4GBlZmYqJCSkXt+odfXVV9tn8Jg8ebIaNWrklu+VRiEhIUpPT69waer09HS3us/j\n2LFjGjJkSIXPdenSRZ9++qmTK6oe/4J1/mxIXl6eFi5cqPfff1+S9Oqrr8pkMik5OVm/+93vXFyh\n8xQXF8vPz6/C5/z8/NxqjKHE9FYXXHxDlrubMmWKq0uoMzw9PTVkyBAlJSVp9+7dys3NldlsVrt2\n7dzqj790ftje+PHjlZWVpZCQEGVnZ+u2225TcHCwNm7cqKKiIg0dOtTVZTrFhRvA8/Pzdfr0adls\ntnL7uMsV2vvuu0+TJk3SyZMnddNNN9mHGGzevFk7duzQk08+6eoSnaZBgwY6ePBghffzHDp0qE5O\nk0hI/p977rlHvXv31r59++xv9BERERVeVq7P2rRpo2XLlikyMrLMUpmFhYVavny52rRp48LqnOvi\n6a369u1bJiiGhITo888/d5uQzKwnqMjq1auVmJiokJCQcsOSSktL9c477+jxxx93UXXOdWEBncmT\nJ6thw4Zl5gmur/OHV+bEiROaNm2aMjMzK93HXa48xcfHy9vbWwsXLixzJbZFixZ65pln1KVLFxdW\n51w9evTQvHnzVFxcrJtvvrnMB4YFCxbUyVnECMk6H4bi4uLUoEEDdezYscxzFotF27dvV7du3VxU\nnXP98Y9/1Isvvqi//OUv6tChgxo0aKAzZ85o165dKioq0ksvveTqEp2G6a0cLmWGF3c5MySdD4B7\n9+7V0aNHVVRUVO7522+/3QVVOd/MmTNlMpnKvT9e+H3ZuXOn24TknTt3avjw4QoODi43S1KjRo10\n6tQpF1XmfFOnTtXRo0c1ePBghYaGut2NzkZdunRRly5dVFBQoLy8PAUEBLjlYmX9+vVTfn6+Pvjg\nA82bN8++3cvLS7fddpv69evnwuoqRkjW+V/o8ePHVzhrw/HjxzV16lS3CcktWrTQhAkTtHLlSn33\n3Xfat2+fAgIC1LVrV911111utdQq01s5PPPMM9Xu4y5nhnJycvTaa6/pyJEjle7jLiF56NChmjJl\ninx8fOzTNxUVFen//u//dODAAb344osurtC5KhuDa7FYKh3GVh/t379fTz75pFudJb0Uvr6+bhmO\nL/D09NTDDz+se++9VwcOHLDPk9y6des6O2sWIbka+fn5bnfzwTXXXFPu7lN3xPRWDhcvsHNBYWGh\ndu3ape3bt+uhhx5yQVWuMXPmTAUGBuqdd97Rn/70J7322mtq1KiRNm7cqM8++0wjR450dYlOk5CQ\nIKvVqilTpshkMqldu3ZKTU3V0aNH9dJLL7nV1YXIyEitWrVKsbGx5Z5bt26d2rVr54KqXKNRo0Zu\nNYOF0Zw5c3TnnXeqcePGeu+996qdCtBdbvS9oEGDBr+Z2ZDcK/1dZOvWrdq6dav98aJFi8p9kiku\nLtbevXvVqlUrZ5eHOoDprRxiYmIq3H7DDTfIbDZr06ZNbrMC3bfffqu//OUvZd4vGjZsqKSkJNls\nNk2fPl0vvPCCCyt0rh49eqioqEgTJ05U06ZNVVBQoFdeecXtxrEPGjRIY8aM0ciRI+1nUL/44gvN\nnTtXBw8e1Pjx411cofP0799fK1asUGRkpFueOf3qq6/UtWtXNW7cWJs2bap2//ockr/++mtFRkbK\n399fX3/9dbX717Xw7LYh+cyZM/YZC6TzwyqM8xV6e3srNja23oeh0aNH64knnlBYWJhGjx5d7f6v\nv/66E6pyPaa3ujQxMTH68MMPXV2G01itVgUGBsrT01Pe3t7Kzc21P9eqVat6P1a9ovHpUVFRuvXW\nW7VlyxYNHz5cVqvVvp+7nE0ODw9XamqqFi5cqDVr1sjT01MbN25UbGysXnvtNTVt2tTVJdaqN998\ns8zjo0eP6oknnlCbNm0qPKv89NNPO6s0p7t4Bhx3nw0nNTVV48ePV+vWrZWamlrt/nVt2J7bhuTe\nvXurd+/ekqSXXnpJQ4YMcZs3c6OwsDD5+PjYv66KO60gxfRWl+abb75xqyFJISEh+vnnnyVJzZs3\n18aNG+03/G7durXMrDD1UXXj01977bUyj+vaH73aFBISomHDhrm6DJc4e/asfYVaDw8PNWnSRJJU\nUFCggoICSSrzPNzDhTmzL3z9W+NR6k5rLgP4VYxniSTJZrPp6NGjysrK0r333qv+/fu7oDLnmzVr\nlgoLC/XYY49p06ZNmjhxov2G1pycHCUnJ9fJu7RrSkZGxmXtX9lQHcAdpKeny2q1qnv37pLOL6gx\nceJEZWVlKTo6WsOHD1dgYKBri0SlCMn/c+zYMX399deVTnxen8cMVefs2bM6fvy4mjdvXu/Hl2Vl\nZenaa6+VyWRi2rOLvPTSS/azQBd4eXmpYcOGuvHGG+0rVbqjPXv2aPPmzSouLlb79u3d5o7+oqIi\nbdq0Sa1bt673Qwkq8+abb2rgwIEKCQmp8IOkUX0eYoCKPfPMM0pMTNQdd9whSRo/frxOnDihHj16\naO3atYqKinKbRWZ++uknnTt3ThEREZLOX2WYP3++jhw5oujoaPXt27fOXWVwn2ukVdiwYYOmTp0q\nSQoKCqpwTkd3Ccnz5s2Tl5eX/azgjh079MYbb6i4uFhms1ljxoxRixYtXFtkLXrmmWfs46eY9szB\nnebHrszx48e1YcMGnTp1SmazWZ07d1abNm0UFRVV4QpS9Z23t7fefvttvfDCC24bks+ePWufCvLi\n4QYXc8chBgsXLqz09Xp4eMjPz08tWrSocKnm+ub48eMKDw+XdH4qwN27d2vUqFGKi4tTcHCwZs6c\n6doCnejf//632rdvbw/Js2bN0pdffqmoqCgtWrRIxcXFde4qHCFZ0gcffKBOnTpp6NCh8vf3d3U5\nLrVx48Yyl83fe+89tWvXTv369dMHH3yguXPn6vnnn3dhhbVr7Nixatasmf1rlFdYWGifEL++j7+9\nYO/evRo/fryKiooUFBSk3NxcLV++XEOGDFFiYqKry3MJDw8PhYeH6+TJk275IUGSXnjhBft4fD5I\nOnz88ceyWq2yWq3y9PSUr6+vCgoKZLPZZDKZ5OHhocLCQl133XV67rnnFBQU5OqSa01paan96vR3\n330nLy8v+3SAjRs3Vl5enivLc6rDhw/bQ3BRUZG+/PJLPfzww+rVq5f++9//atWqVYTkuujMmTPq\n06eP2wdkSTp16pT9houTJ08qKytLQ4cOVatWrXTXXXdp0qRJLq6wdl08fpKxlGVt2rRJS5cu1aFD\nh+zbWrRood///ve65ZZbXFeYE8yfP1/h4eF69tlnFRQUpIKCAk2fPl3z5s1Tr1693HZFsYceekjv\nvPOOrr76arVv396tzpZK0v/7f/9PN910kxISEtSuXTu3e/2VGT16tKZNm6b7779fHTt2lLe3t4qL\ni/XNN9/ogw8+0GOPPSYvLy9NnDhRs2fP1vDhw11dcq257rrrtHHjRkVERGjt2rWKjIy03yj/yy+/\n1NlFNGqD1Wq1n1g5cOCArFarbrrpJknn/5bk5OS4srwKEZIltW3bVseOHXOLSz/Vueqqq+yfbPfs\n2SN/f3/7PNG+vr4VLsFbX40dO1YJCQm65ZZb3OqNrCKrV6/W9OnTdcMNN+j2229XYGCgcnNztWXL\nFr311lvKzc3Vbbfd5uoya83333+vp556yn7Gy9fXVw888IA2bNigY8eOue1sJ2+88YasVqtee+01\neXt7l7tnwcPDQ9OnT3dRdbWva9eu2rRpkz7//HNdffXVuuWWW5SQkGC/nOyuZsyYod///vdl5k73\n9vZW586dVVBQoLS0NKWmpio5OVnvvfeeCyutfQMHDlRqaqo+++wzmUymMldit23bptatW7uwOue6\n5pprtH//fkVGRmrr1q0KDw+X2WyWJJ07d65O3vNESNb5syH/+te/ZDKZ1L59+wovIbvLZeWoqCgt\nX75cHh4e+vDDDxUXF2d/Ljs7W9dcc40Lq3OuoKAgzZkzRzNnzlR0dLQSEhLUpUsX+y+1O1m6dKn6\n9OlTbmW9nj17atasWVq6dGm9DsmFhYXlPihduCO9sLDQFSXVCdUtv13fz6w++uijeuSRR/Ttt98q\nPT1dX3zxhT7++GNdc801io+PV9euXe3jUd3J4cOH1bBhwwqfCwoKst8UHRISovz8fGeW5nTt2rXT\ntGnTlJWVpdDQ0DLvI127dnWrlVv79OmjWbNmKT09XQcPHtSf/vQn+3OZmZl18n4nQrKkZ599VlLV\nc/i5yw1ajzzyiCZNmqR//OMfuv766zVw4ED7c19++WWFSzTXV08//bQKCgq0bds2paena8aMGZo+\nfbrat2+v+Ph4de7cWX5+fq4u0ylyc3MrnbWhc+fOWrNmjZMrcj6r1VomEJeUlEg6H5KNQdldPlSn\npKS4ugSX8/T0VPv27dW+fXsNGTJEO3fuVHp6uj755BMtX75cYWFhSkhIUEJCgn0oW33XtGlTffTR\nR4qMjCwzh3pRUZFWrlxpv/Jy+vRpt7hKZzabK/zbWddWl6ttd9xxh0JCQnTw4EGlpKSUOQnn5+en\npKQkF1ZXMaaAk7Ru3bpq97kwx6E7y8/Pl8lkcquFIy6Wn5+vrVu3Kj09Xbt375anp6fmzJnj6rKc\n4u9//7vatm2rP/zhD+WeW7Jkib777rtLWq3xt+py54B2lw/VqJzVatXXX3+tjRs3asuWLZLc599F\nRkaGXn/9dZnNZrVv315ms1lnz57V7t27lZ+fr7/97W+KiYnRBx98oPz8fA0ePNjVJdeojz/++LKu\nolR3RQau455px4AAXLVDhw4pOztbbdq0ceubG/39/dWkSRM1adJEBw4ckMVicXVJterieaL79Omj\nt99+W6dPn1bnzp3VoEED+5jkbdu2lblsVh/9+c9/dnUJddZ3332nzz77TMeOHZPVai33vLssY290\n6NAh7dmzR/v27ZMktxqqFhMTowkTJui///2v9u3bp/z8fAUEBOjmm2/WnXfeaR9iMGDAABdXWjv+\n85//XNb+7hKSMzIydO7cOftY9TNnzujdd9+1L6zy8MMPV7iEuStxJvkihw4d0r59+5Sbm6tevXop\nKChIR48e1dVXX+024XDKlCny8/Ozf7L/4osv7GvPe3t7a/To0fbpa9zF/v37lZ6erk2bNunUqVNq\n3ry54uPjFR8fX6/Hk3H2FNXZvHmz3nrrLXXo0EHffPON4uLiVFJSoszMTDVs2FDR0dFus1CCJB08\neFDp6en66quvlJOTw818wEVGjRqlhIQE3XPPPZLOL8azZ88edenSRZs3b1bXrl318MMPu7ZIA84k\n6/yqLxMnTtSOHTtkMplktVoVFxenoKAgLVq0SAEBAfXuclBldu3aVebmrAULFuh3v/udHnjgAc2c\nOVPz5893m5A8Z84c+x+7pk2bqkePHoqPj3ebVfaYJxrVWbRoke6++271799fAwcOVEpKilq2bKlT\np07ptddec4tpFLOysrRx40alp6fr2LFj8vf3t08LFxMT47bTAwJG2dnZatmypSTZ7/f5y1/+ovj4\neLVq1Urz588nJNdFs2bNUlZWll5++WW1bt1agwYNsj/XoUMHLV682IXVOdfZs2cVHBws6fw/6JMn\nT2rUqFEKCgpSjx499MYbb7i4Quf56quvFB8fr4SEhDp5121tc4eAgyuTnZ2tRx55xD7+8sLqc40a\nNVJKSormzp2rbt26ubLEWjVixAj99NNPMplM6tSpkx588EH7vMDuZvTo0XriiScUFhZ2SfcnuNMw\nnBMnTmjlypXat2+fLBaLRo4cqebNm+u///2vWrZs6TY3xJeUlMjLy0uStG/fPpWWltpvXmzatKnO\nnj3ryvIq5H6/yRXYsmWLhgwZosjISPsd6xdcc801OnnypIsqcz5/f3+dPn1a0vnxQw0aNFDz5s0l\nnR9u4U6jc/75z3/af6HhUFxcXO73RHKfGR3gcGH8oKenpwICAnT8+HH7sAJvb+96/94ZHBxsnw+4\nLs7x6kxhYWH2RTKqu9pW36cGvNiBAwc0btw4NWrUSFFRUVq7dq19vYGzZ89q+fLlbhOSQ0NDtWPH\nDkVFRenLL79Uq1at7L83ubm5CggIcHGF5RGSdf4u5AtznhoVFhbaf/HdQYcOHTR//nydPn1ay5cv\nt6+GI52f+7I+j8E1evzxx3XrrbeqR48ebjPEojIWi0WzZ8/W1q1bK53XlDHJ7ue6667T4cOHFR0d\nrXbt2mnp0qVq1KiRpPP/Hi4s8V5f/e1vf3N1CXXGE088UeHX7m7WrFnq2LGjnnzySZWWlmrt2rX2\n5yIiItxi+swL7r33Xk2aNElr165Vbm6uRowYYX9u586d9qEYdQkhWVLLli21fv36Csfabtq0SW3b\ntnVBVa7xyCOPaMaMGVq5cqVat25d5u7jLVu2qEOHDi6szrkSExO1fv16ffTRR2rVqpV69OihhIQE\nt7mJ82JTp05VRkaGEhMTFRoayjhLSJKSkpJ06tQpSdKDDz6o8ePH65VXXpEkNWjQoMwfQbgfm82m\n7OxsWSwWtWjRwi3Pth88eFD9+/eXp6dnuStw/v7+9hVu3UF8fLzCw8P1ww8/qEWLFvar1JJ0/fXX\n18mhWYRknZ+GZty4cTp79qz9zOnu3bv16aefasOGDXr55ZddXKHzBAYG6qmnnqrwuRdffNHJ1bhW\nSkqKkpOTlZGRoXXr1mn27NmaNWuWunTpou7du6t9+/auLtFpdu3apccee0y33nqrq0upE0pKSrR9\n+3b7GMN+/fopODhYmZmZCgkJsZ9Nre8uXnb4mmuu0ZtvvqnDhw+ruLhY4eHhdW46JzjPihUrtHz5\ncvtUma+//rpatmypt956Sy1btrTPcFDf+fv7Kzc3t8LnTp48aV/q3l2EhYVVeGW2d+/eLqimeoRk\nnV+KeezYsZo3b57effddSdK8efMUERGhMWPGuNXa6ijLw8ND7dq1U7t27fToo4/qq6++0qeffqrx\n48crODhY3bp1U+/evet9KDKbzfX+NV6q06dPa/z48crKylJISIiys7N12223KTg4WBs3blRRUZFb\nTXt2MU9PT7e8yRVlrVixQvPnz9d9992nmJiYMjPlREVFad26dW4Tkm+88UYtWLBAbdq0KfMemp+f\nrw8//LDMkMb66Ouvv1ZkZKT8/f319ddfV7t/XVuFkJD8P5GRkXrllVdUWFiovLw8+fv7u82lIe5K\nvjQHDx5UZmamjhw5IrPZrLZt2+qzzz7TihUr6v1Z1qSkJH366aeKiYlxq5tuKpKWlibp/DL2DRs2\nLLN0e0xMjObOneuq0pxi3bp1l/VvoC5eQkXt+uSTTzRo0CD16dOn3BCDZs2alVmoqL4bNGiQxo0b\npyeffFJt2rSRJM2cOVNHjhxRcHBwvV/aPTU1VePHj1fr1q2Vmppa7f517d4Wtw7Jhw8flr+/v33K\nM+n8HfoX7tL/+eeflZeXp/DwcFeV6BTclVy5EydOaN26dfriiy908uRJtW/fXn/+85/VpUsXeXt7\nq6SkRHPnztWcOXPqXUh+77337P+/S0tLdeDAAT399NNq165dhTNZPPDAA84u0SV27typ4cOHKzg4\nuFwAaNSokX2Mbn01bdq0y9qfkOx+Tp8+XelNWB4eHm41S5LZbNarr76qDRs2aNeuXWrXrp0CAwN1\n6623qlu3bvV+YoDJkyfbz6BPnjzZxdVcPrcNyZs2bdLkyZOrPCual5en0aNH68knn1SXLl2cWJ1z\ncVdyxV5++WVlZmaqcePG6t69u3r06FFuaVkvLy/Fx8dr5cqVLqqy9mzatKnMYw8PD1mt1kovmblL\nSJZU6Ty4FotFfn5+Tq7GuS5cYevUqZMSEhIUHR3tdh+eK1JUVKRly5Zp27Zt+uWXX8p9gPLw8ND0\n6dNdVJ1zNWnSRJmZmRVObbZ37163my3Ix8dHPXv2VM+ePV1ditNde+21FX79W+G2IXnt2rXq0aNH\nlWeJw8PD1atXL61Zs6Zeh+SFCxde1h+5fv361WI1dUdgYKCee+45xcbGVjmbQ4sWLX6Tn5Crc2E5\n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\n7O3tKSwspLCwkN69ezNhwgSlIwoTGT9+vNIRHhvW1tb84he/4Be/+IXqlyS1bt1a6QiKWLdundIR\nmo26zd9r167F0dGR559/3nivV69esgFcqF6fPn04derUY7XERIpkbr/CWbJkCWfOnOH8+fPo9Xps\nbGzw8/PDz89P6XhCNHstfUlSRUUF+/bto3v37gQFBQG3l9wsWbKk3jhLS0v+8Ic/tPg2cHfKzc0l\nJiaGjIwM489OLy8vwsPDad++vdLxTObMmTO8+uqrODs7U1NTU++ek5NTi9/smJKS8rPG13UOEurh\n7+/P1q1buXHjBoGBgY1OLjS37wspkn+i0Wjw9/fH399f6ShCiGbm0KFD7N+/nw8++MB4rba2lqys\nLAIDA7GxsQFuLz84dOgQzzzzjFJRTSorK4sVK1ZgZWVFYGAgdnZ2FBcXk5yczIkTJ1i2bFm9NZgt\nXVOnTur1+hZ/OueqVat+1ng19VVW8wbwO61duxa43VEsISGh0THN7ftCtUXyrVu30Ol0aDQaY9ue\ne1HTzJAQor5vvvmGX/7yl43OmD/33HPGQvDAgQMkJCSopkjeunUrPXr0YOHCheh0OuP1yspKVq9e\nzdatW1m2bJmCCU3Hy8uLAwcO1NvXUufo0aP4+PgokMp06gogcZtsAG/ocfweUW2RPHXqVCIiIvDw\n8GDq1Kn3Hd/cXt0IIUzn+++/f6Ad6F26dOH77783QaLmITMzkwULFtQrkOH2ErawsDDeffddhZKZ\n3uTJk1m6dCkLFy4kODgYgK+//pqoqCiysrKIiIhQOOGj1a5dO6UjNBuyAbxxj+P3iGqL5FdeecX4\nF/bKK68onEaI5m337t0MHTq00RZWBQUFHD58mHHjximQzDSqqqoanDZoZmbGhg0bjEst4PYhM5WV\nlaaOpxidToder2/0nl6vr3cwT0vn6urKqlWr2LVrF19++SVarZb4+Hh8fX1555136Nixo9IRTa6m\npob8/HzjqZR36ty5swKJTEM2gDetrKyMI0eOcPHiRUpLS5k5cyYdO3YkISEBV1fXZvd9odoi+c62\nbtLiTYh727VrF/7+/o0WyTdv3mTXrl0tukh2cHDg2rVreHt717tuZ2dX7/1r167h6OhoymiKCggI\nICoqinbt2uHh4WG8npmZSVRUVL0j3tWgQ4cO/P73v1c6huKqqqrYtGkTx44do7q6utEx8nRWfXJy\n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\nuMv/B+EeLPjKQuKpAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib\n", "matplotlib.style.use('ggplot')\n", "data.iloc[:10].plot('neighborhood', '% resolved', kind='bar', legend=False, figsize=(12,5), fontsize=15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the Python Folium package I draw an interactive map of San Francisco, and color-code each neighborhood with the percent of resolved crimes:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "import folium\n", "\n", "map_width=1000\n", "map_height=600\n", "sf_lat = 37.77\n", "sf_long = -122.4\n", "\n", "def inline_map(m, width=map_width, height=map_height):\n", " m.create_map()\n", " srcdoc = m.HTML.replace('\"', '"')\n", " \n", " embed = HTML(''.format(srcdoc, width, height))\n", " return embed\n", "\n", "map_sf = folium.Map(location=[sf_lat, sf_long], zoom_start=12, width=map_width, height=map_height)\n", "map_sf.geo_json(geo_path='data/sfn.geojson', data=ngrp_pd,\n", " columns=['neighborhood', '% resolved'],\n", " key_on='feature.properties.neighborho',\n", " threshold_scale=[0, 0.3, 0.4, 0.5, 1.0],\n", " fill_color='OrRd', fill_opacity=0.6, line_opacity=0.6,\n", " legend_name='P(resolved)')\n", "\n", "inline_map(map_sf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preparing The Feature Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, some basic feature engineering work:\n", "1. Extract year and month values from the date field\n", "2. Extract hour from the time field" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yearmonthhourcategorydistrictdayofweekdescriptionneighborhoodlongitudelatituderesolved
02015411LARCENY/THEFTRICHMONDThursdayGRAND THEFT FROM LOCKED AUTOSeacliff-122.51364206426537.77846921994670
12015316MISSING PERSONRICHMONDTuesdayFOUND PERSONSeacliff-122.5036378131237.78120598875291
22015312WARRANTSRICHMONDFridayENROUTE TO OUTSIDE JURISDICTIONSeacliff-122.50922562681837.77704246179661
32015216LARCENY/THEFTRICHMONDMondayPETTY THEFT FROM LOCKED AUTOSeacliff-122.51364206426537.77846921994670
42014129LARCENY/THEFTRICHMONDSaturdayGRAND THEFT FROM LOCKED AUTOSeacliff-122.51364206426537.77846921994670
\n", "
" ], "text/plain": [ " year month hour category district dayofweek \\\n", "0 2015 4 11 LARCENY/THEFT RICHMOND Thursday \n", "1 2015 3 16 MISSING PERSON RICHMOND Tuesday \n", "2 2015 3 12 WARRANTS RICHMOND Friday \n", "3 2015 2 16 LARCENY/THEFT RICHMOND Monday \n", "4 2014 12 9 LARCENY/THEFT RICHMOND Saturday \n", "\n", " description neighborhood longitude \\\n", "0 GRAND THEFT FROM LOCKED AUTO Seacliff -122.513642064265 \n", "1 FOUND PERSON Seacliff -122.50363781312 \n", "2 ENROUTE TO OUTSIDE JURISDICTION Seacliff -122.509225626818 \n", "3 PETTY THEFT FROM LOCKED AUTO Seacliff -122.513642064265 \n", "4 GRAND THEFT FROM LOCKED AUTO Seacliff -122.513642064265 \n", "\n", " latitude resolved \n", "0 37.7784692199467 0 \n", "1 37.7812059887529 1 \n", "2 37.7770424617966 1 \n", "3 37.7784692199467 0 \n", "4 37.7784692199467 0 " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "crimes3 = hc.sql(\"\"\"\n", "SELECT cast(SUBSTR(date_str,7,4) as int) as year, \n", " cast(SUBSTR(date_str,1,2) as int) as month, \n", " cast(SUBSTR(time,1,2) as int) as hour,\n", " category, district, dayofweek, description, neighborhood, longitude, latitude, resolved\n", "FROM crimes2\n", "\"\"\").cache()\n", "crimes3.limit(5).toPandas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this demo, I create a training set for my model from the data in years 2011-2013 and a testing/validation set from the data in year 2014." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "training set has 426306 instances\n", "test set has 150155 instances\n" ] } ], "source": [ "trainData = crimes3.filter(crimes3.year>=2011).filter(crimes3.year<=2013).cache()\n", "testData = crimes3.filter(crimes3.year==2014).cache()\n", "print \"training set has \" + str(trainData.count()) + \" instances\"\n", "print \"test set has \" + str(testData.count()) + \" instances\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For convenience, I define a function to compute our classification metrics (we will use it later): precision, recall and accuracy" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def eval_metrics(lap):\n", " tp = float(len(lap[(lap['label']==1) & (lap['prediction']==1)]))\n", " tn = float(len(lap[(lap['label']==0) & (lap['prediction']==0)]))\n", " fp = float(len(lap[(lap['label']==0) & (lap['prediction']==1)]))\n", " fn = float(len(lap[(lap['label']==1) & (lap['prediction']==0)]))\n", " precision = tp / (tp+fp)\n", " recall = tp / (tp+fn)\n", " accuracy = (tp+tn) / (tp+tn+fp+fn)\n", " return {'precision': precision, 'recall': recall, 'accuracy': accuracy}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, I use Spark-ML to create a pipeline of transformation to generate the feature vector for each crime event:\n", "- Converting each string variable (e.g., category, dayofweek, etc) to a categorical variable\n", "- Converting the \"description\" field to a set of word features using Tokenizer() and HashingTF()\n", "- Convert \"resolved\" (float) into a categorical variable \"label\"\n", "- Assembling all the features into the a single feature vector (Vector Assembler)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAq4AAADhCAYAAAAJbjeWAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL\nEwAACxMBAJqcGAAAAdVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6\neD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYg\neG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4K\nICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlm\nZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpDb21wcmVz\nc2lvbj41PC90aWZmOkNvbXByZXNzaW9uPgogICAgICAgICA8dGlmZjpQaG90b21ldHJpY0ludGVy\ncHJldGF0aW9uPjI8L3RpZmY6UGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbj4KICAgICAgICAgPHRp\nZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRp\nb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CrDjMt0AAEAASURBVHgB7Z0H2B1F1ccnIQk1\nBAJIEZRejFSRrlIUEcWCICIqEQuIYsGCCsonIoiANFEEKYoUaSqIxAICgkSkSxEwVKVLSSAkBNhv\nfhPPy2Tf3dveW7b8z/Ps3b2zu7Oz/3PmzJkzZ2ZHJZ6cSAgIASEgBISAEBACQkAIFByB0QUvn4on\nBISAEBACQkAICAEhIAQCAjJcJQhCQAgIASEgBISAEBACpUBAhmsp2KRCCgEhIASEgBAQAkJACMhw\nlQwIASEgBISAEBACQkAIlAIBGa6lYJMKKQSEgBAQAkJACAgBISDDVTIgBISAEBACQkAICAEhUAoE\nZLiWgk0qpBAQAkJACAgBISAEhIAMV8mAEBACQkAICAEhIASEQCkQkOFaCjapkEJACAgBISAEhIAQ\nEAIyXCUDQkAICAEhIASEgBAQAqVAQIZrKdikQgoBISAEhIAQEAJCQAiM6ScESZL083EDe9aoUaMG\n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\nZcn+l6P0KmXVERiR4Vp1cPR+QkAICAEhIASEgBAQAsVBQIZrcXihkggBISAEhIAQEAJCQAg0QECG\nawNwdEoICAEhIASEgBAQAkKgOAjIcC0OL1QSISAEhIAQEAJCQAgIgQYIyHBtAI5OCQEhIASEgBAQ\nAkJACBQHARmuxeGFSiIEhIAQEAJCQAgIASHQAAEZrg3A0SkhIASEgBAQAkJACAiB4iAgw7U4vFBJ\nhIAQEAJCQAgIASEgBBogUBjDlS9N/Otf/3L33XefvtzUgGFFPGWfQuxV2Z5++uleZa1820Bgzpw5\nQ1/TaeM2XVoDBFigHvnIIj6li34fCTXKfyT5xve+8MIL8V8d1xgByUKxmV8Iw/X44493Sy21lHvf\n+97nNtpoI7fKKqu4P/3pT02Ru+uuu9yFF17Y9Dpd0FsEfvCDH7ivfOUrXX/I448/7t74xje6yZMn\ndz1vy/CKK65wb3rTm+yv9g0Q2Hzzzd3f/vY3d80117g111yzwZXONaqbI73/d7/7nbv99tsbPl8n\nu4fAF7/4RffNb36zYYZTp051G2ywQeY11N/TTjst81yriY3ybzWPRtfdf//9od1pdI3OtY7A73//\nezd69Gi3yCKLDG2rrrqq++pXv+royHSbvv71r7tvfOMbXclWstAVGHuaycAN11NOOcUdeeSR7q9/\n/av7xz/+4R599FH3ne98x733ve91//73vxu+/PXXX+9+/OMfN7xGJ8uLAPyl5/vrX/+6vC9RwZJj\noDTrWDaqmyO9/6c//anDkBH1BwGM1n333bc/D9NTKoPAq1/9avfss88ObRdddJE79thj3dlnn12Z\nd9SLDAaBgRuu3/3ud923vvUtt8YaawQERo0a5T784Q+7I444ws2YMSOkXXLJJW7LLbd0r3nNa8K5\nJ554wv3zn/90+++/fzB499lnn3DdLbfc4t7ylre4FVZYIXjppk+fHtIZpuLa1Vdf3e2yyy6h8px8\n8snh3MMPP+ze9a53uQkTJrj11lvPXX755SGd/HfbbTd33HHHhWfvtdde7swzzwzn+PnlL3/pPvOZ\nzwz9r9MBw3b0cMHz3e9+t3vwwQeHXv+hhx5yu+66q0Npbbvttu7SSy8N5xrh94c//MG9/vWvDzx4\n//vfHzov9957b2gs2X/84x93u+++u6MXD11wwQVuiy22GBp+/PznPz9kSJ144onuda97XdhQkkbP\n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\nmRzoLiEgBISAEBACvUBAhmsvUC1RnsRQsqg4X66xzyva3hYbZ71Hjm1v6exj45RjPITMiraNNR8x\nIs3YxIC0LZ3GPRiMdn16zzkNV5dIuFRUISAEhIAQEAJdRkCGa5cBHVR2fCrx8ccfH/p2t33HO73H\n+CQtNlQxJO1LNnxGEQOSRcRtoXE7tj3pfOEGw5Jrud8MVS3dMygJ0HOFgBAQAkJACFQfARmuBeUx\nsZWPPvqoe/jhh8P2yCOPhD1pbE888UQwVG2P4bjUUkuFDSPUvuOdtccANUOV/ejRowuKgoolBISA\nEBACQkAICIFXEJDh+goWfT3C83nPPfe4++67z91///3uwQcfnGfDUF1iiSXcsssuG7Zlllkm7Jdb\nbrlgnC655JLz7BWL2Vf26WFCQAgIASEgBITAABCQ4dpD0PGG3nnnne7uu+92d911l5s2bZr717/+\n5e69994wa33llVd2q6yyilthhRWGbcsvv7w8oT3kjbIWAkJACAgBISAEyoeADNcu8IxJSjfeeKP7\nxz/+4W699VZ32223udtvvz1MJFp11VXdaqut5lZffXW3xhpruBVXXNGttNJKDo+pSAgIASEgBISA\nEBACQqB1BGS4to5VuJLF4a+//np3zTXXuGuvvdbdcMMN7qGHHnLrrruuW3/99d1aa63lJk2a5F73\nute5pZdeus3cdbkQEAJCQAgIASEgBIRAHgIyXPOQ+V/6iy++6P7617+6Sy+91F122WXBs7rmmmu6\nTTfd1G222WZuvfXWC55UTXBqAqROCwEhIASEgBAQAkJghAjIcM0AkK8mXXTRRe6CCy5wl1xySRjm\n32qrrdzWW2/t3vSmN4VF6zNuU5IQEAJCQAgIASEgBIRADxGQ4RqBy+Spo446yp155pluww03dDvt\ntJPbYYcdwmz+6DIdCgEhIASEgBAQAkJACAwAgTEDeGbhHvnAAw+4Aw44IHhX9957b3fLLbc4ZvWL\nhIAQEAJCQAgIASEgBIqDQO0NVyZYbbzxxm7fffd1GLB8VlQkBISAEBACQkAICAEhUDwEam24Esf6\n7ne/251//vluxx13LB53VCIhIASEgBAQAkJACAiBIQRqG+PKBCwW/8do3WijjYYA0YEQaAeBJEna\nuby0144aNaq0Ze93wSUT/Ua8nM+TnJSTb+2WWnxuF7Hm19fW48rXrBZddFEZrc1lpJZXZCkbS7N9\n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\n", "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image\n", "Image(filename='pipeline.png')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from pyspark.ml.feature import StringIndexer, VectorAssembler, Tokenizer, HashingTF\n", "from pyspark.ml import Pipeline\n", "\n", "inx1 = StringIndexer(inputCol=\"category\", outputCol=\"cat-inx\")\n", "inx2 = StringIndexer(inputCol=\"dayofweek\", outputCol=\"dow-inx\")\n", "inx3 = StringIndexer(inputCol=\"district\", outputCol=\"dis-inx\")\n", "inx4 = StringIndexer(inputCol=\"neighborhood\", outputCol=\"ngh-inx\")\n", "inx5 = StringIndexer(inputCol=\"resolved\", outputCol=\"label\")\n", "parser = Tokenizer(inputCol=\"description\", outputCol=\"words\")\n", "hashingTF = HashingTF(numFeatures=50, inputCol=\"words\", outputCol=\"hash-inx\")\n", "vecAssembler = VectorAssembler(inputCols =[\"month\", \"hour\", \"cat-inx\", \"dow-inx\", \"dis-inx\", \"ngh-inx\", \"hash-inx\"], \n", " outputCol=\"features\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Predictive Models: Logistic Regression and Random Forest" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finish up the end-to-end pipeline and run the training set through it. The resulting model is in the model_lr variable, and is used to predict on the testData.\n", "\n", "I use the previously defined eval_metrics() function to compute precision, recall, and accuracy" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "precision = 0.758149655478, recall = 0.690560082214, accuracy = 0.807758649396\n" ] } ], "source": [ "from pyspark.ml.classification import LogisticRegression\n", "\n", "lr = LogisticRegression(maxIter=20, regParam=0.1, labelCol=\"label\")\n", "pipeline_lr = Pipeline(stages=[inx1, inx2, inx3, inx4, inx5, parser, hashingTF, vecAssembler, lr])\n", "model_lr = pipeline_lr.fit(trainData)\n", "results_lr = model_lr.transform(testData)\n", "\n", "m = eval_metrics(results_lr.select(\"label\", \"prediction\").toPandas())\n", "print \"precision = \" + str(m['precision']) + \", recall = \" + str(m['recall']) + \", accuracy = \" + str(m['accuracy'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, create the same pipeline with the Random Forest classifier:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "precision = 0.807915479483, recall = 0.712893635763, accuracy = 0.834297892178\n" ] } ], "source": [ "from pyspark.ml.classification import RandomForestClassifier\n", "\n", "rf = RandomForestClassifier(numTrees=250, maxDepth=5, maxBins=50, seed=42)\n", "pipeline_rf = Pipeline(stages=[inx1, inx2, inx3, inx4, inx5, parser, hashingTF, vecAssembler, rf])\n", "model_rf = pipeline_rf.fit(trainData)\n", "results_rf = model_rf.transform(testData)\n", "\n", "m = eval_metrics(results_rf.select(\"label\", \"prediction\").toPandas())\n", "print \"precision = \" + str(m['precision']) + \", recall = \" + str(m['recall']) + \", accuracy = \" + str(m['accuracy'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Measure Model Accuracy Per Neighborhood\n", "\n", "I would like to also show the accuracy of the model for each neighborhood.\n", "For this, I compute the centroid for each neighborhood, using ESRI's ST_Centroid() HIVE UDF" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DataFrame[neighborhood: string, cent_longitude: double, cent_latitude: double]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hc.sql(\"add jar /home/jupyter/notebooks/jars/guava-11.0.2.jar\")\n", "hc.sql(\"add jar /home/jupyter/notebooks/jars/esri-geometry-api.jar\")\n", "hc.sql(\"add jar /home/jupyter/notebooks/jars/spatial-sdk-hive.jar\")\n", "hc.sql(\"add jar /home/jupyter/notebooks/jars/spatial-sdk-json.jar\")\n", "\n", "hc.sql(\"create temporary function ST_Centroid as 'com.esri.hadoop.hive.ST_Centroid'\")\n", "hc.sql(\"create temporary function ST_X as 'com.esri.hadoop.hive.ST_X'\")\n", "hc.sql(\"create temporary function ST_Y as 'com.esri.hadoop.hive.ST_Y'\")\n", "\n", "df_centroid = hc.sql(\"\"\"\n", "SELECT neighborho as neighborhood, \n", " ST_X(ST_Centroid(sf_neighborhoods.shape)) as cent_longitude,\n", " ST_Y(ST_Centroid(sf_neighborhoods.shape)) as cent_latitude\n", "FROM sf_neighborhoods\n", "\"\"\")\n", "df_centroid.cache()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now I draw a map, this time showing a marker with the accuracy for each neighborhood, using the results from the Random Forest model." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = results_rf.select(\"neighborhood\", \"label\", \"prediction\").toPandas()\n", "map_sf = folium.Map(location=[sf_lat, sf_long], zoom_start=12, width=map_width, height=map_height)\n", "\n", "n_list = results_rf.select(\"neighborhood\").distinct().toPandas()['neighborhood'].tolist() # list of neighborhoods\n", "for n in df_centroid.collect():\n", " if n.neighborhood in n_list:\n", " m = eval_metrics(df[df['neighborhood']==n.neighborhood])\n", " map_sf.simple_marker([n.cent_latitude, n.cent_longitude], \\\n", " popup = n.neighborhood + \": accuracy = %.2f\" % m['accuracy'])\n", "\n", "inline_map(map_sf) " ] } ], "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.9" } }, "nbformat": 4, "nbformat_minor": 0 }