Hate Crimes Dataset 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 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 evidence 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

#tidyverse::install_tidyverse()
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.4     v dplyr   1.0.7
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   2.0.1     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
#tinytex::install_tinytex()
library(tinytex)
setwd("C:/Users/Jerem/OneDrive/Documents")
hatecrimes <- read_csv("Montgomery College/Fall 2021/DATA 110/Datasets/hateCrimes2010.csv")
## Rows: 423 Columns: 44
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr  (2): County, Crime Type
## dbl (42): Year, Anti-Male, Anti-Female, Anti-Transgender, Anti-Gender Identi...
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.

Cleaning up Data

Making all headers lowercase and remove spaces

names(hatecrimes) <- tolower(names(hatecrimes))
names(hatecrimes) <- gsub("","", names(hatecrimes))
str(hatecrimes)
## spec_tbl_df [423 x 44] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ county                                      : chr [1:423] "Albany" "Albany" "Allegany" "Bronx" ...
##  $ year                                        : num [1:423] 2016 2016 2016 2016 2016 ...
##  $ crime type                                  : chr [1:423] "Crimes Against Persons" "Property Crimes" "Property Crimes" "Crimes Against Persons" ...
##  $ anti-male                                   : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-female                                 : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-transgender                            : num [1:423] 0 0 0 4 0 0 0 0 0 0 ...
##  $ anti-gender identity expression             : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-age*                                   : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-white                                  : num [1:423] 0 0 0 1 1 0 0 0 0 0 ...
##  $ anti-black                                  : num [1:423] 1 2 1 0 0 1 0 1 0 2 ...
##  $ anti-american indian/alaskan native         : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-asian                                  : num [1:423] 0 0 0 0 0 1 0 0 0 0 ...
##  $ anti-native hawaiian/pacific islander       : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-multi-racial groups                    : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-other race                             : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-jewish                                 : num [1:423] 0 0 0 0 1 0 1 0 0 0 ...
##  $ anti-catholic                               : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-protestant                             : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-islamic (muslim)                       : num [1:423] 1 0 0 6 0 0 0 0 1 0 ...
##  $ anti-multi-religious groups                 : num [1:423] 0 1 0 0 0 0 0 0 0 0 ...
##  $ anti-atheism/agnosticism                    : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-religious practice generally           : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-other religion                         : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-buddhist                               : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-eastern orthodox (greek, russian, etc.): num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-hindu                                  : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-jehovahs witness                       : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-mormon                                 : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-other christian                        : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-sikh                                   : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-hispanic                               : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-arab                                   : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-other ethnicity/national origin        : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-non-hispanic*                          : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-gay male                               : num [1:423] 1 0 0 8 0 1 0 0 0 0 ...
##  $ anti-gay female                             : num [1:423] 0 0 0 1 0 0 0 0 0 0 ...
##  $ anti-gay (male and female)                  : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-heterosexual                           : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-bisexual                               : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-physical disability                    : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ anti-mental disability                      : num [1:423] 0 0 0 0 0 0 0 0 0 0 ...
##  $ total incidents                             : num [1:423] 3 3 1 20 2 3 1 1 1 2 ...
##  $ total victims                               : num [1:423] 4 3 1 20 2 3 1 1 1 2 ...
##  $ total offenders                             : num [1:423] 3 3 1 25 2 3 1 1 1 2 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   County = col_character(),
##   ..   Year = col_double(),
##   ..   `Crime Type` = col_character(),
##   ..   `Anti-Male` = col_double(),
##   ..   `Anti-Female` = col_double(),
##   ..   `Anti-Transgender` = col_double(),
##   ..   `Anti-Gender Identity Expression` = col_double(),
##   ..   `Anti-Age*` = col_double(),
##   ..   `Anti-White` = col_double(),
##   ..   `Anti-Black` = col_double(),
##   ..   `Anti-American Indian/Alaskan Native` = col_double(),
##   ..   `Anti-Asian` = col_double(),
##   ..   `Anti-Native Hawaiian/Pacific Islander` = col_double(),
##   ..   `Anti-Multi-Racial Groups` = col_double(),
##   ..   `Anti-Other Race` = col_double(),
##   ..   `Anti-Jewish` = col_double(),
##   ..   `Anti-Catholic` = col_double(),
##   ..   `Anti-Protestant` = col_double(),
##   ..   `Anti-Islamic (Muslim)` = col_double(),
##   ..   `Anti-Multi-Religious Groups` = col_double(),
##   ..   `Anti-Atheism/Agnosticism` = col_double(),
##   ..   `Anti-Religious Practice Generally` = col_double(),
##   ..   `Anti-Other Religion` = col_double(),
##   ..   `Anti-Buddhist` = col_double(),
##   ..   `Anti-Eastern Orthodox (Greek, Russian, etc.)` = col_double(),
##   ..   `Anti-Hindu` = col_double(),
##   ..   `Anti-Jehovahs Witness` = col_double(),
##   ..   `Anti-Mormon` = col_double(),
##   ..   `Anti-Other Christian` = col_double(),
##   ..   `Anti-Sikh` = col_double(),
##   ..   `Anti-Hispanic` = col_double(),
##   ..   `Anti-Arab` = col_double(),
##   ..   `Anti-Other Ethnicity/National Origin` = col_double(),
##   ..   `Anti-Non-Hispanic*` = col_double(),
##   ..   `Anti-Gay Male` = col_double(),
##   ..   `Anti-Gay Female` = col_double(),
##   ..   `Anti-Gay (Male and Female)` = col_double(),
##   ..   `Anti-Heterosexual` = col_double(),
##   ..   `Anti-Bisexual` = col_double(),
##   ..   `Anti-Physical Disability` = col_double(),
##   ..   `Anti-Mental Disability` = col_double(),
##   ..   `Total Incidents` = col_double(),
##   ..   `Total Victims` = col_double(),
##   ..   `Total Offenders` = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

