본문 바로가기
AI/AI 부트캠프

[AI 부트캠프] DAY 34 - EDA 프로젝트 5

by HOHHOH 2023. 9. 2.

[오늘의 일지]

EDA 프로젝트 - 본격적으로 분석 시작

[상세 내용]

EDA 프로젝트

분석 방향 설정

- 지난 일지들을 보면 알다시피 저희 조는 조가 형성되고 스포츠라는 도메인으로 모여서 세부적 주제는 축구를 선택했습니다. 그렇게 1차적인 목표는 '선수의 연봉과 성적의 관계', '선수 연령이 증가하면서 스탯이 떨어질 것이라는 예상'으로 정하게 되었습니다. 그런데 선수의 연봉과 성적의 관계는 막상 데이터를 가지고 그래프를 만들어 보려고 하면 단순한 그래프로 밖에 표현이 안되고 더 이상 분석이라고 할 것도 없을 정도로 간단한 지표였습니다. 그래서 과감하게 포기하고 일단 하나의 주제만 분석해 보기로 했습니다.

# eda_df가 전체 데이터 입니다.
sns.jointplot(x="Age", y="Rating", data=eda_df)
plt.suptitle("Age and Rating",fontsize = 15, y=1.05)
plt.show()

 

연령별평점 분포 그래프

 

# eda_df가 전체 데이터 입니다.
static_df = eda_df[eda_df['Min']>1000].groupby(['Position', 'Age Lev']).mean(numeric_only=True)
sns.jointplot(data=static_df, x="ADJ Salary", y="Rating", kind="reg")

연봉과 선수평점의 관계 그래프

 

우선적으로 선수 연령이 증가하면서 스탯이 떨어질 것이라는 예상에 대해 분석

- 이 주제에 대한 분석도 사실 그냥 나이별로 x축에 넣고 y축에 여러 가지 변수를 주면서 그래프의 모양을 분석하면 어느 정도 평균적인 분석은 가능하겠지만 사실 그런 분석은 말이 안 되는 게 사람은 나이가 들면 신체적으로 떨어지기 때문에 절대적인 지표라고 볼 수 없었다. 그래서 특정 선수를 뽑아서 평균과 비교해 보는 게 오히려 더 분석적인 측면에서 맞다고 느껴서 이 주제도 바꾸게 되었다. 우선 전체 평균을 연령별로 나누고 포지션별로도 나눠서 비교해 보는 그래프를 보여드리겠습니다. 그래도 그래프를 보면 수비수들은 비교적 어린 나이에는 여봉을 적게 받다가 어느 구간이 지나면 급격하게 증가하는 경향성을 찾아볼 수 있었습니다. 또 이번 그래프에서는 32세까지 그렇다 할 감소를 보이지 않은 것으로 보입니다.

# 선수 분포를 보면 너무 어리거나 너무 나이가 많으면 수치가 적어지기 때문에 묶었습니다.
eda_df['Age Lev'] = eda_df['Age'].apply(lambda age: '<21' if age < 21 else '32<' if age>32 else f'{age}')
# 정확한 지표를 위해 평균적으로 1000분 이상 출전한 선수를 대상으로 합니다.
static_df = eda_df[eda_df['Min']>1000].groupby(['Position', 'Age Lev']).mean(numeric_only=True)
plt.figure(figsize=(15, 5))
# 'Age Lev' 컬럼을 순서에 맞게 정렬
age_order = ['<21', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '32<']
eda_df['Age Lev'] = pd.Categorical(eda_df['Age Lev'], categories=age_order, ordered=True)
sns.lineplot(data=eda_df, x='Age Lev', y='ADJ Salary')
sns.lineplot(data=static_df, x='Age Lev', y='ADJ Salary', hue='Position', palette='tab10')
plt.legend(title='Position', loc='upper left')
plt.xlabel('Age')
plt.ylabel('ADJ Salary')
plt.show()

연봉과 나이 구간 관계 그래프

 

우선적으로 재설정한 특정 선수와 평균 지표를 비교해서 분석하기

