{"cells":[{"metadata":{"_uuid":"849d11603dd467b7271c62458d877395de6097bb"},"cell_type":"markdown","source":"# Analysis Question\n\nThe health and safety of amateur and professional football players has become a hot area of research over the last decade. One major issue of note is the large number of concussions that occur each NFL season and the potential long-term consequences of recurring concussions for football players. This research had resulted in recent rule changes in kickoff plays that may reduce the incidence of concussions; the goal of this analysis is to identify comparable rule changes for punt return plays that will reduce future concussion incidence using provided data from the 2016 and 2017 NFL seasons.\n\n# Watching the concussion videos\n\nSince there are relatively few events in this data, it is a rare case where it is worth exploring each concussion individually. I've spared the reader from a long summary of this process, but there a couple of important notes worth making:\n\n1. Many of the plays involved breaking rules that are already in place, including illegal blocks and\n2. Tackling with the helmet first is common among the plays where tacklers became injured\n3. The returner \"putting their head down\" can result in injury\n4. Some concussions involved blocking from behind\n5. Many of the returns were not very fruitful, many resulting in gains of only a few yards.\n\nWe will keep these common themes in mind as we move to exploratory data analysis.\n\n# Exploratory Data Analysis\n\n## Important Note\n\nThe philosophy of this analysis is to explore correlations between concussions and variables that have at least some potential to be *manipulable*. This is important, since our end goal is to propose rule changes to reduce concussion incidence. Thus, whether concussions are more likely to happen in certain stadium types or weather conditions will not be considered, since it would be difficult or impossible to address such discrepancies with rule changes.\n\nWe have been provided a rich array of data to analyze for this problem. We begin by merging several of the non-NGS data files."},{"metadata":{"_uuid":"2a2c080dfdbc2c318b2cc37c6bcfb94baead51b6","_execution_state":"idle","trusted":true},"cell_type":"code","source":"library(tidyverse)\nlibrary(knitr)\nlibrary(ggplot2)\n\n# Load the four primary non-NGS files of interest\nvideo_review <- as_tibble(read.csv(\"../input/video_review.csv\"))\nplay_info <- as_tibble(read.csv(\"../input/play_information.csv\"))\ngame_data <- as_tibble(read.csv(\"../input/game_data.csv\"))\nplayer_roles <- as_tibble(read.csv(\"../input/play_player_role_data.csv\"))\n\n# Merge the files by given ID variables\nnon_NGS_data <- left_join(play_info, video_review, by = c(\"GameKey\", \"PlayID\")) %>%\n                left_join(., game_data, by = \"GameKey\") %>%\n                left_join(., player_roles, by = c(\"GameKey\", \"PlayID\", \"GSISID\"))\n\n# Need to get concatenated roles later","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"06bfd5b47dfb7d968e6d30ee4e6a3720d3ad13b8"},"cell_type":"markdown","source":"## Concussion-specific Data\n\nWe begin exploratory data analysis with the variables that are only available in the file 'video_review.csv'. These variables were specifically derived from the plays in which concussions were known to occur, and thus may be incredibly valuable. Unsurprisingly, all concussions involved a helmet collision, with the exception of one play where the impact type was unclear."},{"metadata":{"trusted":true,"_uuid":"93d57a42269bf0d699217ae5218a946f1781f3b3"},"cell_type":"code","source":"table(video_review$Primary_Impact_Type)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"68a0e513051601c71226cbee39f1f06dc5206faf"},"cell_type":"markdown","source":"It was about evenly likely for a concussion to occur during a blocking encounter vs. a tackling encounter. However, if you consider the large number of blocks that occur on each punt return, it is much more likely for a concussion to occur during a tackle than during a block."},{"metadata":{"trusted":true,"_uuid":"c2fa67e77f23b63b4211222a7ecd759b397a19e9"},"cell_type":"code","source":"table(video_review$Player_Activity_Derived)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"dd93bd36e55eee4d5b0cc11c9ef72ae6e88711d1"},"cell_type":"markdown","source":"None of the concussions were turnover-related and very few were related to friendly fire."},{"metadata":{"_uuid":"4d56767226f4396d22cd53fc6c2e1bb6380c2d8a"},"cell_type":"markdown","source":"In addition, there doesn't seem to be an association between impact type and the player activity during the play."},{"metadata":{"trusted":true,"_uuid":"f8951d11365271c88a204baed4df47441667fe19","_kg_hide-output":false,"_kg_hide-input":false},"cell_type":"code","source":"video_review %>%\n    group_by(Primary_Impact_Type, Player_Activity_Derived) %>%\n    summarise(n = n()) %>%\n    spread(Player_Activity_Derived, n) %>%\n    kable()\n\nfisher.test(video_review$Primary_Impact_Type, video_review$Player_Activity_Derived)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d983a6847a9c24da731e54ec62e2bf66305ccfa0"},"cell_type":"markdown","source":"## What features are associated with plays during which concussions occur (non-NGS data)?\n\nNow we move to the merged dataset. Here, we want to find variables that seem to differ between concussion and non-concussion plays. We develop an indicator variable of whether a play resulted in a concussion and explore distributions of several variables across the groups defined by this indicator.\n\n### Season Type\n\nNone of the identified concussions occurred during the post-season. In addition, concussions were almost twice as likely to occur during a play in the pre-season than during the regular season. However, the difference was not statistically significant (we don't have a lot of statistical power to detect such differences, since we only have 37 events in our data)."},{"metadata":{"trusted":true,"_uuid":"09f2e4e9809f062dea9172d94aaef5c028759320"},"cell_type":"code","source":"# Create indicator variable of whether a concussion occurred on a play\nnon_NGS_data$concussion <- as.numeric(!is.na(non_NGS_data$Turnover_Related))\n\n# Compare season type variable\nt(table(non_NGS_data$concussion, non_NGS_data$Season_Type.y)) /\n    colSums(table(non_NGS_data$concussion, non_NGS_data$Season_Type.y))\n\n# Test whether difference in significant\nfisher.test(table(non_NGS_data$concussion, non_NGS_data$Season_Type.y))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5dcea0b5b9ce98dac073a30ffd6551f72bfcddc4"},"cell_type":"markdown","source":"### Game Time\n\nNow we construct a variable for game time using the Quarter and Game_Clock variables and compare the resulting distribution across our groups of interest."},{"metadata":{"trusted":true,"_uuid":"716f79d57b13998a0dccbe2869476e35cdfa3f67"},"cell_type":"code","source":"clock_string <- strsplit(as.character(non_NGS_data$Game_Clock), \":\")\nnon_NGS_data$Game_Time <- 15 - as.numeric(unlist(lapply(clock_string, '[[', 1))) -\n                          (as.numeric(unlist(lapply(clock_string, '[[', 2))) / 60) +\n                          15*(non_NGS_data$Quarter - 1)\n\n# clean up plot\nggplot(aes(x = Game_Time, fill = concussion), data = non_NGS_data) +\n    geom_density(aes(alpha = 0.3, group = concussion))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8a349412ce95698ae332a0e4e65faa5839a4f2e5"},"cell_type":"markdown","source":"Concussions are slightly more likely to occur in the middle of the game than at the beginning or the end of the game. This is possibly due to returners perceiving returns as time runs out in the first half as more important.\n\n### Yard Line\n\nNow we refine the variable describing the line of scrimmage for each punt play and explore whether punts that resulted in concussions were more likely to come from certain parts of the field."},{"metadata":{"trusted":true,"_uuid":"c5e944238167af03415a041e2395f1cc36d10707"},"cell_type":"code","source":"# Create new yard line variable\nside <- gsub( \" .*$\", \"\", non_NGS_data$YardLine)\n\nstring <- strsplit(as.character(non_NGS_data$YardLine), \" \")\nnon_NGS_data$YardNumber <- \n    as.numeric(unlist(lapply(string, '[[', 2))) +\n    (100 - as.numeric(unlist(lapply(string, '[[', 2))))*(1 - as.numeric(side == non_NGS_data$Poss_Team))\n\n# clean up plot\nggplot(aes(x = YardNumber, fill = concussion), data = non_NGS_data) +\n    geom_density(aes(alpha = 0.3, group = concussion))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"72641d0f4c3bd8145fa4816240e14cc507240c17"},"cell_type":"markdown","source":"Punt plays that resulted in concussions were more likely to start toward the punting teams endzone. This probably corresponds to punt distance, which makes sense since longer punts are typically more returnable. The ones near the opposite endzone were likely data entry or coding errors."},{"metadata":{"_uuid":"5b264b8aa1946f01c84ecac0523dd45bbe038018"},"cell_type":"markdown","source":"## Exploring Text Data\n\nThe text variable 'PlayDescription' contains a lot of potentially valuable information, some of which can be extracted without too much effort."},{"metadata":{"trusted":true,"_uuid":"721c57e7c43015beabc2db86629541278870fe0b"},"cell_type":"code","source":"# Create indicator of penalty\nnon_NGS_data$Penalty <- grepl(\"penalty\", tolower(non_NGS_data$PlayDescription))\ntable(non_NGS_data$concussion, non_NGS_data$Penalty) /\n    rowSums(table(non_NGS_data$concussion, non_NGS_data$Penalty))\nchisq.test(table(non_NGS_data$concussion, non_NGS_data$Penalty))\n\n# illegal blocks\nnon_NGS_data$IllegalBlock <- (grepl(\"illegal block\", tolower(non_NGS_data$PlayDescription)) +\n                             grepl(\"illegal blindside block\", tolower(non_NGS_data$PlayDescription)) > 0)\ntable(non_NGS_data$concussion, non_NGS_data$IllegalBlock) /\n    rowSums(table(non_NGS_data$concussion, non_NGS_data$IllegalBlock))\nfisher.test(table(non_NGS_data$concussion, non_NGS_data$IllegalBlock))\n\n# interference with opportunity to catch\nnon_NGS_data$Interference <- grepl(\"interference with opportunity to catch\",\n                                   tolower(non_NGS_data$PlayDescription))\ntable(non_NGS_data$concussion, non_NGS_data$Interference) /\n    rowSums(table(non_NGS_data$concussion, non_NGS_data$Interference))\nfisher.test(table(non_NGS_data$concussion, non_NGS_data$Interference))\n\n# fair catch\nnon_NGS_data$FairCatch <- grepl(\"fair catch\",\n                                   tolower(non_NGS_data$PlayDescription))\ntable(non_NGS_data$concussion, non_NGS_data$FairCatch) /\n    rowSums(table(non_NGS_data$concussion, non_NGS_data$FairCatch))\nfisher.test(table(non_NGS_data$concussion, non_NGS_data$FairCatch))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d101948d02ed83cc65843dbb8407bdbe2f0372b2"},"cell_type":"markdown","source":"There are several associations encompassing major results here:\n\n#### 1. Concussion plays were almost twice as likely to have a penalty of some kind\n#### 2. Concussion plays were three times as likely to have an illegal blocking penalty and despite low numbers, the difference was statistically significant at an alpha = 0.05 threshold\n#### 3. Interference with opportunity to catch was over ten times as likely to occur on concussion plays, but only occurred on one concussion play so must be taken with a grain of salt (however, in viewing footage it seems that some plays were very close to interference or missed calls)\n#### 4. Fair catches were 5 times less likely on concussion plays; the difference was very statistically significant.\n\nWe can also see some interesting patterns when using text data to look at the play formations used on punt plays."},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"fff4ee5b03b57507c00171ccad39eec30b6aedfa"},"cell_type":"code","source":"# Create play formation variable\nplayer_roles_sorted <- player_roles[order(player_roles$GameKey, player_roles$PlayID, player_roles$Role), ]\nplayer_roles_sorted <- player_roles_sorted %>%\n    group_by(GameKey, PlayID) %>%\n    summarise(Formation = toString(Role)) %>%\n    ungroup()\n\nformation_data <- left_join(non_NGS_data, player_roles_sorted,\n                            by = c(\"GameKey\", \"PlayID\"))\n\ncounts <- formation_data %>%\n    group_by(concussion) %>%\n    count(Formation)\n\ncounts <- formation_data %>%\n    group_by(concussion, Formation) %>%\n    summarise (n = n()) %>%\n    mutate(freq = n / sum(n))\n\ncounts2 <- formation_data %>%\n    group_by(Formation, concussion) %>%\n    summarise (n = n()) %>%\n    mutate(freq = n / sum(n))\n\nhead(counts2)\n\ncounts_non_concussion <- counts[counts$concussion == 0, ]\ncounts_concussion <- counts[counts$concussion == 1, ]\n#counts_non_concussion[order(-counts_non_concussion$n), ]\ncounts_concussion[order(-counts_concussion$n), ][1:6,]\n\ncounts_non_concussion[counts_non_concussion$Formation %in%\n                      counts_concussion[order(-counts_concussion$n), ][1:6,]$Formation, ]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e0a45ae27cbed3bfabe1c8a4a24a6e4167877a0d"},"cell_type":"markdown","source":"We print the 6 formations that were most common in the concussion data (i.e. excluding formations where only one concussion occurred) and compare to how often they were used in non-concussion plays. We can see that the first formation in the first table accounts for 8 percent of concussion plays but less than 4 percent overall (combining concussion and non-concussion numbers). Likewise, the second formation in the table resulted in 8 percent of concussion plays but only 1 percent overall! In addition, the final formation in the first table accounted for 5 percent of concussion plays but only 0.5 percent overall. Though numbers are two small to rule out random associations, these difference are large enough for these formations to be considered carefully."},{"metadata":{"_uuid":"57f126f438720a29245349f89aef40fda77c3ecd"},"cell_type":"markdown","source":"## NGS Data\n\nFinally, we take a look at the NGS data. It seems fairly clear that concussions on tacklers and returners are due to helmet impact, probably at high speeds. But the mechanism being concussions during blocks is worth exploring further:"},{"metadata":{"trusted":true,"_uuid":"4b49c68ea9c16bb567293b9a5ce02632f4433d05"},"cell_type":"code","source":"# Read in NGS data\nNGS1 <- as_tibble(read.csv(\"../input/NGS-2016-pre.csv\"))\nNGS2 <- as_tibble(read.csv(\"../input/NGS-2016-reg-wk1-6.csv\"))\nNGS3 <- as_tibble(read.csv(\"../input/NGS-2016-reg-wk7-12.csv\"))\nNGS4 <- as_tibble(read.csv(\"../input/NGS-2016-reg-wk13-17.csv\"))\nNGS5 <- as_tibble(read.csv(\"../input/NGS-2016-post.csv\"))\nNGS6 <- as_tibble(read.csv(\"../input/NGS-2017-pre.csv\"))\nNGS7 <- as_tibble(read.csv(\"../input/NGS-2017-reg-wk1-6.csv\"))\nNGS8 <- as_tibble(read.csv(\"../input/NGS-2017-reg-wk7-12.csv\"))\nNGS9 <- as_tibble(read.csv(\"../input/NGS-2017-reg-wk13-17.csv\"))\nNGS10 <- as_tibble(read.csv(\"../input/NGS-2017-post.csv\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ba52b87a09f75a21ea744e9710366f33ccaaecaa","_kg_hide-input":true},"cell_type":"code","source":"# vector to hold angle of block for each blocking concussion\nangle <- c()\n\n# very inefficient code, but only 15 plays of interest\n# plays with only one blocker or friendly fire were excluded\n\nplayer1 <- NGS1 %>%\n    filter(GameKey == 21, PlayID == 2587, GSISID == 29343)\nplayer2 <- NGS1 %>%\n    filter(GameKey == 21, PlayID == 2587, GSISID == 31059)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[1] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS1 %>%\n    filter(GameKey == 54, PlayID == 1045, GSISID == 32444)\nplayer2 <- NGS1 %>%\n    filter(GameKey == 54, PlayID == 1045, GSISID == 31756)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[2] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS1 %>%\n    filter(GameKey == 60, PlayID == 905, GSISID == 30786)\nplayer2 <- NGS1 %>%\n    filter(GameKey == 60, PlayID == 905, GSISID == 29815)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[3] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS2 %>%\n    filter(GameKey == 144, PlayID == 2342, GSISID == 32410)\nplayer2 <- NGS2 %>%\n    filter(GameKey == 144, PlayID == 2342, GSISID == 23259)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[4] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS2 %>%\n    filter(GameKey == 149, PlayID == 3663, GSISID == 28128)\nplayer2 <- NGS2 %>%\n    filter(GameKey == 149, PlayID == 3663, GSISID == 29629)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[5] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS3 %>%\n    filter(GameKey == 231, PlayID == 1976, GSISID == 32214)\nplayer2 <- NGS3 %>%\n    filter(GameKey == 231, PlayID == 1976, GSISID == 32807)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[6] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS4 %>%\n    filter(GameKey == 280, PlayID == 2918, GSISID == 32120)\nplayer2 <- NGS4 %>%\n    filter(GameKey == 280, PlayID == 2918, GSISID == 32725)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[7] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS4 %>%\n    filter(GameKey == 289, PlayID == 2341, GSISID == 32007)\nplayer2 <- NGS4 %>%\n    filter(GameKey == 289, PlayID == 2341, GSISID == 32998)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[8] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS6 %>%\n    filter(GameKey == 364, PlayID == 2489, GSISID == 31313)\nplayer2 <- NGS6 %>%\n    filter(GameKey == 364, PlayID == 2489, GSISID == 32851)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[9] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS6 %>%\n    filter(GameKey == 364, PlayID == 2764, GSISID == 32323)\nplayer2 <- NGS6 %>%\n    filter(GameKey == 364, PlayID == 2764, GSISID == 31930)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[10] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS6 %>%\n    filter(GameKey == 392, PlayID == 1088, GSISID == 32615)\nplayer2 <- NGS6 %>%\n    filter(GameKey == 392, PlayID == 1088, GSISID == 31999)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[11] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS7 %>%\n    filter(GameKey == 448, PlayID == 2792, GSISID == 33838)\nplayer2 <- NGS7 %>%\n    filter(GameKey == 448, PlayID == 2792, GSISID == 31317)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[12] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS8 %>%\n    filter(GameKey == 553, PlayID == 1683, GSISID == 32820)\nplayer2 <- NGS8 %>%\n    filter(GameKey == 553, PlayID == 1683, GSISID == 25503)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[13] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS8 %>%\n    filter(GameKey == 567, PlayID == 1407, GSISID == 32403)\nplayer2 <- NGS8 %>%\n    filter(GameKey == 567, PlayID == 1407, GSISID == 32891)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[14] <- players[order(players$distance),][1, ]$DirectionDifference\n\nplayer1 <- NGS9 %>%\n    filter(GameKey == 607, PlayID == 978, GSISID == 29793)\nplayer2 <- NGS9 %>%\n    filter(GameKey == 607, PlayID == 978, GSISID == 32114)\nplayers <- left_join(player1, player2, by = \"Time\")\nplayers$distance <- abs(players$x.x - players$x.y) + abs(players$y.x - players$y.y)\nplayers$DirectionDifference <- abs(players$dir.x - players$dir.y)\nangle[15] <- players[order(players$distance),][1, ]$DirectionDifference\n\nprint(angle)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a268afd551e269860613c07adb51f89825d32821"},"cell_type":"markdown","source":"In the above code (unhide if you want to read) I find the point of impact on each blocking concussion by minimizing the distance in space between the players, and then calculate the difference in the direction the two players are facing as the \"angle\" variable. Thus, values at or near 180 degrees are a \"textbook\" block where the players are facing opposite directions, whereas values near 0 or 360 would mean that the players are facing the same direction, which would be a potential \"block in the back\" or otherwise improper or unconventional block.\n\nWe can see from the results that many of the blocking concussion plays had blocks with angles close to 0 or 360 degrees. This indicates that either some blocks in the back penalties were not called, or that the rule for block in the back (which involves whether the blocker has hands on the back of the person being blocked) may need to be broadened in order to protect players (at least on punt plays). Only 3 of the 15 plays, 20%, were in the range I would have expected for a block, between 90 to 270 degrees."},{"metadata":{"_uuid":"b1f6551a372e7f418c15198cfe5c004f665e55c9"},"cell_type":"markdown","source":"# A Note on Modeling"},{"metadata":{"_uuid":"6e32f14e8229744c6728123c7b34500ce71831d5"},"cell_type":"markdown","source":"I made several attempts to fit a model for this data, but was not able to produce a model that was satisfactory to present. The statistical reasoning for this can be connected to the overall goal of this challenge: To propose rule changes to reduce concussion incidence *while maintaining the integrity of the game*.\n\nBecause the event of interest was so rare in the data (37 identified concussion events out of thousands of punt plays), it is extremely easy to overfit a model. In addition, many models that predicted concussion well also predicted many false positives (i.e. predicted a concussion on data from a non-concussion play). I expect many or most of the submitted kernels will have models with at least one of these issues. \n\nThus drawing conclusions from these models can be extremely misleading, and may also explicitly fail to achieve the secondary goal of preserving the integrity of the game, since potentially many more plays that would never have resulted in concussions will be affected by potential rule changes than plays that would have resulted in concussions. For some analyses this is fine, such as detection of diseases when false positives can be disregarded with further testing. However, for the specific goals of this analysis, I didn't think treating false positives as trivial met the stated goals of the challenge.\n\nI ultimately decided it was better to propose changes derived from the marginal variable comparisons presented in my exploratory data analysis and combining that knowledge intuition derived from watching the videos themselves and drawing logical conclusions."},{"metadata":{"_uuid":"0477016977ec9852988839dc553851f564fa2a7c"},"cell_type":"markdown","source":"# Proposed Rule Changes\n\n## 1: Fair catch incentivization\n\nIt's no surprise that the easiest way to decrease the total number of concussions that occur on punt returns is to reduce the number of punts returned by increasing utilization of the fair catch. My proposal for this is:\n\n### New rule: A fair catch will result in a gain of two yards to the return team from the spot of the catch\n\nRationale: Most punt returns (and many of the returns on which a concussion occurred) result in only a gain of a few yards. It seems that often, returners see an opportunity to catch and run forward a few yards, which can feel important in close games. By giving the return team a small gain for a fair catch (somewhere between 1 and 4 yards would probably be ideal), we can eliminate the unexciting and dangerous punt returns that don't really affect the game while still preserving returns where the returner sees opportunity for a large gain. This is similar in spirit to when the NFL moved the touchback placement from the 20 to 25 yard line, but unlike that rule, doesn't introduce an incentive for shorter punts/kicks.\n\n## 2. Harsher penalties for illegal blocks on punts\n\nWe saw during analysis that many of the blocking plays had illegal blocking penalties (and some seemed to have uncalled illegal blocks). These penalties' existence may have already been preventing concussions for years. However, the rules in place don't seem to be working to a strong enough extent, so I propose to make these penalties harsher:\n\n### Change rules: Increase penalty yards for illegal blocks on punt plays by 5 yards\n\n## 3. Broaden \"Block in the Back\" rule\n\nAs we saw earlier, when players were injured when being blocked, the direction they were facing during the block was similar to the direction the blocker was facing. It isn't clear whether certain block in the back penalties were missed on these plays.\n\n### Change rule to clarify wording to ensure that blocks where the blocker is facing a similar direction as the person blocked is included as a block in the back, even if pushed with hands on their side\n\n## 4. \"Interference with Opportunity to Catch\" should be treated as potential targeting\n\nAlthough this penalty was only called on 1 of the punt concussion plays (still a much higher rate than non-concussion plays), it seemed clear that a few other plays were very close to this interference, maybe even a couple were missed penalties. This interference action puts the returner at extreme risk and should be much more harshly penalized.\n\n### New rule: \"Interference with Opportunity to Catch\" is reviewed and can be given a designation similar to targeting, resulting in ejection of the tackler from the game. In addition penalty yards should be increased for this action\n\n## 5. Consider disallowing formations that result in higher probability of concussion\n\nI don't have enough domain knowledge to understand the formations described earlier, but the analysis did identify some formations which resulted in higher probability of concussion. While the numbers are low enough to take with a grain of salt, some of these formations should receive consideration for no longer being legal."}],"metadata":{"kernelspec":{"display_name":"R","language":"R","name":"ir"},"language_info":{"mimetype":"text/x-r-source","name":"R","pygments_lexer":"r","version":"3.4.2","file_extension":".r","codemirror_mode":"r"}},"nbformat":4,"nbformat_minor":1}