참고 데이터:
https://www.kaggle.com/datasets/hugomathien/soccer
유럽축구 통계 데이터를 이용한 승무패 예측 예제
처음으로 null값이 많은, 완벽하게 깔끔하지 않은 데이터를 다루는 연습을 했다.
골재, 집합 이라는 뜻
숨겨진 행과 오류 값을 무시할 수 있는 옵션을 통해 목록이나 데이터베이스에 여러가지 집계 함수를 적용시킨다.
유럽축구 예제에서는 날짜에 따라 여러개의 데이터를 가지는 선수의 overall_rate 같은 값들의 평균을 구하거나, 가장 많이 등장하는 값을 대표값으로 정해주는 작업을 위해 aggregate 함수를 사용했다.
def most(x):
return x.value_counts().index[0]
team_map = df_team_att.groupby('team_api_id').aggregate(
{
'buildUpPlaySpeed' : 'mean',
'buildUpPlaySpeedClass' : most,
'buildUpPlayDribblingClass' : most,
'buildUpPlayPassing': 'mean',
'buildUpPlayPassingClass': most,
'buildUpPlayPositioningClass': most,
'chanceCreationPassing': 'mean',
'chanceCreationPassingClass':most,
'chanceCreationCrossing': 'mean',
'chanceCreationCrossingClass': most,
'chanceCreationShooting': 'mean',
'chanceCreationShootingClass':most,
'chanceCreationPositioningClass': most,
'defencePressure': 'mean',
'defencePressureClass': most,
'defenceAggression': 'mean',
'defenceAggressionClass': most,
'defenceTeamWidth': 'mean',
'defenceTeamWidthClass': most,
'defenceDefenderLineClass': most
}
)
같은 팀 아이디, 같은 항목에 여러가지 데이터가 존재했기 때문에 most
라는 함수를 만들어서 정의 해 주고, 수치 데이터는 평균값을, 속성 데이터는 가장 많이 나온 값을 대표값으로 정해주면서 데이터를 전처리했다. 스탯같은 경우 평균보다는 가장 최근 스탯을 참고하는 것이 좋지 않을까 라는 생각도 있지만 폼은 일시적이지만 클래스는 영원하다 라는 말이 있는 만큼 평균값을 사용하는 것도 의미 있는 분석인것 같다.
python의 map함수는 아직 조금 어색하다. 자주 사용해 보지 않아서 그런것 같다.
리스트의 요소를 지정된 함수로 처리해주는 함수로 원본 리스트의 변경 없이 새 함수를 생성해주는 특성을 가지고 있다고 한다.
데이터를 다룰때 자주 사용할 수 밖에 없는 함수인것 같으니 얼른 익숙해져야겠다.
for team in ['home_', 'away_']:
team_map.index.name = team + 'team_api_id'
for col in team_map.columns:
df[team + col] = df_match[team_map.index.name].map(team_map[col])
예제에서는 기존 데이터들을 취합하는데 자주 사용했다.
판다스의 평균 계산, 열이나 행 삭제 등 작업을 할 때 axis를 지정해야 한다.
axis=0이면 행 row을 따라 동작하고, axis=1이면 열column을 따라 동작한다.
그렇기 때문에 column에 대한 작업을 진행 할때는 axis=1로 맞추어준다.
여태까지의 작업들은 주로 column을 drop하는 작업들을 했기 때문에 axis는 항상 1로 맞추고 사용했었다.
inplace의 default 값은 False이다. 그 경우 명려을 실행한 후 메소드가 적용된 데이터 프레임을 기존 데이터 프레임으로 대체한다는 뜻이다.
inlace 옵션이 True이면 명령어 실행 후 메소드가 적용된 데이터 프레임으로 반환 한다. 즉 반환값은 column이 삭제된 dataframe이 된다.
원본 데이터가 변하는가 변하지 않는가의 차이가 있다.
차원의 저주란 차원이 증가하면서 학습데이터 수가 차원 수보다 적어져서 성능이 저하되는 현상을 말한다.
차원이 증가할수록 변수가 증가하고, 개별 차원 내에서 학습할 데이터 수가 적어진다.
관측치보다 변수 수가 많아지는 경우레 차원의 저주 문제가 발생한다. 모든 변수의 증가가 차원의 저주를 야기하는 것은 아니다. 이를 해결하기 위해서는 샘플의 밀도가 충분히 높아질 때 까지 데이터를 모아야 한다.