gimmesilver's blog

Agbird.egloos.com

포토로그



데이터 분석을 통한 게임 고객 모델링 #4 데이터분석

이 글은 저희 회사 블로그(http://blog.ncsoft.com/?p=28900)에서도 확인하실 수 있습니다.

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

  이번 편에서는 이전에 소개한 방법들을 이용해 게임 고객을 유형별로 세분화한 자료를 어떤 식으로 활용할 수 있는지 활용 사례와 함께 그 동안 미처 다루지 못했던세부적인 내용 몇 가지를 FAQ 형식으로 소개해 드리겠습니다.

  ‘심슨의 역설 (Simpson’s paradox)’ 이라는 말을 들어보셨나요? 에드워드 심슨이라는 통계학자가 처음 공식적으로 언급한 통계 현상으로, 어떤 집단의 전체 통계량(예를 들어 평균)과 집단을 여러 개 그룹으로 나눠서 구한 통계량이 서로 반대되는 특성을 갖는 현상을 일컫는 말입니다.
  이와 관련해 널리 알려진 사례로 U.C. 버클리 대학교의 1973년 남녀 신입생 합격률 자료가 있습니다. 당시 버클리 대학교의 남녀 입학률은 아래 표와 같습니다.

  위 자료에 의하면 남학생에 비해 여학생의 합격률이 상대적으로 낮게 나오고 있어 버클리 대학교는 남녀 차별을 하고 있다는 의심을 받게 되었죠. 그런데 학과별로 세분화해서 자료를 집계했더니 아래와 같이 나타났습니다(전체자료 중 인원이 가장 많은 상위 6개 학과만 표시한 자료입니다).

  보시다시피 이렇게 학과별로 세분화된 자료를 보면 오히려 여학생의 합격률이 남학생에 비해 전반적으로 높게 나옵니다. 이런 현상이 발생하는 이유는 학과별 입학 정원이 서로 다르기 때문입니다. 즉, 여학생들은 남학생들에 비해 입학 정원이 적은 학과에 지원자가 몰리는 바람에 전체 합격률이 낮아지게 된 것이죠.

  이와 같이 어떤 자료를 집계할 때 전체 대상만을 기준으로 해서 통계를 구할 경우 자칫 실제와 다른 엉뚱한 판단을 할 수 있습니다. 따라서 적절히 자료를 분류하여 집계한 결과를 같이 확인해야 합니다.
  게임 고객 지표 역시 마찬가지입니다. 게임 서비스를 운영할 때는 다양한 지표를 사용하는데, 이 중에서 대표적인 것 몇 가지만 소개하면 아래와 같습니다.

  • 활동 유저(Active User, AU): 특정 기간 동안 게임에 접속한 총 유저수를 의미합니다. 보통 일단위, 주단위, 월단위로 집계를 하는데 게임의 인기도를 파악하는데 중요하게 사용하는 지표입니다.
  • 동시 접속자(Concurrent Connected User, CCU): 특정 시점에 게임에 접속해 있는 유저수를 의미합니다. 이 지표 역시 AU와 비슷하게 게임의 인기도와 밀접하게 관련된 지표입니다. 
  • 유저당 결제금액(Average Revenue Per User, ARPU): 일정 기간 동안 집계된 총 결제 금액을 동일 기간의 AU로 나눈 지표입니다. 말 그대로 한 명의 유저가 얼마의 금액을 사용하는지를 나타내는 수치입니다. 
  • 결제 유저당 결제금액 (Average Revenue Per Paid User, ARPPU): 총 결제 금액을 결제를 한번이라도 한 유저수로 나눈 값입니다. 

  ARPU와 ARPPU를 분리해서 측정하는 이유는 게임의 매출 특성을 좀 더 정확히 파악하기 위함입니다. 가령 ARPU는 낮은데 ARPPU가 매우 높게 나온다면 이 게임은 극소수의 충성도 높은 고객에 의해 대부분의 매출이 발생된다는 뜻입니다. 반대로 ARPU와 ARPPU의 차이가 크지 않다면 전반적으로 많은 수의 유저들이 고르게 매출을 발생시킨다는 의미가 되겠죠. 보통 F2P 기반의모바일 게임이나 캐주얼 게임은 전자의 특성이 강하며 정액제 기반의 PC MMORPG는 후자의 특성이 강합니다.

  만약 이런 지표들을 단지 전체 게임 고객에 대해서만 집계할 경우 앞서 소개한 버클리 대학교 사례처럼 실제 현상을 제대로 반영하지 못할 수 있습니다. 따라서 고객을 유형별로 적절히 분류한 후 각 유형별 지표를 따로 집계하여 전체 지표와 함께 살펴봐야 합니다.
  예를 들어 예전에 모 게임에서 큰 규모의 업데이트를 한 후 게임 고객 동향을 분석한 적이 있습니다. 이 게임은 전체 게임 고객을 약 십 여가지 유형으로 분류하고 있는데, 크게 보면 게임 활동이 왕성하고 충성도가 높은 ‘진성’ 유형, 게임 활동이 그리 활발하지 않은 ‘라이트’ 유형, 자동 사냥 유저로 의심되는 ‘봇’유형 등이 있죠. 혹시 오해하실까 싶어 첨언하자면, 고객지표 관리를 위해 분류하는 ‘봇’ 유형은 개략적인 추정이기 때문에 설령 ‘봇’ 유형으로 분류되었다 하더라도 바로 제재 등의 직접적인 조치를 하지는 못합니다. 이렇게 소위 ‘악성’ 유저로 분류된 이들 중 보다 직접적인 증거가 수집되어 확실히 ‘봇’으로 판정될 경우에만 제재 등의 조치를 취하게 됩니다.

  어쨌든 이 게임의 업데이트 전/후 DAU와 ARPU지표를 확인해 보니 아래와 같이 나왔습니다.

  이 수치를 보면 업데이트로 인해 일별 접속자수(DAU)는 크게 늘어난 반면 상대적으로 유저당 결제금액(ARPU)은 큰 하락세를 보이기 때문에 ARPU를 높이기 위한 상품 프로모션을 기획해야겠다고 생각할 수 있습니다. 그런데 이것을 유형별로 세분화한 지표로 확인해 보면 아래와 같습니다.

  이 자료를 보면 실제 전체 지표 상에서 크게 늘어난 유저는 ‘라이트’나 ‘봇’ 유형이며 ‘진성’ 유형의 유저 수 변화는 상대적으로 그리 크지 않다는 것을 알 수 있습니다. 또한 매출에 가장 큰 비중을 차지하는 ‘진성’ 고객의 ARPU 는 전체 지표와 달리 상승 추세에 있습니다. 전체 지표 상에서 ARPU가 낮게 집계되는 이유는 결재를 거의 하지 않는 기타 유저의 수가 큰 폭으로 증가했기 때문이죠.
  따라서 이렇게 유형별 지표를 보면, ARPU를 높이기 위한 노력보다는 ‘봇’ 유형의 규모를 줄이기 위한 조치를 취하는 한편, ‘라이트’ 유형을 ‘진성’ 유형으로 전환시켜 진성 고객의 수를 늘리기 위한 방안을 모색하는 것이 더 적절해 보입니다.

  더 나아가 고객 세분화는 좀 더 고도화된 예측 작업을 할 때도 바탕이 되는 자료로 활용할 수 있습니다. 예를 들어 이탈 분석의 경우를 생각해 보죠. 이탈 분석은 서비스를 이탈한 고객에 대해서 이탈 원인을 찾거나 혹은 현재 활동하는 고객 중 머지 않아 이탈할 것으로 의심되는 고객을 미리 예측하기 위한 분석을 말합니다. 이런 분석을 통해 이탈 원인에 해당하는 컨텐츠를 개선하거나 혹은 이탈 징후가 보이는 고객을 미리 예측하여 이탈을 방지하기 위한 조치를 취합니다.
  그런데 이런 이탈 분석을 할 때도 고객을 유형별로 나눠서 분석하는 것이 필요합니다. 오랜 기간 게임을 열심히 해왔던 고객과 짧은 기간만 경험하다 이탈하는 고객의 이탈 원인은 매우 다를 것이기 때문입니다.
  심지어 게임에 부정적인 영향을 주는 ‘봇’의 경우 이탈을 방지하는 것이 오히려 게임 서비스에 안 좋기 때문에 이탈 예측 모델 적용 대상에서 제외하는 것이 좋습니다. 따라서 고객 유형을 보고 이탈 방지를 통해 게임 서비스에 긍정적인 효과를 얻을 수 있는 고객을 선별한 후 이들을 대상으로 한 이탈 예측 모델을 만드는 것이 바람직합니다.
  예전에 작업했던 모 게임의 경우 이탈 예측 모델을 적용할 때 우선 전체 이용자를 대상으로 장기간에 걸쳐 게임 활동 유형의 변화를 추적한 후 비슷한 변화를 보이는 고객별로 시퀀스 유형을 분류하였습니다. 아래 그림은 이런 과정을 통해 나온 유형 중 일부입니다.
  이 후 논의를 거쳐 오랜 기간 게임을 열심히 즐기다가 이탈하는 게임 고객들에 대한 분석을 먼저 수행하자고 결정하고 위 유형 중 ‘장기 진성 유형’ 에 해당하는 고객을 선별하여 이탈 예측 분석을 수행했습니다.
  이렇게 특정 유형의 고객을 선별하여 이탈 예측 모델을 만들 경우 해당 유형이 갖고 있는 기대 가치를 좀 더 명확하게 추정할 수 있기 때문에 이탈 방지를 위한 마케팅 비용을 산정하기가 좀 더 수월해지는 장점도 있습니다.

  지금까지 군집화 기법을 이용한 게임 고객 모델링에 대해서 소개해 드렸는데 도움이 되셨는지 모르겠네요. 고객 세분화는 데이터 모델링의 가장 기본적인 응용 사례입니다. 적절한 고객 세분화를 통해 다양한 고객의 특성을 이해하고 보다 정확한 고객 지표를 만들 수 있습니다. 또한 유형별 특성에 맞는 이탈 방지나 맞춤형 프로모션과 같은 마케팅 활동을 할 때도 중요하게 활용됩니다.
  엔씨소프트에서는 게임 고객을 보다 잘 이해하고 도움이 되는 서비스를 만들기 위해 데이터에 기반한 게임 고객 세분화 모델을 만들어 활용하고 있습니다. 비록 아직까지 부족한 점은 많지만 보다 나은 서비스를 위해 다양한 시도를 하고 있으니 많은 관심 부탁 드립니다.

FAQ

  그 동안 지면관계 상 혹은 글의 흐름 상 생략했던 기술적인 내용 중에서 연재 도중에 받았던 몇 가지 질문을 FAQ 형식으로 정리해 보았습니다.

Q1. 여러 가지 군집 유형을 나누는 방법에 대해 소개해 주셨는데 이런 군집 유형이 변하기도 하나요? 만약 변한다면 시간이 지남에 따라 다시 원래 유형으로 돌아가나요 아니면 바뀐 모습을 유지하게 되나요?

A1. 군집을 나눌 때는 특정 시점에 수집된 게임 고객 데이터를 이용하기 때문에 수집 시점의 고객 특징만을 반영할 수 밖에 없습니다. 시간이 지남에 따라 고객의 유형은 달라지기 때문에 유형 분류는 정기적으로 해야 합니다. 그리고 변화 패턴은 고객마다 다르기 때문에 항상 어떻게 변한다고 단정지을 수 없습니다.

Q2. 여기서 소개한 클러스터링 방법 말고 다른 방법으로는 어떤 것들이 있나요? 그리고 그 중에서 가장 성능이 뛰어난 방법은 뭔가요?

A2. 제가 여기서 소개한 방법은 ‘k 평균 군집화’와 ‘계층 군집화’ 인데요, 이것말고도 굉장히 다양한 알고리즘이 있습니다. 제가 소개해 드린 기법은 그 중에서 가장 보편적으로 사용되는 방법일 뿐입니다. 이런 기법들은 모두 저마다의 장단점을 갖고 있기 때문에 어떤 한가지 가장 뛰어난 방법을 찾기 보다는 각 기법의 특성을 잘 파악하여 클러스터링 대상이 되는 데이터에 적합한 방법을 사용하는 것이 중요합니다.
여기까지가 원론적인 답변이고 실전에서는 일단 아는 방법 다 동원해서 분류해 보고 그 중에 가장 괜찮아 보이는 결과를 취합니다.

Q3. 개인 행동 패턴을 통한 군집화 모델과 소셜 네트워크 분석을 통한 군집화 모델 중 어떤 것이 더 유저를 예측하는데 뛰어난가요?

A3. 어떤 것이 더 낫다기 보다 이 둘을 적절히 혼합하여 사용하는 것이 좋습니다. 2편에서 예로 든 다이아몬드와 석탄의 사례를 다시 생각해 보면, 어떤 물체가 다이아몬드가 되려면 입자들의 얽힘 구조뿐만 아니라 그 입자 자체의 특성도 중요합니다. 이 둘 중에 하나라도 다르면 그 물체는 다이아몬드가 아닌 것이죠. 따라서 어떤 고객의 특성을 정확히 파악하려면 고객의 행동 유형과 더불어 고객이 속한 커뮤니티의 네트워크 유형까지 같이 파악하여 이 둘을 통합한 유형을 만드는 것이 좋습니다.
  1편 맨 앞에서 소개했던 MBTI 의 경우를 생각해 보면 MBTI는 각기 독립된 네 가지 기준으로 사람의 성향을 나눈 후 이들을 합쳐 최종 유형을 정합니다. 이와 비슷하게 고객 유형을 나눌 때도 행동 기반의 유형과 커뮤니티 기반의 유형을 각기 분류한 후 이들을 합쳐 최종 유형을 만들면 보다 정확한 고객 특성 파악이 가능하다고 생각합니다.

Q4. 3편에서 예시로 나온 네트워크 시각화 그림들이 흥미로운데 이런 자료는 어떻게 만들 수 있나요?

A4. 블로그에서 소개한 네트워크 그림들은 모두 ‘게피(Gephi, https://gephi.org/)’ 라는 툴을 사용해서 그렸습니다. 이 툴은 누구나 무료로 사용할 수 있는데 다양한 그래프를 그릴 수 있을 뿐만 아니라 기본적인 네트워크 분석기능도 제공해 줍니다. 특히 GUI 기반이기 때문에 기본적인 사용법만 알면 초보자도 쉽게 사용할 수 있는 꽤 괜찮은 툴입니다.

데이터 분석을 이용한 게임 고객 모델링 #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)’이라고 하는데 이에 대해서는 다음 편에서 자세히 소개하겠습니다.

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