주제 : 롤 좀 하니? '이것'만 하면 무조건 이긴다!
- 데이터로 알아보는 리그 오브 레전드의 승리 공식
.
데이터 소개¶
- 이번 주제는 League of Legends Diamond Ranked Games (10 min) 데이터셋을 사용합니다.
- 다음 1개의 csv 파일을 사용합니다.
high_diamond_ranked_10min.csv
- 각 파일의 컬럼은 아래와 같습니다.
gameId: 게임 판의 고유 ID
blueWins: 블루팀의 승리 여부 (0: 패배, 1: 승리)
xxxWardsPlaced: xxx팀에서 설치한 와드의 수
xxxWardsDestroyed: xxx팀에서 파괴한 와드의 수
xxxFirstBlood: xxx팀의 첫번째 킬 달성 여부
xxxKills: xxx팀의 킬 수
xxxDeaths: xxx팀의 죽음 수
xxxAssists: xxx팀의 어시스트 수
xxxEliteMonsters: xxx팀이 죽인 엘리트 몬스터 수
xxxDragons: xxx팀이 죽인 용의 수
xxxHeralds: xxx팀이 죽인 전령의 수
xxxTowersDestroyed: xxx팀이 파괴한 탑의 수
xxxTotalGold: xxx팀의 전체 획득 골드
xxxAvgLevel: xxx팀의 평균 레벨
xxxTotalExperience: xxx팀의 총 경험치 획득량
xxxTotalMinionsKilled: xxx팀의 총 미니언 킬 수
xxxTotalJungleMinionsKilled: xxx팀의 총 정글 미니언 킬 수
xxxGoldDiff: xxx팀과 다른 팀 간의 골드 획득량 차이
xxxExperienceDiff: xxx팀과 다른 팀과의 경험치 획득량 차이
xxxCSPerMin: xxx팀의 분당 CS 스코어
xxxGoldPerMin: xxx팀의 분당 골드 획득량
최종 목표¶
- 일상에서 볼 수 있는 데이터의 활용
- 데이터 시각화를 통한 인사이트 습득 방법의 이해
- Scikit-learn 기반의 모델 학습 방법 습득
- 학습된 모델로부터 인사이트 습득 방법 이해
- LoL 순위 게임 결과 분류
Step 1. 데이터셋 준비하기¶
In [32]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
Pandas 라이브러리로 csv파일 읽어들이기¶
In [36]:
# pd.read_csv()로 csv파일 읽어들이기
df = pd.read_csv('high_diamond_ranked_10min.csv')
Step 2. EDA 및 데이터 기초 통계 분석¶
문제 4. 데이터프레임의 각 컬럼 분석하기¶
In [37]:
# DataFrame에서 제공하는 메소드를 이용하여 컬럼 분석하기 (head(), info(), describe())
df.head()
Out[37]:
In [ ]:
In [38]:
df.describe(include=[np.number])
Out[38]:
In [39]:
df.describe(exclude=[object])
Out[39]:
In [40]:
df.info()
문제 5. 각 컬럼의 Correlation 히트맵으로 시각화하기¶
In [43]:
df.corr().head()
Out[43]:
컬럼이 많아 히트맵이 직관적이지 않음¶
In [60]:
# DataFrame의 corr() 메소드와 Seaborn의 heatmap() 메소드를 이용하여 Pearson's correlation 시각화하기
ax=plt.figure(figsize=(10,10))
ax=sns.heatmap(df.corr(),annot=False,linewidths=.5)
ax=plt.show()
컬럼이 많아 구분이 조금 힘들다 종속변수에 대해서만 진행 -> 한 눈에 들어옴¶
In [61]:
# DataFrame의 corr() 메소드와 Seaborn의 heatmap() 메소드를 이용하여 Pearson's correlation 시각화하기
fig = plt.figure(figsize=(4, 10))
sns.heatmap(df.corr()[['blueWins']], annot=True)
Out[61]:
In [69]:
df.columns
Out[69]:
In [ ]:
### 아래 4개가 종속변수와 0.4 이상의 상관 관계
### Blue total gold
In [108]:
df.columns[df.corr()['blueWins']>0.4]
Out[108]:
문제 6. 각 컬럼과 승리 여부의 관계 시각화하기¶
In [134]:
df.head()
Out[134]:
In [139]:
df.select_dtypes(include='number')
Out[139]:
이진 변수들은 count plot¶
이겼을 때 블루팀이 드래곤을 안죽였을 때 많이졌군..큰 의미는 없다¶
In [ ]:
# Seaborn의 countplot() 및 histplot()을 사용하여 각 컬럼과 승/패의 관계를 시각화 ->
In [146]:
sns.countplot(x='redTowersDestroyed',hue='blueWins',data=df)
Out[146]:
numeric 값은 hist plot¶
In [147]:
sns.histplot(x='blueExperienceDiff',hue='blueWins',data=df)
Out[147]:
종속과 두 변수를 함께 보려면 joint¶
블루팀이 이겼을 때 킬이 많은 건 당연한 이야기...¶
In [148]:
sns.jointplot(x='blueKills', y='blueGoldDiff', data=df, hue='blueWins')
Out[148]:
Step 3. 모델 학습을 위한 데이터 전처리¶
문제 7. StandardScaler를 이용해 수치형 데이터 표준화하기¶
In [1]:
from sklearn.preprocessing import StandardScaler
X_num = df.select_dtypes(include='number')
X_cat =df.select_dtypes(include='category')
X
y = df['blueWins']
원래는 이런 식으로 전처리 해야하는데 type을 보니 모두 int라.... 노가다로 하든 타입을 미리바꿔주던 하나 선택!
쓸데 없는 변수들 미리 지워주기 <-> 서로서로 다중공선성이 있거나 gameid 같은 무의미¶
In [151]:
df[['gameId', 'redFirstBlood', 'redKills', 'redDeaths',
'redTotalGold', 'redTotalExperience', 'redGoldDiff',
'redExperienceDiff']]
Out[151]:
표준화는 예전 커널들에서 계속 다뤄줬으므로 자세한 설명은 생략하겠다¶
In [153]:
from sklearn.preprocessing import StandardScaler
In [152]:
# StandardScaler를 이용해 수치형 데이터를 표준화하기
# Hint) Multicollinearity를 피하기 위해 불필요한 컬럼은 drop한다.
df.drop(['gameId', 'redFirstBlood', 'redKills', 'redDeaths',
'redTotalGold', 'redTotalExperience', 'redGoldDiff',
'redExperienceDiff'], axis=1, inplace=True)
In [155]:
X_num = df[['blueWardsPlaced', 'blueWardsDestroyed',
'blueKills', 'blueDeaths', 'blueAssists', 'blueEliteMonsters',
'blueTowersDestroyed', 'blueTotalGold',
'blueAvgLevel', 'blueTotalExperience', 'blueTotalMinionsKilled',
'blueTotalJungleMinionsKilled', 'blueGoldDiff', 'blueExperienceDiff',
'blueCSPerMin', 'blueGoldPerMin', 'redWardsPlaced', 'redWardsDestroyed',
'redAssists', 'redEliteMonsters', 'redTowersDestroyed', 'redAvgLevel', 'redTotalMinionsKilled',
'redTotalJungleMinionsKilled', 'redCSPerMin', 'redGoldPerMin']]
X_cat = df[['blueFirstBlood', 'blueDragons', 'blueHeralds', 'redDragons', 'redHeralds']]
scaler=StandardScaler()
scaler.fit(X_num)
X_scaled=scaler.transform(X_num)
X = pd.concat([X_scaled, X_cat], axis=1)
y = df['blueWins']
In [160]:
scaler=StandardScaler()
scaler.fit(X_num)
X_scaled=scaler.transform(X_num)
In [161]:
X_scaled
Out[161]:
In [162]:
X_scaled=pd.DataFrame(X_scaled,index=X_num.index,columns=X_num.columns)
In [163]:
X=pd.concat([X_scaled,X_cat],axis=1)
y=df['blueWins']
In [164]:
X
Out[164]:
문제 8. 학습데이터와 테스트데이터 분리하기¶
In [166]:
from sklearn.model_selection import train_test_split
In [168]:
# train_test_split() 함수로 학습 데이터와 테스트 데이터 분리하기
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=1)
Step 4. Classification 모델 학습하기¶
문제 9. Logistic Regression 모델 생성/학습하기¶
In [169]:
from sklearn.linear_model import LogisticRegression
In [172]:
# LogisticRegression 모델 생성/학습
model_lr = LogisticRegression(random_state=1,max_iter=100)
model_lr.fit(X_train,y_train)
Out[172]:
문제 10. 모델 학습 결과 평가하기¶
In [174]:
from sklearn.metrics import classification_report
0.74 정도의 정확도 ( imbalanced 되 있지 않으므로 단순 accuracy 참고)¶
In [175]:
# Predict를 수행하고 classification_report() 결과 출력하기
pred =model_lr.predict(X_test)
print(classification_report(y_test,pred))
문제 11. XGBoost 모델 생성/학습하기¶
In [177]:
from xgboost import XGBClassifier
In [179]:
# XGBClassifier 모델 생성/학습
model_xgb = XGBClassifier()
model_xgb.fit(X_train,y_train)
Out[179]:
부스팅 모델을 쓰니 오히려 정확도가 조금 내려감 - 이럴 때도있음 ..ㅎㅎ¶
문제 12. 모델 학습 결과 평가하기¶
In [181]:
# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_xgb.predict(X_test)
print(classification_report(y_test,pred))
Step5 모델 학습 결과 심화 분석하기¶
문제 13. Logistic Regression 모델 계수로 상관성 파악하기¶
In [190]:
model_lr.coef_
Out[190]:
In [188]:
model_coef = pd.DataFrame(data=model_lr.coef_[0], index=X.columns, columns=['Model Coefficient'])
In [189]:
model_coef
Out[189]:
In [192]:
model_coef.sort_values(by='Model Coefficient', ascending=False, inplace=True)
model_coef
Out[192]:
blueGoldDiff blueExperienceDiff 가 모델 구성에 중요한 feature#182;
In [195]:
# Logistic Regression 모델의 coef_ 속성을 plot하기
plt.bar(model_coef.index, model_coef['Model Coefficient'])
plt.xticks(rotation=90)
plt.grid()
plt.show()
Feature importance 도 마찬가지로 blueGoldDiff가 중요하다¶
문제 14. XGBoost 모델로 특징의 중요도 확인하기¶
In [196]:
# XGBoost 모델의 feature_importances_ 속성을 plot하기
fig = plt.figure(figsize=(10, 10))
plt.barh(X.columns, model_xgb.feature_importances_)
Out[196]:
끝¶
반응형
'Project & Kaggle' 카테고리의 다른 글
철판 제조 공정 데이터를 활용한 분류모형 생성 및 성능 비교 (0) | 2021.04.07 |
---|---|
유럽 축구 경기 및 선수 특징 추출을 통한 승부 예측 (0) | 2021.04.02 |
학생들의 수업 시간 행동 분석을 통한 성적 예측 (0) | 2021.02.02 |
심부전증 환자 데이터를 통한 사망 여부 Classification (0) | 2021.02.01 |
Dog and cat Classification with CNN (0) | 2020.12.15 |