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)
승리한팀이 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)
승리한 팀이 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)
승리한 팀이 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)
승리한 팀이 패배한 팀보다 첫 용을 가져간 비율이 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)
승리한 팀이 패배한 팀보다 첫 전령을 가져간 비율이 20% 높은것을 볼 수 있습니다.
first_valid_visualize(game_df,'win','firstInhibitor')
승리한팀이 패배한 팀보다 첫 억제기를 가져간 비율이 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')
40분이 넘어가는 게임에서는 오히려 승리한팀에서 퍼블 피율이 낮은 것을 확인할 수 있습니다
first_time_ratio('win','firstTower')
게임시간에 상관없이 승리한팀이 첫 타워를 가져간 비율이 높습니다
first_time_ratio('win','firstBaron')
Baron 또한 시간이 가면서 영향이 줄어들지만 이긴팀이 첫번째 바론을 가져간 비율이 높습니다
first_time_ratio('win','firstDragon')
40분이 넘어가면 첫 용의 영향은 약해지는 것을 볼 수 있습니다
first_time_ratio('win','firstRiftHerald')
첫 전령의 경우도 40분이 넘어가면 영향력이 없어지는 것을 볼 수 있습니다
first_time_ratio('win','firstInhibitor')
첫 억제기의 영향력은 40분이 넘어가면 줄어들지만 그래도 이기는 팀이 첫 억제기를 가져가는 비율이 높은것을 확인할 수 있습니다