LOL match 분석2

리그 오브 레전드 데이터 분석2

참고:me뇽

데이터 로드

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings(action='ignore')
plt.rc('font',family='Malgun Gothic')
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')

정합성 검정

#팀a와 팀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)+'행 데이터 정합성 문제')

데이터 전처리

#Null값 제거
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)
game_df.shape
(92034, 16)
#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['game_time'] = game_df['gameDuration'] / 60
#게임 시간별 데이터 분할
game_part1 = game_df[game_df['game_time']>=30].sort_values('win')
game_part2 = game_df[game_df['game_time']>=40].sort_values('win')
game_part3 = game_df[game_df['game_time']<30].sort_values('win')
game_part4 = game_df[game_df['game_time']<20].sort_values('win')
#시각화를 위한 함수
def first_valid_visualize(df,target,variable):
    sns.pointplot(target,variable,data=df)
    plt.title(variable+' 변수의 승리확률')
    plt.show()

연속형 데이터 EDA

first_valid_visualize(game_df,'win','towerKills')

output_20_0

이긴 팀의 타워를 철거한 수가 평균적으로 많은 것이 확인 가능하다

first_valid_visualize(game_df,'win','baronKills')

output_22_0

이긴 팀의 바론을 처치한 횟수가 평균적으로 높은것을 확인할 수 있다

first_valid_visualize(game_df,'win','dragonKills')

output_24_0

이긴 팀의 드래곤 처치 횟수가 평균적으로 높은 것을 확인할 수 있다

경기 시간별 데이터 EDA

def sequence_var_inf(variable):
    global game_part1, game_part2, game_part3, game_part4
    
    value1 = game_part4[variable].value_counts().keys().tolist()
    value2 = game_part3[variable].value_counts().keys().tolist()
    value3 = game_part1[variable].value_counts().keys().tolist()
    value4 = game_part2[variable].value_counts().keys().tolist()
    
    value1.sort()
    value2.sort()
    value3.sort()
    value4.sort()
    print('=============================')
    print('GameTime < 20 minute')
    print('=============================\n')
    for i in value1:
        try:
            a = game_part4[game_part4[variable]==i]['win'].value_counts().values[0]
        except:
            a = 0
        try:
            b = game_part4[game_part4[variable]==i]['win'].value_counts().values[1]
        except:
            b = 0
        print(variable+ ' 변수가 '+str(i)+' 일 때\n Win: {}\n Lose : {}\n'.format(a,b))
    
    print('=============================')
    print('GameTime < 30 minute')
    print('=============================\n')
    for i in value2:
        try:
            a = game_part3[game_part3[variable]==i]['win'].value_counts().values[0]
        except:
            a = 0
        try:
            b = game_part3[game_part3[variable]==i]['win'].value_counts().values[1]
        except:
            b = 0
        print(variable+' 변수가 '+str(i)+' 일 때\n Win : {}\n Lose: {}\n'.format(a,b))
    
    print('=============================')
    print('GameTime > 30 minute')
    print('=============================\n')
    for i in value3:
        try:
            a = game_part1[game_part1[variable]==i]['win'].value_counts().values[0]
        except:
            a = 0
        try:
            b = game_part1[game_part1[variable]==i]['win'].value_counts().values[1]
        except:
            b = 0
        print(variable+ ' 변수가 '+str(i)+' 일 때\n Win : {}\n Lose : {}\n'.format(a,b))
        
    print('=============================')
    print('GameTime > 40 minute')
    print('=============================\n')
    for i in value4:
        try:
            a = game_part2[game_part2[variable]==i]['win'].value_counts().values[0]
        except:
            a = 0
        try:
            b = game_part2[game_part2[variable]==i]['win'].value_counts().values[1]
        except:
            b = 0
        print(variable + ' 변수가 '+str(i)+' 일 때 \n Win: {}\n Lose: {}\n'.format(a,b))
sequence_var_inf('dragonKills')
=============================
GameTime < 20 minute
=============================

dragonKills 변수가 0 일 때
 Win: 9690
 Lose : 2888

dragonKills 변수가 1 일 때
 Win: 4419
 Lose : 2749

dragonKills 변수가 2 일 때
 Win: 4852
 Lose : 465

