개발은 처음이라 개발새발

21/22시즌 손흥민 경기당 공격 지표를 구해보자 [python/pandas] 본문

축구

21/22시즌 손흥민 경기당 공격 지표를 구해보자 [python/pandas]

leon_choi 2022. 8. 1. 09:00
반응형

안녕하세요. 이제 22/23 PL 개막이 5일 정도 남았는데요. D-5 기념으로 지난 시즌 프리미어리그 득점순위 탑 5 선수들의 경기당 주요 공격 지표에 대해 알아보겠습니다. 제목은 리그 Top 5 득점자들의 경기당 주요 공격지표로 하겠습니다. 근데 이제 파이썬을 곁들인...

 

늘 그랬듯이 활용한 스탯은 모두 fotmob 사이트(https://www.fotmob.com/)를 통해 모았습니다. 우선 잘 모은 데이터를 한번 확인해보겠습니다. 데이터를 불러오죠.

 

import pandas as pd
import numpy as np

df= pd.read_excel('epl.xlsx',sheet_name='Sheet1')
print(df)
print('\n')
             league     season               team               name  assist  goals  totalshot  ontarget  winningGoal  keypass  Successdribbles  bigChanceCreated  bigChanceMissed
0    Premier League  2021/2022  Manchester United  Cristiano Ronaldo       0      2          6         2            1        1                0                 0                0
1    Premier League  2021/2022  Manchester United  Cristiano Ronaldo       0      1          7         5            0        0                0                 0                2
2    Premier League  2021/2022  Manchester United  Cristiano Ronaldo       0      0          4         0            0        1                1                 0                0
3    Premier League  2021/2022  Manchester United  Cristiano Ronaldo       0      0          1         0            0        1                0                 0                0
4    Premier League  2021/2022  Manchester United  Cristiano Ronaldo       0      0          3         1            0        1                1                 0                0
..              ...        ...                ...                ...     ...    ...        ...       ...          ...      ...              ...               ...              ...
166  Premier League  2021/2022  Tottenham Hotspur      Son Heung-Min       0      0          0         0            0        2                5                 0                0
167  Premier League  2021/2022  Tottenham Hotspur      Son Heung-Min       1      2          3         3            1        4                1                 1                1
168  Premier League  2021/2022  Tottenham Hotspur      Son Heung-Min       0      1          2         1            0        2                0                 0                0
169  Premier League  2021/2022  Tottenham Hotspur      Son Heung-Min       0      0          2         2            0        4                1                 0                1
170  Premier League  2021/2022  Tottenham Hotspur      Son Heung-Min       0      2          7         5            0        1                1                 0                3

네 이렇게 지난 시즌 득점 탑 5인 손흥민,살라, 케인, 마네, 호날두의 득점, 어시스트, 슈팅, 유효슈팅, 결승득점, 결승득점, 키패스(기회창출(chance created)), 빅찬스 크레이티드, 빅찬스 미스 데이터를 모아서 표출해봤습니다. 이제 경기당 기록을 만들기 위해서는 이 선수들의 출장 경기수와 선수별 데이터 합산이 필요합니다. 출장 경기수는 결국 특정 이름의 데이터가 몇개나 있는지와 맥락이 같은데요. 이는 value_counts()함수를 사용하면 됩니다. 그리고 합산 데이터는 groupby를 사용하겠습니다. 이 두가지를 하기 전에 득점+어시스트인 공격 포인트 항목이 없으니 이것도 추가를 해보겠습니다.

#공격포인트 만들기
df['attPoint'] = df['goals']+df['assist']
print(df)
print('\n')

#합산 데이터 만들기
df1 = df.groupby(['league','season','team','name']).sum()

print(df1)

#경기수 생성
game = df['name'].value_counts()
print('\n')
print(game)
                                                              assist  goals  totalshot  ontarget  winningGoal  keypass  Successdribbles  bigChanceCreated  bigChanceMissed  attPoint
league         season    team              name
Premier League 2021/2022 Liverpool         Mohamed Salah          13     23        139        60            7       63               53                18               17        36
                                           S. Mané                 2     16         98        39            5       41               47                 9               13        18
                         Manchester United Cristiano Ronaldo       3     18        110        43            7       26               20                 7               13        21
                         Tottenham Hotspur H. Kane                 9     17        133        55            4       50               54                19               18        26
                                           Son Heung-Min           7     23         86        49            6       72               51                10               17        30
H. Kane              37
Mohamed Salah        35
Son Heung-Min        35
S. Mané              34
Cristiano Ronaldo    30
Name: name, dtype: int64

네 이렇게 합산 데이터와 선수들의 경기수를 구했습니다. groupby를 통해 구한 데이터의 합산을 보면 인덱스가 리그, 시즌, 팀, 이름까지 다중 인덱스로 돼 있는 모습을 보입니다. 이렇게 되면 반복문과 조건문을 통해 계산을 하는데 문제가 발생할 수도 있는데요. 이걸 해결하기 위해서는 reset_index()함수를 통해 인덱스를 다시 번호로 되돌리면 됩니다. 

#인덱스 초기화
df1.reset_index(drop=False, inplace=True)

print(df1)
           league     season               team               name  assist  goals  totalshot  ontarget  winningGoal  keypass  Successdribbles  bigChanceCreated  bigChanceMissed  attPoint
0  Premier League  2021/2022          Liverpool      Mohamed Salah      13     23        139        60            7       63               53                18               17        36
1  Premier League  2021/2022          Liverpool            S. Mané       2     16         98        39            5       41               47                 9               13        18
2  Premier League  2021/2022  Manchester United  Cristiano Ronaldo       3     18        110        43            7       26               20                 7               13        21
3  Premier League  2021/2022  Tottenham Hotspur            H. Kane       9     17        133        55            4       50               54                19               18        26
4  Premier League  2021/2022  Tottenham Hotspur      Son Heung-Min       7     23         86        49            6       72               51                10               17        30

네 이제 재료들을 모두 완성이 됐으니 반복문과 조건문을 통해 경기당 지표들을 만들어보겠습니다. 

for i in range(len(df1)):
    
    if df1.iloc[i]['name'] == "Mohamed Salah":
        df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[1],2)
        df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[1],2)
        df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[1],2)
        df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[1],2)
        df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[1],2)
        df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[1],2)
        df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[1],2)
        df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[1],2)
        df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[1],2)
        
    elif df1.iloc[i]['name'] == "S. Mané":
        df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[3],2)
        df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[3],2)
        df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[3],2)
        df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[3],2)
        df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[3],2)
        df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[3],2)
        df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[3],2)
        df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[3],2)
        df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[3],2)
        
    elif df1.iloc[i]['name'] == "Cristiano Ronaldo":
        df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[4],2)
        df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[4],2)
        df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[4],2)
        df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[4],2)
        df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[4],2)
        df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[4],2)
        df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[4],2)
        df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[4],2)
        df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[4],2)
    
    elif df1.iloc[i]['name'] == "H. Kane":
        df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[0],2)
        df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[0],2)
        df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[0],2)
        df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[0],2)
        df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[0],2)
        df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[0],2)
        df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[0],2)
        df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[0],2)
        df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[0],2)
    
    elif df1.iloc[i]['name'] == "Son Heung-Min":
        df1.at[i,'per_goals'] = round (df1.iloc[i]['goals']/game.iloc[2],2)
        df1.at[i,'per_assist'] = round(df1.iloc[i]['assist']/game.iloc[2],2)
        df1.at[i,'per_attpoint'] = round(df1.iloc[i]['attPoint']/game.iloc[2],2)
        df1.at[i,'per_totalshot'] =round (df1.iloc[i]['totalshot']/game.iloc[2],2)
        df1.at[i,'per_ontarget'] = round(df1.iloc[i]['ontarget']/game.iloc[2],2)
        df1.at[i,'per_keypass'] = round(df1.iloc[i]['keypass']/game.iloc[2],2)
        df1.at[i,'per_dribble'] = round(df1.iloc[i]['Successdribbles']/game.iloc[2],2)
        df1.at[i,'per_bigChance'] = round(df1.iloc[i]['bigChanceCreated']/game.iloc[2],2)
        df1.at[i,'per_bigMiss'] = round(df1.iloc[i]['bigChanceMissed']/game.iloc[2],2)

print('\n')
df2 = df1.drop(df1.columns[4:14],axis=1)

print(df2)
           league     season               team               name  per_goals  per_assist  per_attpoint  per_totalshot  per_ontarget  per_keypass  per_dribble  per_bigChance  per_bigMiss
0  Premier League  2021/2022          Liverpool      Mohamed Salah       0.66        0.37          1.03           3.97          1.71         1.80         1.51           0.51         0.49
1  Premier League  2021/2022          Liverpool            S. Mané       0.47        0.06          0.53           2.88          1.15         1.21         1.38           0.26         0.38
2  Premier League  2021/2022  Manchester United  Cristiano Ronaldo       0.60        0.10          0.70           3.67          1.43         0.87         0.67           0.23         0.43
3  Premier League  2021/2022  Tottenham Hotspur            H. Kane       0.46        0.24          0.70           3.59          1.49         1.35         1.46           0.51         0.49
4  Premier League  2021/2022  Tottenham Hotspur      Son Heung-Min       0.66        0.20          0.86           2.46          1.40         2.06         1.46           0.29         0.49

네 이렇게 21/22 시즌 탑 스코어러 5명의 경기당 주요 공격 지표를 구해봤습니다. 

반응형