Box and Whisker

Optimize the World

Google Analytics로 게임 분석하기 3

Google Analytics로 게임 분석하기 1에서는 구글 애널리틱스(이하 GA)를 활용하여 게임 로그를 분석하는 예시를 개괄적으로 소개하였고, Google Analytics로 게임 분석하기 2에서는 게임 내에서 발생하는 각종 사건을 어떻게 GA에 매핑할 것인지 설명하였다.

이번 글에서는 GA를 활용하여 난이도 분석, 점수 기록, 플레이어 사망 원인 분석 등을 수행하는 실제 사례를 소개하고자 한다.

뱀게임을 소개합니다 :)

실제 분석 사례를 소개하면 좋겠지만 고객의 데이터를 사례로 쓸 수는 없기에 박스앤위스커 블로그를 분석하는 사례를 간단히 소개한 바 있다. 하지만 게임 사례가 아니어서 아쉬움이 있었다.

때마침 5월에 넥슨 개발자 컨퍼런스에서 “GA로 게임 분석하기”라는 주제로 발표를 하게 되어 게임 데이터가 꼭 필요해진 상황이라, 잠시 고민하다가 간단한 게임을 급히 하나 만들었다.

http://snake.g15e.com

급히 만들어서 지저분하지만 소스코드는 깃헙에 공개되어 있다.

추억의(?) 뱀 게임(Snake Byte)을 기반으로 삼고, 사과를 놓고 경쟁하는 AI 뱀을 추가하였다. 다음은 스크린샷:

Screenshot

녹색뱀이 플레이어 캐릭터, 노란뱀은 느리지만 꼬리가 길고 실수가 적은 AI 뱀이다. 스크린샷을 보고 어떤 게임인지 감이 오지 않는다면 웹에서 바로 플레이를 해볼 수 있다.

데스크탑 플레이와 모바일 플레이

모바일 웹에서도 양손 엄지만으로 플레이를 할 수 있도록 하기 위해 조작 방식을 “상, 하, 좌, 우” 대신 “좌회전, 우회전”으로 제약하였다. 이 결정 덕분에 게임의 난이도가 조금 높아졌지만(뱀 머리가 위를 향하고 있는 상황이 아니면 좌회전, 우회전이 약간 직관적이지 않다), 데스크탑 플레이와 모바일 플레이 사이의 난이도가 일정하게 유지될 수 있을 것으로 기대한다. 이 기대가 사실인지 살펴보자.

일단 상단의 Segment 부분을 클릭하여 모바일 기기로 접속한 세그먼트와 그렇지 않은 세그먼트를 나누자:

mobile vs. desktop

우선 게임 플레이 길이(한 판에 걸리는 시간)를 확인해보자. Behavior -> Site Content -> All Pages에서 /stage에 대한 Avg. Time on Page를 보면 한 판에 걸린 평균 시간을 확인할 수 있다:

time-on-page

두 세그먼트의 플레이 길이가 거의 동일함을 볼 수 있다.

이번에는 Behavior -> Events 메뉴로 이동하여 플레이어가 사과를 잘 먹고 있는지 확인해보자:

player-eat-apple

두 세그먼트가 거의 동일한 비율로 사과를 먹고 있음을 확인할 수 있다. 이 데이터는 사과를 먹을 때 아래와 같이 사용자 정의 이벤트를 보내도록 코딩을 했기 때문에 집계된 데이터이다:

// this._name 은 뱀의 이름. "player", "pink" 등
ga('send', 'event', 'in-game', this._name + '-eat-apple');

평균 플레이 길이도 비슷하고, 플레이 중 먹는 사과의 양도 비슷한 것으로 보아 모바일 기기로 플레이하는 경우와 데스크탑에서 플레이하는 경우 사이에 큰 차이는 없음을 알 수 있다.

일반 모드와 어려운 모드

이번에는 일반 모드(normal mode)와 어려운 모드(hard mode) 사이의 난이도 차이를 살펴보자. 일반 모드는 30 by 30 크기의 화면에서 플레이를 하고 초기 속도가 느리다. 어려운 모드는 60 by 60 크기의 화면에서 플레이가 진행되고 초기 속도가 일반 모드에 비해 빠르다.

일반 모드는 플레이하였으나 어려운 모드는 플레이하지 않은 세션과 그 반대인 세션, 즉 일반 모드는 플레이하지 않고 어려운 모드만 플레이한 세션을 나눠보자. 전자는 아래 조건으로 커스텀 세그먼트를 생성하면 된다. 후자는 이 조건의 반대로 지정하면 되므로 생략:

normal-vs-hard

위에서 지정한 “mode” 차원은 사용자 정의 차원(custom dimension)이다. GA의 관리자 화면에서 사용자 정의 차원을 추가한 뒤 아래와 같은 코드로 데이터를 보내주면 집계가 된다:

ga('set', 'dimension1', 'normal');

이제 모드에 따라 평균 플레이 시간을 살펴보자. 역시 Behavior -> Site Content -> All Pages에서 확인할 수 있다. 다음은 처음 이틀 간의 데이터:

normal-vs-hard-1

사람들이 어려운 모드에서 더 오래 플레이하는 것을 볼 수 있다. 아마도 화면이 넓기 때문에 다른 뱀 혹은 자기 스스로의 꼬리에 닿아서 죽는 경우가 덜 발생하는 것이 원인인 것 같다. 또는, 애초에 잘하는 사람들이 편향되게 어려운 모드를 선택하기 때문일 수도 있다.

좀 더 확실히 알아보려면 일반 모드와 어려운 모드를 모두 플레이한 사람들이 각 모드에서 어떤 차이를 보이는지 알아보는 것이 좋다. 필터링 기준을 세션이 아니라 유저로 바꾸고, 일반 모드를 플레이한 적이 있고 동시에 어려운 모드도 플레이한 적이 있는 사람으로 한정하자:

normal-and-hard

이 상태에서 Secondary dimension을 “mode”로 설정하면 두 모드를 모두 플레이한 사람들이 각 모드에서 평균적으로 얼마나 오래 버티는지를 볼 수 있다:

normal-vs-hard-2

여전히 어려운 모드에서 더 오래 플레이를 하는 것을 볼 수 있다. 이 정도면 어려운 모드가 실제로는 더 쉬운 모드일 가능성이 높다. 이에 따라 1) 일반 모드와 어려운 모드 사이의 속도 차이를 더 크게 벌리고, 2) 어려운 모드에서는 AI 뱀에 동시에 두 마리 나타나도록 수정하였다. 다음은 수정 후의 데이터:

normal-vs-hard-3

이제 일반 모드의 평균 플레이타임이 어려운 모드의 평균 플레이타임에 비해 길어졌다.

사망 원인 분석하기

현재 이 게임에는 세 종류의 AI 뱀이 있다:

사과가 아닌 것에 닿으면 게임이 끝난다. 따라서 네 종류의 사망 원인이 존재한다:

이 중 가장 큰 사망 원인은 무엇일까? 자살과 타살의 비율이 어떻게 되며, 타살의 경우 주로 어떤 뱀에게 죽는지 궁금하다.

Behavior -> Events -> Top Events 화면으로 이동한 후 “Event Action”을 선택하고 “player-killed-by”로 검색을 하면 아래와 같은 통계를 볼 수 있다:

player-killed-by

일단, 스스로의 몸에 닿아 죽는 경우가 가장 많다. 그 다음으로는 핑크와 노랑이 거의 비슷하고 파랑에게 죽는 경우는 약간 적음을 알 수 있다. 하지만 제대로 평가하려면 각 뱀이 몇 마리나 풀렸었느지를 알아야 한다. 예를 들어 핑크와 노랑이 애초에 더 많이 출현했기 때문에 핑크와 노랑에게 더 많이 죽었을 수도 있으니까.

같은 화면에서 “deployed”로 검색을 하면 다음 통계를 볼 수 있다:

deployed

실제로 파란뱀이 다른 뱀들에 비해 약간 적게 출현했음을 알 수 있으나, 출현 횟수 대비 사망률을 구해보아도 1.5% 정도 차이가 나는 것을 알 수 있다.

한편, 사과를 가장 많이 먹는 뱀은 누굴까? 역시나 동일한 화면에서 apple로 검색을 해보자:

eat-apple

플레이어를 제외하면 파란뱀이 압도적으로 높다.

AI와 관련된 부분은 모드별로 나누어 살펴보거나, 점수대별로 나누어 살펴보는 등 여러가지 분석을 해볼 수 있을 것 같지만 일단은 여기까지.

참고로 개발 기간을 포함하여 이 모든 일들은 단 일주일만에 이루어졌고 지출된 비용은 페이스북 광고비 1만원 정도이다. 마음만 먹으면 얼마든지 짧은 기간 안에 데이터를 수집하고 분석하고 개선하는 사이클을 돌 수 있다.

예고

다음 포스팅에서는 A/B 테스팅을 통한 게임 난이도 조절을 다루고자 한다. 관련하여 다음 글들을 참고하기 바란다:

현재 테스팅이 진행되는 중인데 플레이어가 부족하여 걱정이다. 데이터 축적에 도움을 주고 싶다면 다음 링크를 눌러서 게임을 플레이해주길 바란다 :)

http://snake.g15e.com