BattleGround 유저 경기 데이터를 수집하기 위해 필요한 PUBG API를 간단하게 정리해보려고 합니다. (자세한 내용은 Document에서 확인 하실 수 있습니다.)
경기데이터를 가져오는 루트는 riot api와 비슷합니다! 가장 간단한 방법은
PlayerName
을 통해 최근matchId
를 가져올 수 있고MatchId
별 경기 데이터를 가져오는 방식입니다. (API 발급은 필수!)
다만, 배틀그라운드의 경우 플랫폼이 kakao, steam, console 등 다양하기 때문에 이에 맞게 URL을 수정해주어야합니다. (저는 Steam을 기준으로 수집했습니다.)
경기 데이터를 불러오기 위해서는 크게 두가지 방법이 있는 것 같은데요🫠
유저의 아이디를 통해서 가져오기
PlayerName
-> MatchId
-> MatchData
(경기요약) -> telemetry
(경기의 세부적인 로그 데이터)
시간별로 발생한 Sample 데이터
파라미터를 보면 알 수 있듯이 filter[createdAt-start] 기간을 정해서 데이터를 수집할 수 있습니다. (최대 2주)
(두번째의 경우 데이터를 뜯어보니 실제 유저의 데이터가 아니라 Ai player 로 이루어진 경기인 것 같습니다. 😓)
PUBG API 의 경우 1분에 10개의 요청수로 제한이 되어있습니다.
matchid 1000개를 구했다 치고 1000개의 경기데이터를 가져오려면 10개 데이터를 불러올 때마다 1분을 기다려야합니다. 그렇다면 각 단계별로 100분이 필요하니 약 200분이 걸리겠군요.
MatchId
->MatchData
->telemetry
꽤 많은 시간이 필요합니다;; 사실 정리하면서도 데이터를 수집중입니다.
RIOT API 에서 경기 결과 통계 데이터가 있고 그 경기 안에서 세부적인 로그들은 따로 URL를 통해 호출해야 하듯이 PUBG도 마찬가지였습니다.
MatchId
통해 MatchData
가져오면 MatchData(경기결과)의 attributes
키 안에 URL 값이 들어있음을 볼 수 있습니다.
{
"type": "asset",
"id": "1ad97f85-cf9b-11e7-b84e-0a586460f004",
"attributes": {
"URL": "https://telemetry-cdn.pubg.com/pc-krjp/2018/01/01/0/0/1ad97f85-cf9b-11e7-b84e-0a586460f004-telemetry.json",
"createdAt": "2018-01-01T00:00:00Z",
"description": "",
"name": "telemetry"
}
},
해당 url를 통해 얻은 json을 pd.json_normalize
을 이용하여 dataframe 형태로 바꿔주면 아래와 같이 다양한 지표들을 편하게 볼 수 있는데요! 일단 보이는 변수만 무려 263개입니다;; 배틀로얄 FPS라 그런지 더 많은것 같네요.
확실히 평소에 많이 보았던 게임이기 때문에 변수 자체를 이해하는데 어렵지는 않았습니다만 해당 지표들이 어떨때 남는지 해석하는데 시간이 꽤 걸린 것 같습니다.
일단, 제가 생각하는 핵심 변수들을 위주로 어떻게 남겨지는지를 정리해보려고 합니다.
_D
: 로그가 발생한 TIMESTAMP 입니다. (기본적으로 유저의 Position 위치의 경우 10초마다 남겨지고 있었습니다.)_T
: 유저가 어떤 행동을 했는지에 대한 변수입니다. (한 경기에서 발생한 _T는 아래와 같습니다.)유저가 총을 사용하고, 데미지를 받고, 치유아이템을 사용하고, 아이템을 장착하고, DROP하고, 탈것을 이용하고, 수영하고 등 배틀그라운드에서 일어날 수 있는 모든 행동들이 기록되어있습니다. 겁나 디테일합니다 👍🏻
그리고 _T
의 값에 따라 데이터가 남겨지는 형식 입니다. 대표적으로 아래와 같은 컬럼들이 형성되는데요!
Character_
: 참가자에 대한 정보 ( _T
= Position, Heal 같이 다른 유저와의 상호작용이 아닌 각 플레이어에게 발생하는 이벤트의 경우)Attacker_
: 공격한 경우 남겨짐 (상호작용)Victim_
: 피해를 받은 경우 남겨짐 (상호작용)dBNO_
: 기절한 경우 남겨짐 (상호작용)Killer_
: Kill을 한 경우 남겨짐 (상호작용)Final_
... : 마무리 한 경우 남겨짐? (Killer 와 Final의 차이점이 뭔지 잘 모르겠네요..!)가령,
_T
=LogPlayerAttack
의 경우 플레이어의 모든 공격 행동에 대한 이벤트 입니다.
attacker.zone
attacker.type
weapon.itemId
weapon.stackCount
weapon.category
weapon.subCategory
weapon.attachedItems
등
컬럼명 그대로 attacker
의 위치, 공격 타입, 무기, 무기를 얼만큼 사용했는지, 무기 카테고리, 무기별 사용 누적 카운트 등 에 대한 정보입니다.
_T
=LogPlayerTakeDamage
인 경우 아래와 같이Attacker_
와Victim_
에 대한 정보가 생성됩니다.
Attacker_
의 체력, 좌표, 데미지 타입, 데미지 등
물론, 데미지를 받았음에도 Attacker_name이 Nan 인 경우가 있습니다. 물속에 오래 있어서 받는 데미지, 자기장 같이 게임 시스템에 의해 데미지를 받는 경우가 이에 해당합니다.
Victim_
피해를 받은 부위, 체력, 좌표 등
위에서 볼 수 있듯이 (공격과 관련된 이벤트 중에서) LogPlayerTakeDamage
인 경우, 어떤 총을 사용했는지 나와있지 않습니다. LogPlayerAttack
(공격), LogPlayerKillV2
(확정킬)을 한 경우에만 사용된 아이템 정보를 볼 수 있었습니다.
정정합니다 !
LogPlayerTakeDamage
인 경우, damageCauserName
컬럼명에
LogPlayerAttack
인 경우, weapon.itemId
컬럼명에
LogPlayerKillV2
인 경우, victimWeapon
killerDamageInfo.~
등과 같은 컬럼명에
아이템 정보가 들어있습니다.
이와 같이
_T
형태에 따라 남겨지는 컬럼이 다르기 때문에 어떤 타입에 어떤 데이터가 남겨지는지 확인하는데 꽤 시간이 필요했습니다.
일단 랜덤으로 유저의 이름을 가져와서 현재 1000개의 matchdata를 수집해 놓았습니다. 우연인지 실제로 solo 랭크가 적은지 모르겠지만 duo 와 squad 경기가 거의 90퍼를 차지하는군요 ㅎㅎ .. (solo type의 경기만 가져오고 싶었는데 방법을 못찾아서 무작정 수집했습니다..하하)
solo 타입에 해당하는 45경기만 저장해놓은 상태인데요. 45경기 기준 남겨진 데이터만 무려 1100190행 579MB 입니다 ㄷㄷ 실화냐
주제: 총기 밸런스
분석 주제를 실제 배틀그라운드 패치노트를 통해서 해보면 좋겠다는 생각이 들었습니다 ㅎㅎ 일단 가장 최근인 29.1패치의 내용을 보시죠.
SCAR-L과 AKM의 경우, 낮은 사용성과 승률로 인해 상향이 필요하다는 의견
- AKM : 피해량을 소폭 증가 (다른 AR에 비해 피해량이 강화)
- SCAR-L : 낮은 연사 속도를 소폭 증가 + 수직/수평 반동 각 4%씩 감소
- 판처파우스트에 장착 모션을 추가. 빠르게 줍거나 교체하여 발사할 수 없도록 조정
- Mk12의 경우 현재 가장 범용적으로 사용되는 DMR 총기 -> 사운드 인지 어려움(소음기+라이트그립 장착시 OP) -> 사운드만 조정
그렇다면.. 실제로 개발자 분들의 패치의도에 맞게 유저들의 행동이 변화했는지 데이터로 분석해보고 싶다는 생각이 들었습니다. 가령 SCAR_L 과 AKM의 사용성과 승률이 낮다는데 위 패치를 통해 어떻게 변했는지 데이터로 확인해보면 재밌을것 같지 않나요 ㅎㅎ
비교 대상인 이전의 데이터가 있다면 더 좋았겠지만 시간이 지나서 아쉽게도 구할 수 없으니..
패치 이후의 데이터를 통해 총기
와 관련된 지표들을 직접 계산하고 분석해 보려고 합니다.
남겨진 데이터를 보면 알 수 있듯이.. 엄청난 전처리가 필요할것 같습니다 ㅎㅎ