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')
이긴 팀의 타워를 철거한 수가 평균적으로 많은 것이 확인 가능하다
first_valid_visualize(game_df,'win','baronKills')
이긴 팀의 바론을 처치한 횟수가 평균적으로 높은것을 확인할 수 있다
first_valid_visualize(game_df,'win','dragonKills')
이긴 팀의 드래곤 처치 횟수가 평균적으로 높은 것을 확인할 수 있다
경기 시간별 데이터 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')
드래곤을 처치한 횟수는 장기 게임으로 갈수록 높은 것을 확인할 수 있다.
kill_ratio('win','towerKills')
타워를 부신 개수는 단시간 게임이나 장시간 게임에 모두 중요한 요소로 작용한다
kill_ratio('win','inhibitorKills')
억제기를 부신 개수 또한 승리한 팀에서 평균적으로 높은 것을 확인 할 수 있다.