LOL match 분석

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

참고: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별로 나눠줍니다.

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')

EDA

통계치 확인
#이겼을때의 통계 (연속값만)
game_df[game_df['win']=='Win'].describe()[['towerKills','inhibitorKills','baronKills','dragonKills']]
towerKills inhibitorKills baronKills dragonKills
count 46017.000000 46017.000000 46017.000000 46017.000000
mean 6.855488 1.103614 0.545125 2.098355
std 2.622499 0.936760 0.622204 1.168155
min 0.000000 0.000000 0.000000 0.000000
25% 5.000000 0.000000 0.000000 1.000000
50% 7.000000 1.000000 0.000000 2.000000
75% 9.000000 2.000000 1.000000 3.000000
max 11.000000 10.000000 4.000000 6.000000
#졌을 때의 통계 (연속값만)
game_df[game_df['win']=='Lose'].describe()[['towerKills','inhibitorKills','baronKills','dragonKills']]
towerKills inhibitorKills baronKills dragonKills
count 46013.000000 46013.000000 46013.000000 46013.000000
mean 2.096755 0.113468 0.122596 0.911721
std 2.011158 0.445807 0.367773 1.023090
min 0.000000 0.000000 0.000000 0.000000
25% 0.000000 0.000000 0.000000 0.000000
50% 2.000000 0.000000 0.000000 1.000000
75% 3.000000 0.000000 0.000000 2.000000
max 11.000000 7.000000 3.000000 6.000000

이겼을 때가 타워, 억제기, 바론, 용처치 횟수가 평균적으로 높은것이 확인 가능합니다
표준편차의 차이는 항복에 의한 게임 종료로 인해 발생할 수 있습니다

to be continued

범주형 시각화
sns.catplot()
def first_valid_visualize(df,target,variable):
    sns.factorplot(target,variable,data=df)
    plt.title(variable + ' 변수의 승리확률')
first_valid_visualize(game_df,'win','firstBlood')
C:\Users\LG\Anaconda3\lib\site-packages\seaborn\categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`.
  warnings.warn(msg)

output_26_1

승리한팀이 firstblood낸 비율이 진팀에 비해 20%정도 높은것을 볼 수 있습니다

first_valid_visualize(game_df,'win','firstTower')
C:\Users\LG\Anaconda3\lib\site-packages\seaborn\categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`.
  warnings.warn(msg)

output_28_1

승리한 팀이 firsTower를 민 비율이 진팀에 비해 40%정도 높은것을 볼 수 있습니다.

first_valid_visualize(game_df,'win','firstBaron')
C:\Users\LG\Anaconda3\lib\site-packages\seaborn\categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`.
  warnings.warn(msg)

output_30_1

승리한 팀이 first Baron을 친 비율이 약 35% 정도 높은것을 볼 수 있습니다

first_valid_visualize(game_df,'win','firstDragon')
C:\Users\LG\Anaconda3\lib\site-packages\seaborn\categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`.
  warnings.warn(msg)

output_32_1

승리한 팀이 패배한 팀보다 첫 용을 가져간 비율이 25% 높은것을 볼 수 있습니다

first_valid_visualize(game_df,'win','firstRiftHerald')
C:\Users\LG\Anaconda3\lib\site-packages\seaborn\categorical.py:3669: UserWarning: The `factorplot` function has been renamed to `catplot`. The original name will be removed in a future release. Please update your code. Note that the default `kind` in `factorplot` (`'point'`) has changed `'strip'` in `catplot`.
  warnings.warn(msg)

output_34_1

승리한 팀이 패배한 팀보다 첫 전령을 가져간 비율이 20% 높은것을 볼 수 있습니다.

first_valid_visualize(game_df,'win','firstInhibitor')

output_36_0

승리한팀이 패배한 팀보다 첫 억제기를 가져간 비율이 60% 높은것을 볼 수 있습니다.

경기 시간별 EDA
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_time_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)
first_time_ratio('win','firstBlood')

output_42_0

40분이 넘어가는 게임에서는 오히려 승리한팀에서 퍼블 피율이 낮은 것을 확인할 수 있습니다

first_time_ratio('win','firstTower')

output_44_0

게임시간에 상관없이 승리한팀이 첫 타워를 가져간 비율이 높습니다

first_time_ratio('win','firstBaron')

output_46_0

Baron 또한 시간이 가면서 영향이 줄어들지만 이긴팀이 첫번째 바론을 가져간 비율이 높습니다

first_time_ratio('win','firstDragon')

output_48_0

40분이 넘어가면 첫 용의 영향은 약해지는 것을 볼 수 있습니다

first_time_ratio('win','firstRiftHerald')

output_50_0

첫 전령의 경우도 40분이 넘어가면 영향력이 없어지는 것을 볼 수 있습니다

first_time_ratio('win','firstInhibitor')

output_52_0

첫 억제기의 영향력은 40분이 넘어가면 줄어들지만 그래도 이기는 팀이 첫 억제기를 가져가는 비율이 높은것을 확인할 수 있습니다