── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.4.4 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tinytex) #Loads Tinytexsetwd("C:/data110") #Sets directoryhatecrimes <-read_csv("hateCrimes2010.csv") #Loads HatesCrimes data
Rows: 423 Columns: 44
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (2): County, Crime Type
dbl (42): Year, Anti-Male, Anti-Female, Anti-Transgender, Anti-Gender Identi...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
names(hatecrimes) <-tolower(names(hatecrimes)) #extracts the column names of the hatecrimes data frame and converts the first letter of every name to lowercasenames(hatecrimes) <-gsub(" ","",names(hatecrimes)) #gsub is used here for pattern matching and replacement. In this cas it's replacing all occurrences of spaces with an empty string in the column nameshead(hatecrimes) # shows the top of the dataframe/tibble
summary(hatecrimes) #gives you all of the data for each column
county year crimetype anti-male
Length:423 Min. :2010 Length:423 Min. :0.000000
Class :character 1st Qu.:2011 Class :character 1st Qu.:0.000000
Mode :character Median :2013 Mode :character Median :0.000000
Mean :2013 Mean :0.007092
3rd Qu.:2015 3rd Qu.:0.000000
Max. :2016 Max. :1.000000
anti-female anti-transgender anti-genderidentityexpression
Min. :0.00000 Min. :0.00000 Min. :0.00000
1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000
Median :0.00000 Median :0.00000 Median :0.00000
Mean :0.01655 Mean :0.04728 Mean :0.05674
3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000
Max. :1.00000 Max. :5.00000 Max. :3.00000
anti-age* anti-white anti-black
Min. :0.00000 Min. : 0.0000 Min. : 0.000
1st Qu.:0.00000 1st Qu.: 0.0000 1st Qu.: 0.000
Median :0.00000 Median : 0.0000 Median : 1.000
Mean :0.05201 Mean : 0.3357 Mean : 1.761
3rd Qu.:0.00000 3rd Qu.: 0.0000 3rd Qu.: 2.000
Max. :9.00000 Max. :11.0000 Max. :18.000
anti-americanindian/alaskannative anti-asian
Min. :0.000000 Min. :0.0000
1st Qu.:0.000000 1st Qu.:0.0000
Median :0.000000 Median :0.0000
Mean :0.007092 Mean :0.1773
3rd Qu.:0.000000 3rd Qu.:0.0000
Max. :1.000000 Max. :8.0000
anti-nativehawaiian/pacificislander anti-multi-racialgroups anti-otherrace
Min. :0 Min. :0.00000 Min. :0
1st Qu.:0 1st Qu.:0.00000 1st Qu.:0
Median :0 Median :0.00000 Median :0
Mean :0 Mean :0.08511 Mean :0
3rd Qu.:0 3rd Qu.:0.00000 3rd Qu.:0
Max. :0 Max. :3.00000 Max. :0
anti-jewish anti-catholic anti-protestant anti-islamic(muslim)
Min. : 0.000 Min. : 0.0000 Min. :0.00000 Min. : 0.0000
1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.:0.00000 1st Qu.: 0.0000
Median : 0.000 Median : 0.0000 Median :0.00000 Median : 0.0000
Mean : 3.981 Mean : 0.2695 Mean :0.02364 Mean : 0.4704
3rd Qu.: 3.000 3rd Qu.: 0.0000 3rd Qu.:0.00000 3rd Qu.: 0.0000
Max. :82.000 Max. :12.0000 Max. :1.00000 Max. :10.0000
anti-multi-religiousgroups anti-atheism/agnosticism
Min. : 0.00000 Min. :0
1st Qu.: 0.00000 1st Qu.:0
Median : 0.00000 Median :0
Mean : 0.07565 Mean :0
3rd Qu.: 0.00000 3rd Qu.:0
Max. :10.00000 Max. :0
anti-religiouspracticegenerally anti-otherreligion anti-buddhist
Min. :0.000000 Min. :0.000 Min. :0
1st Qu.:0.000000 1st Qu.:0.000 1st Qu.:0
Median :0.000000 Median :0.000 Median :0
Mean :0.007092 Mean :0.104 Mean :0
3rd Qu.:0.000000 3rd Qu.:0.000 3rd Qu.:0
Max. :2.000000 Max. :4.000 Max. :0
anti-easternorthodox(greek,russian,etc.) anti-hindu
Min. :0.000000 Min. :0.000000
1st Qu.:0.000000 1st Qu.:0.000000
Median :0.000000 Median :0.000000
Mean :0.002364 Mean :0.002364
3rd Qu.:0.000000 3rd Qu.:0.000000
Max. :1.000000 Max. :1.000000
anti-jehovahswitness anti-mormon anti-otherchristian anti-sikh
Min. :0 Min. :0 Min. :0.00000 Min. :0
1st Qu.:0 1st Qu.:0 1st Qu.:0.00000 1st Qu.:0
Median :0 Median :0 Median :0.00000 Median :0
Mean :0 Mean :0 Mean :0.01655 Mean :0
3rd Qu.:0 3rd Qu.:0 3rd Qu.:0.00000 3rd Qu.:0
Max. :0 Max. :0 Max. :3.00000 Max. :0
anti-hispanic anti-arab anti-otherethnicity/nationalorigin
Min. : 0.0000 Min. :0.00000 Min. : 0.0000
1st Qu.: 0.0000 1st Qu.:0.00000 1st Qu.: 0.0000
Median : 0.0000 Median :0.00000 Median : 0.0000
Mean : 0.3735 Mean :0.06619 Mean : 0.2837
3rd Qu.: 0.0000 3rd Qu.:0.00000 3rd Qu.: 0.0000
Max. :17.0000 Max. :2.00000 Max. :19.0000
anti-non-hispanic* anti-gaymale anti-gayfemale anti-gay(maleandfemale)
Min. :0 Min. : 0.000 Min. :0.0000 Min. :0.0000
1st Qu.:0 1st Qu.: 0.000 1st Qu.:0.0000 1st Qu.:0.0000
Median :0 Median : 0.000 Median :0.0000 Median :0.0000
Mean :0 Mean : 1.499 Mean :0.2411 Mean :0.1017
3rd Qu.:0 3rd Qu.: 1.000 3rd Qu.:0.0000 3rd Qu.:0.0000
Max. :0 Max. :36.000 Max. :8.0000 Max. :4.0000
anti-heterosexual anti-bisexual anti-physicaldisability
Min. :0.000000 Min. :0.000000 Min. :0.00000
1st Qu.:0.000000 1st Qu.:0.000000 1st Qu.:0.00000
Median :0.000000 Median :0.000000 Median :0.00000
Mean :0.002364 Mean :0.004728 Mean :0.01182
3rd Qu.:0.000000 3rd Qu.:0.000000 3rd Qu.:0.00000
Max. :1.000000 Max. :1.000000 Max. :1.00000
anti-mentaldisability totalincidents totalvictims totaloffenders
Min. :0.000000 Min. : 1.00 Min. : 1.00 Min. : 1.00
1st Qu.:0.000000 1st Qu.: 1.00 1st Qu.: 1.00 1st Qu.: 1.00
Median :0.000000 Median : 3.00 Median : 3.00 Median : 3.00
Mean :0.009456 Mean : 10.09 Mean : 10.48 Mean : 11.77
3rd Qu.:0.000000 3rd Qu.: 10.00 3rd Qu.: 10.00 3rd Qu.: 11.00
Max. :1.000000 Max. :101.00 Max. :106.00 Max. :113.00
hatecrimes2 <- hatecrimes |># pipes hatecrimes data into next operationselect(county, year, 'anti-black', 'anti-white', 'anti-jewish', 'anti-catholic','anti-age*','anti-islamic(muslim)', `anti-multi-religiousgroups`, 'anti-gaymale', 'anti-hispanic', `anti-otherethnicity/nationalorigin`) |># selects country, year and multiple hate crimes and pipes this selectiongroup_by(county, year) # Groups the data by country and yearhead(hatecrimes2)
dim(hatecrimes2) # checks and displays the dimensions of the hatecrimes2 data frame/tibble
[1] 423 12
# There are currently 12 variables with 423 rows.summary(hatecrimes2) # gives a summary of the newly organized dataframe/tibble
county year anti-black anti-white
Length:423 Min. :2010 Min. : 0.000 Min. : 0.0000
Class :character 1st Qu.:2011 1st Qu.: 0.000 1st Qu.: 0.0000
Mode :character Median :2013 Median : 1.000 Median : 0.0000
Mean :2013 Mean : 1.761 Mean : 0.3357
3rd Qu.:2015 3rd Qu.: 2.000 3rd Qu.: 0.0000
Max. :2016 Max. :18.000 Max. :11.0000
anti-jewish anti-catholic anti-age* anti-islamic(muslim)
Min. : 0.000 Min. : 0.0000 Min. :0.00000 Min. : 0.0000
1st Qu.: 0.000 1st Qu.: 0.0000 1st Qu.:0.00000 1st Qu.: 0.0000
Median : 0.000 Median : 0.0000 Median :0.00000 Median : 0.0000
Mean : 3.981 Mean : 0.2695 Mean :0.05201 Mean : 0.4704
3rd Qu.: 3.000 3rd Qu.: 0.0000 3rd Qu.:0.00000 3rd Qu.: 0.0000
Max. :82.000 Max. :12.0000 Max. :9.00000 Max. :10.0000
anti-multi-religiousgroups anti-gaymale anti-hispanic
Min. : 0.00000 Min. : 0.000 Min. : 0.0000
1st Qu.: 0.00000 1st Qu.: 0.000 1st Qu.: 0.0000
Median : 0.00000 Median : 0.000 Median : 0.0000
Mean : 0.07565 Mean : 1.499 Mean : 0.3735
3rd Qu.: 0.00000 3rd Qu.: 1.000 3rd Qu.: 0.0000
Max. :10.00000 Max. :36.000 Max. :17.0000
anti-otherethnicity/nationalorigin
Min. : 0.0000
1st Qu.: 0.0000
Median : 0.0000
Mean : 0.2837
3rd Qu.: 0.0000
Max. :19.0000
hatelong <- hatecrimes2 |># pipes hatecrimes 2 into pivit_longer operationpivot_longer(cols =3:12,names_to ="victim_cat",values_to ="crimecount") # transform the hatecrimes2 data frame from a wide format to a long format
hatecrimplot <-hatelong |># pipes hatelong into ggplotggplot(aes( year, crimecount ))+# creates a scatter plot of hate crime counts over the years, with different colors representing different categories of hate crimesgeom_point()+# adds a layer of points to the plotaes(color = victim_cat)+# sets the color aesthetic based on the 'victim_cat' variablefacet_wrap(~victim_cat) # generates separate panels for each level of the 'victim_cat' variablehatecrimplot
hatenew <- hatelong |>filter( victim_cat %in%c("anti-black", "anti-jewish", "anti-gaymale"))|>#filters the rows of the hatelong data frame to include only those where the victim_cat is one of anti-black, anti-jewish, or anti-gaymalegroup_by(year, county) |># groups the filtered data by year and countyarrange(desc(crimecount)) # arranges the data within each group in descending order based on the crimecount. For each combination of year and county the rows will be sorted in descending order of hate crime counts.hatenew
plot2 <- hatenew |># pipes hatenew data to ggplotggplot() +geom_bar(aes(x=year, y=crimecount, fill = victim_cat),position ="dodge", stat ="identity") +# adds a bar layer, sets the aesthetics & labels axes, positions the bars for different categories of hate crimes side by side & specifies that the heights of the bars should represent the actual values in the 'crimecount' variablelabs(fill ="Hate Crime Type",y ="Number of Hate Crime Incidents",title ="Hate Crime Type in NY Counties Between 2010-2016",caption ="Source: NY State Division of Criminal Justice Services") # sets the labels for the plot, including the legend title caption and x/y axesplot2
plot3 <- hatenew |># pipes hatenew to ggplotggplot() +geom_bar(aes(x=county, y=crimecount, fill = victim_cat),position ="dodge", stat ="identity") +## adds a bar layer, sets the aesthetics & labels axes, positions the bars for different categories of hate crimes side by side & specifies that the heights of the bars should represent the actual values in the 'crimecount' variablelabs(fill ="Hate Crime Type",y ="Number of Hate Crime Incidents",title ="Hate Crime Type in NY Counties Between 2010-2016",caption ="Source: NY State Division of Criminal Justice Services") # # sets the labels for the plot, including the legend title caption and x/y axesplot3
counties <- hatenew |># pipes hatenew data to group_by operation and creates a new dataframe named "counties"group_by(year, county)|># Groups data by year and counrysummarize(sum =sum(crimecount)) |># summarizes the grouped data calculates the sum of hate crime counts for each combination of year and county in new "sum" columnarrange(desc(sum)) # arranges summarized data in descending order based on total hate crime count
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.
counties # shows the new data frame
# A tibble: 277 × 3
# Groups: year [7]
year county sum
<dbl> <chr> <dbl>
1 2012 Kings 136
2 2010 Kings 110
3 2016 Kings 101
4 2013 Kings 96
5 2014 Kings 94
6 2015 Kings 90
7 2011 Kings 86
8 2016 New York 86
9 2012 Suffolk 83
10 2013 New York 75
# ℹ 267 more rows
counties2 <- hatenew |># pipes hatenew into group_by and creates a counties2 dataframegroup_by(county)|># groups the data by countysummarize(sum =sum(crimecount)) |># summarizes the grouped data calculates the sum of hate crime counts for each combination of year and county in new "sum" column and pipes it into the slice_max function/operationslice_max(order_by = sum, n=5) # extracts the top 5 rows based on the sum column we created in descending order. It retains the counties with the highest total hate crime counts.counties2
# A tibble: 5 × 2
county sum
<chr> <dbl>
1 Kings 713
2 New York 459
3 Suffolk 360
4 Nassau 298
5 Queens 235
plot4 <- hatenew |>filter(county %in%c("Kings", "New York", "Suffolk", "Nassau", "Queens")) |># selects only rows where the 'county' is one of the specified counties ("Kings", "New York", "Suffolk", "Nassau", "Queens").ggplot() +# starts ggplot operationgeom_bar(aes(x=county, y=crimecount, fill = victim_cat),position ="dodge", stat ="identity") +# adds a bar layer, sets the aesthetics & labels axes, positions the bars for different categories of hate crimes side by side & specifies that the heights of the bars should represent the actual values in the 'crimecount' variablelabs(y ="Number of Hate Crime Incidents",title ="5 Counties in NY with Highest Incidents of Hate Crimes",subtitle ="Between 2010-2016", fill ="Hate Crime Type",caption ="Source: NY State Division of Criminal Justice Services") # adds thelabels for the x/y axes aswell as the caption, title and subtitleplot4
setwd("C:/data110") # sets the work directory to find the NY population datasetnypop <-read_csv("newyorkpopulation.csv") # reads/imports NY population dataset into R and sets it as a tibble/dataframe
Rows: 62 Columns: 8
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Geography
dbl (7): 2010, 2011, 2012, 2013, 2014, 2015, 2016
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
nypop$Geography <-gsub(" , New York", "", nypop$Geography) # replaces substring new york with a empty string in geography column to clean up county namesnypop$Geography <-gsub("County", "", nypop$Geography) # replaces substring County with a empty string in geography column to clean up county namesnypoplong <- nypop |># pipes nypop dataset into rename and gather functionsrename(county = Geography) |># Renames the 'Geography' column to 'county'gather("year", "population", 2:8) # Gathers the columns from the 2nd to the 8th into key-value pairs, where 'year' becomes the key and 'population' becomes the valuenypoplong$year <-as.double(nypoplong$year) # Converts the 'year' column in the nypoplong data frame to numeric double format.head(nypoplong) # Displays the first few rows of nypoplong data frame
# A tibble: 6 × 3
county year population
<chr> <dbl> <dbl>
1 Albany , New York 2010 304078
2 Allegany , New York 2010 48949
3 Bronx , New York 2010 1388240
4 Broome , New York 2010 200469
5 Cattaraugus , New York 2010 80249
6 Cayuga , New York 2010 79844
nypoplong12 <- nypoplong |># pipe operator to filter the rows of the nypoplong data frame selecting only where the 'year' is equal to 2012filter(year ==2012) |>arrange(desc(population)) |># arranges the filtered data frame in descending order based on the 'population' columnhead(10) # selects the top 10 rows from the arranged data framenypoplong12$county<-gsub(" , New York","",nypoplong12$county) # uses the gsub function to replace the substring " , New York" with an empty string in the 'county' column of the nypoplong12 data framenypoplong12
# A tibble: 10 × 3
county year population
<chr> <dbl> <dbl>
1 Kings 2012 2572282
2 Queens 2012 2278024
3 New York 2012 1625121
4 Suffolk 2012 1499382
5 Bronx 2012 1414774
6 Nassau 2012 1350748
7 Westchester 2012 961073
8 Erie 2012 920792
9 Monroe 2012 748947
10 Richmond 2012 470978
counties12 <- counties |># Pipes counties data we created earlier into the filter operationfilter(year ==2012) |># filters the rows by the year 2012arrange(desc(sum)) # arranges filtered data frame in descending order based on 'sum' columncounties12
# A tibble: 41 × 3
# Groups: year [1]
year county sum
<dbl> <chr> <dbl>
1 2012 Kings 136
2 2012 Suffolk 83
3 2012 New York 71
4 2012 Nassau 48
5 2012 Queens 48
6 2012 Erie 28
7 2012 Bronx 23
8 2012 Richmond 18
9 2012 Multiple 14
10 2012 Westchester 13
# ℹ 31 more rows
datajoin <- counties12 |>full_join(nypoplong12, by=c("county", "year")) # performs a full join between the counties12 and nypoplong12 data frames. The by=c("county", "year") argument specifies that the join should be based on the common columns "county" and "year"datajoin
# A tibble: 41 × 4
# Groups: year [1]
year county sum population
<dbl> <chr> <dbl> <dbl>
1 2012 Kings 136 2572282
2 2012 Suffolk 83 1499382
3 2012 New York 71 1625121
4 2012 Nassau 48 1350748
5 2012 Queens 48 2278024
6 2012 Erie 28 920792
7 2012 Bronx 23 1414774
8 2012 Richmond 18 470978
9 2012 Multiple 14 NA
10 2012 Westchester 13 961073
# ℹ 31 more rows
datajoinrate <- datajoin |>mutate(rate = sum/population*100000) |># adds a new column named "rate" to the datajoin data frame. The new column is calculated by dividing the total hate crime count (sum) by the population and then multiplying by 100,000 to get the rate per 100,000 populationarrange(desc(rate)) # arranges data frame in descending order based on the hate crime ratesdatajoinrate
# A tibble: 41 × 5
# Groups: year [1]
year county sum population rate
<dbl> <chr> <dbl> <dbl> <dbl>
1 2012 Suffolk 83 1499382 5.54
2 2012 Kings 136 2572282 5.29
3 2012 New York 71 1625121 4.37
4 2012 Richmond 18 470978 3.82
5 2012 Nassau 48 1350748 3.55
6 2012 Erie 28 920792 3.04
7 2012 Queens 48 2278024 2.11
8 2012 Bronx 23 1414774 1.63
9 2012 Westchester 13 961073 1.35
10 2012 Monroe 5 748947 0.668
# ℹ 31 more rows
dt <- datajoinrate[,c("county","rate")] # extracts the columns "county" and "rate" from the datajoinrate data frame dt
# A tibble: 41 × 2
county rate
<chr> <dbl>
1 Suffolk 5.54
2 Kings 5.29
3 New York 4.37
4 Richmond 3.82
5 Nassau 3.55
6 Erie 3.04
7 Queens 2.11
8 Bronx 1.63
9 Westchester 1.35
10 Monroe 0.668
# ℹ 31 more rows
aggregategroups <- hatecrimes |># reshapes the data by converting columns 4 to 44 into a long formatpivot_longer(cols =4:44,names_to ="victim_cat",values_to ="crimecount" )unique(aggregategroups$victim_cat) # extracts the unique values in the "victim_cat" column
aggregategroups <- aggregategroups |># pipes aggregate groups into mutate functionmutate(group =case_when( victim_cat %in%c("anti-transgender", "anti-gayfemale", "anti-gendervictim_catendityexpression", "anti-gaymale", "anti-gay(maleandfemale", "anti-bisexual") ~"anti-lgbtq", victim_cat %in%c("anti-multi-racialgroups", "anti-jewish", "anti-protestant", "anti-multi-religousgroups", "anti-religiouspracticegenerally", "anti-buddhist", "anti-hindu", "anti-mormon", "anti-sikh", "anti-catholic", "anti-islamic(muslim)", "anti-atheism/agnosticism", "anti-otherreligion", "anti-easternorthodox(greek,russian,etc.)", "anti-jehovahswitness", "anti-otherchristian") ~"anti-religion", victim_cat %in%c("anti-asian", "anti-arab", "anti-non-hispanic", "anti-white", "anti-americanindian/alaskannative", "anti-nativehawaiian/pacificislander", "anti-otherrace", "anti-hispanic", "anti-otherethnicity/nationalorigin") ~"anti-ethnicity", victim_cat %in%c("anti-physicaldisability", "anti-mentaldisability") ~"anti-disability", victim_cat %in%c("anti-female", "anti-male") ~"anti-gender",TRUE~"others")) # adds a new column named "group". Case_when allows you to specify multiple conditions and their corresponding values for the new columnaggregategroups
# A tibble: 17,343 × 6
county year crimetype victim_cat crimecount group
<chr> <dbl> <chr> <chr> <dbl> <chr>
1 Albany 2016 Crimes Against Persons anti-male 0 anti…
2 Albany 2016 Crimes Against Persons anti-female 0 anti…
3 Albany 2016 Crimes Against Persons anti-transgender 0 anti…
4 Albany 2016 Crimes Against Persons anti-genderidentityexpr… 0 othe…
5 Albany 2016 Crimes Against Persons anti-age* 0 othe…
6 Albany 2016 Crimes Against Persons anti-white 0 anti…
7 Albany 2016 Crimes Against Persons anti-black 1 othe…
8 Albany 2016 Crimes Against Persons anti-americanindian/ala… 0 anti…
9 Albany 2016 Crimes Against Persons anti-asian 0 anti…
10 Albany 2016 Crimes Against Persons anti-nativehawaiian/pac… 0 anti…
# ℹ 17,333 more rows
lgbtq <- hatecrimes |>pivot_longer( cols =4:44,names_to ="victim_cat",values_to ="crimecount") |>filter(victim_cat %in%c("anti-transgender", "anti-gayfemale", "anti-gendervictim_catendityexpression", "anti-gaymale", "anti-gay(maleandfemale", "anti-bisexual")) # transforms dataframe from a wide to a long format for columns 4 to 44. And filters the data frame to include only rows where the "victim_cat" column matches specific categories related to anti-LGBTQ hate crimeslgbtq
Without a universal system and understanding of what constitutes a hate crime aswell as potential bias from those who report & collect the data (police officers) there are substantial issues in this dataset. I recall only recently seeing a similar issue in the UK with issues on the reporting of sexual assaults and rape cases aswell as the improper handling of them ( there is a good article on this issue by the Guardian).
I would love to group the data by religion ethnicity and gender identity to see where most of the cases lie. As well as sorting them by county with differing colors representing the different forms of hate crimes.
Coming from a background in cityplanning i am painfully aware of the bisections that were created by robert moses (a very famous city planner) which carved up New York into segregated section, not only by race but also by socioeconomic status. With that in mind i would love to explore the counties themselves and thier potential relationship to one another and whether or not there are hot spots due to proximity between predominantly black and white neighborhoods and counties.
As a follow up to this tutorial i would like to urge my representatives to look into how data is being collected in my local PD. I would also like to see data relating to Maryland hate crimes and thier prevelance in each county and to be able to play around with that data aswell.