관리 메뉴

TEAM EDA

[빅콘테스트 2019] 데이터 탐색 본문

EDA Project/빅콘테스트

[빅콘테스트 2019] 데이터 탐색

김현우 2019. 9. 22. 22:35

빅콘테스트 2019

주제 : 게임 활동 데이터를 활용하여 “게임유저 잔존가치를 고려한 고객 이탈 예측 모형” 개발

  • 엔씨소프트에서 제공하는 ‘리니지’ 고객 활동 데이터를 활용하여 향후 고객

  • 이탈 방지를 위한 프로모션 수행 시 예상되는 잔존가치를 산정하는 예측 모형 개발

기간 : 2019.07.17 ~ 2019.09.10

 

0. Overview

 

데이터

  • activity: 캐릭터별 활동이력.

  • combat : 캐릭터별 전투이력

  • pledge : 소속 혈맹 전투 활동 정보

  • trade : 거래 이력

  • payment : 결제 이력

day, server, acc_id, char_id 4가지에 의해서 결합되는 형태이고, payment의 경우는 char_id가 따로 없이 char_id의 모든합을 acc_id의 payment에 넣은 형태입니다.

 

평가함수

 

평가함수로는 특이하게 기대 이익이라는 함수를 사용하고, 그 식은 아래와 같이 계산이 됩니다. 생존 기간 예측치와 생존 기간 두가지를 예측하고 실제로 평가는 둘을 합친 기대이익을 사용하게 됩니다.

(출처 : 2019빅콘테스트설명회_엔씨소프트)

사전정보

 

(출처: 2019빅콘테스트설명회_엔씨소프트)

Q & A

1. 잔존가치의 정확한 의미가 무엇인가요?

