개발/데이터 분석

배틀그라운드 유저 데이터 분석해보기 4. 데이터 추가 가공 및 시각화

잠수돌침대 2023. 1. 19. 18:00

완성된 프로젝트를 보고 계십니다. 분석 결과만을 보고 싶으시다면 아래의 URL에 접속해주세요.

https://songmin9813.tistory.com/51(Steam 버전 배틀그라운드유저 분석해보기)

 

이전 내용과 이어집니다.

https://songmin9813.tistory.com/49(3. 데이터 가공)


데이터 추가 가공 - AI 여부 파악하기

 

페이즈 별 생존 시간이라는 새로운 가공 데이터 외에도 여러 정보들을 살펴보고 있던 도중 흥미로운 정보를 하나 찾아냈다.

 

아래는 매치 별 유저에게서 뽑아낼 수 있는 정보의 예시를 JSON 형태로 표현하고 있다.

 {
    "DBNOs": 1,
    "assists": 0,
    "boosts": 0,
    "damageDealt": 67.100006,
    "deathType": "byplayer",
    "headshotKills": 0,
    "heals": 0,
    "killPlace": 25,
    "killStreaks": 1,
    "kills": 1,
    "longestKill": 2.3925922,
    "name": "Mercu_l12",
    "playerId": "ai.267",
    "revives": 0,
    "rideDistance": 0,
    "roadKills": 0,
    "swimDistance": 0,
    "teamKills": 0,
    "timeSurvived": 629,
    "vehicleDestroys": 0,
    "walkDistance": 186.03517,
    "weaponsAcquired": 0,
    "winPlace": 9
}

 

이 중에서 playerId 항목을 주목해 보라.

 {"playerId": "ai.267"}

 

ai.267은 누가 봐도 Id보다는 AI의 느낌이 강하게 묻어나는 Id인 것을 확인할 수 있었다. 실제 플레이어인 경우 해당 Id가 아닌 다른 형태의 Id가 등록되어 있는 것을 확인하여 아래와 같은 패턴은 곧 AI가 작동하는 플레이어임을 알아차릴 수 있었다. 

 

ai.+숫자 3개로 이루어진 플레이어 Id는 AI로 판단할 수 있다. 

 

이를 정규표현식으로 바꾸면 다음과 같은 표현식을 컴파일하고 리스트화할 수 있을 것이다.

import re
name=re.compile(r'ai.\d\d\d')
ai=list(map(lambda x:name.search(x)!=None,list(df['playerId'])))

한 장짜리 Report 만들어보자!

 

이제 Tableau를 이용하여 시각화를 진행해 볼 차례이다. 개인적인 바람으로는 하나의 독립적인 정보가 아닌 정보별로 유기적으로 연결되어 있는 1 page report를 만들어보고 싶었던 욕구가 가장 컸다.

 

아 너무 멋지다! 출처: 클래스 101

 

 

상기 사진과 같이 한 페이지에 5~7개 정도의 데이터가 일목요연하게 들어가 있는 형태의 분석을 원했다. 그리고 내가 가지고 있는 재료들을 한데 어캐어캐 잘 섞어 다음과 같은 초안을 만들 수 있었다.

 

 

한 장은 곧 흔하게 볼 수 있는 A4 용지 사이즈, 색은 최대한 한 색의 명도를 변화시켜 사용하는 방식으로 사용하였다. 많은 색을 사용하는 것은 시각적으로 보기 흉하고 배그하면 떠오르는 색상이 노란색이었기에 조금 더 강렬한 색채인 주황 계열의 색감을 사용하기로 마음먹었다.

 

기본적으로 5개의 배치를 해보았지만 그래프를 가로 형태로 배치하는 것보다는 세로 형태로 배치, 기타 사용 빈도는 최대한 줄여 우하단에 참조 형식으로 두는 것이 가장 좋을 것 같다는 생각을 했다.

 

