축구선수의 능력치를 데이터프레임화 시키고 PCA를 사용해서 차원을 축소 시켜보자!
'https://sofifa.com/players?showCol%5B0%5D=ae&showCol%5B1%5D=ta&showCol%5B2%5D=ts&showCol%5B3%5D=to&showCol%5B4%5D=tp&showCol%5B5%5D=td&showCol%5B6%5D=tg&showCol%5B7%5D=oa&col=oa&sort=desc'
위 링크에서 크롤링해 온 축구선수의 능력치 데이터를 이용
아래와 같은 데이터를 형성했다.
포지션의 개수가 너무 다양해서 크게 FW, MF, DF, GK로 나누었다.
new_position = []
for i in new_df['position']:
if i in ['ST', 'CF', 'LW', 'RW']:
new_position.append('FW')
elif i in ['CM', 'CAM', 'CDM', 'RM', 'LM']:
new_position.append('MF')
elif i in ['CB', 'LB', 'RB', 'RWB', 'LWB']:
new_position.append('DF')
else:
new_position.append('GK')
new_df['new_position'] = pd.DataFrame(new_position)
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
pca_model = pca.fit_transform(new_df[['Attacking', 'Skill', 'Movement', 'Power', 'Defending', 'Goalkeeping']])
new_df[['x', 'y']] = pca_model
sns.scatterplot(x = 'x', y = 'y', hue = 'new_position', data = new_df)
plt.show()
'Attacking', 'Skill', 'Movement', 'Power', 'Defending', 'Goalkeeping' 6개의 feature를 갖고 있는 Dataset이 주성분 'x', 'y'로 차원축소 되었음을 볼 수 있다.
머신러닝, 딥러닝을 위해 데이터셋을 이용할 때 스케일링이 되지 않은 feature를 그대로 사용하면 유의미한 결과를 얻지 못할 수 있다.
예를 들어 LinearRegression의 상황을 보자. x1은 0 ~ 10의 분포를 갖고 x2는 10000 ~ 100000의 분포를 갖는데 y는 10000 ~ 100000의 분포를 갖는다고 가정해보자. 이 때는 x1이 유의미한 Feature일 수 있음에도 y에 영향을 주지 않는다고 생각할 수 있다. 그렇기 때문에 데이터 스케일링을 통해 분포를 맞춰줘야 하는 상황이 있다.
물론 모든 상황에서 스케일링을 해줘야 하는 것은 아니다. 오히려 스케일링을 하지 않고 원래의 분포를 유지해야 하는 상황도 있다.