Looking at homicide data can provide insight about homicide trends that can be helpful in deploying human resources or enacting legislation.
Homicides can be very complex in that motives and scenarios may vary drastically from one another and many cases remain unsolved.
Visualizations offer an efficient method to portray trends among the homicide data.
The U.S. homicide dataset was obtained from https://www.kaggle.com/murderaccountability/homicide-reports
The dataset contains demographic, location, and other information about homicides that occurred between 1980 and 2014.
Some homicide cases lack data as they remain unsolved. Others simply lack data. For demographic data, there were frequently missing values and some values that contradicted other values.
The data was handled with care to reduce discrepancies and prevent inaccurate insights from being made. In many instances however, not enough information was provided to fill in missing values. These were handled differently, depending on the visualization produced.
There appears to be an observable seasonality trend during the time period. Homicides were the most infrequent during February, although this could be in part due to February containing less days than other months, which adds up over the 34 year period. Normalizing month lengths may be appropriate in this context.
Homicide frequency trended higher between March and July, which could suggest increased temperate is associated with more homicides. The downward trend during the fall months would support that idea.
import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'c:/Users/askst/Anaconda3/Library/plugins/platforms'
import warnings
warnings.filterwarnings("ignore")
# Get data
import pandas as pd
#https://www.kaggle.com/murderaccountability/homicide-reports
path = r'C:\Users\askst\OneDrive\Documents\Loyola Data Science'
file = '\homicide_df.csv'
# Drop columns
#columns_to_drop = ['Record ID','Incident','Victim #Count','Perpetrator Count']
# Read data
df = pd.read_csv(path+file)
# usecols = lambda x:x not in columns_to_drop)
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
# Get Frequencies
month_count = df.groupby(['Month']).size().to_frame('Count').reset_index()
# Map Month numbers
import datetime
import calendar
month_nums = [datetime.datetime.strptime(m, '%B').month for m in month_count.Month]
month_count['Month Num'] = month_nums
all_months = list(calendar.month_abbr)[1:]
# Order values by Month
month_count = month_count.sort_values(by='Month Num').drop(
'Month Num', axis = 1).reset_index(drop=True)
month_count['Month'] = all_months
# Plot Line Graph
fig = plt.figure(figsize=(18,10))
ax = fig.add_subplot(1,1,1)
ax.plot(month_count.Count,
marker = 'o')
ax.set_xticks(range(0,12,1))
ax.set_xticklabels(month_count.Month,
fontsize = 14,
rotation = 0)
ax.tick_params(axis='y', labelsize= 14)
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos:format(int(x),',')))
ax.set_xlabel('Month', fontsize = 17,
labelpad = 17)
ax.set_ylabel('Homicides', fontsize = 17,
labelpad = 15)
plt.title('Number of Homicides by Month:\n 1980-2014', fontsize = 22,
pad = 17)
plt.show()
The homicide dataset provides demographic information about victims but does not include information about their respective demographic population. Comparing the absolute number of homicides across gender and race over time does not provide much insight.
To overcome this, I created a statistic that shows the number of homicides for every 100,000 people for each demographic.I did this after joining U.S. population data from the SEER cancer datasets, found at https://seer.cancer.gov/popdata/download.html. A drawback of this data is that until 1990, ‘other’ was used for races other than black or white. Thus, two plots were made to provide more insight at the demographic level beyond 1990.
Homicides across all demographics in the data were elevated in the early 1980’s and generally trended downwards over the time period. However, there was a spike in the mid 1980’s for black male homicide victims.
The number of homicide victims per 100,000 people was disproportionately high for black males across the time series. In general, male victims were more frequent than female victims. Black females were an exception, with the second highest victim rate across the demographic groups.
This finding suggests that in general, black people have higher victim rates, on a relative basis.
with open(r'C:\Users\askst\OneDrive\Documents\Loyola Data Science\us.1969_2019.19ages.txt' ) as f:
lines = f.readlines()
with open(r'C:\Users\askst\OneDrive\Documents\Loyola Data Science\us.1990_2019.19ages.txt') as f2:
lines2 = f2.readlines()
race_dict_pre_1990 = {
'1': 'White',
'2': 'Black',
'3': 'Other'}
race_dict = {
'1': 'White',
'2': 'Black',
'3': 'Native American/Alaska Native',
'4': 'Asian/Pacific Islander'}
# Dataframe columns for all years (only black,white, other)
years = []
states = []
races = []
sexes = []
populations = []
for textStr in lines:
year = textStr[:4]
years.append(int(year))
state = textStr[4:6]
states.append(state)
race = textStr[13]
race = race_dict_pre_1990[race]
races.append(race)
sex = int(textStr[15])
if sex == 1:
sex = 'Male'
else:
sex = 'Female'
sexes.append(sex)
population = int(textStr[18:-1])
populations.append(population)
# Dataframe columns for 1990+ years (4 races)
years2 = []
states2 = []
races2 = []
sexes2 = []
populations2 = []
for textStr in lines2:
year = textStr[:4]
years2.append(int(year))
state = textStr[4:6]
states2.append(state)
race = textStr[13]
race = race_dict[race]
races2.append(race)
sex = int(textStr[15])
if sex == 1:
sex = 'Male'
else:
sex = 'Female'
sexes2.append(sex)
population = int(textStr[18:-1])
populations2.append(population)
# Create population dataframes
# 1980-2014
population_df = pd.DataFrame(data={'Year':years,'Sex':sexes,'Race':races,'Population':populations})
population_df = population_df[(population_df.Year>1979)
&(population_df.Year <2015)]
population_df = population_df.groupby(['Year','Sex','Race'])['Population'].sum().reset_index()
population_df.loc[population_df['Race'].isin(
['Native American/Alaska Native','Asian/Pacific Islander']), 'Race'] = 'Other'
# 1990+
population_df_after_1990 = pd.DataFrame(data={'Year':years2,'Sex':sexes2,'Race':races2,'Population':populations2})
population_df_after_1990 = population_df_after_1990.groupby(['Year','Sex','Race'])['Population'].sum().reset_index()
# Race/Sex/Year Homicide dataframes
victim_race = df[(df['Victim Race'] != 'Unknown')&
(df['Victim Sex'] != 'Unknown')][['Year','Victim Sex','Victim Race']]
victim_race_after_1990 = df[(df.Year>=1990)&
(df['Victim Race'] != 'Unknown')&
(df['Victim Sex'] != 'Unknown')][['Year','Victim Sex','Victim Race']]
# Replace non white/black races with 'other' for all years
victim_race.loc[victim_race['Victim Race'].isin(
['Native American/Alaska Native','Asian/Pacific Islander']), 'Victim Race'] = 'Other'
# Get Frequencies
victim_race = victim_race.groupby(['Year',
'Victim Sex',
'Victim Race']).size().to_frame('Count').reset_index()
victim_race_after_1990 = victim_race_after_1990.groupby(['Year',
'Victim Sex',
'Victim Race']).size().to_frame('Count').reset_index()
# Merge population and homicide dataframes
left = victim_race
left.rename(columns={'Victim Sex': 'Sex',
'Victim Race':'Race'},
inplace = True)
right = population_df
merged_df = pd.merge(left,right)
left_after_1990 = victim_race_after_1990
left_after_1990.rename(columns={'Victim Sex': 'Sex',
'Victim Race':'Race'},
inplace = True)
right_after_1990 = population_df_after_1990
merged_df_after_1990 = pd.merge(left_after_1990,right_after_1990)
# Create per 100,000 people column
merged_df['Victims per 100,000 People'] = (merged_df.Count/merged_df.Population)*100000
merged_df_after_1990['Victims per 100,000 People'] = (merged_df_after_1990.Count/merged_df_after_1990.Population)*100000
# Plot Line Graphs
fig = plt.figure(figsize=(18,30))
# Data from 1980-2014
ax1 = fig.add_subplot(2,1,1)
# Sex linestyles
linestyles = {'Female': '--',
'Male': '-'}
# Colors for victim race groups
colors_all_data = {'Other': 'green',
'White': 'blue',
'Black': 'red'}
colors_after_1990 = {'Native American/Alaska Native': 'orange',
'White': 'blue',
'Black': 'red',
'Asian/Pacific Islander':'purple'}
# Plot each group
for key, grp in merged_df.groupby(['Race','Sex']):
grp.plot(ax=ax1, kind='line',
x='Year', y='Victims per 100,000 People',
linestyle = linestyles[key[1]] ,
color = colors_all_data[key[0]],
label = key[0]+' '+key[1])
# Edit labels and titles
years = list(set(merged_df.Year))
ax1.set_xticks(range(years[0],years[-1]+1,1))
ax1.tick_params(axis='x', labelsize= 12, rotation = 30)
ax1.tick_params(axis='y', labelsize= 12)
ax1.yaxis.set_major_formatter(FuncFormatter(lambda x, pos:format(int(x),',')))
ax1.set_xlabel('Year', fontsize = 18,
labelpad = 17)
ax1.set_ylabel('Victims per 100,000 People', fontsize = 18,
labelpad = 15)
ax1.set_title('Number of Homicides by Year and by Victim Sex and Race:\n 1980-2014', fontsize = 22,
pad = 17)
ax1.legend(loc='best', fontsize = 15)
# Data from 1990-2014
ax2 = fig.add_subplot(2,1,2)
# Plot each group
for key, grp in merged_df_after_1990.groupby(['Race','Sex']):
grp.plot(ax=ax2, kind='line',
x='Year', y='Victims per 100,000 People',
linestyle = linestyles[key[1]] ,
color = colors_after_1990[key[0]],
label = key[0]+' '+key[1])
# Edit labels and titles
years_after1990 = list(set(merged_df_after_1990.Year))
ax2.set_xticks(range(years_after1990[0],
years_after1990[-1]+1,1))
ax2.tick_params(axis='x', labelsize= 14, rotation = 30)
ax2.tick_params(axis='y', labelsize= 14)
ax2.yaxis.set_major_formatter(FuncFormatter(lambda x, pos:format(int(x),',')))
ax2.set_xlabel('Year', fontsize = 18,
labelpad = 17)
ax2.set_ylabel('Victims per 100,000 People', fontsize = 18,
labelpad = 15)
ax2.set_title('Number of Homicides by Year and by Victim Sex and Race:\n 1990-2014', fontsize = 22,
pad = 17)
ax2.legend(loc='best', fontsize = 14)
plt.show()
The weapon used in homicides can potentially provide insight into a homicide motive, or lack thereof.
Examining the relative frequency of each weapon’s use across time can show how homicides have evolved.
Due to infrequent use of poison, explosives, drowning, fall, drugs, and fire weapon types, they were categorized as “other”. Strangulation and suffocation homicides are similar in concept, so they were combined as “suffocation”.
The relative frequency of unknown weapons used in homicides was higher later in the time series. This could be because perpetrators are using more weapons/tactics that are hard to identify, or because more crimes are going unsolved.
Knife and suffocation usage appear to decline across the time series.
# Combine Weapon Categories
weapon_df = df
# Replace non white/black races with 'other'
weapon_df.loc[weapon_df['Weapon'].isin(
['Rifle','Firearm', 'Shotgun','Handgun']), 'Weapon'] = 'Gun'
weapon_df.loc[weapon_df['Weapon'].isin(
['Strangulation']), 'Weapon'] = 'Suffocation'
weapon_df.loc[weapon_df['Weapon'].isin(
['Poison','Explosives','Drowning','Fall','Drugs','Fire']), 'Weapon'] = 'Other'
# Bin Years
year_bins = list(range(1980,2020,5))
weapon_df['Year Bin'] = pd.cut(weapon_df.Year, bins = year_bins, right = False)
yb_strings = []
for yb in weapon_df['Year Bin']:
split_years = str(yb).split(',')
_yb_string = '-'.join([split_years[0].replace('[',''),
split_years[1].replace(')','').replace(' ','')])
yb_strings.append(_yb_string)
weapon_df['Year Bin'] = yb_strings
weapon_df.loc[weapon_df['Year Bin'].isin(
['2010-2015']), 'Year Bin'] = '2010-2014'
# Groupby bin, weapon
weapon_df_group = weapon_df.groupby(['Year Bin','Weapon']).size().to_frame('Count').reset_index()
# Pivot table
stacked_df = weapon_df_group.pivot(index='Year Bin',
columns = 'Weapon',
values = 'Count')
import numpy as np
# Setup Plot
fig = plt.figure(figsize = (18,10))
ax = fig.add_subplot(1,1,1)
bottom = np.zeros(len(stacked_df))
for i, col in enumerate(stacked_df.columns):
ax.bar(stacked_df.index, stacked_df[col], bottom=bottom, label=col)
bottom += np.array(stacked_df[col])
totals = stacked_df.sum(axis=1)
y_offset = 800
for i, total in enumerate(totals):
ax.text(totals.index[i], total + y_offset, '{:,.0f}'.format(total), ha='center', weight='bold', size = 12)
# Titles and Axes
plt.ylabel('Total Homcides', fontsize = 18, labelpad = 12)
plt.xlabel('Year Range', fontsize = 18, labelpad = 14)
plt.title('Total Homicides by Weapon Type and Year Range', fontsize = 22, pad = 20)
ax.tick_params(axis='x', labelsize= 15, rotation = 0)
ax.tick_params(axis='y', labelsize= 15)
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos:format(int(x),',')))
plt.legend(loc='best', fontsize = 15)
plt.show()
Examining homicide victim ages can provide insight into potential homicide motives and identify age ranges that are more susceptible to being victims.
Some of the data used for this analysis was problematic. First, 998 was used as an age value when age was not reported and/or unknown. The data dictionary states 0 was used for children that had not attained a year and 99 was used for victims 99 and older. However, I found that 0 and 99 were likely being used as unknown values for several observations. For example, it is unlikely that a victim of age 99 or greater was killed by his father.
To combat this, I removed observations that had an age value of 998 and 99. This hinders the ability to look at the oldest victim group; but the benefits of excluding this information outweighed the cons, in my opinion.
I retained observations with age 0 values, since infancy homicide victims are relatively common. I did examine relationships with other information to determine specific observations that could be eliminated, however. Because of the discrepancies, the frequency at age = 0 should be scrutinized in analysis.
The shape of the age distribution for women and men are very similar. Both distributions show a relatively high number of infant homicide victims and a spike in victims during the 15-25 age range. Although, early age female victims are nearly as frequent as late-adolescent early-adult victims - which is not the case for males.
As victim age increased, the decline in the homicide victims appears to be steeper for men than for woman.
A relatively high number of infant homicide victims suggests the scenario in which a parent or family member murders an infant may be relatively common.
The spike in homicide victims at age 15-25 could correlate with engagement in criminal activity. Gang activity and mischief is not uncommon for people of this age group.
# Setup data
age_n_sex = df
age_n_sex['Victim Age'] = age_n_sex['Victim Age'].astype(int)
age_n_sex = age_n_sex[age_n_sex['Perpetrator Age']!= ' ']
age_n_sex['Perpetrator Age'] = age_n_sex['Perpetrator Age'].astype(int)
# Remove erroneous data
age_n_sex.loc[(age_n_sex['Victim Age'] == 0) &
(age_n_sex['Relationship'].isin(['Father','Mother',
'Stranger','Acquaintance',
'Friend','Common-Law Wife',
'Husband','Wife','Boyfriend',
'Girlfriend','Employee',
'Stepmother','Ex-Wife',
'Boyfriend/Girlfriend'])), ['Victim Age']] = 99
age_n_sex = age_n_sex[age_n_sex['Victim Age'] < 99]
# Clean data for sex
age_n_sex.loc[(age_n_sex['Victim Sex'] == 'Unknown')&
(age_n_sex['Relationship'].isin([
'Wife','Daughter','Mother','Girlfriend','Stepdaughter'])), ['Victim Sex']] = 'Female'
age_n_sex.loc[(age_n_sex['Victim Sex'] == 'Unknown')&
(age_n_sex['Relationship'].isin([
'Husband','Son','Father','Stepson','Boyfriend'])), ['Victim Sex']] = 'Male'
# Create dataframe for men and women
age_n_sex_male = age_n_sex[age_n_sex['Victim Sex'] == 'Male']
age_n_sex_female = age_n_sex[age_n_sex['Victim Sex'] == 'Female']
# Setup plot
fig = plt.figure(figsize = (18,10))
ax1 = fig.add_subplot(1,2,1)
# Male Plot
ax1.hist(age_n_sex_male['Victim Age'],
bins = len(list(set(age_n_sex_male['Victim Age']))))
ax1.set_xlabel('Victim Age', fontsize = 17,
labelpad = 17)
ax1.set_ylabel('Frequency', fontsize = 17,
labelpad = 17)
ax1.set_title('Male Victim', fontsize = 19,
pad = 17)
ax1.yaxis.set_major_formatter(FuncFormatter(lambda x, pos:format(int(x),',')))
ax1.tick_params(axis='x', labelsize= 15, rotation = 0)
ax1.tick_params(axis='y', labelsize= 15)
ax2 = fig.add_subplot(1,2,2)
# Female Plot
ax2.hist(age_n_sex_female['Victim Age'], color = 'pink',
bins = len(list(set(age_n_sex_female['Victim Age']))))
ax2.set_xlabel('Victim Age', fontsize = 17,
labelpad = 17)
ax2.set_ylabel('Frequency', fontsize = 17,
labelpad = 17)
ax2.set_title('Female Victim', fontsize = 19,
pad = 17)
ax2.yaxis.set_major_formatter(FuncFormatter(lambda x, pos:format(int(x),',')))
ax2.tick_params(axis='x', labelsize= 15, rotation = 0)
ax2.tick_params(axis='y', labelsize= 15)
fig.suptitle('Homicide Victim Age Distribution:\n 1980-2014', size = 21,
ha='center',
y = .98)
plt.show()
Below is a heat map that shows the number of homicides by county and by year for the 10 counties with the most homicides during the time period.
Cities were not used because in some instances, observations had counties listed as the respective city. In order to compare them, respective counties were used.
In order to obtain counties, latitude and longitude coordinates were obtained for each city/county and state combination, using the Geopy python library. From there, calls were made using the FCC API to obtain the county for each latitude and longitude pair.
In general, Los Angeles and New York were leaders in homicides annually. During the 1980’s through early 90’s, gang violence was on the rise in metro areas, which could explain the relatively high number of homicides.
There appears to be no data for 1998-1991 for Miami-Dade county. It is unlikely that no homicides occurred during this period. This should be examined further.
import us
from geopy.geocoders import Nominatim
GeoLocator = Nominatim(user_agent="http")
df.loc[df['State'].isin(
['Rhodes Island']), 'State'] = 'Rhode Island'
state_abbreviations = us.states.mapping('name', 'abbr')
df['State_Abbr'] = df.State.apply(lambda x: state_abbreviations[x])
df['City_State'] = df['City']+', '+df['State_Abbr']
locations = list(set(df.City_State))
lat_dict = {}
lon_dict = {}
for loc in locations:
try:
_location = GeoLocator.geocode(loc).raw
_lat = _location['lat']
_lon = _location['lon']
lat_dict[loc] = _lat
lon_dict[loc] = _lon
except:
pass
lat = []
lon = []
for _city_state in df.City_State:
try:
_lat = lat_dict[_city_state]
_lon = lon_dict[_city_state]
lat.append(_lat)
lon.append(_lon)
except:
lat.append(None)
lon.append(None)
df['lat'] = lat
df['lon'] = lon
# Fix erroneous coordinates
df.loc[df.City_State == 'San Juan, Washington', ['lat', 'lon']] = ['48.63669','-122.916611']
df.loc[df.City_State == 'Columbia, New York', ['lat', 'lon']] = ['42.92875','-75.038506']
df.loc[df.City_State == 'Ferry, Washington', ['lat', 'lon']] = ['48.495464','-118.523636']
df.loc[df.City_State == "St. Mary's, Maryland", ['lat', 'lon']] = ['38.29962228','-76.55721741']
df.loc[df.City_State == 'Thomas, Georgia', ['lat', 'lon']] = ['30.836582','-83.978783']
df.loc[df.City_State == 'Aleutians West, Alaska', ['lat', 'lon']] = ['53.865295','-166.538324']
df.loc[df.City_State == 'Baker, Georgia', ['lat', 'lon']] = ['31.37168','-84.338325']
df.loc[df.City_State == 'De Soto, Florida', ['lat', 'lon']] = ['27.203827','-81.864443']
df.loc[df.City_State == 'Kemper, Mississippi', ['lat', 'lon']] = ['32.75268','-88.651909']
df.loc[df.City_State == 'Kent, Maryland', ['lat', 'lon']] = ['39.271381', '-76.131996']
df.loc[df.City_State == 'Kent, Rhodes Island', ['lat', 'lon']] = ['41.700001','-71.500000']
df.loc[df.City_State == 'St. Mary, Louisiana', ['lat', 'lon']] = ['29.71296495', '-91.47525635']
import requests
import json
county_dict = {}
for _city_state in list(set(df.City_State)):
if _city_state in list(county_dict.keys()):
pass
else:
try:
lat = lat_dict[_city_state]
lon = lon_dict[_city_state]
response = requests.get(f'https://geo.fcc.gov/api/census/block/find?latitude={lat}&longitude={lon}&format=json')
byte_str = response.content
data_dict = json.loads(byte_str)
county_dict[_city_state] = data_dict['County']['name']
except:
county_dict[_city_state] = None
counties = []
for _city_state in df.City_State:
_county = county_dict[_city_state]
counties.append(_county)
df['County'] = counties
df['County_State'] = df['County'] + ', ' + df['State_Abbr']
county_Count = pd.DataFrame(df.County_State.value_counts())
# Get 10 most frequent counties
county_Count_top10 = list(county_Count[:10].index)
# Get Frequency of homocides for each city by year
df_top10 = df[df.County_State.isin(county_Count_top10)]
df_top10 = df_top10.groupby(['County_State','Year']).size().to_frame('Count').reset_index()
# Create dataframe for heatmap
hm_countyCount = pd.pivot_table(df_top10,
index = 'Year',
columns = 'County_State',
values = 'Count')
# Plot heatmap
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
comma_fmt = FuncFormatter(lambda x,p: format(int(x),','))
fig = plt.figure(figsize=(21,15))
ax = fig.add_subplot(1,1,1)
ax = sns.heatmap(hm_countyCount, linewidth=0.15,
annot = True, cmap = 'coolwarm',
fmt = ',.0f',
cbar_kws = {'format': comma_fmt,
'orientation':'vertical'},
annot_kws = {'size':14}).invert_yaxis()
plt.title('Number of Homicides by County and Year: 1980-2014\n Top 10 Counties',
fontsize = 22, pad = 17)
plt.xlabel('County', fontsize = 18, labelpad=7)
plt.xticks(size=16, rotation = 30, ha = 'right')
plt.ylabel('Year', fontsize = 18, labelpad=12)
plt.yticks(size=16)
plt.show()
Geographic heat maps can effectively convey frequencies for different locations.
Below is a heatmap that shows frequency of homicides across the United States.
Latitude and longitude coordinates were used for each observation. These were not included in the dataset. To obtain these coordinates, the Geopy library was used. Several coordinates were erroneous and had to be handled individually or removed completely.
As expected, metropolitan areas like Los Angeles and New York had the highest number of homicides during the time period.
Certain states like Nevada and Arizona have very little recorded homicides. In general the mid and northwest had less homicides than the mid and northeast.
# Plot map
import folium
from folium import Map
from folium.plugins import HeatMap
import branca.colormap
from collections import defaultdict
map_df = df
map_df = map_df[~map_df.lat.isnull()]
# Add title
title = 'U.S. Homicide Geographic Heatmap: 1980-2014'
title_html = '''
<h3 align="center" style="font-size:22px"><b>{}</b></h3>
'''.format(title)
center_of_map = [39.5, -98.35]
my_map = folium.Map(location = center_of_map,
zoom_start = 4,
width = '90%',
height = '100%',
left = '5%',
right = '5%',
top = '0%')
# Setup Gradient
steps=20
colormap = branca.colormap.linear.YlOrRd_09.scale(0,1).to_step(steps)
gradient_map=defaultdict(dict)
for i in range(steps):
gradient_map[1/steps*i] = colormap.rgb_hex_str(1/steps*i)
colormap.add_to(my_map)
# Add heatmap to map
hm = HeatMap(list(zip(map_df.lat.values, map_df.lon.values)),
min_opacity = .2,
gradient = gradient_map)
my_map.add_child(hm)
my_map.get_root().html.add_child(folium.Element(title_html))
my_map.save(r"C:\Users\askst\OneDrive\Documents\Loyola Data Science\GeoHeatMap_Homicides.html")