LOL match 분석3
리그오브레전드의 오브젝트 경기기록이 승패에 얼마만큼 영향을 미치는지
Logistic Regression으로 파악하는 과정
경기 승패 인과분석
참고:me뇽
데이터 로드
import pandas as pd
import numpy as np
import statsmodels.api as sm
team_a = pd.read_csv('team1.csv',encoding='cp949',index_col=0)
team_b = pd.read_csv('team2.csv',encoding='cp949',index_col=0)
match_fin = pd.read_csv('match_data.csv',encoding='cp949')
정합성 검정 - team_a가 team_b와 모두 반대임을 확인
for i in range(len(team_a)):
wf_valid = team_a['win'].iloc[i]
if team_b['win'].iloc[i] != wf_valid:
pass
else:
print(str(i)+'행 데이터 정합성 문제')
각 경기별 게임 시간 병합
match_fin = match_fin[~match_fin['gameDuration'].isnull()]
team_a['gameDuration'] = match_fin['gameDuration'].tolist()
team_b['gameDuration'] = match_fin['gameDuration'].tolist()
match_fin['gameDuration'].index = range(len(match_fin))
team_a['gameDuration'].index = range(len(team_a))
team_b['gameDuration'].index = range(len(team_b))
game_df = pd.concat([team_a,team_b],axis=0)
#True and False로 되어있는 컬럼들을 1과 0으로 변환
col_lst = [col for col in game_df.columns if 'first' in col ]
dictionary = {True : 1, False:0}
for i in col_lst:
game_df[i] = game_df[i].map(dictionary)
game_df['win'] = game_df['win'].str.replace('Fail','Lose')
game_df['win_encoding']=game_df['win'].map({'Win':1,'Lose':0})
game_df['game_time'] = game_df['gameDuration'] / 60
상관계수 확인
game_df.select_dtypes(['int64','float64']).corr()[['win_encoding']]
win_encoding | |
---|---|
teamId | 0.000500 |
firstBlood | 0.188113 |
firstTower | 0.434792 |
firstInhibitor | 0.636784 |
firstBaron | 0.393765 |
firstDragon | 0.263951 |
firstRiftHerald | 0.229932 |
towerKills | 0.713446 |
inhibitorKills | 0.559402 |
baronKills | 0.382020 |
dragonKills | 0.475391 |
vilemawKills | NaN |
riftHeraldKills | 0.317980 |
dominionVictoryScore | NaN |
gameDuration | -0.000131 |
win_encoding | 1.000000 |
game_time | -0.000131 |
이긴 팀일 수록 타워,억제기,용,바론의 제거와 상관성이 높은것을 확인할 수 있다.
Logist Regression을 위한 변수 선택
Null값인 변수들은 제거하고 숫자형이 아닌 컬럼을 삭제한다.
teamID 컬럼 또한 사용하지 않는다
reg_df = game_df.drop(columns=['teamId','vilemawKills','dominionVictoryScore','win','game_time'])
reg_df = reg_df.dropna()
reg_df['win_encoding'] = reg_df['win_encoding'].astype('int64')
logit = sm.Logit(reg_df[['win_encoding']],reg_df[reg_df.columns.tolist()[:-2]])
result = logit.fit()
Optimization terminated successfully.
Current function value: 0.511959
Iterations 7
summary와 summary2의 차이는 r-squared값이나 AIC값 등이 없기 때문에 summary2 값으로 계수를 해석한다
result.summary2()
Model: | Logit | Pseudo R-squared: | 0.261 |
Dependent Variable: | win_encoding | AIC: | 94253.1625 |
Date: | 2020-07-04 15:58 | BIC: | 94356.8911 |
No. Observations: | 92030 | Log-Likelihood: | -47116. |
Df Model: | 10 | LL-Null: | -63790. |
Df Residuals: | 92019 | LLR p-value: | 0.0000 |
Converged: | 1.0000 | Scale: | 1.0000 |
No. Iterations: | 7.0000 |
Coef. | Std.Err. | z | P>|z| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
firstBlood | -0.7196 | 0.0159 | -45.2615 | 0.0000 | -0.7508 | -0.6884 |
firstTower | 0.7437 | 0.0215 | 34.6088 | 0.0000 | 0.7016 | 0.7858 |
firstInhibitor | 1.9232 | 0.0365 | 52.7254 | 0.0000 | 1.8518 | 1.9947 |
firstBaron | 0.6401 | 0.0452 | 14.1479 | 0.0000 | 0.5515 | 0.7288 |
firstDragon | -0.1653 | 0.0207 | -7.9889 | 0.0000 | -0.2059 | -0.1248 |
firstRiftHerald | -0.5548 | 0.0293 | -18.9052 | 0.0000 | -0.6123 | -0.4973 |
towerKills | 0.0617 | 0.0055 | 11.2704 | 0.0000 | 0.0510 | 0.0724 |
inhibitorKills | 0.3390 | 0.0246 | 13.7873 | 0.0000 | 0.2908 | 0.3872 |
baronKills | -0.2027 | 0.0381 | -5.3218 | 0.0000 | -0.2774 | -0.1281 |
dragonKills | -0.0338 | 0.0107 | -3.1573 | 0.0016 | -0.0548 | -0.0128 |
riftHeraldKills | -0.1487 | 0.0206 | -7.2092 | 0.0000 | -0.1891 | -0.1083 |
모든 변수가 p-value가 유의수준 0.05이하에서 (95% 신뢰구간) 통계젹으로 유의미하다는 결론이 도출된다
오즈비 계산
로지스틱 회귀식의 오즈는 일어나지 않을 확률 대비 일어나 확률을 나타낸다
회귀계수를 exponential^x에서 x에 대입한 값으로 해석을 진행한다
예를들어 다른 변숙들이 고정되어 있는 상태에서 FirsTowe변수가 한 단위 증가하면
승리할 확률이 1.67배(exponential ^ 0.5160)증가한다. 혹은 67% 증가한다.
for i in range(len(result.params)):
print(f'다른 변수가 고정되어 있으며, {result.params.keys()[i]}이 한단위 상승할 때 승리할 확률이 {np.round(np.exp(result.params.values[i]),2)}배 증가한다.\n')
다른 변수가 고정되어 있으며, firstBlood이 한단위 상승할 때 승리할 확률이 0.49배 증가한다.
다른 변수가 고정되어 있으며, firstTower이 한단위 상승할 때 승리할 확률이 2.1배 증가한다.
다른 변수가 고정되어 있으며, firstInhibitor이 한단위 상승할 때 승리할 확률이 6.84배 증가한다.
다른 변수가 고정되어 있으며, firstBaron이 한단위 상승할 때 승리할 확률이 1.9배 증가한다.
다른 변수가 고정되어 있으며, firstDragon이 한단위 상승할 때 승리할 확률이 0.85배 증가한다.
다른 변수가 고정되어 있으며, firstRiftHerald이 한단위 상승할 때 승리할 확률이 0.57배 증가한다.
다른 변수가 고정되어 있으며, towerKills이 한단위 상승할 때 승리할 확률이 1.06배 증가한다.
다른 변수가 고정되어 있으며, inhibitorKills이 한단위 상승할 때 승리할 확률이 1.4배 증가한다.
다른 변수가 고정되어 있으며, baronKills이 한단위 상승할 때 승리할 확률이 0.82배 증가한다.
다른 변수가 고정되어 있으며, dragonKills이 한단위 상승할 때 승리할 확률이 0.97배 증가한다.
다른 변수가 고정되어 있으며, riftHeraldKills이 한단위 상승할 때 승리할 확률이 0.86배 증가한다.
firstInhibitor 변수가 가장 큰 영향을 끼치는 것을 확인할 수 있다.