잔존 가치는 고객의 이탈을 방지하여 창출되는 추가 가치를 의미합니다.
잔존 가치는 추가 생존 기간, 일별 평균 결제 금액, 전환율 등으로 산정 되며 세부 사항은 대회홈페이지에 게시된 설명회 자료와 단비 블로그 글(https://danbi-ncsoft.github.io/competition/2019/07/22/competition-2019-bigcontest.html)을 참조하시길 바랍니다.

2. 제공된 데이터가 리마스터에서 수집된 데이터인가요?
네, 리니지(1998 출시, 현 리니지 리마스터)의 데이터가 맞습니다. 리니지 리마스터(2019-03-27) 이전의 데이터를 제공하고 있습니다.

3. 단발성 전투와 기타 전투는 무엇인가요?
단발성 전투는 전투한 캐릭터 수가 일정 기준 이하인 캐릭터 간의 전투를 의미합니다. 기타 전투는 제공된 전투 유형에 해당하지 않는 전투를 의미합니다.

4. train_activity.csv 파일에 playtime이 0인데 fishing은 0이 아닌 경우가 존재합니다.

플레이 타임에 낚시 시간이 포함이 되는 건지 안되는 건지 궁금합니다.
낚시에 소요한 시간(fishing)은 일일 플레이 시간(playtime)에 포함되는 것이 옳습니다.
간혹 통신 오류 등의 사유에 따라 유저의 활동이 정확하게 기록되지 않는 경우가 있습니다. 
문의하신 건은, 낚시의 시작 또는 종료가 원인 미상의 사유로 인해 정확하게 기록되지 않아 낚시 시간이 잘못 집계된 경우로 보입니다. 주어진 데이터 중 오류에 해당하는 소량의 데이터가 있을 수도 있다는 점을 고려하여 분석을 진행하시기 바랍니다.

5. 유저(acc_id) 및 캐릭터(char_id)식별 기준은 어떻게 되나요?  

유저 식별 기준은 acc_id입니다
캐릭터 식별 기준은 acc_id, char_id입니다.즉, 다른 캐릭터이더라도 같은 char_id를 가질 수 있습니다.
acc_id와 char_id를 key로 이용해야만 캐릭터 식별이 가능합니다.
같은 캐릭터이지만 (acc_id와 char_id가 같지만)다수의 서버에서 기록이 있는 경우가 존재합니다.
여러 서버의 캐릭터들이 모여서 즐기는 통합 서버 컨텐츠(e.g.월드 공성)는 일반 서버(데포르쥬,켄라우헬 등)가 아닌 특수 서버에서 진행되며,일반 서버 컨텐츠 활동은 일반 서버에, 통합 서버 컨텐츠 활동은 특수 서버에 기록이 됩니다. 
따라서 동일한 캐릭터의 활동이 일반 서버와 특수 서버 모두에 기록될 수 있습니다.

6. 표준화 이전 데이터의 값, 상세 데이터 추출 기간 등 주어진 정보 이외의 추가적인 정보 제공이 가능한가요?
타 참가자와의 형평성 및 보안상의 이슈로 표준화 이전 데이터 및 데이터의 실제 값에 대한 정보는 제공 불가능한 점 양해 부탁 드립니다.

7.  최종 답안지는 어떻게 제출하면 되나요?
예측 대상은 test1_activity와 test2_activity에 존재하는 유저(acc_id)각각 20,000명입니다.
이들의 생존 기간(survival_time) 및 일별 평균 결제 금액(amount_spent) 예측치를 각각 test1_predict.csv와 test2_predict.csv파일로 제출하시면 됩니다. 

1. Exploratory Data Analysis

  • What is Leanage?

저희가 대회를 시작하고 첫번째로 한 작업은 리니지를 설치하고 게임을 해보는 것이었습니다. 플레이는 만랩85에서 레벨 78까지 진행하였습니다.

게임하면서 얻은 참고할 만한 사항

  • 법에 의해 컴퓨터 게임의 경우 결제금액 한도가 있어서 특정 금액이상 결제를 못합니다. ( 리니지의 경우 50만원 )

    • 하지만, 토스, 편의점 바코드 결제 등으로 50만원 한도 다 뚫을 수 있어서 실제로 50만원 이상 결제가 가능합니다.

  • 레벨을 직접 올려본 결과, 55레벨까지는 쉽고, 55~75레벨은 조금 어렵고 그 이후로는 많이 어려웠습니다.

    • 아인하사드의 축복이라고 해서 특정 이상만큼 사냥하면 사냥이 안됩니다.

      • 단, 캐쉬템을 사용하거나 피시방에 가면 사냥시간(효율)을 늘릴 수 있습니다.

    • 특정 던전의 경우 하루 사냥 제한시간이 있습니다.

    • 캐릭터의 직업마다 레벨업 속도가 많이 다릅니다.

    • 사람이 많은 서버는 자동사냥이나 메크로를 돌리는 사람이 많아서 사냥이 힘듭니다.

      • 다른서버로 옮기거나 초보자들이 적응하지 못하는 원인이 됩니다.

  • 혈맹끼리의 싸움때매 사람들이 스트레스를 많이 받습니다.

    • 나이트발드 서버에는 'ooo혈' 은 던전에서 자동사냥 돌려놓고 자는 사람들 죽이러 다니고, 보스 스틸등을 합니다. (위에서 말한 막피 라고 함.)

  • 서버를 3가지로 나눌 수 있습니다. (특화[PVP], NON-PVP, 일반)

    • 일반 : 만렙 제한이 없고, PVP + Non-PVP를 섞은 형태입니다.

    • 특화(PVP) : 경험치 획득량 및 아이템 드롭률이 월등히 높으며, 레벨은 60레벨로 제한, 최근에 최대 85레벨까지 성장으로 바뀌었습니다. (2019.07에 90으로 증가.)

    • Non-PVP : 레벨업을 빠르게 할 수 있고, 공성전 등의 이벤트가 지속적인 서버입니다.

      • 튜토리얼 서버이고 시간이 지나면 사라지는 서버입니다.

      • 시간이 지나서 사람들이 서버이전을 통해 일반서버로 옮겨가기도 합니다.

    • 이벤트 서버 : 업데이트 전에 미리 테스트용으로 나오는 서버가 있고 기간이 딱 정해져 있습니다.

      • 최근에는 리마스터의 테스트용으로 이벤트서버가 존재했습니다.

 

사전조사 및 현장조사를 통해서 얻은 인사이트

사전조사는 1. '리니지 게임' 2. '리니지 커뮤니티(인벤, 유튜브, 아프리카)' 3. '도메인 전문가' 방법으로 확인.

  • 리니지는 총 3가지 종류의 서버가 존재하며, 각 서버마다 플레이 형태가 다르다. 3개의 서버에서 플레이하면서 확인한 점은 아래와 같습니다.

  • 게임을 통해 확인한 이탈 요소 :

    • '초보자가 적응하기 힘듬'

      • 1.'플레이를 어떻게 해야할 지 모르겠음'

      • 2.'현질의 압박'(45레벨에 스킬을 찍어야 하는데 돈이 없어서 50이 넘도록 스킬을 못찍음, '강화'가 터짐에 따른 현타 및 충당할 돈이 부족, 현질한 사람과 아닌사람의 차이가 큼.

  • 커뮤니티를 통해 확인한 이탈 요소 :

    • '라인들의 횡포',

    • '막피의 슬픔'

  • 도메인 전문가를 통해 확인한 이탈 요소:

    • '강화의 실패에 따른 이탈'

    • '작업장'

    • '막피'

  • 길드원들의 이탈원인.*카카오톡 사진 첨부해야 함. 

How to divided server and level?

서버의 타입

  • Non-PVP 서버 : Npc를 잡는 행위가 일어나지 않는 서버.

  • 특화(PVP) 서버 : 다른 서버보다 혈맹 간 전투가 활발한 서버

  • 일반 서버 : 그 외.

Non-PVP 서버 : npc_kill이 전혀 없는 서버 

Non-PVP 서버: ['bq', 'bh', 'bi', 'bg', 'bf', 'be', 'bs']

특화 서버 : 혈맹간의 전투가 활발한 서버

특화(PVP) 서버: ['bj', 'bk', 'bl']

그 외 : 일반 서버

일반 서버: {'bd', 'ae', 'au', 'ag', 'bk', 'aa', 'ar', 'ai', 'af', 'ax', 'ah', 'av', 'bc', 'br', 'at', 'bp', 'ad', 'am', 'bm', 'bj', 'aw', 'bn', 'bb', 'ak', 'bl', 'az', 'ab', 'bo', 'al', 'aj', 'ao', 'as', 'aq', 'an', 'ay', 'ac', 'ap'}

사용자의 실력에 따른 이탈 예측시 가치 분석.

  1. 리니지를 활동하는 사람들의 의견과 histogram의 분포를 통해서 결정함.

    • 고수 : 계정의 최고 레벨이 80 이상

    • 중수 : 계정의 최고 레벨이 40 ~ 79

    • 초보 : 계정의 최고 레벨이 39레벨 이하

    28일동안의 level의 max값에 따라 histogram을 그리고, 확연히 구분되는 구간을 찾음

일별 결제 금액 또한 고수 > 중수 > 하수로 구간이 나뉘는 것을 확인할 수 있음. (고수를 잘 예측하는게 중요함. )

How to solve anonymous information?

다음으로 시작한 작업은 마스킹된 정보를 원래의 정보로 되돌리는 작업입니다.activity의 head정보를 살펴보면 아래와 같습니다. 마스킹이 원본 값 / 표준편차로 되어서 playtime같은 시간변수와 death같은 int값이 모두 소숫점을 가지는 값으로 바뀌었습니다.

 

activity의 head정보

 

여기서 무슨 값(표준편차)로 나누었는지 안다면 익명화를 풀 수 있을 것 입니다.그렇기에 death 같은 원래는 int값을 가지는 변수가 특정 값을 곱했을 때, 모두 int값을 가지도록 하는 값을 찾도록 하였습니다

  • 해결 : 0이 아닌 가장 최솟값으로 나누기

0이 아닌 가장 최솟값으로 나눈 이후 activity의 head정보

0이 아닌 최솟값으로 나누게 되면 기존의 값들이 위에처럼 바뀌게 됩니다. 그렇다면, 이렇게 해결한 방법이 맞는 지 아닌 지에 대해 검증할 필요가 있습니다.

  • 검증1. death 와 revive가 같다. (죽은 횟수와 부활 횟수가 다를 수도 있지만, 0이 아닌경우에 기존 0%에서 68%로 많이 상승합니다.)

  • 검증 2. 시간변수의 길이가 1440분(=1일), 86400초(=1일)을 가진다.

따라서 우리가 한 방법이 꽤 신빙성있다고 할 수 있습니다.

 

what is information?

 

1. playtime 

  • 특징1. 1주일의 주기마다 playtime이 떨어지는 것을 보입니다.

    • Q. train과 test1은 같고, test2만 다른걸로 봐서는 day1이 서로 같은 요일을 의미하는게 아닐 수도 있을 것 같음.

    • A. 리니지를 실제로 플레이하면서 확인한 결과, 수요일 - 정기점검 / 근데 연휴가끼거나 업데이트가 잘못되면 목요일날 하기도 하는 것을 확인하였습니다.

    위에서 얻은 정보로 숨겨진 train, test1, test2의 날짜를 찾아보도록 하겠습니다.

    • test2의 day 28은 3월 27일 수요일임(Q&A에서 확인할 수 있음). 정기점검이어서 값 떨어지는것까지 정확함.

      • test2 : 2월 28일(day1 목요일) ~ 3월 27일(day28 수요일)

        • 3월 27일부터 리니지 리마스터가 시작되었음.

      • test1 : 11월 28일(day1 수요일) ~ 12월 26일(day28 화요일)

        • 11월 27일 리니지 리마스터 발표

      • train : 9월 5일(day1 수요일) ~ 10월 2일(day28 화요일)

  • 특징2. 전반적으로 test가 train보다 playtime이 큽니다.

    • *계속해서 살펴봤지만 정확한 이유는 알 수 없었습니다. * 다만, 결과 그대로를 해석하면 10월에서 11월로 넘어가면서 인기가 많이 감소했거나, 샘플링의 문제라고 생각합니다.

  • 특징1. GENERAL > NON-PVP > PVP으로 사람들의 플레이 시간이 김.

    • NON-PVP와 GENERAL이 막피당할 가능성이 더 적음.

    • GENERAL이 NON-PVP보다 사람들이 더 활발함.

    • 서버 특성상 NON-PVP가 튜토리얼 느낌이라 상대적으로 PLAY시간이 짧음

    • Q. PVP가 NON-PVP보다 플레이시간이 짧은 이유는 잘 모르겠음.

  • 특징2. test2의 non_pvp가 급격하게 playtime이 떨어짐.

    • 확인결과 11일에서 12일로 넘어가면서 기존에 없었던 새로운 NON-PVP 서버가 등장함. 근데 이게 playtime이 매우 안좋음.

  • 특징3. 다른 서버는 playtime이 비슷하고, 오히려 NON-PVP는 train이 더 높지만, 가장 많은 사람들이 플레이하는 일반서버에서 train이 더 사람들이 높은 모습을 보임.

2. npc_kill

    • 특징 : 이유없이 npc_kill이라는 변수가 8일전까지는 매우 높다가 9일에서 부터 급감하는 모습을 보입니다. 이유를 찾기 위해 서버별로, 서버의 특성별로 나누어서 살펴보도록 하겠습니다.  그 그래프는 아래에 있습니다. 

서버별로, 서버의 특성별로 나누어서 살펴본 npc_kill

  • 특징1 : npc_kill이 의미하는 것은 미니언을 잡는 것? 엔피씨를 잡는 것?

    • 확인 : 미니언은 아니라고 생각하는게 npc_kill이 0인데 solo_exp가 0보다 큰게 많음. 약12만개.

    • 공성전이 진행되면 경비병이 나오는것 같은데, 이때 잡은것을 의미할 수 있음.

  • 특징2 : Npc_kill을 왜 하는지 모르겠음.

    • 확인 : 공성전이 진행될 때 나오는 경비병이 npc로 취급 됨. 집의 문 입구를 막은 엔피씨를 죽이기도 함.

  • 특징3 : test와 test2의 npc_kill은 비슷한데, train의 npc_kill이 급격하게 떨어짐.

    • 사람들의 인기가 많은 모든 일반서버에서 같은 현상을 보이는것을 봐서는 업데이트라든지 어떤 이슈가 있었던것 같음.

    • 확인결과 : 기간동안 npc를 잡는 이벤트가 있었던 것으로 확인 되었습니다.

3. solo_exp, party_exp, quest_exp

  • 특징1 : playtime이 가장 많은 순서는 test1 = test2 >> train 이었지만, solo exp는 train > test2 > test1의 양상을 보입니다.

  • 특징2 : test1과 test2의 party_exp와 quest_exp의 분포가 너무 다르다.

    • solo_exp는 거의 비슷하지만, party_exp는 train과 test1만 비슷하고 test2는 매우 다르다.

    • quest_exp는 셋 모두가 다른 모습을 보인다.

4. rich_monster : 보스의 타격 횟수 

  • 특징1. 7~8일쯤부터 npc_kill, solo_exp이 감소하는것과 반대로 rich_monster의 잡는 횟수는 늘어 났습니다.

    • 확인 결과 : 위에서 봤던 아이디어를 토대로 새로운 업데이트를 통해서 생긴 이벤트의 결과라는 것을 알 수 있습니다.

  • 특징2. train, test1, test2의 양상이 비슷하지만, 크기는 train > test1 > test2로 시간이 지남에 따라 감소하는 형태를 보입니다.

5. death, revive, exp_recovery 

  • 특징1. Death와 Revive는 비슷한 모습을 보입니다.

    • 거의 대부분이 0값만 가지고 같은 비율은 96%입니다. 그리고 death와 revive의 값이 다른 경우도 있었습니다.

      • Death < Revive : 12시가 넘어가면서 값이 바뀐 경우 혹은 통신 오류로 값이 잡히지 않은 경우입니다.

      • Death > Revive : 위의 이유와 같습니다. 추가적으로 죽은 이후 강제로 게임을 종료한 경우에도 Death가 revive보다 많은 것으로 찍히는 것 같습니다.(빡종)

  • 특징2. exp_recovery같은 경우는 레벨이 높은 경우에만 의미가 있고, 횟수가 누적될 수록 그 비용이 증가하는 값입니다.

  • 특징3. death와 revive의 train과 test1의 비율은 매우 비슷한 반면, test2에서 갑작스럽게 바뀌는 모습을 보입니다.

    • 이유는 찾을 수 없었습니다..

6. fishing, private_shop, game_money_change 

  • 특징1. fishing의 값은 초(s)고 play_time은 분(60s)임. 그래서 둘 값의 차이를 비교하려면 60을 곱하거나 나누고 해야 합니다.

  • 특징2. fishing에서 train, test1에서 마지막주는 저런 모습을 보이고, test2는 반대의 모습을 보입니다.

  • 특징3. private_shop과 play_time 비교해보면 사람들의 행동유형이 조금 바뀝니다. (아래그림)

 

7. enchant_count : 7강이상의 강화횟수 

  • 특징 : 15일 부근에 enchant_count의 평균이 급증하는 모습을 보이고 test2에서는 5일 부근에도 많은데, 업글과 관련해서 이벤트가 있던 것으로 예상됩니다.

  • 강화의 영향 

    • 악세사리의 경우 대부분 7강까지 가기 힘들어서 위의 데이터에 안찍혔을 확률이 높습니다.

    • 그렇다면 무기와 갑옷이 위의 케이스인데, 기사단의 무기같이 보급품의 경우 터져도 큰 영향이 없지만 현질을 통해서 나온 무기같은경우 터지면 영향이 매우 큽니다. 

전투이력 정보 (combat)

1. pledge_cnt 

  • 특징1. 혈맹간의 전투는 PVP서버에서만 거의 일어나고 그 외 서버에서는 잘 일어나지 않습니다. 

  • 특징2. PVP서버에서도 고수들 사이에서만 일어남. 중수는 있긴 하지만 거의 끼지도 못합니다. 

2. random_attacker_cnt, random_defender_cnt 

3. temp_cnt, etc_cnt 

  • 용어의 차이 

    • temp_cnt : 단발성 전투 횟수 

    • etc_cnt : 기타 전투 횟수 

  • 특징1. 하수의 경우 중수 고수에 비해 전반적으로 낮은 값을 가짐. 

  • 특징2. PVP > GENERAL > NON_PVP순으로 전투횟수가 발생함. 참고로 NON_PVP는 전투횟수가 아예 없음. 

4. same_pledge_cnt 

  • 자료 조사를 하면서 가장 이해가 가지 않은 부분이 same_pledge_cnt입니다. 강함의 측정이나 장난 삼아서 같은 혈맹원을 공격한다고는 하지만, 9일이전과 이후의 패턴이 왜 차이가 나는지? 일반서버가 왜 PVP서버보다 높은지, 고수가 중수보다 높은지등의 이유는 잘 모르겠습니다. 

 

5. num_opponent 

  • 특징1. 고수 > 중수 > 하수의 순으로 크기가 차이가 남. 

  • 특징2. PVP > 일반서버 > NON-PVP순이고, 일반서버도 그 수가 거의 0에 가까움. 

  • 특징3. train, test1, test2가 거의 비슷한 양상을 보임. 

거래 정보 (trade)

  • source_acc_id와 target_acc_id를 서로 바꾸면 겹치는 값이 있고 (동일한 거래를 수행한 내역) 아닌 값들이 있습니다. 

    • 의문1. 한쪽은 받기만한 거래여서 없는지, 샘플링의 문제인지 알 수 없습니다. 

1. item_amount 

  • adnea를 제외하고 분석

  • etc를 제외하고 분석

adena, spell, enchant_scroll을 제외한 다른 아이템끼리는 amount의 큰 차이를 보이지는 않습니다.

 

혈맹정보 (pledge)

1. play_char_cnt

  • 특징1. 서버별로, train과 test별로 확연한 차이가 있음을 볼 수 있습니다.

  • 특징2. 위의 play_chat_cnt와 combat_char_cnt를 함께보면, 일반서버(GENERAL)은 혈맹접속원은 더 많지만 전투는 적은 반면, 특화서버(PVP)는 접속한 인원의 대부분이 전투중임을 알 수 있습니다.

  • 특징3. 특이한 점은 NON-PVP를 상징하는 서버는 접속한 인원도 적고, 전투하는 인원도 없습니다. (서버 특성상 전투가 불가능합니다. )

  • 특징1. same_pledge_cnt의 정보가 위에서 봤던, npc_kill과 굉장히 유사한 모습을 보입니다. 동일한 혈맹원을 공격하는 행위는 사실 장난삼아서 하는 경우 혹은 자신의 강함을 평가하는 용도가 많은데, 정확한 의미는 모르겠습니다.

 

현질내역(payment)

  • 초보, 중수, 고수에 따른 현질

위에서 살펴본 내용과 마찬가지로 고수 > 중수 > 하수순으로 평균돈을 쓰는 비용이 많습니다.

 

추가적인 분석 내용

 

1. 낚시시간의 통신 오류

  • 레벨 30미만은 낚시가 아예 불가능한데, 낚시시간이 있는 유저가 있었음. 

  • 플레이시간과 비교했을 때, 낚시시간이 플레이시간보다 긴 유저가 많았음. 

 

2. 공성전 및 이벤트 아이템 분배 

  • 같은 혈맹의 경우 아데나를 받지 않고 아이템을 주거나, 아데나를 공짜로 주는 경우가 있음. 

'EDA Project > 빅콘테스트 ' 카테고리의 다른 글

[빅콘테스트2019] 모델링  (0) 2019.09.24
빅콘테스트 2019  (0) 2019.09.11
빅콘테스트 2018  (0) 2019.09.11