{"cells":[{"metadata":{"_uuid":"051d70d956493feee0c6d64651c6a088724dca2a","_execution_state":"idle","trusted":true},"cell_type":"code","source":"library(dplyr)\nlibrary(ggplot2)\nlibrary(ggthemes)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Load in data and have a look at what we are working with"},{"metadata":{"trusted":true},"cell_type":"code","source":"injury_record <- data.table::fread(\"../input/nfl-playing-surface-analytics/InjuryRecord.csv\", stringsAsFactors = F)\nplayer_tracking <- data.table::fread(\"../input/nfl-playing-surface-analytics/PlayerTrackData.csv\", stringsAsFactors = F)\nplay_list <- data.table::fread(\"../input/nfl-playing-surface-analytics/PlayList.csv\", stringsAsFactors = F)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"injury_record %>% head\ndim(injury_record)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"play_list %>% head()\ndim(play_list)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"player_tracking %>% head()\ndim(player_tracking)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Lets have a quick look at a random play"},{"metadata":{"trusted":true},"cell_type":"code","source":"id1 = player_tracking %>% filter(PlayKey == \"39873-4-32\")\nunique(id1$event)\nid1  %>% filter(event != '')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Lets have a more indepth look at these events.."},{"metadata":{"trusted":true},"cell_type":"code","source":"hist_dat <- player_tracking %>% filter(event !='')\nevents_table <- table(hist_dat %>% pull(event))\nevents_table","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"A plot of some of the most common events and their occurrence distribution"},{"metadata":{"trusted":true},"cell_type":"code","source":"common_events <- events_table[events_table > 100000]\n\ntouchdown_times <- hist_dat %>% filter(event %in% names(common_events)) %>% filter(time < 40)\nggplot(touchdown_times,aes(x=time)) + geom_histogram(binwidth=0.5) + theme_economist(base_family=\"Verdana\")+facet_wrap(~event, scales = \"free\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Apparently some of these plays last a long time, even with my limited American football knowledge that seems strange. Lets have a look at the events in these long plays.."},{"metadata":{"trusted":true},"cell_type":"code","source":"long_plays <- hist_dat  %>% filter(time > 100)\ntable(long_plays$event)\nlength(unique(long_plays$PlayKey))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Huddles starting after 100s into a play? (maybe just speaks to my lack of knowledge)\n\nPenalty flags in 182 out of 358 in these long rounds, so maybe it's linked to penalties and possibly injuries as well"},{"metadata":{},"cell_type":"markdown","source":"Now I think this extremely detailed player data is interesting, and there seems to be endless possiblities in extracting features from this detailed individual player movement and behavior data. For starters I'll just have a look at the ball passings. \n\nI haven't tried to relate this to the response yet."},{"metadata":{"trusted":true},"cell_type":"code","source":"passing_data <- player_tracking %>% filter(event %in% c(\"pass_forward\",\"pass_arrived\"))\n\npassing_data %>% head() %>% arrange(PlayKey,time)\nfailed_passes <- passing_data %>% group_by(PlayKey) %>% summarise(count = length(PlayKey))  %>% filter(count == 1)\n\npasses <- passing_data %>% filter(!(PlayKey %in% failed_passes$PlayKey))\nprint(dim(failed_passes)[1]+dim(passes)[1] == dim(passing_data)[1])\n\npasses$pass_time_lagged <- lag(passes$time,1)\npasses$pass_x_lagged <- lag(passes$x,1)\npasses$pass_y_lagged <- lag(passes$y,1)\npasses <- passes  %>%\n    mutate(pass_time_in_air = ifelse(event == \"pass_arrived\", time - pass_time_lagged,NA),\n           pass_x_flown = ifelse(event == \"pass_arrived\", x - pass_x_lagged,NA),\n           pass_y_flown = ifelse(event == \"pass_arrived\", y - pass_y_lagged,NA))\n\nhead(passes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"passes_arrived <-passes %>% filter(event == \"pass_arrived\")\n\nggplot(passes_arrived,aes(x=pass_time_in_air)) + geom_histogram(binwidth=0.1) + theme_economist(base_family=\"Verdana\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"distance_func = function(dx,dy){\n    sqrt((dx)^2 + (dy)^2)\n}\n\npasses_arrived <- passes_arrived %>% mutate(distance_flown_yards = distance_func(pass_x_flown,pass_y_flown))\npasses_arrived %>% head()\nggplot(passes_arrived,aes(x=distance_flown_yards)) + geom_histogram(binwidth=1) + theme_economist(base_family=\"Verdana\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"passes_arrived <- passes_arrived  %>% mutate(pass_speed_yards_per_sec = distance_flown_yards/pass_time_in_air)\nggplot(passes_arrived,aes(x=pass_speed_yards_per_sec)) + geom_histogram(binwidth=0.1) + theme_economist(base_family=\"Verdana\")","execution_count":null,"outputs":[]}],"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}