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 변수가 가장 큰 영향을 끼치는 것을 확인할 수 있다.