gimmesilver's blog

Agbird.egloos.com

포토로그



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

이 글은 회사 블로그에 기고한 초본입니다. 담당 부서의 마사지를 받은 글은 http://blog.ncsoft.com/?p=26737 에서 확인하실 수 있습니다.

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

    2편에서 예고했듯이 이번 편에서는 ‘사회 연결망 분석(Social network analysis)’을 통해 고객의 특성을 파악하는 방법에 대해 소개해 드리겠습니다.
    사회 연결망 분석을 위해선 먼저 게임 고객 간의 관계를 ‘연결망(보통 네트워크라는 말을 더 많이 사용)’이라고 부르는 구조로 만들어야 합니다. 연결망(혹은 네트워크)은 말 그대로 여러 개의 개체(보통 ‘노드’라고 함)들을 연결한 것을 말하는데요, 예를 들어 인터넷 네트워크는 여러 기기들이 인터넷을 통해 연결된 구조를 의미합니다. 마찬가지로 사회 연결망(혹은 소셜 네트워크)은 사람들이 사회적 관계를 통해 연결된 구조이죠.
    온라인 게임에서 게임 고객들은 다양한 사회적 관계를 갖게 됩니다. 친구가 되거나 같은 혈맹에 소속되는 것처럼 현실과 유사한 사회적 관계를 맺기도 하고, 같이 파티를 맺고 인던을 돌거나 혹은 서로 아이템을 주고 받는 것과 같은 다양한 상호 작용을 하기도 합니다. 그래서 이런 관계나 게임 활동을 이용하면 게임 고객 네트워크를만들 수 있습니다.
    보통 네트워크 분석을 할 때는 네트워크 구조를 우리가 수학 시간에 배우는 ‘행렬’로 표현합니다. 가령 네 명의 사람이 아래와 같이 연결되어 있다면 이들을 행과 열에 놓고 두 사람 사이가 연결되어 있으면 1, 아니면 0으로 표시하는 것이죠.

네트워크 구조를 행렬로 표현한 예

    얼핏 생각하기엔 그냥 그림으로 그리면 될 것을 왜 이렇게 머리 아프게 행렬로 표시하나 싶지만 여러 가지 복잡한 계산을 하거나 혹은 분석에 필요한 계산을 컴퓨터가 자동으로 처리하도록 프로그래밍할 때는 이렇게 행렬을 이용하는 것이 편하답니다.
    하지만 역시 저같은 일반인들에게는 숫자보다는 그림이 더 보기 좋고 직관적이기 때문에 보통 네트워크는 그림으로 많이 표현됩니다. 예를 들어 아래 그림은 인터넷 네트워크를 시각화한 것입니다.

