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

파이썬으로 프리미어리그 아스널의 지난 10년 역사 분석하기

by 동장군님 2020. 9. 15.
728x90
반응형

EPL Analysis with Python

EPL이 개막 함에 따라서 파이썬으로 내가 좋아하는 아스널(Arsenal)의 지난 10년 역사를 분석해보도록 하겠다. 첫 시간인 만큼 간단한 내용만 파이썬으로 분석하고자 한다. 지난 10년간은 아스널의 암흑기여서 기분은 그렇게 좋지는 않다. 

 

  • 지난 10년간 아스날 최종 순위

  • 지난 10년간 아스날 최종 승점

  • 지난 10년간 평균 득점/실점 

  • 시즌별 최다 득점자

 

Data Source

이번 분석에서 사용한 Data Source는 아래 사이트와 같다. 여기 사이트가 데이터 사용이 조금 제한적이라 다른 소스를 찾고 있는데 아마 다음 시간에는 다른 소스를 사용하지 않을까 생각이 든다. 

 

fbref.com/

 

Football Statistics and History | FBref.com

Easy-to-use source for football stats including player, team, and league stats.

fbref.com

 

 

 

 

 

Python Code

 

Data 추출

 

Pandas에 있는 read_html 함수를 사용하면 바로 우리가 원하는 data가 데이터 프레임 화해서 받을 수 있다. 그리고 간단한 전처리 과정만 거치면 아래 표와 같이 우리가 원하는 분석이 바로 가능하다. 

import pandas as pd
tables=pd.read_html('https://fbref.com/en/squads/18bb7c10/history/Arsenal-Stats-and-History')

#최근 10년 데이타만 추출
rank=tables[0][1:11]

#최종 순위 숫자만 가져오기
rank['Rank']=rank['LgRank'].apply(lambda x: int(x[0]))

#기간별로 오름차순으로 정렬
rank['seas']=rank['Season'].apply(lambda x: int(x.split('-')[1]))
rank=rank.sort_values(by=['seas'])

 

 

 

 

 

아스널 시즌별 최종 승점 & 순위

 

여기서 유의해야 되는 부분은 y 축이다. y축 값이 높을수록 좋기 때문에 y축을 거꾸로 정렬해야 되는데 gca(). invert_yaxis()를 사용하면 될 것이다. 승점이랑 순위를 같이 보여주면 좋을 듯해서 twinx로 콤보 차트를 시각화해봤다.

 

아래 그래프를 보면 2016년 이후 챔스권에 진입조차 하지도 못했다. 저번 시즌에는 프리미어리그 출범 이후 두 번째로 최악 순위 8위를 기록하기도 했다. 이번 시즌은 최소 6위 안에 들어갔으면 한다.

 

import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams["font.family"] = 'Malgun Gothic'
fig, ax1 = plt.subplots(figsize=(18,8))

ax1.set_title('아스날 시즌별 최종 순위 & 승점', fontsize=16)
ax1.set_xlabel('시즌', fontsize=16)
ax1.set_ylabel('최종 순위', fontsize=16)
ax1 = sns.lineplot(x='Season', y='Rank', data = rank, palette='summer',color='tab:red')
ax1.tick_params(axis='y')
ax1.set_ylim(1,10,1)
ax1.invert_yaxis()

for x, y in enumerate( list(rank['Rank']) ):
    plt.text(x, y, y, fontsize=15, color='tab:red', 
                    horizontalalignment='center', verticalalignment='bottom')

ax2 = ax1.twinx()


ax2.set_ylabel('최종 승점', fontsize=16)
ax2 = sns.lineplot(x='Season', y='Pts', data = rank, sort=False )
ax2.tick_params(axis='y')
ax2.set_ylim(50,100,10)

for x, y in enumerate( list(rank['Pts']) ):
    plt.text(x, y, y, fontsize=15, color='tab:blue', 
                    horizontalalignment='center', verticalalignment='bottom')

plt.show()

 

 

 

아스널 시즌별 최종 승점 & 순위

 

분석 결과 지난 시즌은 정말 최악인 점을 확인할 수 있다. 경기당 평균 득점은 1.47로 10년 이래 최저였다. 득점왕 오바메양을 보유한 팀이 이 정도밖에 득점을 기록하지 못한 것은 팀 공격이 얼마나 시원치 않았는지를 알 수 있는 부분이다.

 

import matplotlib.pyplot as plt

plt.rcParams["font.family"] = 'Malgun Gothic'
plt.rcParams["font.size"] = 16
plt.figure(figsize=(16,8))

plt.plot(rank['Season'],rank['avg_goals'],color='tab:red')
for x, y in enumerate( list(rank['avg_goals']) ):
    plt.text(x, y, y, fontsize=15, color='tab:red', 
                    horizontalalignment='center', verticalalignment='bottom')

plt.plot(rank['Season'],rank['avg_losses'],color='tab:blue')
for x, y in enumerate( list(rank['avg_losses']) ):
    plt.text(x, y, y, fontsize=15, color='tab:blue', 
                    horizontalalignment='center', verticalalignment='bottom')


plt.legend(['평균 득점','평균 실점'],loc='center left')

plt.show()

 

 

 

 

아스널 시즌별 최다 득점자

 

2011-2012 시즌 반통수는 정말 잘하긴 잘했다. 만약에 반통수가 아스날을 안 떠나고 남아 있고 남아 있었더라고 하면 최소 우승 한번은 하지 않았을까라는 생각이 든다. 반 페르시가 떠나고 최다 득점자가 14 득점을 기록한 월콧이라는 점만 봐도 아스날 공격진이 반통수 이후 얼마나 처참했는지 알 수 있다. 

 

rank['Scorer']=rank['Top Team Scorer'].apply(lambda x: x.split(' - ')[0])
rank['Scores']=rank['Top Team Scorer'].apply(lambda x: int(x.split(' - ')[1]))

import matplotlib.pyplot as plt

plt.rcParams["font.family"] = 'Malgun Gothic'
plt.rcParams["font.size"] = 16
plt.figure(figsize=(16,8))

plt.plot(rank['Season'],rank['Scores'],color='tab:red')
for x, y,z in zip(range(len(rank['Season'])), rank['Scorer'],rank['Scores'] ):
    plt.text(x, z, z, fontsize=11, color='tab:red', 
                    horizontalalignment='left', verticalalignment='bottom')
    plt.text(x, z, y, fontsize=11, color='tab:red', 
                    horizontalalignment='right', verticalalignment='bottom')

plt.show()

 

 

fbref 사이트가 패스/공격/수비 상세 지표를 크롤링하기 쉽지 않아서 다른 사이트를 좀 더 찾아보고자 한다. 시즌이 한 5경기 지나고 나서 아스널 선수들의 상세 지표를 한번 분석해보고자 한다. 

 

 

728x90
반응형

댓글