{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":18603,"databundleVersionId":1058179,"sourceType":"competition"}],"dockerImageVersionId":29867,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## はじめに\n\nNCAAバスケットボールのデータ分析において、アドバンスド統計は非常に重要な役割を果たします。アドバンスド統計とは、従来の基本的な統計データを組み合わせて算出される高度な指標のことです。これらの指標は、チームやプレイヤーのパフォーマンスをより深く理解するために使用されます。\n\n本ノートでは、Pythonを用いてNCAAバスケットボールのアドバンスド統計を算出する方法について解説します。コードの各部分に詳細な説明を加えているので、プログラミングに慣れていない方でも理解しやすい内容となっています。","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom math import pi\nimport os\n\ndef create_advanced_stats():\n    # CSVファイルからデータを読み込む\n    df = pd.read_csv('../input/march-madness-analytics-2020/MDataFiles_Stage2/MRegularSeasonDetailedResults.csv')\n\n    # 勝利チームと敗北チームの得点を計算\n    df['WPts'] = df.WScore\n    df['LPts'] = df.LScore\n\n    # 勝利チームと敗北チームのポゼッション数を計算\n    # ポゼッション数 = 0.96 * (フィールドゴール試投数 + ターンオーバー数 + 0.44 * フリースロー試投数 - オフェンシブリバウンド数)\n    wPos = df.apply(lambda row: 0.96*(row.WFGA + row.WTO + 0.44*row.WFTA - row.WOR), axis=1)\n    lPos = df.apply(lambda row: 0.96*(row.LFGA + row.LTO + 0.44*row.LFTA - row.LOR), axis=1)\n    # 両チームのポゼッション数はほぼ同じなので、平均値を使用\n    df['Pos'] = (wPos+lPos)/2\n    df['WPos'] = wPos\n    df['LPos'] = lPos\n\n    # アドバンスドメトリクスの計算\n\n    # オフェンシブ効率 (OffRtg) = 100 * (得点 / ポゼッション数)\n    df['WOffRtg'] = df.apply(lambda row: 100 * (row.WPts / row.WPos), axis=1)\n    df['LOffRtg'] = df.apply(lambda row: 100 * (row.LPts / row.LPos), axis=1)\n    # ディフェンシブ効率 (DefRtg) = 100 * (相手チームの得点 / 相手チームのポゼッション数)\n    df['WDefRtg'] = df.LOffRtg\n    df['LDefRtg'] = df.WOffRtg\n    # ネットレーティング = オフェンシブ効率 - ディフェンシブ効率\n    df['WNetRtg'] = df.apply(lambda row:(row.WOffRtg - row.WDefRtg), axis=1)\n    df['LNetRtg'] = df.apply(lambda row:(row.LOffRtg - row.LDefRtg), axis=1)\n\n    # アシスト比 : アシストでポゼッションが終了した割合\n    df['WAstR'] = df.apply(lambda row: 100 * row.WAst / (row.WFGA + 0.44*row.WFTA + row.WAst + row.WTO), axis=1)\n    df['LAstR'] = df.apply(lambda row: 100 * row.LAst / (row.LFGA + 0.44*row.LFTA + row.LAst + row.LTO), axis=1)\n    # ターンオーバー比 : 100ポゼッションあたりのチームのターンオーバー数\n    # (TO * 100) / (FGA + (FTA * 0.44) + AST + TO)\n    df['WTOR'] = df.apply(lambda row: 100 * row.WTO / (row.WFGA + 0.44*row.WFTA + row.WAst + row.WTO), axis=1)\n    df['LTOR'] = df.apply(lambda row: 100 * row.LTO / (row.LFGA + 0.44*row.LFTA + row.LAst + row.LTO), axis=1)\n\n    # シューティング効率 : シューティングの効率性を測定 (FGA/FGA3, FTA)\n    df['WTSP'] = df.apply(lambda row: 100 * row.WPts / (2 * (row.WFGA + 0.44 * row.WFTA)), axis=1)\n    df['LTSP'] = df.apply(lambda row: 100 * row.LPts / (2 * (row.LFGA + 0.44 * row.LFTA)), axis=1)\n    # 実効フィールドゴール％ (eFG%) : 3ポイントショットの価値を考慮したフィールドゴール成功率\n    df['WeFGP'] = df.apply(lambda row:(row.WFGM + 0.5 * row.WFGM3) / row.WFGA, axis=1)      \n    df['LeFGP'] = df.apply(lambda row:(row.LFGM + 0.5 * row.LFGM3) / row.LFGA, axis=1)   \n    # フリースロー試投率 (FTA Rate) : ファウルを引き出す能力\n    df['WFTAR'] = df.apply(lambda row: row.WFTA / row.WFGA, axis=1)\n    df['LFTAR'] = df.apply(lambda row: row.LFTA / row.LFGA, axis=1)\n\n    # オフェンシブリバウンド％ (OREB%) : チームのオフェンシブリバウンドの割合\n    df['WORP'] = df.apply(lambda row: row.WOR / (row.WOR + row.LDR), axis=1)\n    df['LORP'] = df.apply(lambda row: row.LOR / (row.LOR + row.WDR), axis=1)\n    # ディフェンシブリバウンド％ (DREB%) : チームのディフェンシブリバウンドの割合\n    df['WDRP'] = df.apply(lambda row: row.WDR / (row.WDR + row.LOR), axis=1)\n    df['LDRP'] = df.apply(lambda row: row.LDR / (row.LDR + row.WOR), axis=1)                                      \n    # リバウンド％ (REB%) : チームの総リバウンドの割合\n    df['WRP'] = df.apply(lambda row: (row.WDR + row.WOR) / (row.WDR + row.WOR + row.LDR + row.LOR), axis=1)\n    df['LRP'] = df.apply(lambda row: (row.LDR + row.LOR) / (row.WDR + row.WOR + row.LDR + row.LOR), axis=1)\n\n    # PIE (Player Impact Estimate) : チームのパフォーマンスを測定\n    # 高いPIE％は勝利と強い相関がある\n    wtmp = df.apply(lambda row: row.WPts + row.WFGM + row.WFTM - row.WFGA - row.WFTA + row.WDR + 0.5*row.WOR + row.WAst +row.WStl + 0.5*row.WBlk - row.WPF - row.WTO, axis=1)\n    ltmp = df.apply(lambda row: row.LPts + row.LFGM + row.LFTM - row.LFGA - row.LFTA + row.LDR + 0.5*row.LOR + row.LAst +row.LStl + 0.5*row.LBlk - row.LPF - row.LTO, axis=1) \n    df['WPIE'] = wtmp/(wtmp + ltmp)\n    df['LPIE'] = ltmp/(wtmp + ltmp)\n\n    # 結果をCSVファイルに保存\n    df.to_csv('NCAASeasonDetailedResultsEnriched.csv', index=False)\n\n    return df\n\ncreate_advanced_stats()","metadata":{"_uuid":"b1fa0512-265e-42b0-b31c-03b456d4e999","_cell_guid":"6ac12305-7526-457f-99cd-9bf4a65e4a98","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-06-03T08:54:35.843807Z","iopub.execute_input":"2024-06-03T08:54:35.844230Z","iopub.status.idle":"2024-06-03T08:58:37.770264Z","shell.execute_reply.started":"2024-06-03T08:54:35.844193Z","shell.execute_reply":"2024-06-03T08:58:37.769368Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}