들어가기 전
저는 어렸을 때 Xbox360을 가지고 게임을 즐겨했습니다.
그중에서 FIFA 11을 제일 많이 했었는데 그때 항상 AI와 경기를 했습니다. AI와 하기 전에 플레이할 팀을 골라야 하는데
그 당시 한국에서는 보통 레알 마드리드, 바르셀로나, 맨유 정도로 팬이 되게 많았었는데 저는 어렸을 때부터 홍대병인지
맨체스터 유나이티드의 반대같은 맨체스터 시티를 항상 골랐습니다.
그래서 축구에 대한 관심이 되게 많습니다. 그런 김에 FIFA22 선수 데이터를 가지고 간단하게 분석을 한번 진행해보았습니다.
https://www.kaggle.com/datasets/stefanoleone992/fifa-22-complete-player-dataset
kaggle에 있는 데이터를 사용했습니다.
모듈 불러오기
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
FIFA22 선수 데이터 파일 불러오기
from google.colab import drive
drive.mount('/content/drive')
%cd /content/drive/My Drive/
data = pd.read_csv('players_22.csv')
이렇게 간단하게 준비를 마치고 분석을 시작해보겠습니다.
data.shape
(19239, 110)
19239의 행과 110개의 열로 구성돼 있네요.
df = data[['short_name','age','height_cm','weight_kg','nationality_name','club_name','overall','potential',
'value_eur','wage_eur','player_positions','preferred_foot','international_reputation',
'skill_moves', 'work_rate']]
print(df.isnull().sum())
df
제가 쓸 열들만 골라주었고 결측치가 있는지 확인해보았고 있길래 아래와 같이 제거했습니다.
df.dropna()
데이터 간단하게 추려보기
#상위 10명의 선수 데이터
df.head(10)
#선수들 중 가장 낮은 오버롤
min(df.overall)
47
#선수들 중 가장 높은 오버롤
max(df.overall)
93
#국가별 선수 수
df['nationality_name'].value_counts()
England 1719
Germany 1214
Spain 1086
France 980
Argentina 960
...
Ethiopia 1
Papua New Guinea 1
Kyrgyzstan 1
Guam 1
Indonesia 1
Name: nationality_name, Length: 163, dtype: int64
#모든 선수들의 주발
df.groupby(['preferred_foot']).count()[['short_name']]
왼발 선호 선수가 4565명, 오른발이 14674명이란 사실을 알 수 있네요.
데이터 분석 및 시각화
players_preferred_foot_labels = df["preferred_foot"].value_counts().index #왼발, 오른발
players_preferred_foot_values = df["preferred_foot"].value_counts().values #왼발, 오른발 값
#선수들의 주발 파이차트
plt.figure(figsize = (6, 6))
explode = [0.05, 0.05]
plt.pie(players_preferred_foot_values, labels=players_preferred_foot_labels,autopct='%.1f%%', startangle=320, counterclock=False, explode=explode, shadow=True)
plt.title('Players Preferred Feet',color = 'black',fontsize = 30)
plt.legend()
plt.show()
오른발 선호 선수가 76.3%로 압도적이며 왼발은 23.7%라는 사실을 알 수 있습니다.
선수 수가 많은 상위 10국가
#선수 수 상위 10국가
from collections import Counter
top10 = dict(Counter(df['nationality_name'].values).most_common(10))
top10
fig, ax = plt.subplots(figsize = (15,5))
plt.bar(*zip(*top10.items()))
ax.set_title('Popular Nationalities')
plt.show()
상위 6 국가는 누가 봐도 끄덕끄덕이지만 일본 선수가 많다는 점과 축구는 별로 안 하고 미식축구만 할 것 같은 미국이 꽤 많다는 점이 신기하네요.
선수들의 키, 몸무게 분포
fig, axes = plt.subplots(1, 2, figsize=(20, 10), sharey=True)
sns.histplot(df,ax=axes[0], x="height_cm") #키(cm) 분포
sns.histplot(df,ax=axes[1], x="weight_kg") #몸무게(kg) 분포
역시 축구선수들 답게 180~190cm 부분이 많다는 사실을 알 수 있네요.
그리고 170cm대 선수들이 그렇게 많을 것이라고 생각은 못했는데 꽤 많은 수치를 보여주고 있습니다.
선수들의 오버롤과 나이 분포
fig, axes = plt.subplots(1, 2, figsize=(20, 10), sharey=True)
sns.histplot(df,ax=axes[0], x="overall") #오버롤 분포
sns.histplot(df,ax=axes[1], x="age") #나이 분포
오버롤(능력치)은 60~70대에 가장 많이 분포했다는 점을 알 수 있고 나이또한 20대초반이 되게 많네요!
오버롤 상위 100명이 속한 팀은??
teams_df = df.sort_values(by = 'overall',ascending = False).head(100) #오버롤 기준 상위 100명 정렬
teams_df['club_name'].value_counts() #오버롤 기준 상위 100명이 속한 팀 정렬
#상위 100명의 선수들의 소속 팀
plt.figure(figsize=(10,5),dpi=100)
sns.countplot(x='club_name', data = teams_df, palette = 'magma', order=teams_df['club_name'].value_counts().head(10).index)
plt.xticks(rotation=90)
plt.xlabel('Club Name')
plt.ylabel('Count')
plt.title('Top 100 Players by Club', fontsize=20)
plt.show()
사실 상위 50명으로 처음에 했는데 맨시티가 1위가 아니길래 100명으로 고쳤습니다...
사실 맨시티, 리버풀, 바이에른 뮌헨 순서라고 예측했는데 PSG와 ATM, 맨유 선수들이 은근히 많다는 사실을 알 수 있었습니다.
상관관계 히트맵
sns.heatmap(data = df[['international_reputation', 'value_eur', 'wage_eur', 'overall', 'potential', 'skill_moves', 'age', 'height_cm','weight_kg']].corr(),
annot = True, cmap = "coolwarm", vmin = -1, vmax = 1, center = 0 ,linewidths=.5, annot_kws={"size": 15})
sns.set(rc = {'figure.figsize':(20,10)})
plt.title("Correlation")
plt.show();
상관관계를 히트맵으로 만들어 보았습니다.
평판이 높은 선수일수록 급여와 가치가 높은 양의 상관관계,
나이가 많은 선수일수록 포텐셜이 낮은 음의 상관관계,
키가 크고 몸무게가 많은 선수일수록 개인기(skill_moves)가 낮은 음의 상관관계 정도를 알 수 있겠네요!
저희가 흔히 생각하는 것과 비슷한 양상을 보여주는 것 같습니다.
간단하게 제가 좋아하는 FIFA22의 선수들 데이터를 가지고 분석해보았습니다.
막상 글을 쓰고 보니 작업시간이 되게 짧을 것 같다고 생각되는데 시각화는 잘 안 해봐서 구글링 하는데 시간을 좀 썼네요.
제 github에 파일을 올려두었습니다. 자세히 보고 싶은 분들은 참고하시면 좋겠습니다 :)
https://github.com/200000001/FIFA22-DATA/blob/main/fifa.ipynb