[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에 영향을 미치는가를 확인할 수도 있다고 한다.
더욱 다양한 결과물을 위해 조금 더 공부하고 노력하자.
Author And Source
이 문제에 관하여([Python] FIFA 데이터 EDA), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@han3528/Python-FIFA-EDA저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)