데이터 소개
- 이번 주제는 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 기반의 모델 학습 방법 습득
- 학습된 모델로부터 인사이트 습득 방법 이해
## Step 1. 데이터셋 준비하기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
### 문제 1. Colab Notebook에 Kaggle API 세팅하기
import os
# os.environ을 이용하여 Kaggle API Username, Key 세팅하기
os.environ["KAGGLE_USERNAME"] = 'jmsu5270'
os.environ["KAGGLE_KEY"] = '55175f50d3fab35dea43d1c5f4618359'
### 문제 2. 데이터 다운로드 및 압축 해제하기
# Linux 명령어로 Kaggle API를 이용하여 데이터셋 다운로드하기 (!kaggle ~)
# Linux 명령어로 압축 해제하기
!kaggle datasets download -d bobbyscience/league-of-legends-diamond-ranked-games-10-min
!unzip '*.zip'
### 문제 3. Pandas 라이브러리로 csv파일 읽어들이기
# pd.read_csv()로 csv파일 읽어들이기
df = pd.read_csv("high_diamond_ranked_10min.csv")
## Step 2. EDA 및 데이터 기초 통계 분석
### 문제 4. 데이터프레임의 각 컬럼 분석하기
# DataFrame에서 제공하는 메소드를 이용하여 컬럼 분석하기 (head(), info(), describe())
df.head()
df.info()
df.describe()
### 문제 5. 각 컬럼의 Correlation 히트맵으로 시각화하기
# DataFrame의 corr() 메소드와 Seaborn의 heatmap() 메소드를 이용하여 Pearson's correlation 시각화하기
df.corr()
fig = plt.figure(figsize=(4,10))
sns.heatmap(df.corr()[['blueWins']],annot=True)
# [[]] : 데이터프레임 * 히트맵에 사용하기 위해서는 데이터프레임 양식을 따라야함
# [] : 시리즈
# 전체 히트맵으로 보면 가시적이지 않고 수치도 잘 보이지 않아서, 하나의 데이터(블루팀 승리)와 나머지 요소들을 비교해 볼 수 있다.
df.corr()
# 다시 데이터를 살펴보면
# blueFirstBlood와 redFristBlood값이 -1의 상관관계를 보이는 것을 알 수 있다.
# redDeath와 blueKills도 1의 상관관계를 보이는 것을 알 수 있다.
# 선형 회귀 분석을 할 시 위의 요소들을 함께 변수에 넣으면 다중공선성 문제로 분석이 제대로 이루어지지 않을 수 있다.
### 문제 6. 각 컬럼과 승리 여부의 관계 시각화하기
# Seaborn의 countplot() 및 histplot()을 사용하여 각 컬럼과 승/패의 관계를 시각화
fig = plt.figure(figsize=(10,5))
sns.histplot(x='blueGoldDiff', data=df, hue='blueWins',palette='RdBu',kde=True)
fig = plt.figure(figsize=(10,5))
sns.histplot(x='blueKills', data=df, hue='blueWins',palette='RdBu',kde=True, bins=8)
#bins로 범위 조정 해줄 수 있다.
# 조인트플롯
sns.jointplot(x='blueKills',y='blueGoldDiff',data=df,hue='blueWins')
# 우상향하긴 하지만 어느정도 분포가 퍼져있어서 상관관계가 강하진 않지만 있다고 볼 수 있다.
sns.jointplot(x='blueExperienceDiff',y='blueGoldDiff',data=df,hue='blueWins')
# 경험치와 Gold의 상관관계가 매우 높게 나타난다.
sns.countplot(x='blueDragons',data=df,hue='blueWins',palette='RdBu')
sns.countplot(x='redDragons',data=df,hue='blueWins',palette='RdBu')
## Step 3. 모델 학습을 위한 데이터 전처리
### 문제 7. StandardScaler를 이용해 수치형 데이터 표준화하기
from sklearn.preprocessing import StandardScaler
df.columns
df.drop(['gameId','redFirstBlood', 'redKills', 'redDeaths',
'redTotalGold', 'redTotalExperience','redGoldDiff','redExperienceDiff'],axis=1,inplace=True)
# StandardScaler를 이용해 수치형 데이터를 표준화하기
# Hint) Multicollinearity를 피하기 위해 불필요한 컬럼은 drop한다.
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_scaled = pd.DataFrame(X_scaled,index=X_num.index, columns=X_num.columns)
X = pd.concat([X_scaled,X_cat], axis=1)
y = df['blueWins']
X
### 문제 8. 학습데이터와 테스트데이터 분리하기
from sklearn.model_selection import train_test_split
# 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 모델 생성/학습하기
from sklearn.linear_model import LogisticRegression
# LogisticRegression 모델 생성/학습
model_lr = LogisticRegression()
model_lr.fit(X_train,y_train)
### 문제 10. 모델 학습 결과 평가하기
from sklearn.metrics import classification_report
# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_lr.predict(X_test)
print(classification_report(y_test, pred))
### 문제 11. XGBoost 모델 생성/학습하기
from xgboost import XGBClassifier
# XGBClassifier 모델 생성/학습
model_xgb = XGBClassifier()
model_xgb.fit(X_train,y_train)
### 문제 12. 모델 학습 결과 평가하기
# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_xgb.predict(X_test)
print(classification_report(y_test,pred))
## Step5 모델 학습 결과 심화 분석하기
### 문제 13. Logistic Regression 모델 계수로 상관성 파악하기
# Logistic Regression 모델의 coef_ 속성을 plot하기
model_coef = pd.DataFrame(data=model_lr.coef_[0],index=X.columns, columns=['Model Coefficient'])
model_coef.sort_values(by='Model Coefficient',ascending = False , inplace = True)
plt.bar(model_coef.index, model_coef['Model Coefficient'])
plt.xticks(rotation=90)
plt.grid()
plt.show()
### 문제 14. XGBoost 모델로 특징의 중요도 확인하기
# XGBoost 모델의 feature_importances_ 속성을 plot하기
fig = plt.figure(figsize=(10,10))
plt.barh(X.columns, model_xgb.feature_importances_)
blueGoldDiff가 가장 승리에 영향이 큰 요인이다.
그 다음은 , blueExperienceDiff이다.
'Data Mining with Kaggle' 카테고리의 다른 글
[로지스틱 회귀분석] Students' Academic Performance Dataset (0) | 2021.06.19 |
---|