Select only certain hate-crimes

The data selected based on the hate-crime type with a max number of 9 or more. By selecting the max number of 9 or more allows the audience to focus on the most prominent types of hate-crimes.

hatecrimes2 <- hatecrimes %>% 
  select(county, year, `anti-black`, 'anti-white', `anti-jewish`, 'anti-catholic','anti-age*','anti-islamic (muslim)', 'anti-gay male', 'anti-hispanic') %>%
  group_by(county, year)
head(hatecrimes2)
## # A tibble: 6 x 10
## # Groups:   county, year [4]
##   county    year `anti-black` `anti-white` `anti-jewish` `anti-catholic`
##   <chr>    <dbl>        <dbl>        <dbl>         <dbl>           <dbl>
## 1 Albany    2016            1            0             0               0
## 2 Albany    2016            2            0             0               0
## 3 Allegany  2016            1            0             0               0
## 4 Bronx     2016            0            1             0               0
## 5 Bronx     2016            0            1             1               0
## 6 Broome    2016            1            0             0               0
## # ... with 4 more variables: anti-age* <dbl>, anti-islamic (muslim) <dbl>,
## #   anti-gay male <dbl>, anti-hispanic <dbl>

Checking the dimensions and the summary to make sure there is no missing data values

dim(hatecrimes2)
## [1] 423  10
summary(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-gay male    anti-hispanic    
##  Min.   : 0.000   Min.   : 0.0000  
##  1st Qu.: 0.000   1st Qu.: 0.0000  
##  Median : 0.000   Median : 0.0000  
##  Mean   : 1.499   Mean   : 0.3735  
##  3rd Qu.: 1.000   3rd Qu.: 0.0000  
##  Max.   :36.000   Max.   :17.0000

Use Facet_Wrap

hatecrimeslong <- hatecrimes2 %>%
  tidyr::gather("id", "crimecount", 3:10)

hatecrimesplot <- hatecrimeslong %>%
  ggplot(., aes(year, crimecount)) +
  geom_point() +
  aes(color = id) +
  facet_wrap(~id)
hatecrimesplot

Look Deeper into crimes againest blacks, Males, and Jews

hatenew <- hatecrimeslong %>%
  filter(id == "anti-black" | id == "anti-gay male" | id == "anti-jewish") %>%
  group_by(year, county) %>%
  arrange(desc(crimecount))
hatenew
## # A tibble: 1,269 x 4
## # Groups:   year, county [277]
##    county   year id          crimecount
##    <chr>   <dbl> <chr>            <dbl>
##  1 Kings    2012 anti-jewish         82
##  2 Kings    2016 anti-jewish         51
##  3 Suffolk  2014 anti-jewish         48
##  4 Suffolk  2012 anti-jewish         48
##  5 Kings    2011 anti-jewish         44
##  6 Kings    2013 anti-jewish         41
##  7 Kings    2010 anti-jewish         39
##  8 Nassau   2011 anti-jewish         38
##  9 Suffolk  2013 anti-jewish         37
## 10 Nassau   2016 anti-jewish         36
## # ... with 1,259 more rows

Plot these three types of hate crime together

plot2 <- hatenew %>%
  ggplot() +
  geom_bar(aes(x = year, y = crimecount, fill =id), position = "dodge", stat = "identity") +
  ggtitle("Hate Crime Type in NY Counties Between 2010-2016") +
  ylab("Number of Hate Crime Incidents") +
  labs(fill = "Hate Crime Type")
plot2

Based on this graph, the hate crimes againest jews spiked in 2012. All other years were relatively consistent with a slight upward trend. There was also an upward trend in hate crimes againest gay males, Finally, there appears to be a downward trend in hate crimes againest blacks during this period.

Counties

plot3 <- hatenew %>%
  ggplot() +
  geom_bar(aes(x = county, y = crimecount, fill = id), position = "dodge", stat = "identity") +
  ggtitle("Hate Crimes Type in NY Counties Between 2010-2016") +
  ylab("Number of Hate Crime Incidents") +
  labs(fill = "Hate Crime Type")
plot3

Reducing amount of counties

This will allow the audiance to read the graph.

counties <- hatenew %>%
  group_by(county, year) %>%
  summarize(sum = sum(crimecount)) %>%
  arrange(desc(sum))
## `summarise()` has grouped output by 'county'. You can override using the `.groups` argument.
counties
## # A tibble: 277 x 3
## # Groups:   county [60]
##    county    year   sum
##    <chr>    <dbl> <dbl>
##  1 Kings     2012   136
##  2 Kings     2010   110
##  3 Kings     2016   101
##  4 Kings     2013    96
##  5 Kings     2014    94
##  6 Kings     2015    90
##  7 Kings     2011    86
##  8 New York  2016    86
##  9 Suffolk   2012    83
## 10 New York  2013    75
## # ... with 267 more rows
plot4 <- hatenew %>% 
  filter(county == "king" | county == "New York" | county == "Suffolk" | county == "Nassau" | county == "Queens") %>% 
  ggplot() +
  geom_bar(aes(x = county, y = crimecount, fill = id), position = "dodge", stat = "identity") +
  labs(ylab = "Number of Hate Crime Incidents", 
    title = "5 Countires IN NE with Highest Incidents of Hate Crimes",
    subtitle = "Between 2010-2016",
    fill = "Hate Crime Type")
plot4

setwd("C:/Users/Jerem/OneDrive/Documents")
nypop <- read_csv("Montgomery College/Fall 2021/DATA 110/Datasets/newyorkpopulation.csv")
## Rows: 62 Columns: 8
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): Geography
## dbl (7): 2010, 2011, 2012, 2013, 2014, 2015, 2016
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i 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 matches in the other dataset.

