{"cells":[{"metadata":{"_uuid":"f93ec5723b320192ee8421326faff50233c1ddbb"},"cell_type":"markdown","source":"Here is the  kernel to show how punt formation affect the rate of concussion"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport matplotlib.pyplot as plt\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c1dd34df411040bd689f176959685a0783367b58"},"cell_type":"markdown","source":"Load player role and concussion data"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"scrolled":true,"_kg_hide-input":true},"cell_type":"code","source":"player_role_data = pd.read_csv('../input/play_player_role_data.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"6a0adab6eead8858c83ea6a4c418d93d198f249f"},"cell_type":"code","source":"player_role_data.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"384a73247f53ef95d6d7f9d450f84924a39fecfc"},"cell_type":"code","source":"play_information_data = pd.read_csv('../input/play_information.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"5c67dfae27b69a47c76ea35377f14f918f8d8478"},"cell_type":"code","source":"play_information_data.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ebc0eb6cac0153b368c164347bddbb9b9af75c91","_kg_hide-input":true},"cell_type":"code","source":"concussion_data = pd.read_csv('../input/video_review.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"acf88a2d8198ec4fb67c7dafeeaa265967bcfc0d"},"cell_type":"code","source":"concussion_data.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"033bf3db3dda4eb4036588dd89e476ea774e68da"},"cell_type":"code","source":"len(concussion_data)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e0001ee691ce42df59d03885db961e926de1c2ec","_kg_hide-input":true},"cell_type":"code","source":"concussion_data['concussed'] = 1","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"362bf984834afbe952b9fa96e25324cb7a51180b"},"cell_type":"markdown","source":"Create a pivot table for all punt play data and merge it with concussion data"},{"metadata":{"trusted":true,"_uuid":"e8dbba1833793fc8e83649c7ac5fcd3d980bc6f9"},"cell_type":"code","source":"table = pd.pivot_table(player_role_data,index=['GameKey', 'PlayID'],columns=['Role'], aggfunc=lambda x: len(x.unique()))['GSISID'].fillna(0)\n\ntable.reset_index(inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"3fe8680b88ea7f1b5227108b17b6696995056601"},"cell_type":"code","source":"table.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"635d9a673dd658eaa04c8cfcffebc4c2a7c02717"},"cell_type":"code","source":"merged_data = pd.merge(table,play_information_data)\nmerged_data = pd.merge(merged_data,concussion_data,how='outer')\nmerged_data.concussed.fillna(0, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4568d1e4fa5d8bc6bf47fa569f19a2dc38da5590"},"cell_type":"markdown","source":"Check the number of concussed player  in the new dataframe"},{"metadata":{"trusted":true,"_uuid":"40968ee5a0790e94d9e9a6f46bca44cb2e76da3a"},"cell_type":"code","source":"len(merged_data[merged_data['Primary_Impact_Type'].notnull()])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"114eedefa3cd367d0f3a6ef03c1a756ed6aa71a2"},"cell_type":"markdown","source":"Here we would like to find number of defender in box and if the receiver team is overloading one side. "},{"metadata":{"trusted":true,"_uuid":"e32f4c86641f1df048b9a54b14fccfd9adc1774e","_kg_hide-input":false},"cell_type":"code","source":"merged_data['overload'] =  ((merged_data['PDL1'] + merged_data['PDL2'] + merged_data['PDL3'] + merged_data['PDL4'] + merged_data['PDL5'] + merged_data['PDL6']) - \\\n(merged_data['PDR1'] + merged_data['PDR2'] + merged_data['PDR3'] + merged_data['PDR4'] + merged_data['PDR5'] + merged_data['PDR6']) + \\\n(merged_data['PLL1'] + merged_data['PLL2'] + merged_data['PLL3']) - \\\n(merged_data['PLR1'] + merged_data['PLR2'] + merged_data['PLR3'])).abs()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a8dae95762207bc17516855fa3aecee23f182dbe","_kg_hide-input":false},"cell_type":"code","source":"merged_data['box_defender'] =  ((merged_data['PDL1'] + merged_data['PDL2'] + merged_data['PDL3'] + merged_data['PDL4'] + merged_data['PDL5'] + merged_data['PDL6']) + \\\n(merged_data['PDR1'] + merged_data['PDR2'] + merged_data['PDR3'] + merged_data['PDR4'] + merged_data['PDR5'] + merged_data['PDR6']) + \\\n(merged_data['PLL1'] + merged_data['PLL2'] + merged_data['PLL3']) + \\\n(merged_data['PLR1'] + merged_data['PLR2'] + merged_data['PLR3']) + \n(merged_data['PLM1'] + merged_data['PLM'] + merged_data['PDM']))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"cb1180713e3ff3b81deb6bad45327be710c964a7"},"cell_type":"markdown","source":"Also remove punt plays that are blocked or killed by penalties"},{"metadata":{"trusted":true,"_uuid":"775bd9aaf38a42bf3a8e12f7f50a624bd4357749"},"cell_type":"code","source":"yards_list = []\n\nfor i,yards in enumerate(merged_data.PlayDescription.str.split(' yard').str[0].str[-2:]):\n    try:\n        yards_list.append(float(yards))\n    except ValueError:\n        yards_list.append('NaN')\nmerged_data['punt_yards'] = yards_list\nmerged_data['no_play'] = merged_data.PlayDescription.str.contains('No Play', regex=True)\nmerged_data['blocked'] = merged_data.PlayDescription.str.contains('BLOCKED', regex=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5f9346fd65b62db5d0aae7a229ae295db1223091"},"cell_type":"code","source":"merged_data = merged_data[(merged_data.box_defender > 3) & (merged_data.box_defender  <9) & (merged_data.punt_yards != 'NaN') & (merged_data.no_play == False) & (merged_data.blocked == False)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"504bf95ee5556c67f7cf1ecb6197a022aa9b4ead"},"cell_type":"code","source":"merged_data.head()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6f942a4d3929ae92de8e11ac8beff134fdab3ed5"},"cell_type":"markdown","source":"We now load the statsmodels module for logistic regression to determine whether no. of box defender and overload players would affect"},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"1fd6da5bfb32923329953d59159d8a3c98083c45","_kg_hide-output":true},"cell_type":"code","source":"import statsmodels\nimport statsmodels.api as sm\n\nimport statsmodels.formula.api as smf\n\n\nresults = smf.logit(formula='concussed ~ box_defender + overload', data=merged_data).fit()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7435ae695b3bac1a11fb52fce07a48b90e02199e"},"cell_type":"code","source":"results.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6d010072366e151caaa9fd46176c390e00495998"},"cell_type":"markdown","source":"From the result we can see that no. of box defender may has some effect on concussion chance, but overloading one side by receiving team seems to not making any difference.\nFinally we plot the 95% Wilson convidence interval for each case"},{"metadata":{"trusted":true,"_uuid":"5e71a157f2efa4fb69ff4941df2782ef047ec655","_kg_hide-input":true},"cell_type":"code","source":"zero_overload = merged_data[merged_data['overload'] == 0]\nlower_zero,upper_zero = statsmodels.stats.proportion.proportion_confint(len(zero_overload[zero_overload['concussed'] == 1]), len(zero_overload['concussed']), alpha=0.05, method='wilson')\none_overload = merged_data[merged_data['overload'] == 1]\nlower_one,upper_one = statsmodels.stats.proportion.proportion_confint(len(one_overload[one_overload['concussed'] == 1]), len(one_overload['concussed']), alpha=0.05, method='wilson')\ntwo_overload = merged_data[merged_data['overload'] == 2]\nlower_two,upper_two = statsmodels.stats.proportion.proportion_confint(len(two_overload[two_overload['concussed'] == 1]), len(two_overload['concussed']), alpha=0.05, method='wilson')\nthree_overload = merged_data[merged_data['overload'] == 3]\nlower_three,upper_three = statsmodels.stats.proportion.proportion_confint(len(three_overload[three_overload['concussed'] == 1]), len(three_overload['concussed']), alpha=0.05, method='wilson')","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"58dc56c87685a91cb4c54ce917e3b9093d8c5fff"},"cell_type":"code","source":"x = [0,1,2,3]\ny = [np.mean(zero_overload['concussed']),np.mean(one_overload['concussed']),np.mean(two_overload['concussed']),np.mean(three_overload['concussed'])]\n\nyerr = [[y[0] - lower_zero, y[1] - lower_one, y[2] - lower_two, y[3] - lower_three ], [upper_zero - y[0], upper_one - y[1], upper_two - y[2], upper_three - y[3]]]","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"cbb9e5dfa98790bcfec31f53d1712594f8f903f5"},"cell_type":"code","source":"plt.errorbar(x,y,yerr, capsize=3, elinewidth=1)\nplt.xlabel('No. of overload defender')\nplt.ylabel('Concussion chance')\nplt.title('Error of concussion chance vs overload defender')\nplt.xticks(np.arange(0, 4, step=1))","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"d26a653bb66187e56cad8be044173c355908434a"},"cell_type":"code","source":"six_box = merged_data[merged_data['box_defender'] == 6]\nlower_six,upper_six = statsmodels.stats.proportion.proportion_confint(len(six_box[six_box['concussed'] == 1]), len(six_box['concussed']), alpha=0.05, method='wilson')\nseven_box = merged_data[merged_data['box_defender'] == 7]\nlower_seven,upper_seven = statsmodels.stats.proportion.proportion_confint(len(seven_box[seven_box['concussed'] == 1]), len(seven_box['concussed']), alpha=0.05, method='wilson')\neight_box = merged_data[merged_data['box_defender'] == 8]\nlower_eight,upper_eight = statsmodels.stats.proportion.proportion_confint(len(eight_box[eight_box['concussed'] == 1]), len(eight_box['concussed']), alpha=0.05, method='wilson')","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"7474c5526f783bf954a9965898685236802f803b"},"cell_type":"code","source":"x = [6,7,8]\ny = [np.mean(six_box['concussed']),np.mean(seven_box['concussed']),np.mean(eight_box['concussed'])]\n\nyerr = [[y[0] - lower_six, y[1] - lower_seven, y[2] - lower_eight], [upper_six - y[0], upper_seven - y[1], upper_eight - y[2]]]","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"41f1469508242d8c76b68b541353b63ab4b7c077"},"cell_type":"code","source":"plt.errorbar(x,y,yerr, capsize=3, elinewidth=1)\nplt.xlabel('No. of box defender')\nplt.ylabel('Concussion chance')\nplt.title('Error of concussion chance vs box defender')\nplt.xticks(np.arange(6,9, step=1))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0a804aff2ac69c62855fcd3cb88bc57d3f891b2c"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}