brunch

You can make anything
by writing

C.S.Lewis

by 채과장 Jul 16. 2020

오버워치 리그 데이터 분석 - 2

자 이제 데이터를 수집해서 csv 파일을 만들었다.

사실 내가 이렇게 csv 파일을 만들 수 있을지도 몰랐다. 데이터 파일은 누가 인터넷에 첨부파일로 올려주지 않으면 다운로드 받을 수 없는 것 아닌가.


데이터 분석, 데이터 사이언티스트라는 단어들이 굉장히 유행했을 때—물론 지금도 굉장히 핫하다— 여러 곳에서 온라인 수업을 들었었다. 그것도 유료 온라인 수업을


udemy에서도 1만원, 2만원 수업을 들었고, udacity에서 nano degree 과정도 듣고, 패스트캠퍼스도 들어봤는데 그 중에서 가장 기억에 남는 건 udacity 수업이었다.


이 수업은 정말 프로젝트를 내주고 답을 주지 않는다. 

그리고 그 프로젝트가 자신들의 기준에 맞지 않으면 통과를 안 시켜줬기 때문에 초기에 프로젝트를 하면서 머리를 쥐어뜯었던 기억이 생생하다. 그럼에도 불구하고 아직도 파이썬은 어렵다.


여튼 이 수업들은 미리 잘 정리된 데이터셋을 주는 것이다. 그러니 데이터를 이렇게 저렇게 해보면 되는데 실제 내가 원하는 데이터를 얻는 과정에서 포기했었다.


데이터가 없는데 어떻게 분석을 하지? 아 BeautifulSoup로 하면 되는구나. 

어? 이 사이트는 강의에서 알려주는대로 해도 안 되는데? 아 여기 오타가 있었네. 오타를 고쳐도 안 되네.. 왜 그럴까.. 흠


지금까진 저기서 다 멈춰있었는데 csv 파일을 스스로 얻었으니 감개무량 했다. API를 이용해서 받았지만

이 csv 파일을 가지고 뭘 해볼까?


이제 온라인 강의로 배운 걸 활용해보기로 했다

먼저 데이터를 요캐조캐 해볼려면 데이터프레임 형식이 필요하니 csv 파일을 불러와서 데이터 프레임으로 전환했다. 그러기 위해서는 필요한 라이브러리를 불러왔다


그리고 csv 파일을 구글코랩에 불러와야 하니 file.upload 명령어를 써서 overwatchstat 데이터를 업로드 했다


그리고 csv 파일을 데이터 프레임으로 전환. 사실 이게 먹히지 않으면 아무 것도 할 수 없었기 때문에 조금 긴장했었다. 결론은 성공



여기서 고민을 꽤 했던 건, 실제 제공되는 데이터의 범위가 야구의 sabermetrics 처럼 깊게 들여다 보기에는 한정적이었다. 오버워치 리그 팀간의 승패를 결정하는 주요 요인이나, 야구의 WAR 처럼 어떤 선수가 더 가치있는 지 판별할 수 있는 지표가 나올 것 같진 않았다.


그래도 생각해보니 오버워치라는 게임은 각 라운드마다 한타승부에서 누가 이기느냐가 중요한데 위 데이터로는 알 수 없으니 그냥 모든 플레이어가 한 번 죽을 때 몇 명의 플레이어를 처치했는가를 보기로 했다


즉, 내가 한 번 죽을 때 3명을 처치하고 죽었다면, 한 번 죽을 때 2명을 처치한 플레이어보다는 우리 팀에 더 많이 기여했을 거라고 가정한 것이다. 이렇게 가정하지 않으면 앞으로 더 진행을 할 수 없었다.

리그의 평균 목숨당 처치 비율을 구하기 전에 일단 딜러 / 탱커 / 힐러 역할별로 10분당 처치 수를 확인해봤다



역시 딜러가 16.68 명으로 가장 높았는데 의외로 탱커가 16.49 명으로 거의 근접했다?

왜 그러지? 내 라인은 맨날 죽는데? 라고 생각했는데 의문은 나중에 풀렸었다


일단 udacity에서 배운대로 그래프를 그려봐야 할 것 같아서 그래프를 그렸다(주입식 교육 짱!)



그리고 선수들 중 출전 시간이 없는 선수들은 제외해야 할 것 같아서 출전 시간이 없는 선수들은 제외했다


제거하기 전에 df1.info()를 실행했던 내용과 비교해보니 출전시간이 0인 선수들은 원래 없었다!(만인 평등의 오버워치 리그!)


다음으로 팀간 10분당 처치 항목을 비교해보기로 했다.

작년 우승팀인 샌프란시스코 쇼크가 제일 높지 않을까? 라고 생각하면서 코드를 실행해보니



샌쇽이 아닌 뉴욕 엑셀시어가 16.99로 가장 높게 나왔다. (역시 정규시즌의 최고명가, 하지만 포스트 시즌은?)

생각해보니 포스트 시즌 데이터 API가 따로 있었던 게 기억이 났다. 아 그렇지 이건 정규시즌만 해당하는 구나.


