This dataset looks at all types of hate crimes in New York counties by the type of hate crime from 2010 to 2016
My caveat:
Flawed Hate Crime Data Collection - We Should Know How The Data Was Collected
(Nathan Yau of Flowing Data, Dec 5, 2017)
Data can provide (note: original text says provvictim_cate, unsure if this is a typo) you with important information, but when the collection process is flawed, there’s not much you can do. Ken Schwencke, reporting for ProPublica, researched the tiered system that the FBI relies on to gather hate crime data for the United States:
“Under a federal law passed in 1990, the FBI is required to track and tabulate crimes in which there was ‘manifest evvictim_catence (unsure if this is a typo) of prejudice’ against a host of protected groups, regardless of differences in how state laws define who’s protected. The FBI, in turn, relies on local law enforcement agencies to collect and submit this data, but can’t compel them to do so.”
This is a link to the ProPublica Article: https://www.propublica.org/article/why-america-fails-at-gathering-hate-crime-statistics
Here is a data visualization of where hate crimes do NOT get reported around the country (Ken Schwencke, 2017): https://projects.propublica.org/graphics/hatecrime-map
So Now We Know That There Is Possible Bias In The Dataset, What Can We Do With It?
library(tidyverse)
── 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.5.2 ✔ tibble 3.2.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.0.4
── 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
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.
Clean Up The Data
Make All Headers Lowercase and Remove Spaces
After cleaning up the variable names, look at the structure of the data. Since there are 44 variables in this dataset, you can use “summary” to decide which hate crimes to focus on. In the output of “summary”, look at the min/max values. Some have a max value of 1.
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
I decided I would only look at the hate crime types with a max number of 9 or more. That way I can focus on the most prominent types of hate crimes.
Check The Dimensions and The Summary to Make Sure No Missing Values
Also check the dimensions to count how many variablees remain
dim(hatecrimes2)
[1] 423 12
# There are currently 12 variables with 423 rowssummary(hatecrimes2)
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
Convert From Wide to Long Format
Look at each set of hate crimes for each type for each year. Convert the dataset from wide to long with the pivot_longer function. It will take each column’s hate crime type and combine them all into one column called “victim_cat”. Then each cell count will go into the new column, “crimecount”.
Finally, we only doing this for the quantitative variables, which are in column 3-10. Note the command facet_wrap requires (~) before “victim_cat”.
Look Deeper Into Crimes Against Blacks, Gay Males, and Jews
From the facet_wrap plot above, anti-black, anti-gaymales, and anti-jewish categories seem to have highest rates of offenses reported. Filter out just for those 3 crimes.
Use the following commands to finalize your barplot:
position = “dodge” makes side-by-side bars, rather than stacked bars
stat = “identity” allows you to plot each set of bars for each year between 2010 and 2016
ggtitle gives the plot a title
labs gives a title to the legend
plot2 <- hatenew |>ggplot() +geom_bar(aes(x = year, y = crimecount, fill = victim_cat),position ="dodge", stat ="identity") +labs(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")plot2
We can see that hate crimes against jews spiked in 2012. All other years were relatively consistent with a slight upward trend. There was also an upward trend in hate crimes against gay males. Finally, there appears to be a downward trend in hate crimes against blacks during this period.
What About The Counties?
I have not dealt with the counties, but I think that is the next place to explore. I can make bar graphs by county instead of by year.
plot3 <- hatenew |>ggplot() +geom_bar(aes(x = county, y = crimecount, fill = victim_cat),position ="dodge", stat ="identity") +labs(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")plot3
So Many Counties
There are too many counties for this plot to make sense, but maybe we can just look at the 5 counties with the highest number of incidents.
use “group_by” to group each row by counties
use summarize() to get the total sum of incidents by county
use arrange(desc) to arrange those sums of total incidents by counties in descending order
# A tibble: 5 × 2
county sum
<chr> <dbl>
1 Kings 713
2 New York 459
3 Suffolk 360
4 Nassau 298
5 Queens 235
Finally, create the barplot above, but only for the 5 counties in 2012 with the highest incidents of hate crimes. The command “labs” is nice because you can get a title, subtitle, y-axis label, and legend title, all in one command
plot4 <- hatenew |>filter(county %in%c("Kings", "New York", "Suffolk", "Nassau", "Queens")) |>ggplot() +geom_bar(aes(x = county, y = crimecount, fill = victim_cat),position ="dodge", stat ="identity") +labs(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")plot4
How Would Calculations Be Affected By Looking at Hate Crimes in Counties Per Year by Population Densities?
Bring in census data for populations of New York counties. These are estimates from 2010 census.
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.
Clean The County Name to Match The Other Dataset
Rename the variable “Geography” as “county” so that it matchesin the other dataset.
# 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
Focus on 2012
Since 2012 had the highest counts of hate crimes, let’s look at the populations of the counties in 2012
Clean the nypoplong12 variable, county, so that it matches counties12 variable by cutting off the “, New York” portion of the county listing
# 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
Not surprisingly, 4/5 of the countries with the highest populations also were listed in the counties with the highest number of hate crimes. Only the Bronx, which has the fifth highest population, is not in the list with the highest number of total hate crimes over the period from 2010 to 2016.
# 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
Notice that the highest rates of hate crimes in 2012 happened in:
dt <- datajoinrate[,c("county", "rate")]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
But the highest populated counties were: Kings (Brooklyn), Queens, New York, Suffolk (Long Island), Bronx, and Nassau. They do not correspond directly, though they are similar, to the counties with highest rates of hate crimes.
I Wonder what the data would look like if there was a universally accepted requirement for this type of data collection.
The Bronx appears to have much lower than expected incvictim_catents of hate crimes relative to its population density in comparison to other NY counties
In Kings County, NY (which is home to Brooklyn, according to Wikipedia, it is New York’s most populous borough and the second most densely populated county in the US) in 2012, there was a spike in hate crimes against jews.
All of these findings are corroborated in Hate Crime in New York State 2012 Annual Report: https://www.criminaljustice.ny.gov/crimnet/ojsa/hate-crime-in-nys-2012-annual-report.pdf
Final Dataset Analysis
The hate crimes data set has a list of positives and negatives. The purpose of this data set is to give information on the number of hate crimes which have occurred during the period of 2010 to 2016 in the state of New York. The biggest critique behind this data set is how the data is collected. There is a current widespread debate regarding the definition of hate crime. According to Michael Shively in the Office of Justice Programs, there is no national consensus regarding how to constitute what should be considered a hate crime (see page 3: https://www.ojp.gov/pdffiles1/nij/grants/210300.pdf ). This brings up concerns regarding the metrics by which the data is being recorded, along with the accuracy of the data set. Metrics is a concern due to the inability to scale out what is considered a hate crime, as there is no universally accepted statute to clearly determine the difference between a crime and a crime motivated by discrimination of some sort. Accuracy is an issue due to similar reasons as the metrics, with another major concern being that the FBI is relying on local law enforcement to accurately share data on hate crime, which can be a possible potential conflict of interest. As it is a current issue to face, this major concern is something that comes with the territory of attempting to be transparent regarding the severity of hate crimes in our country, and thus in the state of New York in this instance.
One major positive remark regarding this data set is that the list of variables to record datum is very thorough. It would be easier to simplify the information into broader categories such as “anti-lgbtq”, “anti-religion”, or “anti-racial”, however it would take away from giving people the ability to accurately observe what is going on in the state. This data set gives observers the opportunity to notice concerning information such as a rise in hate crimes directed towards a specific group in certain areas (such as the anti-jews trend spike in 2012), during certain time frames. This creates dialogue for deeper questions including:
What may have occurred during the time and around the specific locations?
How was the problem resolved when the trend began to decline?
Including specific data variables gives the opportunity for more accurate analysis. This data set does an amazing job at that, possibly a data scientist’s biggest joy (and in turn, a coding nightmare).
If I were to continue further with this data set, I would like to see the following plots:
The ratio of hate crimes against each specific categories in a facet wrap over time from 2010 - 2016 to see if there are trends where a decline in one subset group having a high occurrence in hate crime instances turned into an incline for a separate group possibly. (This would of course be done solely for groups with higher counts as there are too many variables with not so large of a number)
A Bar graph of the county with the highest hate crime count (along with the amount being displayed) for every given year from 2010 - 2016. This would likely be done by first gathering the data of each year to tally up the count of hate crimes per each county for every year, then grouping the counties with the highest counts for each year (One county per each year from 2010 to 2016) and using “fill = county” for those given counties to identify what bar corresponds to what county