{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# HAVOC: Quantify, Improve and Evaluate NFL Punt Block & Punt Protection Units\n\n","metadata":{}},{"cell_type":"markdown","source":"Punt Rush HAVOC is a metric that attempts to quantify the pressure applied by the rusher as he tries to block the punt. By considering the rushers' velocity and distance from the punter, we can create a weighted function to represent the rushers' influence - This approach uses a variation of the same player influence techniques that can be found in [*Wide Open Spaces: A statistical technique for measuring\nspace creation in professional soccer*](http://www.lukebornn.com/papers/fernandez_ssac_2018.pdf). More information about HAVOC, and its formula can be found at [Quantifying Punt Rush Ability with HAVOC](https://www.kaggle.com/jdruzzi/quantifying-punt-rush-ability-with-havoc).","metadata":{}},{"cell_type":"markdown","source":"# Unlocking Potential With Expected HAVOC \n\nNow that we can assign a specific value to a rushers' ability to apply pressure - we can then build a model to predict HAVOC generated by the rusher using only pre-snap features. This will help standardize each scenario by considering the situation, scheme, personnel, and other factors by producing a pre-snap **Expected HAVOC** - this will shed light on how well a coaching staff is designing pressure. The actual execution of the pressure can be measured by taking the difference between actual HAVOC and Expected HAVOC, resulting in what will be known as **HAVOC Over Expected** - a measurement of the rushers’ ability to create HAVOC given the scenario the coaching staff put them in.\n\n\n#### Applications for Expected HAVOC & HAVOC Over Expected:\n* **Evaluate Punt Rush & Punt Protection Units** - \nWe can identify teams that can scheme up good pressure on punt plays, as well as those that can protect against it. \n\n* **Evaluate Individual Player Performance** - \nNot only will we be able to evaluate the actual punt rushers, but also individual players in punt protection. By combining HAVOC with my other work on [Estimating Punt Protection Blocking Assignments](https://www.kaggle.com/jdruzzi/estimating-punt-protection-blocking-assignments), we can determine how well each player protected against the rush and rank players at their respective punt protection positions.\n\n* **Optimizing Punt Block Scheme** - \nWe can identify key characteristics and schemes that may help in generating more pressure on a punt rush.\n\n* **Examine Other Outcomes** - \nWe can examine what other effects HAVOC may have on a punt play.","metadata":{}},{"cell_type":"markdown","source":"# HAVOC Example\n\nBelow you will see the highest recorded punt rush HAVOC by any player from 2018-2020, reaching a maximum value of 166.09. The Patriots designed the perfect scheme to allow Matthew Slater to run free through the A-Gap and block the punt. The only thing is, instead of laying out his full body to block the punt, he only stuck out 1 hand - eventually missing the ball only by a couple of inches. A near perfect punt block scheme, and execution - now added to the pile of forgettable punt plays. HAVOC and its ability to recognize situations like this one, and many others, is very valuable.","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \n\n%matplotlib nbagg\nimport matplotlib.pyplot as plt\nimport matplotlib.animation as animation\nimport pandas as pd\nfrom IPython.display import HTML\n\nfrom matplotlib.patches import Polygon\n\nimport pytz\nfrom IPython.display import HTML\nfrom matplotlib import animation, rc\nfrom matplotlib.patches import Rectangle, Arrow, FancyArrow\nfrom matplotlib.patches import Polygon\nimport matplotlib.patheffects as pe\nimport gc\n\n\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\nimport matplotlib._color_data as mcd\nimport matplotlib.patches as mpatch\nimport random\nfrom scipy.spatial import ConvexHull\n\nfrom tqdm import tqdm\nfrom datetime import date\nfrom datetime import datetime\nimport io\nimport time\nimport io\nimport re\n\nfrom shapely.geometry import Point, Polygon, GeometryCollection,MultiPoint\nfrom shapely.validation import make_valid\n\nimport matplotlib as mpl\nmpl.rcParams.update(mpl.rcParamsDefault)\n\npd.options.mode.chained_assignment = None \npd.set_option('display.max_columns', None)\nfrom scipy.spatial import ConvexHull\nimport math\n\nimport warnings \nwarnings.filterwarnings(\"ignore\")\n\nimport numpy as np \nimport pandas as pd\npd.options.mode.chained_assignment = None \npd.set_option('display.max_columns', None)\n\nimport warnings \nwarnings.filterwarnings(\"ignore\")\n\nuse = pd.read_csv('https://github.com/jdruzzi/BDB22/blob/main/Punt%20Rush%20Havoc/Havoc_Slater.csv.gz?raw=true', compression='gzip', low_memory=False)\n\nylim= (-18, 5.5)\nxlim=(-12, 12)\n# fig = plt.figure(figsize=(20,10))\n#ylim=(40,85)\n#xlim=(0,50)\nfig = plt.figure(figsize=(16,10))\nax = plt.axes(xlim=xlim, ylim=ylim)\n\n\n\n# plt.ylim([-3, 22])\n# plt.xlim([-23.3, 23.3])\npoints0, = ax.plot([], [],'.',alpha = .85, markersize =65,color='red')\npoints1, = ax.plot([], [],'.',alpha = .80, markersize =65,color='#2F4F4F')\npoints2, = ax.plot([], [],'.',alpha = .80, markersize =65,color='#C0C0C0')\npoints3, = ax.plot([], [],'d',alpha = 1, markersize =25,color='brown')\nframe_text = ax.text(16, -5, '', horizontalalignment = 'center', verticalalignment = 'center', c = 'white',fontweight='bold',fontsize='larger')\n\n\na_or_list = []\nname_list = []\nscat_number_list = []\nblock = []\nBlock_Prob_list = []\n\nfor _ in range(len(use['displayName'].drop_duplicates())):\n    a_or_list.append(ax.add_patch(Arrow(0, 0, 0, 0, color = 'k')))\n    block.append(ax.add_patch(Arrow(0, 0, 0, 0, color = 'green')))\n    name_list.append(ax.text(0, 0, '', horizontalalignment = 'center', verticalalignment = 'center', c = 'black',fontweight='bold',fontsize=13,path_effects=[pe.withStroke(linewidth=3, foreground=\"gold\")]))\n    scat_number_list.append(ax.text(0, 0, '', horizontalalignment = 'center', verticalalignment = 'center', c = 'black',fontweight='bold',fontsize=15,path_effects=[pe.withStroke(linewidth=3, foreground=\"white\")]))\n    Block_Prob_list.append(ax.text(0, 0, '', horizontalalignment = 'center', verticalalignment = 'top', c = 'black',fontweight='bold',fontsize=15,path_effects=[pe.withStroke(linewidth=3, foreground=\"gold\")]))\n\n#use = puntview.query(' gameId == 2018123013 & playId == 502 & X_diff < 25 ').reset_index(drop=True)\nplt.axhline(y=0, color='black', linestyle='-',linewidth=6,alpha=.5)\n\n\n\nto_be_deleted = []\n\nplt.axis('off')\n\n\ndef animate(i):\n    time = use['frameId'].unique()[i]\n\n    trim = use.loc[use['frameId'] == time].drop_duplicates()\n\n    rusher_x = trim.loc[(trim['frameId'] == time) & (trim['displayName'] == \"Matthew Slater\")]['LOS_X_diff']\n    rusher_y = trim.loc[(trim['frameId'] == time) & (trim['displayName'] == \"Matthew Slater\")]['LOS_Y_diff']\n\n    home_x = trim.loc[(trim['frameId'] == time) & (trim['punt_team'] == \"Returning_Team\") & (trim['displayName'] != \"Matthew Slater\")]['LOS_X_diff']\n    home_y = trim.loc[(trim['frameId'] == time) & (trim['punt_team'] == \"Returning_Team\") & (trim['displayName'] != \"Matthew Slater\")]['LOS_Y_diff']\n\n    away_x = trim.loc[(use['frameId'] == time) & (trim['punt_team'] == \"Punting_Team\")]['LOS_X_diff']\n    away_y = trim.loc[(use['frameId'] == time) & (trim['punt_team'] == \"Punting_Team\")]['LOS_Y_diff']\n    \n    ball_x = trim.loc[(trim['frameId'] == time) & (trim['displayName'] == \"football\")]['LOS_X_diff']\n    ball_y = trim.loc[(trim['frameId'] == time) & (trim['displayName'] == \"football\")]['LOS_Y_diff']\n    \n    rusher_coordinate = pd.DataFrame({'x':rusher_x,'y':rusher_y})\n\n    home_player_coordinate = pd.DataFrame({'x':home_x,'y':home_y})\n    \n    away_player_coordinate = pd.DataFrame({'x':away_x,'y':away_y})\n\n    frame_text.set_text('frame ' + str(trim.frameId.iloc[0]) + \" \" + str(trim.event.iloc[0]))\n    \n    points0.set_data((rusher_coordinate['y']),(rusher_coordinate['x']))\n    points1.set_data((home_player_coordinate['y']),(home_player_coordinate['x']))\n    points2.set_data((away_player_coordinate['y']),(away_player_coordinate['x']))\n    points3.set_data((ball_y),(ball_x))\n\n\n    for (index, row) in trim[trim.displayName.notnull()].reset_index().iterrows():\n      if (row.displayName != \"football\") & (row.punt_team == \"Returning_Team\"):\n        scat_number_list[index].set_text(\"\")\n        scat_number_list[index].set_position((row.LOS_Y_diff, row.LOS_X_diff))\n        scat_number_list[index].set_text(row['jerseyNumber'])\n      else:\n        scat_number_list[index].set_text(\"\")\n        pass\n\n\n    for (index, row) in trim[trim.displayName.notnull()].reset_index().iterrows():\n      if row.punt_team == \"Returning_Team\" and row.frameId <= (row.snap_frame + 10) and row.IsRusher == 0:\n        a_or_list[index].remove()\n        a_or_list[index] = ax.add_patch(Arrow(row.LOS_Y_diff, row.LOS_X_diff, (row.LOS_Y_diff_path_diff*-1), (row.LOS_X_diff_path_diff*-1)/2, color = 'black', width = .5))\n\n      elif row.IsRusher == 1 and row.frameId <= (row.snap_frame + 10):\n        a_or_list[index].remove()\n        a_or_list[index] = ax.add_patch(Arrow(row.LOS_Y_diff, row.LOS_X_diff, (row.LOS_Y_diff_path_diff*-1), (row.LOS_X_diff_path_diff*-1)/2, color = 'red', width = .5))\n      else:\n        a_or_list[index].remove()\n        a_or_list[index] = ax.add_patch(ax.add_patch(Arrow(0, 0, 0, 0, color = 'white', width = .001)))\n        pass\n\n    for (index, row) in trim[trim.displayName.notnull()].reset_index().iterrows():\n      if row.punt_team == \"Returning_Team\" and row.frameId <= (row.snap_frame + 10) and row.displayName == \"Matthew Slater\":\n        name_list[index].set_text(row.displayName.split()[-1])\n        name_list[index].set_position((row.LOS_Y_diff, row.LOS_X_diff+1))\n\n      else:\n        name_list[index].set_text(\"\")\n        name_list[index].set_position((row.LOS_Y_diff, row.LOS_X_diff+1))\n        pass\n\n      for (index, row) in trim[trim.displayName.notnull()].reset_index().iterrows():\n        if row.displayName == \"Matthew Slater\":\n          Block_Prob_list[index].set_text(str(round(float(row.influence_blend_cont),2)))\n      #    Block_Prob_list[index].set_text((row['max']*1000)*(row['max']*1000))\n          Block_Prob_list[index].set_position((row.LOS_Y_diff, row.LOS_X_diff+2))\n          ax.plot(row.LOS_Y_diff, row.LOS_X_diff, \"ro-\", markersize=round(float(row.influence_blend_cont),2) /2 )\n\n        else:\n          Block_Prob_list[index].set_text(\"\")\n          Block_Prob_list[index].set_position((row.LOS_Y_diff, row.LOS_X_diff+2))\n          pass\n      \n    return points1,points2,points3,points0\n\n\nanim = animation.FuncAnimation(fig, animate,\n                               frames=len(use['frameId'].unique()))\n\nHTML(anim.to_jshtml())","metadata":{"_kg_hide-input":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<!-- ![](https://github.com/jdruzzi/BDB22/blob/main/Punt%20Rush%20Havoc/Slater_gif.gif?raw=true)\n\nInstead of easily laying out his full body to block the kick, Slater actually used only one hand which narrowly missed the ball. It's worth noting that the Patriots do coach their rushers to use only one hand to minimize the chances of a penalty - just an unlucky outcome to a phenomenal punt block design. -->","metadata":{}},{"cell_type":"markdown","source":"Here's the same play on film.","metadata":{}},{"cell_type":"code","source":"from IPython.display import HTML\nfrom base64 import b64encode\n\ndef play(filename):\n    html = ''\n    video = open(filename,'rb').read()\n    src = 'data:video/mp4;base64,' + b64encode(video).decode()\n    html += '<video width=800 controls autoplay loop><source src=\"%s\" type=\"video/mp4\"></video>' % src \n    return HTML(html)\n\nplay('../input/slaterhavoc2/BDB_FInal2.mp4')","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-01-06T03:44:58.091093Z","iopub.execute_input":"2022-01-06T03:44:58.091384Z","iopub.status.idle":"2022-01-06T03:44:58.975866Z","shell.execute_reply.started":"2022-01-06T03:44:58.091345Z","shell.execute_reply":"2022-01-06T03:44:58.974875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"--------------","metadata":{}},{"cell_type":"markdown","source":"# HAVOC Generated & Earned By Each Team In 2020\n\nHigh-expected pre-snap HAVOC will indicate teams that have put their players in the best positions to block a punt. High HAVOC Over Expected is an indication of players generating more pressure than originally predicted given the pre-snap scenario.","metadata":{}},{"cell_type":"markdown","source":"## Havoc Generated by NFL Punt Rush Units","metadata":{}},{"cell_type":"markdown","source":"<div>\n    <img src=\"https://raw.githubusercontent.com/jdruzzi/BDB22/main/Punt%20Rush%20Havoc/Avg_Team_HAVOC.png\" width=\"3000\" length=\"3000\"/>\n</div>","metadata":{}},{"cell_type":"markdown","source":"**Notes:** The Browns and Chargers stick out as teams that have generally set themselves up for success, however, they lacked the execution. The Lions and Texans were the best in the league in 2020 at scheming up the pressure, and the execution was on par with it. The Panthers and Titans had a solid scheme; however, it was their personnel that performed better than anticipated.","metadata":{}},{"cell_type":"markdown","source":"## Havoc Allowed by NFL Punt Protection Units","metadata":{}},{"cell_type":"markdown","source":"<div>\n    <img src=\"https://raw.githubusercontent.com/jdruzzi/BDB22/main/Punt%20Rush%20Havoc/Punt_Pro_HAVOC.png\" width=\"3000\" length=\"3000\"/>\n</div>","metadata":{}},{"cell_type":"markdown","source":"**Notes:** The Saints punt protection unit might have been the best in the league, giving up the least amount of pressure. The Lions gave up the most pressure on average, and by a pretty wide margin.","metadata":{}},{"cell_type":"markdown","source":"-----------------","metadata":{}},{"cell_type":"markdown","source":"# Evaluating Individual Player Performance - Punt Rush & Punt Protection\n\nNow we can evaluate HAVOC on a more granular level to determine who is helping, as well as hurting NFL special teams units.","metadata":{}},{"cell_type":"markdown","source":"## Punt Rush Players - HAVOC Generated Over Expected\n\nBelow we have the Punt Return Defensive Linemen, Punt Return Linebackers, and Vises that all had at least 10 punt rush attempts from 2018-2020. The best players generated more HAVOC Over Expected, all based on the pre-snap scheme for each play.","metadata":{}},{"cell_type":"markdown","source":"![](https://github.com/jdruzzi/BDB22/blob/main/Punt%20Rush%20Havoc/Top%20Punt%20Rushers.png?raw=true)","metadata":{}},{"cell_type":"markdown","source":"----------------","metadata":{}},{"cell_type":"markdown","source":"## Punt Protection Players - HAVOC Allowed Over Expected\n\nApplying my previous work on [Estimating Punt Protection Blocking Assignments](https://www.kaggle.com/jdruzzi/estimating-punt-protection-blocking-assignments), we can create **HAVOC Allowed Over Expected** to evaluate members in punt protection. The players will get credited the HAVOC Over Expected of their assumed blocking assignment, only if that assignment was deemed as trying the rush the punt per PFF.","metadata":{}},{"cell_type":"markdown","source":"![](https://github.com/jdruzzi/BDB22/blob/main/Punt%20Rush%20Havoc/Avg%20Punt%20Pro%20HAVOC%20OE%202.png?raw=true)","metadata":{}},{"cell_type":"markdown","source":"--------------------","metadata":{}},{"cell_type":"markdown","source":"# How to Improve HAVOC\n\nThere are some steps teams can take to improve HAVOC based on stunt combinations, alignment and personnel. I will only outline the findings in this notebook, but if you want an in-depth extended version please vist:\n\n## [Extended: How to Improve HAVOC & Block Punts 📝](https://www.kaggle.com/jdruzzi/extended-how-to-improve-havoc-block-punts)","metadata":{}},{"cell_type":"markdown","source":"<span style=\"color:black;font-size:20px;font-weight:bold;\"> 1. Utilization of A Combination Rush / Stunt </span>\n\nTeams can gain a significant advantage by utilizing a stunt rush combination, compared to not using a stunt at all. Findings show that 3-man combinations may produce the most HAVOC on average, compared to 2-man and No stunt groups. ","metadata":{}},{"cell_type":"markdown","source":"<span style=\"color:black;font-size:20px;font-weight:bold;\"> 2. Using a 2-Man rush combination of either RPLB1 + LDL1 or LPLB1 + LDL1 </span>\n\nThe #1 stunt group is when the right PLB crashes down through the left A-Gap right behind the LDL1 attempting to block the punt. The #3 top-specific combo is essentially the same thing, except it is the PLB is on the left side with the DL1 - this further confirms that the utilization of both a PLB1 and DL1 will improve HAVOC.\n\nTo maximize the success of this stunt group, I've found that lining up more DL outside the wings and overloading the opposite side of the punt protector, increases HAVOC. Specifically, these are the optimal alignments:\n\n- 4 DL Outside Wings / 3 DL Opposite Punt Protector\n- 4 DL Outside Wings / 4 DL Opposite Punt Protector\n- 5 DL Outside Wings / 4 DL Opposite Punt Protector\n\n![](https://github.com/jdruzzi/BDB22/blob/main/Punt%20Rush%20Havoc/HAVOC%20Improvement%20Images/Top2man.png?raw=true)","metadata":{}},{"cell_type":"markdown","source":"<span style=\"color:black;font-size:20px;font-weight:bold;\"> 3. Using a 3-Man rush combination of LPLB1, RDL1, RDL2 </span>\n\nWith 3-Man groups, the sample sizes drastically decrease, but we do see a significant advantage in HAVOC. The #1 group was only attempted 3 times, yet it produced a maximum HAVOC of 125.418 and a blocked punt. The #2 group was attempted 18 times and contributed to 2 blocked punts and the largest HAVOC recorded.\n\nWhen looking at 2-Man combos and 3-Man combos with at least 5 attempts, LPLB1, RDL1, RDL2 stand out above the rest - it is significantly better than 35 other combination pairings.\n\n![](https://github.com/jdruzzi/BDB22/blob/main/Punt%20Rush%20Havoc/HAVOC%20Improvement%20Images/Top3man.png?raw=true)","metadata":{}},{"cell_type":"markdown","source":"<span style=\"color:black;font-size:20px;font-weight:bold;\"> 4. Prioritizing Speed </span>\n\nFor teams to maximize pressure when running punt rush combos, they need to put some of their fastest players at PLB to rush the punt. During this 2021 season, Dallas has utilized 2 Wide Receivers: Noah Brown, and Malik Turner as Punt Linebackers. They currently lead the NFL with 3 blocked punts.","metadata":{}},{"cell_type":"markdown","source":"<span style=\"color:black;font-size:20px;font-weight:bold;\"> 5. Know Your Opponent - Find Weak Links </span>\n\nThere appears to be a positive correlation when teams lineup more experienced rushers, against an inexperienced player in punt protection.\n\nExpected block probabilities for all players in punt protection are incorporated into the expected HAVOC model, for each rusher. Then we can compare total cumulative special teams’ snap counts at the time of the snap. There are no publicly available snap counts for specific special teams’ positions, only general snaps - so we take these to standardize the snaps, based on position and game week. Multiply the expected block probabilities with the snap counts for all players in punt protection and take the difference from the rushers’ snaps. This is how we can quantify a matchup advantage.","metadata":{}},{"cell_type":"code","source":"from IPython.display import HTML\nfrom base64 import b64encode\nimport pandas as pd\nimport numpy as np\n\ndef play(filename):\n    html = ''\n    video = open(filename,'rb').read()\n    src = 'data:video/mp4;base64,' + b64encode(video).decode()\n    html += '<video width=800 controls autoplay loop><source src=\"%s\" type=\"video/mp4\"></video>' % src \n    return HTML(html)\n\nplay('../input/experience-mismatch/Experience mismatch.mp4')","metadata":{"execution":{"iopub.status.busy":"2022-01-06T03:14:33.670343Z","iopub.execute_input":"2022-01-06T03:14:33.67069Z","iopub.status.idle":"2022-01-06T03:14:35.094984Z","shell.execute_reply.started":"2022-01-06T03:14:33.670603Z","shell.execute_reply":"2022-01-06T03:14:35.093541Z"},"_kg_hide-input":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<span style=\"color:black;font-size:20px;font-weight:bold;\"> 6. Put Pressure on the Long Snapper </span>\n\nThe punt team long snapper is probably one of the most difficult positions in football, you must accurately snap the ball around 15-18 yards, then immediately block a player that comes barreling down your right or left shoulder - or even across your face, or a combination of all those moves. There's a reason why some of the best 2 and 3-Man rush combinations generally used some form of attack on the long snapper, and even just a straight-up bull rush right through the A-gap seems to work.\n\nThere appears to be a positive correlation between putting more pressure on the Long Snapper and increasing HAVOC. ","metadata":{}},{"cell_type":"markdown","source":"-------------","metadata":{}},{"cell_type":"markdown","source":"# Alternative HAVOC & Punt Rush Outcomes","metadata":{}},{"cell_type":"markdown","source":"Here I will outline some of the potential outcomes that bringing additional pressure might lead to, for the extended version please visit the link below:","metadata":{}},{"cell_type":"markdown","source":"### [Extended: Alternate Outcomes WIth Punt Pressure & HAVOC](https://www.kaggle.com/jdruzzi/alternate-outcomes-with-punt-pressure-havoc)","metadata":{}},{"cell_type":"markdown","source":"![](https://github.com/jdruzzi/BDB22/blob/main/Punt%20Rush%20Havoc/Other%20HAVOC%20Outcomes%202.png?raw=true)","metadata":{}},{"cell_type":"markdown","source":"Some may think that by utilizing more rushers, that it enhances the risk of other factors - let's investigate this:\n\n<span style=\"color:blue;font-size:18px;font-weight:bold;\"> 1. The Distance of the Punt: </span> The results came back inconclusive about whether the number of rushers or pre-snap expected HAVOC influences the distance of the punt. However, the actual HAVOC generated on the play did show a statistically significant difference in punt distance - punts fell short of expectations due to the pressure.\n\n<span style=\"color:blue;font-size:18px;font-weight:bold;\"> 2. Hang Time: </span> A high hang time is generally a good thing for a punter, it allows for the kick to be in the air longer, so the punt unit has more time to get downfield. Adding more rushers, creating more expected HAVOC, and the actual HAVOC itself - all were statistically significant, and all reduced hang time.\n\n<span style=\"color:blue;font-size:18px;font-weight:bold;\"> 3. Punt Return Yardage: </span> In all 3 phases, the results were inconclusive about whether applying pressure has an impact on return yardage. This is one of the common misconceptions, that if you apply pressure, then it limits your return game - this does not seem to be the case.\n\n<span style=\"color:blue;font-size:18px;font-weight:bold;\"> 4. EPA: </span> The results came back inconclusive about whether the number of rushers or pre-snap expected HAVOC influences EPA on the play. However, the actual HAVOC generated on the play did show a statistically significant difference in EPA - a high HAVOC leads to lower EPA, which is a good thing for the return team.\n\n<span style=\"color:blue;font-size:18px;font-weight:bold;\"> 5. Penalties: </span> Another reason teams shy away from pressure - fear of getting a penalty. The most disastrous penalty a team can draw is a 15-yard roughing of the punter call – well guess what, there were 0 instances of it from 2018-2020. The next worst thing is running into the punter, which is only 5 yards – this occurred less frequently than a blocked punt! \n\n<span style=\"color:blue;font-size:18px;font-weight:bold;\"> 5. Fake Punts: </span> Unfortunately, PFF did not assign rushers on plays where there was a fake - this means we can't see the number of rushers or HAVOC. However, I did put the data for Run / Pass fakes - fake punts were surprisingly effective!","metadata":{}},{"cell_type":"markdown","source":"#### [Code on GitHub](https://github.com/jdruzzi/BDB22/tree/main/Punt%20Rush%20Havoc/Code)","metadata":{}},{"cell_type":"markdown","source":"-------------------------------------------------------------\n## More 2022 Big Data Bowl Content\n\n### [ ⭐ HAVOC: Decoding the Punt Rush ⭐ ](https://www.kaggle.com/jdruzzi/havoc-decoding-the-punt-rush)\n\n- [Quantifying Punt Rush Ability with HAVOC](https://www.kaggle.com/jdruzzi/quantifying-punt-rush-ability-with-havoc)\n\n- [Extended: How to Improve HAVOC & Block Punts 📝](https://www.kaggle.com/jdruzzi/extended-how-to-improve-havoc-block-punts)\n\n- [Alternate Outcomes WIth Punt Pressure & HAVOC](https://www.kaggle.com/jdruzzi/alternate-outcomes-with-punt-pressure-havoc)\n\n\n#### Alternative Punt / Punt Rush\n\n- [Evaluating Punt/Punt Rush Units with Convex Hulls](https://www.kaggle.com/jdruzzi/evaluate-punt-punt-return-units-with-convex-hulls)\n\n#### Punt Protection\n\n- [Estimating Punt Protection Assignments](https://www.kaggle.com/jdruzzi/estimating-punt-protection-blocking-assignments)\n\n#### Misc / Additional Data\n- [Generating Detailed Punt Positions](https://www.kaggle.com/jdruzzi/generating-detailed-punt-positions)\n\n- [Combine, Snap Counts, & Left Footed Kicker Data](https://www.kaggle.com/jdruzzi/combine-snap-counts-left-footed-kicker-data)\n\n------------------------------------------------------------\n#### Socials\n- [Twitter](https://twitter.com/j_druzzi)\n- [LinkedIn](https://www.linkedin.com/in/joe-andruzzi-27b3a7149/)\n\n------------------------------------------------------------","metadata":{}}]}