본문 바로가기

Data Mining with Kaggle

[로지스틱 회귀분석] league-of-legends-diamond-ranked-games-10-min

 

데이터 소개

- 이번 주제는 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이다.