Hate crimes in NY from 2010-2016

Author

Oworeniba Nseyo

Hate Crimes Data-set

This data set looks at all types of hate crimes in New York counties by the type of hate crime from 2019 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 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 that we know that there is possible bias in the data-set, 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.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ 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
#tinytex::install_tinytex()
#library(tinytex)
setwd("/Users/oworenibanseyo/Desktop/Data 110 2025")
hatecrimes <- read_csv("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...

ℹ 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 variables’ 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-vale of 1.

names(hatecrimes) <- tolower(names(hatecrimes))
names(hatecrimes) <- gsub(" ","", names(hatecrimes))
head(hatecrimes)
# A tibble: 6 × 44
  county    year crimetype          `anti-male` `anti-female` `anti-transgender`
  <chr>    <dbl> <chr>                    <dbl>         <dbl>              <dbl>
1 Albany    2016 Crimes Against Pe…           0             0                  0
2 Albany    2016 Property Crimes              0             0                  0
3 Allegany  2016 Property Crimes              0             0                  0
4 Bronx     2016 Crimes Against Pe…           0             0                  4
5 Bronx     2016 Property Crimes              0             0                  0
6 Broome    2016 Crimes Against Pe…           0             0                  0
# ℹ 38 more variables: `anti-genderidentityexpression` <dbl>,
#   `anti-age*` <dbl>, `anti-white` <dbl>, `anti-black` <dbl>,
#   `anti-americanindian/alaskannative` <dbl>, `anti-asian` <dbl>,
#   `anti-nativehawaiian/pacificislander` <dbl>,
#   `anti-multi-racialgroups` <dbl>, `anti-otherrace` <dbl>,
#   `anti-jewish` <dbl>, `anti-catholic` <dbl>, `anti-protestant` <dbl>,
#   `anti-islamic(muslim)` <dbl>, `anti-multi-religiousgroups` <dbl>, …

Select only certain hate-crimes

summary(hatecrimes)
    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-crimes types with a max number of 9 or more. THat way i can focus oon 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-multi-religiousgroups`, 'anti-gaymale', 'anti-hispanic', `anti-otherethnicity/nationalorigin`) |>
  group_by(county, year)
head(hatecrimes2)
# A tibble: 6 × 12
# 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
# ℹ 6 more variables: `anti-age*` <dbl>, `anti-islamic(muslim)` <dbl>,
#   `anti-multi-religiousgroups` <dbl>, `anti-gaymale` <dbl>,
#   `anti-hispanic` <dbl>, `anti-otherethnicity/nationalorigin` <dbl>

Check the dimensions and the summary to make sure no missing values

Also, check the dimensions to count how many variables remain

dim(hatecrimes2)
[1] 423  12
# Thwew are currently 12 variables with 423 rows.
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-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 year. Convert the dataset from wide to long with the pivot_longer function. It will take each column’s hate-crime type to combine them all into one column called “victim_cat”.

hatelong <- hatecrimes2 |>
  pivot_longer(
    cols = 3:12, 
    names_to = "victim_cat",
    values_to = "crimecount")

Now use the long format to create a facet plot

hatecrimeplot <-hatelong |>
  ggplot(aes(year, crimecount))+
  geom_point()+
  aes(color = victim_cat)+
  facet_wrap(~victim_cat)
hatecrimeplot

Look deeper into crimes against blacks, gays males, and jews

From facet_wrap plot above, anti_black, anti-gay males, and anti_jewish categoroes seem to have highest rates of offences reported. Filter out just for those 3 crimes.

hatenew <- hatelong |>
  filter( victim_cat %in% c("anti-black", "anti-jewish", "anti-gaymale"))|>
  group_by(year, county) |>
  arrange(desc(crimecount))
hatenew
# A tibble: 1,269 × 4
# Groups:   year, county [277]
   county   year victim_cat  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
# ℹ 1,259 more rows

Plot these three types of hate crimes together

Use the following commands to finalize your barplot: - position = “dodge” makes side-by-side bars, rather than stacked bars - stat = “identify” 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 the 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 five 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 the total sums of total incidents by counties in descending order.

counties <- hatenew |>
  group_by(year, county)|>
  summarize(sum = sum(crimecount))|>
  arrange(desc(sum))
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.
counties
# 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

Top 5

To list the five counties with the highest total incidents, change group_by to: group_by(county), then use slice_max(order_by=sum. n=5) to list the five counties with the highest total incident

counties2 <- hatenew |>
  group_by(county)|>
  summarize(sum = sum(crimecount)) |>
  slice_max(order_by = sum, n=5)
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

Finally, create the barplot above, but only for the five 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, amd 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 populatins densities?

Bring in census data for populations of New York counties. These are estimates from the 2010 census

setwd("/Users/oworenibanseyo/Desktop/Data 110 2025/Datasets")
nypop <- read_csv("newyorkpopulation.csv")
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 country name to match the data set

Renames 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 × 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 Nypolong12 variable, county, so that it matches the counties12 variable by cutting off the “New York” portion of the count listing

nypoplong12 <- nypoplong |>
  filter(year == 2012) |>
  arrange(desc(population)) |>
  head(10)
nypoplong12$county<-gsub(" , New York","",nypoplong12$county)
nypoplong12
# 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 counties with the highest populations were also listed in the counties with the highest number of hate crimes. Only the Bronx, which has the fifth highest population, is not on 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 Queens 235

Filter hate crimes just for 2012 as well

counties12 <- counties |>
  filter(year == 2012) |>
  arrange(desc(sum))
counties12
# 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

Join the Hate Crimes data with NY population data for 2012

datajoin <- counties12 |>
  full_join(nypoplong12, by=c("county", "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

Calculate 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 × 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 the highest rates of hate crimes.

Follow up

Aggregating some of the categories

aggregategroups <- hatecrimes |>
  pivot_longer(
    cols = 4:44,
    names_to = "victim_cat",
    values_to = "crimecount"
  )
unique(aggregategroups$victim_cat)
 [1] "anti-male"                               
 [2] "anti-female"                             
 [3] "anti-transgender"                        
 [4] "anti-genderidentityexpression"           
 [5] "anti-age*"                               
 [6] "anti-white"                              
 [7] "anti-black"                              
 [8] "anti-americanindian/alaskannative"       
 [9] "anti-asian"                              
[10] "anti-nativehawaiian/pacificislander"     
[11] "anti-multi-racialgroups"                 
[12] "anti-otherrace"                          
[13] "anti-jewish"                             
[14] "anti-catholic"                           
[15] "anti-protestant"                         
[16] "anti-islamic(muslim)"                    
[17] "anti-multi-religiousgroups"              
[18] "anti-atheism/agnosticism"                
[19] "anti-religiouspracticegenerally"         
[20] "anti-otherreligion"                      
[21] "anti-buddhist"                           
[22] "anti-easternorthodox(greek,russian,etc.)"
[23] "anti-hindu"                              
[24] "anti-jehovahswitness"                    
[25] "anti-mormon"                             
[26] "anti-otherchristian"                     
[27] "anti-sikh"                               
[28] "anti-hispanic"                           
[29] "anti-arab"                               
[30] "anti-otherethnicity/nationalorigin"      
[31] "anti-non-hispanic*"                      
[32] "anti-gaymale"                            
[33] "anti-gayfemale"                          
[34] "anti-gay(maleandfemale)"                 
[35] "anti-heterosexual"                       
[36] "anti-bisexual"                           
[37] "anti-physicaldisability"                 
[38] "anti-mentaldisability"                   
[39] "totalincidents"                          
[40] "totalvictims"                            
[41] "totaloffenders"                          
aggregategroups <- aggregategroups |>
  mutate(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"))
aggregategroups
# 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

Or create subset with just lgbtq

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"))
lgbtq
# A tibble: 1,692 × 5
   county    year crimetype              victim_cat       crimecount
   <chr>    <dbl> <chr>                  <chr>                 <dbl>
 1 Albany    2016 Crimes Against Persons anti-transgender          0
 2 Albany    2016 Crimes Against Persons anti-gaymale              1
 3 Albany    2016 Crimes Against Persons anti-gayfemale            0
 4 Albany    2016 Crimes Against Persons anti-bisexual             0
 5 Albany    2016 Property Crimes        anti-transgender          0
 6 Albany    2016 Property Crimes        anti-gaymale              0
 7 Albany    2016 Property Crimes        anti-gayfemale            0
 8 Albany    2016 Property Crimes        anti-bisexual             0
 9 Allegany  2016 Property Crimes        anti-transgender          0
10 Allegany  2016 Property Crimes        anti-gaymale              0
# ℹ 1,682 more rows

So what does this all mean?

Important findings:

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

  2. The Bronx appears to have much lower-than-expected invictim-catentes of hate crimes relative to its population density in comparison to tother NY counties.

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

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

A short Essay on the given datasets

As mentioned in class, data set cleaning plays a significant role in the data science field. Since most data sets are already biased, unclean datasets can distort the meaning being communicated. To better understand the data set, I read the ProPublica article and examined the country chart by Ken Schwencke and Hannah Fresques for additional insight. The chart reinforces the idea that the data is heavily biased, making it remarkable that any data is collected. I have explored other methods for improved collection but have yet to find success. Even in surveys, we don’t always report accurately. We have, however, misused our collection methods, as we know that AI systems have inadvertently become biased based on historical trends and social media behavior.

Hate: I believe there is an issue with contemporary humans who are drawn to hate, fueling a fire that burns with an invisible flame.It inflicts harm, but data cannot be ethically collected to monitor it. Algorithms on the various social media platforms we use today tend to recommend the latest conflicts, celebrity deaths, or drama, as well as the details of Taylor Swift’s fuel consumption, rather than promote videos that spread love, joy, and the importance of the information age. Not because they aim to harm us, but because these algorithms are designed to keep users engaged, and after enough usage, data collection and updates reveal that we are more likely to keep watching negative videos or Twitter posts. Today, you would find a considerable amount of these patterns of hate turned into jokes and stigmas. Definition of hate crime: A potential solution would be to establish a system that records incidents. One of the questions posed is whether the datasets would improve if there were a universally accepted standard for this type of data collection. In this case, to gather this data, we must reach a universal agreement on what constitutes hate crimes. Despite our global connectivity, we have not achieved this; instead, we gain deeper insight into the divide. A significant capitalist bias: As long as money is involved, individuals will employ hate speech or similar rhetoric to gain engagement and revenue. This flawed data, which reflects this trend, fails to acknowledge that this type of hate crime was employed for monetary gain rather than out of genuine animosity toward a specific group.

Not part of essay: In this field, data collection is going to be dangerously flawed; these insights might be biased due to personal experiences. Note that I have never suffered a hate crime at the hands of a cop or any law enforcement officer, nor have I been arrested; however, such is not the case for some. Can we count on cops to give any reliable data at all? For one, police are among those departments that have devised and work solely within internal groups with similar beliefs. Within the group, you will find those who seek to “make America great again.” There are those who see nothing wrong with the atrocious things that were once done and are being referred to as “great.” In my opinion, there is no unbiased groups capable of collecting truthful or proper data; even within the FBI, groups with similar ideals exist. At a basic level, I realize these organizations function not because of an unconscious just system that they follow; they must be collective groups, and nothing holds collective groups together better than shared ideas and beliefs. Are we to believe the groups that existed in these government agencies that fueled these hate crimes not too long ago are completely gone just because we have new policies in place?