dragonKills 변수가 3 일 때
 Win: 707
 Lose : 64

dragonKills 변수가 4 일 때
 Win: 117
 Lose : 10

dragonKills 변수가 5 일 때
 Win: 1
 Lose : 0

=============================
GameTime < 30 minute
=============================

dragonKills 변수가 0 일 때
 Win : 19669
 Lose: 4291

dragonKills 변수가 1 일 때
 Win : 11421
 Lose: 8674

dragonKills 변수가 2 일 때
 Win : 13160
 Lose: 4848

dragonKills 변수가 3 일 때
 Win : 8517
 Lose: 1400

dragonKills 변수가 4 일 때
 Win : 2789
 Lose: 118

dragonKills 변수가 5 일 때
 Win : 31
 Lose: 2

=============================
GameTime > 30 minute
=============================

dragonKills 변수가 0 일 때
 Win : 857
 Lose : 175

dragonKills 변수가 1 일 때
 Win : 2469
 Lose : 754

dragonKills 변수가 2 일 때
 Win : 2738
 Lose : 2164

dragonKills 변수가 3 일 때
 Win : 2633
 Lose : 1796

dragonKills 변수가 4 일 때
 Win : 2427
 Lose : 657

dragonKills 변수가 5 일 때
 Win : 397
 Lose : 37

dragonKills 변수가 6 일 때
 Win : 5
 Lose : 1

=============================
GameTime > 40 minute
=============================

dragonKills 변수가 0 일 때 
 Win: 4
 Lose: 1

dragonKills 변수가 1 일 때 
 Win: 36
 Lose: 7

dragonKills 변수가 2 일 때 
 Win: 128
 Lose: 66

dragonKills 변수가 3 일 때 
 Win: 129
 Lose: 108

dragonKills 변수가 4 일 때 
 Win: 167
 Lose: 103

dragonKills 변수가 5 일 때 
 Win: 52
 Lose: 3

dragonKills 변수가 6 일 때 
 Win: 3
 Lose: 1

경기 시간이 길어질수록 드래곤 처치에 개수가 승리에 미치는 영향이 평균적으로 감소하는 것을 볼 수 있다.

sequence_var_inf('baronKills')
=============================
GameTime < 20 minute
=============================

baronKills 변수가 0 일 때
 Win: 12897
 Lose : 12588

baronKills 변수가 1 일 때
 Win: 380
 Lose : 80

baronKills 변수가 2 일 때
 Win: 15
 Lose : 2

=============================
GameTime < 30 minute
=============================

baronKills 변수가 0 일 때
 Win : 35854
 Lose: 22558

baronKills 변수가 1 일 때
 Win : 14404
 Lose: 1580

baronKills 변수가 2 일 때
 Win : 499
 Lose: 22

baronKills 변수가 3 일 때
 Win : 2
 Lose: 1

=============================
GameTime > 30 minute
=============================

baronKills 변수가 0 일 때
 Win : 5130
 Lose : 1424

baronKills 변수가 1 일 때
 Win : 4729
 Lose : 2862

baronKills 변수가 2 일 때
 Win : 2259
 Lose : 540

baronKills 변수가 3 일 때
 Win : 139
 Lose : 23

baronKills 변수가 4 일 때
 Win : 4
 Lose : 0

=============================
GameTime > 40 minute
=============================

baronKills 변수가 0 일 때 
 Win: 104
 Lose: 46

baronKills 변수가 1 일 때 
 Win: 182
 Lose: 176

baronKills 변수가 2 일 때 
 Win: 121
 Lose: 101

baronKills 변수가 3 일 때 
 Win: 57
 Lose: 17

baronKills 변수가 4 일 때 
 Win: 4
 Lose: 0

시간이 길때 baron 처치횟수가 4 일때 승리율 100%로 인것을 볼 수 있다

sequence_var_inf('inhibitorKills')
=============================
GameTime < 20 minute
=============================

inhibitorKills 변수가 0 일 때
 Win: 12582
 Lose : 6628

inhibitorKills 변수가 1 일 때
 Win: 4559
 Lose : 307

inhibitorKills 변수가 2 일 때
 Win: 1472
 Lose : 74

inhibitorKills 변수가 3 일 때
 Win: 282
 Lose : 14

