library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(raster)
## Warning: package 'raster' was built under R version 4.3.3
## Loading required package: sp
## Warning: package 'sp' was built under R version 4.3.3
## 
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
## 
##     select
library(maps)
## Warning: package 'maps' was built under R version 4.3.3
library(usmap)
## Warning: package 'usmap' was built under R version 4.3.3
library("sf")
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
law_url <- "https://raw.githubusercontent.com/sphill12/Data608/refs/heads/main/strictest-gun-laws-by-state-2024.csv"
death_url <- "https://raw.githubusercontent.com/sphill12/Data608/refs/heads/main/data-table.csv"

law_df <- read.csv(law_url)
death_df <- read.csv(death_url)
## Filter for 2022 on deaths
death_df <- death_df %>% filter(YEAR ==2022)

## Remove District of Columbia as we don't have information on the laws
death_df <-death_df %>% filter(STATE != "District of Columbia")
## Remove + and - from the gifford grade
law_df$GunLawsGiffordGrade <- gsub("[+-]", "", law_df$GunLawsGiffordGrade)

## Add a likert scale type rating for the grades
law_df <- law_df %>% 
  mutate(law_strictness = case_when(
    GunLawsGiffordGrade == "A" ~ "Very Strict",
    GunLawsGiffordGrade == "B" ~ "Somewhat Strict",
    GunLawsGiffordGrade == "C" ~ "Average",
    GunLawsGiffordGrade == "D" ~ "Somewhat Lax",
    GunLawsGiffordGrade == "F" ~ "Very Lax"
  ))
law_df <- law_df %>%
  mutate(numeric_grade = case_when(
    GunLawsGiffordGrade == "A" ~ 5,
    GunLawsGiffordGrade == "B" ~ 4,
    GunLawsGiffordGrade == "C" ~ 3,
    GunLawsGiffordGrade == "D" ~ 2,
    GunLawsGiffordGrade == "F" ~ 1
  ))
law_df <- law_df %>% mutate(ranking_group = ntile(GunLawsStrengthRank, 5
))
## Remove unwanted columns
law_df <- law_df %>% dplyr::select(-c(GunLawsGunDeathRateRank,GunLawsStrengthRank))
death_df <- death_df %>% dplyr::select(-c(URL, YEAR))
## Make all column names lowercase:

names(law_df) <- tolower(names(law_df))
names(death_df) <- tolower(names(death_df))
state_mapping <- setNames(state.abb,state.name)
law_df <- law_df%>% mutate(state_abbr = state_mapping[trimws(state)])
names(death_df) <- c("state_abbr", "death_per_100k","total_deaths")
data <- inner_join(law_df, death_df,by= "state_abbr")
data <- data %>% dplyr::select(-c(gunlawsgundeathrateper100k))
data$numeric_grade <- as.factor(data$numeric_grade)
data$ranking_group <- as.factor(data$ranking_group)

data <- data %>%
      mutate(final_grouping = case_when(
        ranking_group == 1 ~ 5,
        ranking_group == 2 ~ 4,
        ranking_group == 3 ~ 3,
        ranking_group == 4 ~ 2, 
        ranking_group == 5 ~ 1
      ))

data <- data %>%
  mutate(final_likert = case_when(
    final_grouping == 5 ~ "Very Strict (5)",
    final_grouping == 4 ~ "Somewhat Strict (4)",
    final_grouping == 3 ~ "Average (3)",
    final_grouping == 2 ~ "Somewhat Lax (2)",
    final_grouping == 1 ~ "Very Lax (1)"
  ))
data$final_likert <- factor(data$final_likert, levels = c("Very Lax (1)", "Somewhat Lax (2)", "Average (3)", "Somewhat Strict (4)", "Very Strict (5)"))
data$final_grouping <- as.factor(data$final_grouping)
ggplot(data, aes(x = final_likert, y = death_per_100k)) +
  geom_boxplot(outlier.shape = NA) +
  labs(title ="Likert Scale Gun Law Strictness Vs. Gun Deaths Per 100K") +
  labs(x = "Gun Law Strictness", y = "Gun Deaths Per 100k People") +
  theme_minimal()

data <- data %>% mutate(region = tolower(state))
states <- map_data("state")
mapping_df <- merge(states, data, by = "region")
mapping_df <-mapping_df[order(mapping_df$order),]
strictness <- data.frame(region = tolower(state.name), long =  state.center$x, lat=  state.center$y)
strictness <-merge(strictness, data, by = "region")
strictness <-strictness %>% filter(!(region %in% c("alaska", "hawaii")))

unique(mapping_df$group)
##  [1]  1  2  3  4  5  6  7  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## [26] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
## [51] 52 53 54 55 56 57 58 59 60 61 62 63