nypop$Geography <- gsub(" , New York", "", nypop$Geography)
nypop$Geography <- gsub("County", "", nypop$Geography)
nypoplong <- nypop %>%
  rename(county = Geography) %>%
  gather("year", "population", 2:8)
nypoplong$year <- as.double(nypoplong$year)
head(nypoplong)
## # A tibble: 6 x 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

Focusing 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 matches the counties12 variable by Cutting off the “, New York” portion of the county listing

nypoplong12 <- nypoplong %>%
  filter(year == 2012) %>%
  arrange(desc(population)) %>%
  head(10)
nypoplong12$county <- gsub(" , New York", "", nypoplong12$county)
nypoplong12
## # A tibble: 10 x 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 counties 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.

Recall the total hate crime counts: Kings 713 New York 459 Suffolk 360 Nassau 298 Queens 235

Filter hate crimes just for 2012 as well

countries12 <- counties %>%
  filter(year == 2012) %>%
  arrange(desc(sum))
countries12
## # A tibble: 41 x 3
## # Groups:   county [41]
##    county       year   sum
##    <chr>       <dbl> <dbl>
##  1 Kings        2012   136
##  2 Suffolk      2012    83
##  3 New York     2012    71
##  4 Nassau       2012    48
##  5 Queens       2012    48
##  6 Erie         2012    28
##  7 Bronx        2012    23
##  8 Richmond     2012    18
##  9 Multiple     2012    14
## 10 Westchester  2012    13
## # ... with 31 more rows