inhibitorKills 변수가 4 일 때
 Win: 35
 Lose : 2

inhibitorKills 변수가 5 일 때
 Win: 5
 Lose : 0

inhibitorKills 변수가 6 일 때
 Win: 2
 Lose : 0

=============================
GameTime < 30 minute
=============================

inhibitorKills 변수가 0 일 때
 Win : 35817
 Lose: 12264

inhibitorKills 변수가 1 일 때
 Win : 15873
 Lose: 1177

inhibitorKills 변수가 2 일 때
 Win : 7319
 Lose: 360

inhibitorKills 변수가 3 일 때
 Win : 1708
 Lose: 79

inhibitorKills 변수가 4 일 때
 Win : 250
 Lose: 15

inhibitorKills 변수가 5 일 때
 Win : 38
 Lose: 7

inhibitorKills 변수가 6 일 때
 Win : 9
 Lose: 3

inhibitorKills 변수가 7 일 때
 Win : 1
 Lose: 0

=============================
GameTime > 30 minute
=============================

inhibitorKills 변수가 0 일 때
 Win : 6539
 Lose : 308

inhibitorKills 변수가 1 일 때
 Win : 4555
 Lose : 1391

inhibitorKills 변수가 2 일 때
 Win : 2273
 Lose : 407

inhibitorKills 변수가 3 일 때
 Win : 1023
 Lose : 146

inhibitorKills 변수가 4 일 때
 Win : 282
 Lose : 35

inhibitorKills 변수가 5 일 때
 Win : 90
 Lose : 32

inhibitorKills 변수가 6 일 때
 Win : 20
 Lose : 4

inhibitorKills 변수가 7 일 때
 Win : 3
 Lose : 1

inhibitorKills 변수가 10 일 때
 Win : 1
 Lose : 0

=============================
GameTime > 40 minute
=============================

inhibitorKills 변수가 0 일 때 
 Win: 157
 Lose: 15

inhibitorKills 변수가 1 일 때 
 Win: 156
 Lose: 132

inhibitorKills 변수가 2 일 때 
 Win: 119
 Lose: 38

inhibitorKills 변수가 3 일 때 
 Win: 59
 Lose: 52

inhibitorKills 변수가 4 일 때 
 Win: 33
 Lose: 12

inhibitorKills 변수가 5 일 때 
 Win: 13
 Lose: 10

inhibitorKills 변수가 6 일 때 
 Win: 6
 Lose: 2

inhibitorKills 변수가 7 일 때 
 Win: 2
 Lose: 1

inhibitorKills 변수가 10 일 때 
 Win: 1
 Lose: 0

40분이 넘어가는 게임에서는 첫 억제기가 큰 영향을 안주는 것을 확인가능하다

def kill_ratio(target,variable):
    global game_part1, game_part2, game_part3, game_part4
    
    fig = plt.figure(figsize=(20,20))
    fig.suptitle('게임 시간대별 승리 팀과 패배 팀의 ' + variable + ' 비율',size=30)
    ax1 = fig.add_subplot(221)
    ax2 = fig.add_subplot(222)
    ax3 = fig.add_subplot(223)
    ax4 = fig.add_subplot(224)
    
    ax1.set_title('GameTime < 20 minute',size = 20)
    ax2.set_title('GameTime < 30 minute',size = 20)
    ax3.set_title('GameTime > 30 minute',size = 20)
    ax4.set_title('GameTime > 40 minute',size = 20)
    
    sns.pointplot(target,variable,data=game_part4,ax=ax1)
    sns.pointplot(target,variable,data=game_part3,ax=ax2)
    sns.pointplot(target,variable,data=game_part1,ax=ax3)
    sns.pointplot(target,variable,data=game_part2,ax=ax4)
kill_ratio('win','dragonKills')

output_35_0

드래곤을 처치한 횟수는 장기 게임으로 갈수록 높은 것을 확인할 수 있다.

kill_ratio('win','towerKills')

output_37_0

타워를 부신 개수는 단시간 게임이나 장시간 게임에 모두 중요한 요소로 작용한다

kill_ratio('win','inhibitorKills')

output_39_0

억제기를 부신 개수 또한 승리한 팀에서 평균적으로 높은 것을 확인 할 수 있다.