[Python] FIFA 데이터 EDA

0. 미리보기

1. 모듈 불러오기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from math import pi
%matplotlib inline

2. 데이터 불러오기

FIFA 공식 홈페이지에서 20년도 선수들의 데이터를 활용했다.

data = pd.read_csv('./downloads/archive/players_20.csv')

데이터셋 구조 확인하기

data.shape()

data.head() - 상위 5항목 출력

18278명의 선수와 104개의 컬럼이 있다는 것을 확인할 수 있다.(날강두는 노쇼해서 2등인걸까)

목표는 스타플레이어의 능력치 비교이기 때문에 사용할 수 있는 컬럼이 어떤것이 있는지 확인한다.

data.columns - 데이터 컬럼확인


ID 부터 시작해서 포지션별 능력치까지 총 104개의 컬럼이 있는것을 확인할 수 있다.

Data Summary

  • overall : 선수의 전체적인 능력치
  • potential : 선수의 잠재력
  • value_eur : 선수가치
  • wage_eur : 선수임금
  • preferred_foot : 선수의 주사용 발
  • skill_move : 개인기
  • work_rate : 적극성
  • pace ~ defending_standing_tackle : 스탯
  • ls ~ rb : 포지션별 스탯
data.types 로 data의 type을 확인한다.

해당 컬럼을 모두 사용하지 않기 때문에 필요한 컬럼들을 제외하고 GK 능력치를 포함한 나머지 컬럼들은 모두 삭제한다.(필드플레이어로 하는거라 미안해 키퍼야,,)

drop_col = ['player_url', 'long_name', 'dob', 'body_type', 'real_face', 'nation_position', 'nation_jersey_number', 'loaned_from', 'release_clause_eur', 'player_tags', 'joined',
           'contract_valid_until', 'gk_diving', 'gk_handling', 'gk_kicking', 'gk_reflexes', 'gk_speed', 'gk_positioning']

data = data.drop('sofifa_id', axis=1)
data = data.drop(drop_col, axis = 1)

data.dropna(subset=['pace'],inplace=True) # 필드 플레이어의 데이터 확인을 위해 골키퍼 데이터를 삭제
data.shape 

(16242, 85) 로 골키퍼 2000명과 컬럼 20개를 날려버렸다.

3. 데이터 분석하기

이제 플레이어들의 여러 데이터를 활용해 비교를 해보자.

우선 isnull 함수를 통해 null 값이 없다는 것을 확인한다.

data.isnull().sum()

3-1. OVERALL 에 따른 선수분포

a=data['overall'].value_counts()
b=sorted(a.index)
a2=pd.Series(a, index=b)
over=a2.index
value=a2.values
plt.plot(over,value,color='green', marker='o', linestyle='solid')
plt.axvline(x=np.mean(data['overall']),c='green', ls='--', label = 'Mean overall of players')
plt.legend()
plt.title("number of player by overall")
plt.xlabel("overall")
plt.ylabel("number of player")
plt.show()

선수들의 전체적인 능력치를 나타내는 OVERALL을 기준으로 선수들의 분포를 확인하면 6~70 에 대부분의 선수들이 포진되어 있는것을 알 수 있다.

OVERALL을 기준으로 선수들의 임금을 확인해보면 OVERALL 이 높을수록 임금을 많이 받는것이 보인다. (90 언저리에서 한번 꺾이는거 보면 꼭 그런건 아니네)

4. 손흥민 선수와의 비교

여러 컬럼을 활용해서 비교를 하던 중 손흥민 선수와의 비교가 빠질 수 없어 비교를 시작해보았다.

우선 편한 비교를 위해서 비슷한 성격의 컬럼을 하나로 묶어준다.