도넛 차트는 개인적으로 정말 만들어보고 싶은 예쁜 표였기에 사용해 보았고, 그 사이에 텍스트 레이블을 배치하여 정확한 정보를 나타낼 수 있게 하여 시각적인 연출을 도왔다. 

 

  페이지는 좌상단이 중요! 우하단이 안 중요!라는 말을 어디서 들었던 것 같다.

 

그리고 여기에 추가적으로 가공한 히스토그램 데이터와 말하고 싶었던 사족을 합쳐 다음과 같은 결과물을 도출해 낼 수 있었다.

 

최종 결과물이 이렇게 나왔다.

 

A4용지로는 다소 작다고 생각되어 조금 더 큰 A3 사이즈를 기준으로 리포트를 작성해보았다. 그리고 전체 플레이어 수라는 공통점을 가진 채로 필터 기능을 이용하여 플레이어 별, AI 별 플레이 빈도를 살펴볼 수 있게 작동하도록 했다.

 

색감은 전반적으로 주황계열에서 벗어나지 않도록 작성하였으며, 좌상단에서 우하단으로 갈수록 표의 중요도를 낮추고자 했다.

 

또한 약 48만 명의 유저 데이터를 단순 카운트하는 것은 시각적으로 도움이 안 될 것 같아 전체 비율에 인용한 전체 카운트를 제하고 나머지 레이블은 비율을 이용하여 표현하였다.

 

폰트는 개인적으로 굴림체, 돋움체 같은 기본 폰트에 거부감이 있어 무료 폰트인 티몬몬소리체를 사용하여 적용하였다.

 

TmonMonsori.ttf.ttf
2.97MB

 

이것저것 찾아보면서 해당 분석에 맞다고 생각한 폰트이니 기회가 된다면 깔아보고 사용해 보기를 추천한다.

 

이것도 나중에 알았지만 퍼블릭 버전에서는 개인 컴퓨터에 해당 폰트가 깔려있어야지만 올바른 출력이 되는 것을 알게 되었다... 직접 배포할 때에는 시스템 폰트로 바꾸어 배포해야겠다.

마치며

 

 

Tableau를 꽤나 흥미롭게 다루면서 리포트를 만들어봤지만, 이것을 계속 건드려보면서 드는 생각은 단 하나뿐이었다.

 

  PPT 프로그램을 처음 만졌을 때의 낯섦이 계속 느껴진다. 하다 보면 나만의 노하우가 생길 것 같다. 

 

실제로 Tableau를 건드리면서 발생했던 고충들은 다른 사람들에게 그리 유의미한 고충이라고는 생각이 들지 않는다. 진짜 처음 꾸미기를 배우는 사람처럼 이것저것 만져보되, 내가 만들고 싶었던 항목들은 뚜렷했기에 어떻게든 몸을 비틀며 다음과 같은 결과물을 도출해 낼 수 있었던 것 같다.

 

그나마 구체적으로 말하자면 히스토그램 축 변경, 도넛 차트에서의 이중 축 사용, 레이블 정렬, 폰트 적용, 축 정렬, 바둑판식 표현과 부동 표현 등등... 많은 것을 직접 다루면서 겪었던 고충들이 정말 많았지만, 이는 이론상으로 해결해 보는 것이 아닌 직접 몸으로 부딪혀봐야 생기는 자신만의 노하우인 것이 더 올바른 것 같다.

 

당장 이 글을 읽고 있는 여러분도 위의 요약표를 그대로 만들 수 있을 것이다. 결과적으로는 같게 만들되, 그 과정에서 뻗어나가는 수백 수만 가지의 경우가 바로 여러분만의 고충이자 실무적으로 필요한 스킬이 아닐까. 방법 자체도 그리 어려운 프로젝트가 아니니 시간이 된다면 일주일정도 투자하여 자신만의 리포트를 한 번 만들어보는 것을 추천한다.

 

마지막 장에서는 해당 리포트를 살펴보면서 어떤 흥미로운 점이 있었는지 살펴보고 URL을 공유하는 것으로 첫 번째 프로젝트를 마치기로 한다.

 

수고하셨습니다!