인터넷 네트워크 (이미지 출처: https://en.wikipedia.org/wiki/Internet_backbone)

    뭔지 모르지만 아무튼 멋지죠? 그런데 이와 비슷하게 온라인 게임에서도 게임 고객간의 네트워크를 시각화할 수 있습니다. 아래 그림은 저희 회사 모 게임에서 고객 간에 서로 아이템을 주고 받는 관계를 네트워크로 시각화한 것입니다. 비록 그리는 방식에 약간의 차이는 있지만 자세히 보면 이 둘은 구조 상 매우 유사하답니다.

게임 고객 네트워크 시각화 예

    한편 보통 네트워크는 여러 개의 작은 집단으로 나눌 수 있습니다. 가령 위 그림에서는 각기 다른 색깔로 구분된 수백 개의 소집단으로 구분될 수 있죠. 이런 소집단들은 같은 집단에 속한 노드 간의 연결선이 외부 노드와의 연결선에 비해 상대적으로 밀도가 높게 구성되는데 이런 여러 개의 소집단들이 모여서 전체 네트워크를 이루게 되죠. 이런 소규모 집단들을 ‘커뮤니티’라고 부릅니다.

이 네트워크의 경우 세 개의 커뮤니티로 나눌수 있죠

    각각의 ‘커뮤니티’들은 저마다 다양한 네트워크 구조를 갖고 있습니다. 예를 들어 우리 회사 게임 고객 네트워크를 보면 아래와 같은 다양한 커뮤니티 구조를 발견할 수 있습니다.

다양한 구조의 게임 고객 커뮤니티

    따라서 유저들을 유사한 행동 패턴끼리 군집화하듯이 커뮤니티 역시 비슷한 네트워크 구조를 갖는 커뮤니티끼리 군집화할 수 있습니다.
    이 때 군집화를 위해 커뮤니티 구조 간의 유사도를 측정하려면 우선 각 커뮤니티 구조를 나타내는 적절한 값을 구해야 합니다. 이를 위해 사용하는 여러 가지 네트워크 지표가 있는데 일일이 다 설명하기에는 지면이 부족하니 대표적인 것 몇 가지만 소개하면 다음과 같습니다.

Degree

    Degree는 네트워크 상의 어떤 노드가 몇 개의 노드와 연결되어 있는지를 나타내는 값입니다. 즉, 노드에 연결된 선의 개수죠. 이 때 개별 노드의 degree를 구하고 난 후 커뮤니티 별로 노드들의 degree 평균이나 표준 편차를 구하면 각 커뮤니티 구조의 차이를 아는데 도움이 됩니다.
    또한 서로 비슷한 degree를 갖는 노드끼리 연결되었느냐 차이가 큰 노드끼리 연결되었느냐를 측정하는 지표로 degree assortativity(동질성)라는 것이 있습니다. 아래 그림에서 왼쪽 커뮤니티는 비슷한 degree를 갖는 개체끼리만 연결되었기 때문에 이 수치가 높은 반면, 오른쪽 커뮤니티는 반대로 매우 낮은 값을 갖습니다. 그래서 이 지표 역시 네트워크 구조를 파악하는데 도움이 되는 정보입니다.

Degree assortativity가 큰 커뮤니티(왼쪽)와 작은 커뮤니티(오른쪽)의 예

Radius

    우리말로 하면 반경인데요, 쉽게 말해 커뮤니티 내에서 가장 멀리 떨어진 개체 사이의 거리를 의미합니다. 이것 역시 네트워크 구조를 파악하는데 많이 사용하는 지표입니다.

Radius가 큰 커뮤니티(왼쪽)와 작은 커뮤니티(오른쪽)의 예

    각 커뮤니티마다 이런 다양한 지표를 구한 후 커뮤니티에 대한 군집화를 수행하면 마치 탄소 분자간의 얽힘 구조를 보고 다이아몬드와 석탄을 구분하듯이 전체 네트워크에서 비슷한 구조를 갖는 커뮤니티끼리 분류할 수 있습니다. 아래 그림은 다양한 네트워크 지표를 기반으로 군집화 알고리즘을 사용해 게임 고객 네트워크를 다섯 가지 유형의 커뮤니티로 분류한 것입니다.

네트워크 구조를 기준으로 커뮤니티들을 다섯 가지 유형으로 군집화한 예

    이렇게 분류를 하면 설령 행동 패턴만 볼 때는 동일한 유형의 게임 고객처럼 보이더라도 어떤 커뮤니티 유형에 속해 있는지에 따라 다르게 관리할 수도 있고 혹은 고객 관리 자체를 커뮤니티 단위로 할 수도 있겠죠.
    더 나아가 네트워크 구조를 잘 파악하면 개체의 특성만 보고는 알 수 없는 독특한 패턴을 발견할 수 있습니다. 가령 범죄자들은 자신의 정체를 숨기기 위해 일반인 코스프레를 하기 때문에 개체의 특성만 분석해서는 정체를 파악하기 쉽지 않은 반면, 네트워크 구조는 여러 노드를 제어해야 하기 때문에 일반인들의 자연스런 관계 구조를 흉내내기가 상대적으로 어렵죠. 따라서 보험 사기나 주식 작전 세력, 악성코드에 감염된 좀비 PC 등을 탐지할 때 이런 네트워크 분석 기법을 많이 활용하고 있습니다.

    저희 회사도 악성 유저를 탐지할 때 이런 기법을 활용하곤 합니다. 예를 들어 아래 커뮤니티의 경우 각 캐릭터들의 게임 활동만 보면 일반 고객과 큰 차이점이 없지만 캐릭터 간의 관계 구조를 시각화하면 이렇게 매우 규칙적이고 인위적인 구조가 나타납니다. 그래서 이런 정보가 큰 도움이 되죠.

이것은 사람이 아니므니다...

    비록 여기서는 고객 커뮤니티를 군집화하기 위해 네트워크 구조를 파악하는 방법만을 살펴 봤지만 실제로는 이 외에도 매우 다양한 네트워크 분석 기법이 있으며 여러 분야에서 폭넓게 활용되고 있답니다.

    지금까지 세 편에 걸쳐 게임 고객을 모델링하기 위해 사용하는 데이터 분석 기법들을 소개해 드렸는데 잘 따라오셨나요? 그럼 마지막으로 다음 편에서는 앞서 설명한 세 가지 기법을 실전에서 어떻게 적용할 수 있는지 소개하면서 그 동안 정신 없이 달려오느라 미처 다루지 못했던 내용들을 FAQ 형식으로 정리하는 시간을 갖겠습니다.

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 2 3 4 5 6 7 8 9 10 다음