오버워치 리그 첫 시즌의 뉴욕 엑셀시어의 압도적 포스가 생각났다

그리고 의외로 서울 다이너스티의 수치가 높다


그 다음은 이제 내가 한 번 죽을 때 내가 몇 명을 데려가는 지 알아보기 위해 새로운 칼럼을 만들어야 했다



오버워치 리그에서는 딜러, 탱커, 힐러 모든 역할을 아울러서 자신이 한 번 죽을 때 3.3명은 처치하고 죽는 다는 뜻이다. (놀랍다? 난 3번 죽을 때 한 명 처치하는데!! 역시 FPS는 젊은이들의 게임, 프로리그니까 그렇겠지?)


이제 어떤 선수들이 이 기준으로 잘하는 선수들이고, 평균의 선수들이고, 그저 그런 선수들인지 알아보기로 했다



그 다음은 통계량을 기준으로 구간을 설정하고, 잘하는 선수들을 super-performer, 평균 구간에 해당하는 선수들을 avg-performer, 평균 이하의 선수들을 low-performer로 이름지었다



그리고 모든 데이터에(선수들에게) 어느 구간에 해당하는 지 적용해보니



udacity 에서 배운대로 적용이 되었다.(배운걸 써먹다니 ㅠㅠ)

그 다음은 그렇다면 리그에 최고 10명은 누구인지 알아보기로 했다

학살? 카르페? 등 최고 수준의 딜러들의 이름이 스쳐갔는데



10명 중 2명 빼고 다 섭탱 유저들이었다. (사실 뉴욕의 넨네도 초반에 자리야 한 걸 생각하면 섭탱으로 봐야할지도 모른다)


딜러가 다 처치하는 거 아닌가? 갑자기 어떤 섭탱 선수의 인터뷰가 생각이 났다.

"섭탱의 중요 역할 중 하나는 끝까지 쫓아가서 킬캐치 해야 하는 것입니다(끝까지 쫓아가서 죽여야 합니다)"

나를 끝까지 쫓아오던 디바를 생각해보니 맞는 말이었다.


그런데 Void가 1등? 최근 최고의 폼을 가졌다고 생각하긴 했었는데 1등을 할 줄을 몰랐는데?

그리고 서울의 미셀? 3등인데 미셀 왜 안 쓰지? (시그마?)


다시 그렇다면 저 탑텐이 팀에 몇 명 있는 지 그래프를 그려보기로 했다.

결과는 그래픽으로 뽑아야 일을 한 것이다라는 상사의 옛말이 귀에 스쳐지나갔다



역시 전통의 명가 뉴욕, top-ten에서 3명이나 보유하는 걸 그래프로 확인할 수 있었다(저기 그래프 안 그려도 바로 보이는데?!)


리그에서 팀별로 super-performer, avg-performer, low-performer가 몇 명 있는지 확인하기로 했다


뉴욕은 그렇다 치는데 항저우? 서울???


그렇다면 avg-performer는??


샌쇽??? 샌쇽이 제일 많다니... (역시 오버워치는 팀게임이라 super-performer 같은 애들보다 애들이 다 고만고만 잘해야 하는 것인가?)


마지막으로 low-performer를 알아보자


눈에 띄는 건 뉴욕과 샌쇽이 현저히 낮은 점이다.


못하는 선수들을 적게 데리고 있는 것이 잘 나가는 팀이 된다는 비결을 알아냈다!! (잘 하니까 못하는 선수들이 적은게 아닌가?? 원인과 결과를 헷갈리지 말자 응?? 중요한 건 내가 그래프를 그렸다는 것)


Outro

데이터 분석이라는 것에 흥미를 가지면서 이런저런 책도 사고 온라인 강의도 들어봤지만 거의 대부분 수업에 나와있는 내용과 책에 있는 코드를 그대로 답습하는 것에 지나지 않았었다.


영어로 설명하자면 50문장 외우기 책을 사서 그 문장을 그대로 외우기만 할 뿐 활용을 못하는 것과 비슷하다고 해야할까?


혼자서 데이터를 수집하고 기초적 수준의 EDA라도 해보고 싶었다.

그러다가 평소 즐겨보는 오버워치 리그의 데이터가 API로 제공된다는 걸 알고, 최근 배운 scrapy를 한 번 써먹어볼까 생각하고 실행해보니 처음으로 csv 파일로 저장되는 일을 해낼 수 있었다.


그 csv 자료로 온라인 강의로 배운 걸 적용해보니 뿌듯하고 재미있었다.

이 글을 쓴 이유는 문과 출신이라도, 이미 엑셀에 익숙해진 30~40대라도 관심을 가는 분야의 데이터를 수집해서 시도를 해볼 수 있다라는 걸 알리고 싶었기 때문이다.


다른 분들도 데이터 분석에 도전하고 재미를 느끼기를 응원합니다!

작가의 이전글 오버워치 리그 데이터 분석 - 1
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari