gimmesilver's blog

Agbird.egloos.com

포토로그



word2vec으로 게임 아이템 의미 벡터 추출하기 데이터분석

0. Introduction 

  word2vec 알고리즘은 이름에서 알 수 있듯이 단어를 벡터 형태로 변환해 주는 알고리즘입니다. 데이터 분석을 할 때 가장 중요한 것 중 하나는 내가 모델링하고자 하는 대상을 적절한 수치형 자료(벡터나 스칼라)로 표현하는 것입니다. 이것을 보통 feature engineering 이라고 하는데 대상이 갖고 있는 특징들을 최대한 뽑아내는 동시에 노이즈는 잘 제거하는 것이 핵심입니다.
  기존에는 데이터 분석가 및 도메인 전문가가 다양한 탐사 분석을 통해 적절한 특질(feature)들을 뽑아내고 이 중에서 내가 모델링하고자 하는 목적에 가장 잘 부합하는 특질들만을 선별하기 위해 step-wise 나 regularization 등의 기법을 사용하는 것이 일반적인 접근 방법이었습니다. 그러나 최근에 딥러닝 기법들이 발전하면서 feature engineering 역시 뉴럴 네트워크 기반의 다양한 알고리즘을 이용해 자동화되고 있습니다. 대표적으로 Autoencoder가 있으며 최근에는 Convoluional Neural Network(CNN)가 이미지 인식 분야에서 활발하게 사용되고 있습니다. 오늘 소개하는 word2vec 역시 자연어 처리 분야에서 많은 관심을 받고 있는 뉴럴 네트워크 기반의 feature engineering 알고리즘입니다.
  word2vec에 대해서는 이미 인터넷에 다양한 소개글이 있기 때문에 별도로 소개할 필요는 없을 것 같습니다. 혹시 이 알고리즘에 대해 잘 모르시는 분은 http://www.moreagile.net/2014/11/word2vec.html 을 참고하시기 바랍니다.
  word2vec은 원래 자연어 처리를 목적으로 만들어지긴 했으나 이론적으로는 텍스트와 유사한 특성을 가진 데이터라면 어떤 것이든 word2vec 알고리즘을 이용할 수 있습니다. 최규민님이 쓰신 https://brunch.co.kr/@goodvc78/16 에서는 아프리카 TV 에서 시청자의 시청 이력을 이용해 컨텐츠를 추천하는데 활용하는 사례를 소개하고 있습니다.
  저는 최규민님이 소개하신 아이디어를 참고하여 각 유저별로 게임 내에 있는 상점에서 구매한 아이템 이력 데이터에 word2vec을 적용했을 때 게임 아이템의 의미(특질) 벡터를 잘 생성하는지 테스트한 내용을 간략히 소개하고자 합니다.

1. 아이템 구매 이력에 word2vec 적용하기

  분석에 사용한 게임은 엔씨소프트의 모바일 게임인 '리니지 레드나이츠(이하 RK)' 입니다. RK는 리니지 IP를 이용한 수집형 RPG 게임입니다. 상점을 통해 다양한 장비나 소환수 영혼석, 장비 제작 및 소환수 육성을 위한 재료들을 구입할 수 있어서 유저별 다양한 구매 이력 데이터를 추출할 수 있습니다.