attack = ['attacking_crossing', 'attacking_finishing', 'attacking_heading_accuracy', 'attacking_short_passing', 'attacking_volleys']
defend = ['defending_marking', 'defending_standing_tackle', 'defending_sliding_tackle']
skill = ['skill_dribbling', 'skill_curve', 'skill_fk_accuracy', 'skill_long_passing', 'skill_ball_control']
movement = ['movement_acceleration', 'movement_sprint_speed', 'movement_agility', 'movement_reactions', 'movement_balance']
power = ['power_shot_power', 'power_jumping', 'power_stamina', 'power_strength', 'power_long_shots']
mental = ['mentality_aggression', 'mentality_interceptions', 'mentality_positioning', 'mentality_vision', 'mentality_penalties', 'mentality_composure']
all = attack+defend+skill+movement+power+mental

포지션별 선수들의 능력치를 int형태로 모두 바꿔준다.

for col in pos_columns:
  data[col]=data[col].str.split('+',n=1,expand = True)[0]
data[pos_columns] = data[pos_columns].astype(int)
data[pos_columns]


선수들의 능력치가 포지션별로 잘 출력되는것을 볼 수 있다

궁금하니까 손흥민선수 능력치도 한번 본다.

is_son=data['short_name']=='H. Son'
son = data[is_son]
son

4-1. overall 기준 상위 10명의 플레이어와 비교

overall 값이 가장 높은 선수 10명의 데이터를 찾은 후 손흥민 선수데이터와 병합한다.

overall_ten = data.sort_values('overall', ascending=False).head(10)
top10_son = pd.concat([overall_ten,son])
top10_son

이때쯤 되니까 내가 컬럼값을 제대로 지정하는건가 싶기도 하고,,

메시와 포르투갈의 손흥민(호날두), 네이마르와 함께 보아도 손색이 없는 흥민SON

4-2. LW 선수들과의 비교

이번에는 손흥민 선수의 포지션인 LW 포지션의 선수들과 비교를 해보자.
우선은 손흥민 선수의 공식적인 포지션부터 확인을 해본다.

son_lw = son[['short_name', 'player_positions', 'lw', 'overall']]

player_positions에서 LW가 포함되어 있는 선수중 상위 5명과 손흥민 선수를 출력한다.

player_LW=data['player_positions'].str.contains("LW")
lw_player = data[player_LW]
lw_player = lw_player[['short_name', 'player_positions', 'lw', 'overall']].head()


그 후, 각 선수들의 대표적인 컬럼들을 손흥민 선수와 비교한다.

손흥민 선수를 필두로 그래프를 그렸을때 역시 스타플레이어들과 비교해도 손색이 없는 능력치를 보여준다.

4-3. 대한민국의 호날두? VS 포르투갈의 손흥민?

LW 포지션에서 가장 높은 능력치를 보여주는 호날두 선수와 비교를 해보자.
누가 과연 타이틀을 가지게 될까

column_r=['short_name','overall','potential','pace','shooting','passing','dribbling','defending','physic']
rival = lw_player.head(2)[column_r]
rival= rival.set_index('short_name')

마지막은 손흥민 선수와 호날두의 능력치를 레이다 그래프로 출력한다.

총 8개의 항목 중 7개의 항목에서 호날두 선수가 앞서는 것을 볼 수 있다.
손흥민 선수는 Defending 항목에서 호날두 선수보다 높은 값을 보여주고 있다.

결론은 둘 다 모두 행복했으면 좋겠다.
둘 다 포기못해 난..

5. 마치며

20년도에 Python을 활용해서 처음으로 진행해본 데이터 분석인데 당시엔 굉장히 어려운 프로젝트라고 생각했었다.
2년이 지나고 포스팅하며 확인하니 지금은 더 잘할 수 있을거란 생각이 들기도 한다.
그래도 아직 갈길이 너무나도 멀다.

출신국가를 지도에 출력하거나 체형이 overall에 영향을 미치는가를 확인할 수도 있다고 한다.
더욱 다양한 결과물을 위해 조금 더 공부하고 노력하자.

좋은 웹페이지 즐겨찾기