본문 바로가기
문송충의 코딩하기/NBA 분석 With Python

[NBA]크리스 폴(Chris Paul) 선수 분석 #3

by 동장군님 2020. 8. 6.
728x90
반응형

저번 시간에 이어서 최애 선수 크리스 폴에 대한 분석을 해보도록 하겠다. 이번에는 크리스 폴이 2005년 데뷔 이후 뛴 모든 경기 기록을 Basketball_Reference 사이트에서 크롤링해와서 다음과 같은 분석을 해보겠다. Basketball_reference 사이트는 NBA 팬들이라면 모두 알고 있는 NBA 데이터 사이트로 특히 선수 하나하나의 경기별 상세 데이터를 제공하고 있다. 진짜 선수에 대한 세부적인 지표까지 제공할 수 있어서 크리스 폴 선수 분석은 한 #10까지 이어질 수 있지 않을까 생각이 든다.

 

  • 크리스 폴 커리어 내 홈, 어웨이 경기에 따른 평균 스탯 비교
  • 상대팀별 평균 스탯 차이 비교

크리스 폴이 홈, 원정에 따라 기복이 있는 선수인지, 어떤팀한테는 강했고 어떤 팀한테는 경기력이 안 좋았는지 종합적으로 분석하고자 한다. 분석하기 전 내가 크리스 폴에 가지고 있던 인상은 굉장히 기복이 없는 선수라 크게 차이가 없을 것으로 추측된다.


우선 크리스폴 데뷔 이후 뛴 모든 경기 기록을 가져오도록 하겠다. 이번에도 마찬가지로 Pandas에 있는 Read_html 함수를 사용하겠다. 2006년부터 2020년까지의 시즌을 다 가져와야 되기 때문에 반복문을 사용했고, data라는 빈 데이터 프레임에 추가하였다. 

import pandas as pd

data=pd.DataFrame()
for i in range(2006,2021):
    tables =pd.read_html(f'https://www.basketball-reference.com/players/p/paulch01/gamelog/{i}/')
    df=tables[7]
    data=data.append(df)

OutPut: Data 데이터 프레임을 출력하면 아래와 같다.

그다음으로 데이터에 대한 전처리가 필요하다. 크리스 폴이 안 뛴 경기를 제외하고, 그리고 칼럼명이 데이터 중간중간에 있어 이 부분도 함께 처리를 해야 된다.

#데이터 중간에 있는 컬럼명 제외
data=data[data['G']!='G']

#결장한 경기 행 제외
data=data[(data['PTS']!='Inactive')&(data['PTS']!='Did Not Dress')&(data['PTS']!='Did Not Play')&(data['PTS']!='Not With Team')]

#홈, 원정 컬럼 변경
data.rename(columns={'Unnamed: 5':'Home_Away'},inplace=True)

#홈, 원정 값 추가
data['Home_Away']=data['Home_Away'].fillna('H')
data['Home_Away']=data['Home_Away'].str.replace('@','A')

#필요없는 첫 두 컬럼 제외
data=data.drop(['Rk','G'],axis=1)

수치 데이터가 문자열로 저장되어 있기에 우선 숫자 int 타입으로 바꾸도록 하겠다. 그리고 분석할 지표는 대표적인 농구 선수 지표인 득점, 어시스트, 스틸, 리바운드를 선정했다.

data['PTS']=data['PTS'].astype(int)
data['AST']=data['AST'].astype(int)
data['STL']=data['STL'].astype(int)
data['TRB']=data['TRB'].astype(int)

분석을 위한 사전 준비 작업은 끝났고, 바로 크리스 폴 선수 지표 분석을 해보도록 하겠다. 

 

1. 홈, 어웨이 경기 별로 경기 스텟 비교

역시 크리스 폴이다. 홈, 원정 경기 간 차이가 크지 않은 점을 확인할 수 있다. 커리어 평균 득점은 오히려 원정에서 좋다. 야투율은 홈에서 1% 정도 낮기는 하지만 이 정도는 큰 차이라고 볼 수도 없다. 역시 S 클래스 선수들은 홈, 원정 가리지 않는다. 

Home_Away_stats=data.groupby('Home_Away')['PTS','AST','TRB','STL'].mean()

Output: 

home_away_fg=data.groupby('Home_Away')['FG'].sum()/data.groupby('Home_Away')['FGA'].sum()

Output: 

 

2. 상대팀 별 경기 스텟 비교

상대팀 별 경기 스텟 비교하는 것도 크게 어렵지 않다. 위에서 긁어온 데이터 안에 선수 경기 기록뿐만 아니라 상대팀 별 경기 기록도 함께 제공하기 때문이다. 어떻게 분석을 할 것이냐면 상대팀 별로 4대 지표 평균 기록을 계산한 다음 각 지표 기록 별로 4 분위로 구분할 것이다. 그리고 상대팀 별 기록 분위를 합산한 수치를 상대 팀 별로 비교하고자 한다. 즉 가장 낮은 수치를 기록한 상대팀일수록 크리스 폴의 평균 득점, 평균 어시스트, 평균 스틸, 평균 리바운드가 가장 높은 수치를 기록했다고 이해하면 될 것이다. 

 

#상대팀 별 평균 기록 계산
opp_stats=data.groupby('Opp')['PTS','AST','TRB','STL'].mean()

r_labels = range(4, 0, -1)

#4대 지표를 4분위로 구분
pts_groups = pd.qcut(opp_stats['PTS'], q=4, labels=r_labels)
ast_groups = pd.qcut(opp_stats['AST'], q=4, labels=r_labels)
trb_groups = pd.qcut(opp_stats['TRB'], q=4, labels=r_labels)
stl_groups = pd.qcut(opp_stats['STL'], q=4, labels=r_labels)

rank_df=pd.DataFrame([pts_groups,ast_groups,trb_groups,stl_groups]).T

rank_df 경기 지표 4분위 합산한 후 오름차순으로 정렬하면 다음과 같은 결과를 얻을 수 있다.

rank_df['Scores']=rank_df['PTS']+rank_df['AST']+rank_df['TRB']+rank_df['STL']
rank_df=rank_df.sort_values(by='Scores',ascending=True)

평균 기록 지표만 볼 경우 크리스 폴은 브루클린, 오클라호마 시티, 새크라멘토 팀에 굉장히 좋은 기록을 찍은 점을 확인할 수 있고, 반대로 위에 이미지에서는 짤렸지만 인디애나, 밀워키, 마이애미 팀한테는 커리어 못 미치는 기록은 찍었다. 이것만 보고 단정할 수는 없지만 동부팀에 오히려 약하지 않았나 생각이 들기도 한다.

 

분석을 하면 할수록 크리스폴이 얼마나 좋은 선수인지를 확인할 수 있다. 비록 성질이 더러운 선수인 점은 동의하나, 이정도 기복 없이 뛰는 선수도 없다고 생각한다. 다음 시간에도 동일하게 크리스 폴에 대해서 더 재밋는 주제를 가져와 분석해보도록 하겠다.

728x90
반응형

댓글