혹시 안해보신 분들은 한번 다운로드 받아서 해보시길...^^;

  아래 그림은 파이썬 노트북에서 word2vec으로 게임 아이템 의미 벡터를 추출하는 코드입니다. 사전에 게임 로그로부터 추출한 각 유저별 구매 아이템 목록을 pandas 의 데이터 프레임으로 불러온 후(1) 데이터를 확인해 보면 (2)와 같이 유저별로 구매한 아이템이 한 줄에 나열된 것을 볼 수 있습니다. 각각의 구매 이력에서 아이템은 콤마(,)로 구분되어 있는데 이것을 다시 배열로 변환(3)한 후 (4)와 같이 wod2vec 알고리즘을 이용해 벡터 모델을 생성합니다(여기서 size는 벡터의 차원을 의미합니다). 참고로 word2vec 알고리즘을 사용할 때는 토픽 모델링용 라이브러리인 gensim(https://radimrehurek.com/gensim/) 을 이용했습니다.


  (5)에서는 각 아이템의 의미 벡터가 잘 생성되었는지 확인해 보기 위해 '2월 스페셜 패키지' 라는 상품 아이템에 대한 의미 벡터를 화면에 출력해 보았습니다. 비록 이 벡터의 각 원소값이 의미하는 바를 정확히 이해할 수 없습니다만, 충분히 많은 데이터로 학습을 했다면 적어도 이 벡터는 같이 구매한 경향이 높은 아이템끼리는 유사도가 높도록 벡터가 구성될 것입니다.
  예를 들어 (6)을 보면 '아델하이드 영혼석'이라는 아이템과 유사도가 높은 아이템 목록이 나열되어 있습니다(각 아이템의 옆에 있는 숫자는 '아델하이드 영혼석'과의 코사인 유사도입니다). 즉, '아델하이드 영혼석'을 구매하는 유저는 '커츠 영혼석'도 같이 구매하는 경향이 가장 높다는 뜻이죠. 실제 이 게임을 해보신 분은 아시겠지만 '아델하이드'는 마법 공격 방어용 소환수이고 '커츠'는 물리 공격 방어용 소환수인데 보통 게임 유저들은 이 둘을 같이 키우는 경향이 높기 때문에 둘의 구매 유사도가 가장 높게 나오는 것은 직관적으로도 납득할 수 있는 결과입니다.

2. 아이템 의미 벡터로 추론 관계 연산하기

  뭐니뭐니해도 word2vec 을 가장 유명하게 만든 것은 벡터 연산을 통해 대상 간의 의미 관계를 추론하는 것입니다. 예를 들어 아래와 같이 'king', 'queen', 'man', 'woman' 이라는 네 개의 단어에 대한 의미 벡터가 있다면,
이것을 이용해서 'king' - 'man' + 'woman' = 'queen' 이라는 연산을 할 수 있죠.
  다시 말해 '왕' 이라는 단어에서 '남자'라는 의미를 뺀 후, 대신 '여자'라는 의미를 더하면 '여왕'이라는 단어가 나오는 것입니다. 물론 위 예는 매우 이상적인 예이며 실제로는 직관과 잘 맞지 않는 사례도 많긴 하지만, (충분히 많은 데이터와 차원을 적용하면) 굳이 언어 전문가가 일일이 각 단어에 대한 의미 규칙을 구성하지 않더라도 인간과 유사한 추론이 가능한 벡터를 만들 수 있다는 것이 word2vec 의 가장 흥미로운 점입니다.

  그런데 구매 이력을 이용해 추출한 게임 아이템의 의미 벡터 역시 위와 비슷한 연산이 가능합니다. 아래 코드는 소환수 영혼석에 대한 벡터 연산 예입니다.

  위 코드 및 결과를 벡터 연산으로 표기하면 '에스텔 영혼석' - '아델하이드 영혼석' + '제니스 퀸 영혼석' = '좀비로드 영혼석' 입니다. 다시 말해 위 네 소환수에 대한 벡터 연산을 앞서 예로 든 'king', 'man', 'queen', 'woman' 에 대한 벡터 연산에 매칭해서 보면 아래 그림과 같습니다.
  이 결과를 이해하려면 각 소환수의 특성에 대한 설명이 필요한데요, 먼저 '에스텔' 이라는 소환수는 '인간형 마법 딜러'이며 '아델하이드'는 '인간형 마법 탱커'입니다.
에스텔(인간형 마법딜러)

아델하이드(인간형 마법탱커)

  한편 좀비로드와 제니스퀸은 전투에서의 역할이 각각 '마법딜러'와 '마법탱커' 이기 때문에 이런 역할 측면에서 보면 각각 에스텔과 아델하이드에 매칭이 됩니다. 또한 이 두 소환수는 '비인간형' 소환수(정확하게는 하나는 '마족형'이고 다른 하나는 '야수형')라는 점에서 공통점이 있습니다. (아래 그림을 보면 뭔가 외모에서 풍기는 분위기가 비슷하죠? ^^)
좀비로드(마족형 마법딜러)

제니스 퀸(야수형 마법탱커)

  결국 실제 각 소환수의 특성을 분석가가 일일이 지정하지 않더라도 단지 구매 이력만을 이용해 word2vec 알고리즘을 적용했더니 각 소환수의 속성(딜러형, 탱커형, 인간형, 비인간형)을 의미적으로 해석할 수 있는 벡터를 생성할 수 있었으며 이를 통해 '인간형 마법 딜러'에서 '인간형 마법 탱커'를 빼고 여기에 '비인간형 마법 탱커'를 넣었더니 '비인간형 마법 딜러'가 나오는 추론 연산을 할 수 있었던 것이죠.

실제 이렇게 계산되는 것은 아니지만 이해를 돕기 위해 그림으로 표현한 예

3. 의미 벡터 클러스터링을 통한 아이템 카테고리 생성하기

  마지막으로 구매 이력을 통해 얻을 수 있는 모든 아이템들의 의미 벡터가 실제 우리가 직관적으로 이해하고 있는 아이템 속성 카테고리와 얼마나 유사한지 비교해 보기 위해 클러스터링을 해 보았습니다. 이 작업은 R에서 했는데, 보기 편하도록 먼저 PCA를 이용해 전체 12차원 벡터를 2차원 벡터로 축소한 후 DBSCAN이라는 알고리즘을 사용해서 클러스터링을 수행했습니다. 사용한 코드 및 결과는 아래와 같습니다.

library(dbscan)
library(ggplot2)
library(ggrepel) # 플롯에서 라벨이 서로 겹쳐서 보이지 않도록 재조정하는 라이브러리

# 각 아이템별 벡터 데이터 불러오기
data <- read.csv('item2vec.csv')

# 차원 축소를 위해 PCA 이용
vec.pca <- prcomp(data)
item2vec <- data.frame(item=data$item, vec.pca$x[, 1:2])

# DBCAN 클러스터링 알고리즘 이용
set.seed(1234)
item.cluster <- dbscan(item2vec[, c('PC1', 'PC2')], eps=1)
item2vec$cluster <- as.factor(item.cluster$cluster)

# 클러스터링 결과 시각화
my.theme <- theme_bw() + theme(text = element_text(size=14, face='bold'))
ggplot(item2vec, aes(x=PC1, y=PC2, col=cluster)) + geom_point() + my.theme + geom_text_repel(aes(label=item, col=cluster), size=3)

  그림을 확대해서 자세히 보면 비교적 의미적으로 비슷한 아이템들끼리 군집이 잘 형성되는 것을 볼 수 있습니다. 예를 들어 초보 영웅들을 위한 장비류가 같이 묶이거나(왼쪽의 초록색 그룹) 소환수 연성에 활용하는 재료 중 '순수한 XXX 비약' 아이템들끼리 묶이거나(왼쪽에서 두번째 연두색 그룹) 소환수 영혼석들이 같은 클러스터에 묶이기도 하죠(오른쪽 노란색 그룹). 만약 차원 축소를 하지 않고 클러스터링에 더 신경을 쓴다면 더 정교한 카테고리 분류가 가능할 것 같습니다.

4. 결론

  요즘 뉴럴 네트워크 기반의 feature engineering 알고리즘이 많은 인기를 끌고 있습니다. 이 중에서 word2vec은 자연어 처리를 위해 만들어진 알고리즘이지만 높은 성능을 갖고 있으면서 처리 속도 역시 빨라 자연어 처리 뿐만 아니라 다른 분야에서도 이 알고리즘을 적용하기 위한 다양한 시도를 하고 있습니다. 저도 일종의 컨셉 검증 차원에서 게임 아이템 구매 내역을 이용해서 게임 아이템의 의미 벡터를 추출하는 매우 간단한 실험을 해봤는데 예상보다 훨씬 더 아이템의 의미 벡터를 잘 생성하는 것 같습니다.
  그럼 이렇게 만든 의미 벡터는 어떻게 활용할 수 있을까요? 아직 이 부분에 대해서는 명확히 생각을 정리하지 못했습니다. 최규민님의 글에서는 벡터간 유사도를 이용해 추천 엔진에 활용하는 아이디어를 제시하고 있지만 실제 유용한 수준으로 구현하려면 이것만으로는 많이 부족할 것이라 생각합니다. 특히 제가 사용한 게임의 경우 각 유저가 구매할 수 있는 상점 아이템 목록이 매우 제한적이기 때문에 구매 유사도 기반의 추천 방식은 적절하지 않습니다.
  다만 이렇게 정성적인 데이터를 비교적 직관적으로 볼 때 잘 맞는 수준으로 정량화할 수 있다는 것 자체만으로도 그 가능성은 매우 크다고 생각합니다. 더 나아가 이번에는 단순히 구매 이력만을 이용했지만 그 외에도 다양한 시퀀스 데이터를 적용해 보면 다른 좋은 서비스 적용 방안이 나올 수 있지 않을까 생각합니다.

엔씨소프트 게임 데이터 분석가 채용 데이터분석

아래 글은 채용이 끝나면 비공개 처리될 예정입니다.

***********************************************

  저희 팀에서 데이터 마이닝 기반의 게임 데이터 분석가를 채용합니다. 요즘 워낙 이 바닥 수요가 많아서 채용이 잘 될지 무척 염려됩니다만, 게임을 좋아하고 데이터 분석 역량이 탄탄한 좋은 분들이 저희와 함께 할 수 있으면 좋겠습니다. 
(참고로 2명 채용을 계획 중입니다.)


  비록 게임 업계의 폐쇄성 때문에 잘 알려져 있지는 않지만 제가 생각하기에 게임 데이터는 세상에서 가장 흥미로운 데이터입니다. 

  게다가 엔씨소프트는 2009년부터 하둡 기반의 인프라를 게임 로그 적재 및 프로세싱에 활용하기 시작하여 현재는 탄탄한 데이터 인프라를 기반으로 다양한 탐사 분석 및 데이터 모델링을 할 수 있는 환경이 구축되어 있습니다. 데이터 분석을 해보신 분은 아시겠지만 제대로된 인프라가 없어 데이터 확보부터 걱정해야 하는 환경에서 분석하는 것이 얼마나 괴로운지 생각해 볼 때, 저희 팀의 분석 환경은 데이터 분석가들에게 최고의 복지 환경이 아닐까 생각합니다.

  더불어 아직 미흡한 점은 많이 있지만 저희 팀 역시 이런 탄탄한 인프라 위에서 여러 해 동안 다양한 데이터 분석 경험을 쌓아 유저 세그먼테이션, 이탈 예측, 악성 유저 탐지, 이상 탐지 등의 다양한 예측 모델링 결과를 실제 서비스에 조금씩 활용하고 있습니다.
주구장창 분석 보고서만 만드는 현실에 환멸을 느끼신다면 실제 서비스로 연결되는 보람을 같이 만들어 나가면 좋겠습니다. 

  마지막으로 저희 팀 업무 및 성과에 대해서 좀 더 궁금하신 분들은 아래 링크들을 참고하시기 바랍니다.

R을 이용한 데이터 분석 소개 자료 - http://blog.ncsoft.com/?p=18870 
게임 유저 클러스터링 기법 소개 자료 - http://blog.ncsoft.com/?p=25333 

유저 세그먼테이션 분석 사례 기사

자기 유사도 기반 게임봇 탐지 모델 및 시스템 개발 관련 발표 논문 - https://www.internetsociety.org/sites/default/files/blogs-media/you-are-game-bot-uncovering-game-bots-mmorpgs-via-self-similarity-wild.pdf 

많은 분들의 관심 부탁 드립니다.

데이터 분석을 이용한 게임 고객 모델링 #2 데이터분석

아래 글은 http://blog.ncsoft.com/?p=25333 에서도 확인하실 수 있습니다.

-------------------------------------

  1편에서 다양한 고객의 특징을 잘 파악하여 세분화하는 방법으로 ‘군집화’ 라는 것이 있다고 했습니다. 군집화는 이름에서 알 수 있듯이 전체 고객을 유사한 특성을 갖는 유형끼리 군집을 묶어주는 데이터 마이닝 기법을 말하는데요, 그럼 이번 편에서는 1편에서 언급한 3가지 관점에서 고객을 어떻게 군집화하는지 구체적인 방법에 대해 소개해 드리겠습니다.

  군집화를 위해서 가장 먼저 해야 할 것은 각 유저들이 서로 얼마나 비슷한지 그 비슷한 정도를 정량화하는 것입니다. 이 값을 ‘유사도’ 혹은 ‘거리’ 라고 말합니다. ‘유사도’는 두 개체가 유사할수록 높은 값을 주고 ‘거리’는 반대로 두 개체가 서로 다를수록 높은 값을 준다는 점에서 차이가 있을 뿐 개념은 비슷합니다. 데이터의 속성에따라 여러 가지 ‘거리(혹은 유사도)’를 측정하는 방식이 있으며 이렇게 측정한 값을 토대로 군집화하는 방법 역시 다양하게 있습니다.

  이 중에서 가장 널리 사용되는 방법 중 하나가 ‘k 평균 군집화 (k-meansclustering)’ 입니다. 이것은 군집화 대상들을 각각 좌표 상의 점으로 표현한 후 좌표간의 거리를 구해서 가깝게 몰려있는 점들끼리 군집을 묶는 기법입니다.
  예를 들어 각 고객별로 일주일 동안 게임을 플레이한 시간과 이 때 획득한 경험치를 이용해 각각 X, Y 좌표 상의 한 점으로 표시했을 때, 아래 그림과 같이 나온다면 서로 몰려 있는 점들끼리 네 그룹으로 묶을 수 있을 것입니다. 그러면 왼쪽 하단부터 시계 방향으로 각각 ‘플레이 시간도 적고 성장도 느린 유형(Type1)’, ‘플레이는 적게 하지만 성장은 빠른 유형(Type2)’, ‘플레이 시간도 많고 성장도 빠른 유형(Type3)’, ‘플레이 시간은 많지만 성장은 느린 유형(Type4)’으로 분류할 수 있겠죠.
  물론 위 예에서는 이해를 돕기 위해 단지 두 종류의 데이터를 이용한 것이고 실제 서비스에서는 수십 가지가 넘는 다양한 활동 정보를 이용합니다.

  그런데 1편에서 언급했듯이 고객의 성향이나 활동 패턴은 조금씩 바뀌기 때문에 주기적으로 고객의 유형을 갱신해줘야 합니다. 그 때마다 매번 위 작업을 반복한다면 번거롭기 때문에 최초 군집화 결과를 이용해 이후 유형 분류를 자동화할수 있습니다. 구체적인 방법은 군집화 알고리즘이 무엇인지에 따라 조금씩 다른데요, 예를 들어 앞서 소개한 ‘k 평균 군집화’ 의 경우 각 유형별 개체들의 평균점을 기억하고 있다가 이후 새로운 데이터에 대해서 각 평균점들과의 거리를 측정한 후 가장 가까운 평균점에 해당하는 유형으로 분류할 수 있습니다(참고로 이 알고리즘 이름이 ‘k 평균 군집화’인 이유는 이처럼 k개의 평균점을 이용해서 군집을 만들기 때문입니다).
k 평균 군집화 모델을 이용해서 유형을 자동으로 분류하는 예

  한편, 고객의 게임 활동 유형을 주기적으로 갱신하게 되면 시간이 지남에 따라 매 주기마다 고객별로 분류했던 유형의 이력이 쌓이게 됩니다. 그러면 이 이력 정보를 이용해서 아래와 같은 시퀀스 데이터를 생성할 수 있으며 이 시퀀스 데이터가 서로 비슷한 고객끼리 다시 유형을 분류할 수 있습니다.
고객별 유형 분류 이력을 시퀀스 데이터로 만든예


  시퀀스 데이터의 유형을 분류할 때는 주로 ‘계층적 군집화 (Hierarchicalclustering)’ 라는 방법을 이용합니다. 이 알고리즘은 고객별 시퀀스 데이터 간의 유사도를 측정한 후 서로 비슷한 고객끼리 같은 하위 계층에 묶이도록 계층 구조를 만듭니다.
시퀀스 데이터 간의 유사성을 토대로 계층 구조를만든 예

  이렇게 계층 구조를 만들고 나면 아래 그림처럼 같은 하위 계층에 있는 고객끼리 군집을 묶어 유형을 분류할 수 있습니다.
계층 구조를 이용한 군집화 예

  이처럼 고객별 게임 활동 유형의 변화에 대해 유형을 분류하면 비록 처음에는 동일한 유형이었던 고객들도 시간이 흐를수록 다른 특성을 갖는 것을 좀 더 명확하게 알 수 있겠죠?

  예를 들어 아래 그림은 ‘계층적 군집화’ 방법을 이용해서 시간이 지남에 따라 활동 유형이 비슷하게 변하는 고객끼리 군집화한 자료입니다. 처음엔 모두 주황색 유형으로 분류되었던 고객들을 위에서 소개한 계측적 군집화를 이용하면 아래 그림처럼 4가지 형태로 분류할 수 있습니다. 그러면 이를 토대로 각 시퀀스 유형별 고객의 변화 원인을 분석하거나 혹은 게임 활동으로는 탐지하지 못한 어떤 차이가 있는지 등을 좀 더 장기적 관점에서 분석할 수 있죠.

  더 나아가 각 시퀀스 유형별 고객들의 1인당 평균 매출을 비교해 보면 빨간색 박스로 표시한 시퀀스 유형(Type3)의 고객 매출이 다른 유형에 비해 유독 높은 것을 볼 수 있습니다. 그러면 Type3 고객과 다른 고객의 차이를 분석해 봄으로써 사업적인 관점에서 의사 결정을 하는데 도움이 될 수 있습니다.

고객의 게임 활동 유형의 변화가 비슷한 집단끼리 분류한 예

  지금까지 고객 개개인 별로 특정 시점에서의 게임 활동이나 시간에 따른 변화 패턴을 토대로 유형을 분류하는 방법을 소개했는데요, 이렇게 개개인의 특성을 분석하는 것만으로 과연 고객의 모든 것을 파악할 수 있을까요? (물론 이렇게 묻는 것은 아니라는 뜻이죠 ^^)

  잠시 머리를 식히는 의미에서 영화 이야기를 잠깐 해보죠. 혹시 제 또래 분들이라면 지금은 고인이 된 크리스토퍼 리브가 주연을 맡았던 ‘슈퍼맨’ 시리즈를 기억하실지 모르겠네요. 이 슈퍼맨 시리즈 중 3편 마지막 부분에 보면 슈퍼맨이 어린 시절 짝사랑했던 여자 친구 주려고 석탄 한 움큼을 꽉 쥐어 다이아몬드로 만드는 장면이 나옵니다.
비록 지금은 마블이 짱 먹고 있지만 이 당시에는DC의 히어로들이 최고였죠!

  뭐 이런 말도 안 되는 설정이 다 있나……라고 생각하시는 분도 계실지 모르겠습니다만 이건 사실 과학적으로도 충분히 가능한 설정이랍니다. 석탄과 다이아몬드는 둘 다 탄소로 이뤄진 물질이기 때문에 석탄에 충분한 압력을 가한다면 다이아몬드로 바꿀 수 있죠(우리도 ‘충분히’ 노오력하면 모두 성공할 수 있어요).

  심지어 어린 시절 흔하게 쓰던 연필심도 탄소로 이뤄져 있습니다. 석탄과 연필심은 둘 다 검고 잘 부서지며 손에 검댕이가 잘 묻는다는 점을 생각해 보면 뭐 그럴 수 있겠구나 싶지만 겉으로 보기엔 전혀 다를 것 같은 다이아몬드도 똑같은 물질이라는 것이 믿어지시나요? 이렇게 다이아몬드와 연필심, 석탄이 입자 수준에서 보면 완전히 동일한 물질임에도 불구하고 전혀 다른 외형과 특성을 갖는 이유는 입자끼리 서로 얽힌 구조가 다르기 때문입니다.
같은 입자로 이뤄진 물질이라 하더라도 서로 어떻게연결되는지에 따라 다른 특성을 가질 수 있습니다.

  게임 고객 역시 마찬가지입니다. 개개인의 데이터를 확인했을 때는 매우 비슷해 보여도 다른 고객들과 어떤 사회 관계를 맺고 있느냐에 따라 전혀 다른 유형의 고객인 경우를 종종 볼 수 있습니다. 따라서 고객을 잘 세분화하려면 개개인의 특성뿐만 아니라 고객 사이의 연결 구조 역시 분석해야 합니다.

  1편에서 잠깐 소개해 드렸듯이 이렇게 고객 사이의 연결 구조를 분석하는 기법을 ‘사회 연결망 분석(Social network analysis)’이라고 하는데 이에 대해서는 다음 편에서 자세히 소개하겠습니다.

소리 아이 그 이후 단상

  2008년에 '소리아이'라는 다큐멘터리 영화를 굉장히 인상 깊게 보고선 블로그에 글을 쓴 적이 있다(http://agbird.egloos.com/4624292). 오늘 문득 그들이 현재 어떻게 지내는지 검색을 해 보니 이런 기사들을 발견했다.

 - 전주대사습놀이 판소리 일반부 장원: http://www.hnwoori.com/news/articleView.html?idxno=116306
 - '국악신동' 박성열, 방황 털고 양악 수술: http://www.iksanopennews.com/news/articleView.html?idxno=463149

  9년 전 다큐멘터리에서도 엘리트 코스를 밟던 수범이는 지금 전형적인 엘리트의 길을 가고 있는 반면 그 당시에도 파란만장한 어린 시절을 보내던 성열이는 여전히 쉽지 않은 인생을 살고 있단 생각에 마음이 아련해졌다.

데이터 분석을 이용한 게임 고객 모델링 #1 데이터분석

아래 글은 회사 블로그에 기고한 글의 초본입니다. 회사 커뮤니케이션실의 마사지를 받은 버전은 http://blog.ncsoft.com/?p=24178 에서 확인하실 수 있습니다.

---------------------------------

  혹시 MBTI 검사라는 말을 들어 보셨거나 직접 검사를 받아 보신 적 있으신가요? MBTI는 테스트를 통해 사람의 성격을 16가지 유형으로 분류하는 지표입니다. 비교적 단순한 검사와 몇 가지 유형만으로도 그럴듯하게 사람의 성격을 잘 분류하기 때문인지 지표가 개발된 지 수십 년이 지난 지금까지도 많은 인기를 끌고 있습니다.

MBTI는 양분되는 4가지 카테고리의 유형을 조합하여 총 16가지 유형으로 사람의 성격을 분류합니다.

  이처럼 다양한 사람들을 몇 가지 유형으로 분류하여 파악하는 방식은 비단 심리 테스트에서만 사용하는 것이 아닙니다. 고객관리 및 마케팅, 제품 설계, 서비스 기획 등의 분야에서도 저마다의 목적에 맞춰 다양하게 방식으로 고객을 유형별로 분류하여 그 결과를 활용하고 있죠. 이것을 ‘고객 세분화 (Customer Segmentation)’ 라고 부릅니다. 카드 회사에서 소비 패턴에 따른 맞춤형 신용 카드 상품을 설계한다거나 혹은 백화점이나 마트 등에서 성별, 거주지, 연령대 별로 소비 패턴을 분석하여 각 유형에 맞는 상품을 진열하고 카탈로그를 발송하는 등이 모두 고객 세분화의 활용 사례입니다.

  온라인 게임 역시 현실 세계 못지 않게 다양한 유형의 유저들이 존재합니다. 때문에 좋은 게임을 만들고 서비스하기 위해선 이런 다양한 유저의 특징을 잘 파악하여 적절하게 세분화하는 것이 필요합니다.

‘게임 유저’ 라고 하면 이런 이미지를 떠올릴지 모르겠지만……

무려 이런 사람들도 게임을 즐긴답니다!

  특히 온라인 게임에서는 유저가 수행하는 다양한 활동들이 로그에 꼼꼼히 기록되기 때문에 풍부하고 다양한 데이터를 바탕으로 유저 행동에 대한 세밀한 분석이 가능합니다. 이렇게 게임 활동을 관찰하여 유저의 특징을 파악하는 작업은 마치 프로파일러가 세밀한 관찰을 토대로 어떤 사람의 직업이나 나이, 성격 등을 추정하는 것과 비슷하다고도 볼 수 있습니다.

‘손목의 시계줄 자국과 딱딱한 말투에 단정히 빗은 머리로 지팡이를 짚은 모습을 보니 
너님은 아프칸 파병 갔다 의가사 제대한 군인인 듯……’

  물론 그렇다고 해서 게임 유저를 세분화할 때 ‘이 사람은 겉으론 까칠해 보여도 섬세한 내면의 감수성을 보유한 20대 도시남이군’ 이라고 파악하지는 못합니다. 저희가 볼 수 있는 것은 단지 게임 플레이 기록이기 때문에 실제 유저의 특성이 아니라 유저가 플레이한 캐릭터의 특성을 파악할 수 있을 뿐이죠. 예를 들면 ‘일주일에 10시간 정도 게임을 즐기는데 필드 사냥보다는 퀘스트나 인던 활동을 더 선호하는 유형’ 같은 식입니다. 

  이런 고객 세분화를위해 많이 사용되는 데이터 마이닝 기법으로 ‘군집화 (Clustering)’라는 것이 있습니다. 이름에서 알 수 있듯이 서로 다른 여러 가지 유형이 섞여 있는 데이터에서 유사한 특성을 갖는 유형끼리 군집을 묶어줄 때 사용하는 기법이죠.

어떤 데이터에서 유사한 특징을 갖는 대상끼리 군집을 묶어주는 기법을 ‘군집화(Clustering)’ 이라고 부릅니다.

  군집화 기법을 사용해 게임 유저의 유형을 분류할 때 우리는 크게 세 가지 측면에서 적용할 수 있습니다.

  첫째, 유저가 게임에서 하는 행동을 기반으로 군집화가 가능합니다.
  앞서 언급해 드린 소비 패턴에 따라 고객의 유형을 나누는 사례에서처럼 게임 유저 역시 게임 내 활동 패턴에 따라 유형을 나눌 수 있습니다. 이런 행동 기반 군집화는 다른 분야에서도 일반적으로 널리 사용하는 방식입니다.

  둘째, 시간에 따른 변화 과정을 기반으로 군집화할 수 있습니다.
  시간이 지남에따라 게임 업데이트로 인해 서비스 자체가 변할 뿐만 아니라 주변 환경이나 사람들의 성향 역시 조금씩 달라지기 마련입니다. 따라서 어떤 유저가 특정 시점에 A 유형이라고 분류됐다고 해서 앞으로도 영원히 A 유형을 유지할 것이라 단정할 수 없습니다. 실상은 유형이 달라질 가능성이 더 크죠. 그렇다면 만약 ‘가’라는 캐릭터는 A라는 유형에서 B를거쳐 C로 바뀌었고 ‘나’라는캐릭터는 E에서 D를 거쳐 C로 바뀐 경우 이 둘이 단지 마지막 분류 시점에서 볼 때 같은 C 유형이라고해서 동일한 취급을 하는 것이 맞을까요?
  아마도 비록 같은 C 유형이라고 하더라도 기존에 어떤 이력을 거쳐 현재의 상태에 도달했느냐를 고려하여 유형을 분류하는 것이 더 유저를 정확히 이해하는데 도움이 될 것입니다. 따라서 시간에 따라 달라지는 유형 정보 역시 군집화에 활용할 수 있습니다. 이렇게 일련의 순서를 갖는 정보를 이용하여 군집화 하는 기법을 ‘시퀀스 클러스터링 (Sequence Clustering)’ 이라고합니다.

동일한 유형의 유저라고 해도 어떤 이력을 거쳐 왔는지에 따라 구분이 필요할 수 있습니다.

  셋째, 유저가 속한 사회 집단을 기준으로 군집화가 가능합니다.
  대부분의 온라인 게임들은 유저 간의 상호 작용에 의한 사회 활동을 중요한 게임 콘텐트로 제공합니다. 가령, 파티나 혈맹 활동이 대표적이고 더 나아가 서로 아이템을 사고 파는 거래 활동 역시 그렇습니다. 이런 상호 작용을 통해 모든 게임 캐릭터들은 일종의 사회 집단을 형성하게 됩니다.
  따라서 단지 개개인의 특징만을 분석하는 것뿐만 아니라 각 게임 캐릭터가 어떤 사회 집단에 속해있는지 혹은 친밀한 관계를 갖는 주변 캐릭터의 유형은 무엇인지 등도 같이 분석한다면 유저의 유형이나 특징을 좀 더 정확하게 파악할 수 있을 것입니다.
이렇게 각 개체간의 사회 관계 데이터를 이용해 여러 가지 특징을 분석하는 기법을 ‘사회 연결망 분석 (Social Network Analysis)’ 이라고 합니다. 주로 페이스북이나 트위터 같은 SNS 데이터를 이용한 분석이 널리 알려져 있는데, 온라인 게임 역시 이런 분석이 가능합니다.

‘사회 연결망 분석 (Social Network Analysis)’은 유저 간의 관계에서 나타나는 여러 가지 특징들을 분석하는 기법입니다.

  정리하자면, 우리는 게임 유저가 어떤 행동 패턴을 갖고 있는지, 시간이 지남에 따라 패턴이 어떻게 변화하는지, 그리고 게임 유저가 긴밀한 관계를 갖고 있는 집단의 유형은 무엇인지를 이용하여 유저를 세분화할 수 있습니다.

  그럼 이 각각의 분석 기법을 이용해 실제 게임 유저를 유형별로 어떻게 세분화할 수 있는지 좀 더 구체적인 방법에 대해서는 다음 편에서 하나씩 소개하겠습니다.

1 2 3 4 5 6 7 8 9 10 다음