Join the Hate Crimes data with NY Population Data for 2012

datajoin <- countries12 %>%
  full_join(nypoplong12, by = c("county", "year"))
datajoin
## # A tibble: 41 x 4
## # Groups:   county [41]
##    county       year   sum population
##    <chr>       <dbl> <dbl>      <dbl>
##  1 Kings        2012   136    2572282
##  2 Suffolk      2012    83    1499382
##  3 New York     2012    71    1625121
##  4 Nassau       2012    48    1350748
##  5 Queens       2012    48    2278024
##  6 Erie         2012    28     920792
##  7 Bronx        2012    23    1414774
##  8 Richmond     2012    18     470978
##  9 Multiple     2012    14         NA
## 10 Westchester  2012    13     961073
## # ... with 31 more rows

Calcuate the rate of incidents per 100,000. Then arrange in descending order

datajoinrate <- datajoin %>%
  mutate(rate = sum/population*100000) %>%
  arrange(desc(rate))
datajoinrate
## # A tibble: 41 x 5
## # Groups:   county [41]
##    county       year   sum population  rate
##    <chr>       <dbl> <dbl>      <dbl> <dbl>
##  1 Suffolk      2012    83    1499382 5.54 
##  2 Kings        2012   136    2572282 5.29 
##  3 New York     2012    71    1625121 4.37 
##  4 Richmond     2012    18     470978 3.82 
##  5 Nassau       2012    48    1350748 3.55 
##  6 Erie         2012    28     920792 3.04 
##  7 Queens       2012    48    2278024 2.11 
##  8 Bronx        2012    23    1414774 1.63 
##  9 Westchester  2012    13     961073 1.35 
## 10 Monroe       2012     5     748947 0.668
## # ... with 31 more rows

Notice that the highest rates of hate crimes in 2012 happened in:

dt <- datajoinrate[,c("county", "rate")]
dt
## # A tibble: 41 x 2
## # Groups:   county [41]
##    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
## # ... with 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.

Important Findings: 1. I wonder what the data would look like if there was a universally accepted requirement for this type of data collection.

  1. The Bronx appears to have much lower than expected incidents of hate crimes relative to its population density in comparison to other NY counties.

  2. In Kings County, NY (which is home to Brooklyn; according to Wikipedia, it is New York’s most populous borough and the second most densly populated county in the US) in 2012, there was a spike in hate crimes against jews.

  3. 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

Homework Paragraph

The positive aspect of this dataset is that it includes many variables that allow me and others to compare hate crimes across counties. With the wide spectrum of data, it may potentially lead to informative and thorough reports. The negative aspect of this dataset is that it’s a flawed dataset. The raw data was collected incompletely causing the data to be cleaned and reformatted. Also, the dataset doesn’t give the population of these counties therefore it’s not a true representation of the whole population of differences in hate crime between the different New York counties.

Two paths I would like to (hypothetically) study about this dataset are hate crimes against the LGBTQ community and non-LGBTQ. One of my best friends is part of the LGBTQ community and I would want to see if there is a correlation between being LGBTQ and how it will affect the rate of hate crimes. I would follow up by comparing this dataset to other cities and counties datasets and see which cities and counties are more accepting of the LGBTQ community and what laws or organized events are implemented for them.