- 선수를 분석하기에 앞서 그 선수가 어느 포지션인지를 확인해 주고 기왕이면 동포지션과 비교하는 분석을 해보기로 했습니다. 그래서 포지션과 나이를 그룹으로 잡아주고 공격수이기 때문에 공격지표별로 변수를 바꿔주면서 그래프로 표현해 봤습니다. 주제가 정해지고 당연하게도 손흥민 선수의 데이터부터 비교를 해보기로 했습니다. 아래의 그래프는 손흥민 선수의 비교 분석 그래프입니다.

plt.figure(figsize=(15, 18))
# 'Age Lev' 컬럼을 순서에 맞게 정렬
age_order = ['<21', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '32<']
eda_df['Age Lev'] = pd.Categorical(eda_df['Age Lev'], categories=age_order, ordered=True)
plt.subplot(6, 2, 1)
sns.lineplot(data=static2_df, x='Age Lev', y='G', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='G', label='AVG',linestyle='dashdot')
plt.title("Player's Goals vs AVG Foward's Goals",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel("Goals")
plt.legend()

# 두 번째 그래프 그리기
plt.subplot(6, 2, 3)
sns.lineplot(data=static2_df, x='Age Lev', y='xG', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='xG', label='AVG',linestyle='dashdot')
plt.title("Player's Expected Goals vs AVG Foward's Expected Goals",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel("Expected Goals")
plt.legend()

plt.subplot(6, 2, 5)
sns.lineplot(data=static2_df, x='Age Lev', y='A', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='A', label='AVG',linestyle='dashdot')
plt.title("Player's Assists vs AVG Foward's Assists",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel("Assists")
plt.legend()

plt.subplot(6, 2, 7)
sns.lineplot(data=static2_df, x='Age Lev', y='xA', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='xA', label='AVG',linestyle='dashdot')
plt.title("Player's Expected Assists vs AVG Foward's Expected Assists",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel("Expected Assists")
plt.legend()

plt.subplot(6, 2, 9)
sns.lineplot(data=static2_df, x='Age Lev', y='NPG', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='NPG', label='AVG',linestyle='dashdot')
plt.title("Player's NPG vs AVG Foward's NPG",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel('Non Penalty Goals')
plt.legend()

plt.subplot(6, 2, 11)
sns.lineplot(data=static2_df, x='Age Lev', y='Drb_Off', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='Drb_Off', label='AVG',linestyle='dashdot')
plt.title("Player's Dribbles vs AVG Foward's Dribbles",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel('Dribbles')
plt.legend()

plt.subplot(6, 2, 2)
sns.lineplot(data=static2_df, x='Age Lev', y='Tackles', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='Tackles', label='AVG',linestyle='dashdot')
plt.title("Player's Tackles vs AVG Foward's Tackles",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel('Tackles')
plt.legend()

plt.subplot(6, 2, 4)
sns.lineplot(data=static2_df, x='Age Lev', y='Inter', label='player',linestyle='dashdot')
sns.lineplot(data=forward_static_df , x='Age Lev', y='Inter', label='AVG',linestyle='dashdot')
plt.title("Player's Interceptions vs AVG Foward's Interceptions",fontsize = 15, y=1)
plt.xlabel('Age')
plt.ylabel('Interceptions')
plt.legend()

plt.tight_layout()
plt.show()

왼쪽이 공격지표, 오른쪽이 수비지표입니다.

 

[마무리]

 오늘은 분석 주제에 대해서 여러 가지 방면으로 그래프를 만들어 보기도 하면서 어떤 분석이 유의미한 면을 가지고 있을 생각 해보았습니다. 최종적으로 특정 선수를 전체 동포지션 평균과 비교해 보는 걸로 첫 번째 주제를 결정지었습니다. 하지만 아직 두 가지 주제를 더 설정할 예정이고 대략 다음 주 수요일까지는 마감을 해야 하기 때문에 시간적으로는 아직 여유가 있어서 주말 동안 천천히 생각해 보고 잘 마무리를 할 수 있도록 노력해야 될 거 같습니다. 이번 한 주도 정말 빨리 흘러간 느낌을 받으면서 일지를 끝마치겠습니다.

반응형

댓글