스마트락으로 개선되는 애어비앤비 경험

외국에서 에어비앤비를 쓰다보면 종종 호스트가 와서 전달하거나 열쇠를 우편함에 넣어놓는다던가 하는 방법을 쓰는데 호스트를 만나려면 새벽시간에 도착하는 경우나 종종 호스트가 늦는 경우가 있어 불편하고 후자는 후자대로 보안이 좀 찜찜한 것이 사실이다.

열쇠의 관리가 허술 할 때 도난품이나 기타 문제로 싸우게 될 가능성도 있고 지금까지는 괜찮았지만 언제 트러블에 휘말려서 골치아프게 될지 모르는 일이다.

얼마 전 이용한 호스트는 스마트락을 설치한 집이었는데 나에게 3일간만 이용 할 수 있는 6자리 핀번호를 발급해주었다. 중국제 핀번호 입력형 스마트락이었는데 알아보니 여러 채의 물건을 굴리면서 게스트가 올때면 원격으로 기간제 핀번호를 발급하고, 청소대행 업체의 사람에게도 별도의 핀번호를 발급해준다고 한다.

개념 자체는 요즘 호텔들에서 실시하고 있는 리셉션을 거치지 않고 핸드폰 앱을 키삼아 숙실로 직행하는 것과 유사하다. 사실 앱이 필요가 없으니 오히려 더 간편한 느낌.

스마트락의 초기 투자비용이 좀 있지만 요즘은 방 3개짜리 아파트의 각 방마다 설치하여 3건의 호스트를 하는 경우도 있다고 한다. 실제 내가 사는 중국의 룸쉐어 아파트도 비슷한 방식. (아파트의 철문은 3개 방의 핀번호로 열 수 있고 각 방문은 자기만의 핀번호를 쓴다. 스마트락 API를 이용하여 무선랜으로 제어하고 렌트업체 자체 관리프로그램을 사용)

아직까진 우편함에 열쇠를 넣어두는 경우가 많지만 단기이용자 입장에선 스마트락만큼 편한게 없으므로 렌트업 위주로 조금씩 파이를 늘려나가지 않을까 하는 생각. 단 맨 처음 소개한 August 같은 스마트락은 쓸모가 없을 듯.

아무래도 폰으로 앱을 구동하고 락을 연다는게 너무 번거롭다. 청소대행업체에 연동하는 문제도 있고 시장의 니즈는 핀번호 입력이 가능한 스마트락이 되지 않을지.

머신러닝 피드백을 이용한 게임 지표 분석

아이템 가격 결정의 문제점 – 이게 잘 팔리는데 과연 적정가에 팔고 있나?

흔히들 말하는 게임 아이템들, 가챠를 포함하여 거래 가능한 아이템들의 가격설정은 인게임과 현금판매 둘 다 사실상 “해봤던 적이 있는 사업부나 기획자의 경험”에 의존하는 부분이 있다. 대충 이런이런 논리로 이 아이템은 환산하면 어느정도 가치가 있으니까 얼마에 팔자, 또는 이 시점에서 캐릭터의 성장과 하루 두시간 플레이 한 사람의 평균 소지금은 얼마니까 다음 아이템은 이 정도 선에서 얻도록 하자는 결정이 이루어진다.

과연 가챠는 악의 문명인가? – @k_t_y_k

당연한 의문이지만 아이템 산정에 뛰어난 사람 1은 과연 무엇을 통해 “적절한 가격 책정”을 하게 되는 것인가? BM 자체는 Subscription, Micro-transaction, 이거저거 혼합형 등등 큰 줄기는 이해하고 결정 할 수 있지만 개별 아이템의 가격이나 밸런스 조정에서 각 스킬의 수치 조정 부분은 사실상 이해 할 수 없는 블랙박스다. 2 물론 각자 나름대로 경험을 가지고 거기에 논리를 붙여 설명하지만 문제는 이에 대한 사람들의 논리가 제각각이라는 점이다.

게임의 성공과 실패에는 여러가지 요소가 있으므로 매출이라는 거시적인 지표는 확인 할 수 있지만 게임 밸런스나 아이템 가격 같은 개별 수치 X가 적정한가 아닌가에 대한 평가는 현재까지 불가능했다. 매 업데이트마다 아이템이나 밸런스 변화가 최소 십수가지인데 하나하나 붙잡고 분석하는 것은 시간대비 효율도 낮고 평가하는 사람의 주관이라는 다른 변수가 추가되므로 결국 거시적인 지표 3를 기준으로 묶어서 볼 수 밖에 없는 한계가 있다.

머신러닝을 이용하여 이 개별 수치 X를 조사하여 어떤 아이템이 매출의 증대에 도움이 되었고 어떤 것이 오히려 마이너스인지 분류하는 방법을 도입한다면 개별 수정사항이나 추가 아이템에 대한 객관적 평가가 가능해지고 매출이나 유저 만족도 평가를 더 개선하는 방향으로 이후 계획을 세우기 더 쉬워지지 않을까.

머신 러닝, 기계를 이용한 귀납적 추론으로 게임지표를 분석해본다면?

한국에서 이세돌 vs. 알파고의 대결로 잠깐 신경망과 머신러닝에 대한 붐이 일었는데 이번에 활용해보는 부분은 기계를 이용한 귀납적 추론을 시도하는 것이라 생각하면 쉬울 것 같다. 쌓인 문제를 해결하는 마법의 열쇠는 아니지만 귀납에서 연역으로 이어지는 사유 과정 중 전자를 기계학습을 통해 아웃소싱 할 수 있다면 이전에는 볼 수 없었던 시각으로 상황을 해석하는 일도 가능할 것이다.

최소한의 코드로 머신러닝 분석 시도해보기

Ariel Faigon 의 Discovering ketosis: how to effectively lose weight 을 보고 4 그가 작성한 vowpal-wabbit 5스크립트 및 훈련용 데이터셋이 게임 로그에도 충분히 사용 될 수 있는 형식이라 응용해보았는데 생각보다 훨씬 흥미로운 결과가 나왔다. 이 스크립트는 비개발 직군이라도 비교적 쉽게 이해하고 how-to를 따라하기 쉽기에 이를 중심으로 설명해보고자 한다.

아래는 NDA 때문에 실제 라이브 데이터를 그대로 공개 할 수는 없으므로 적절하게 수정을 가해 더미 데이터셋을 만들어 재구성 한 내용이다.

머신러닝 귀납적 분석에서 연역적 인사이트 얻기 – Ariel Faigon의 사례
https://github.com/arielf/weight-loss

Ariel이 Github에 올린 머신러닝을 이용한 다이어트 방법은 얼마 전 해커 뉴스에 소개되면서 주목받았는데 발상의 전환이라 할 만 하다. 매번 식사를 하거나 운동을 할 때 칼로리를 신경쓰지 않고 그 날 자신이 한 행동 중 체중에 영향을 주었다고 생각하는 것들을 기록한다. 그리고 이렇게 일정량 쌓인 데이타를 일부 가공해 vowpal-wabbit에 쓸 수 있는 트레이닝셋을 만든 뒤 이를 이용해 훈련시킨 손실함수 계산으로 어떤 행동이 체중의 변화에 어떻게 기여하는지를 귀납적으로 추론한 것이다.

Date,MorningWeight,YesterdayFactors
2012-06-10,185.0,
2012-06-11,182.6,salad sleep bacon cheese tea halfnhalf icecream
2012-06-12,181.0,sleep egg

수면시간까지 포함하여 지난 24시간동안 취한 행동이 다음 날 아침 체중에 어떻게 반영되었는지를 측정하여 체중이 증가한 날과 감소한 날 주로 어떤 것을 먹거나 행동을 취했는지를 보고 가중치를 계산하여 체중 증가에 많이 기여했다고 보여지는 행동을 줄이고 감소에 많이 기여한 것으로 보이는 것을 늘리는 것이다. 그리고 이 변화한 행동양식과 결과물인 체중을 꾸준하게 머신러닝을 통해 피드백 시킨다.

상식적으로 소모량을 넘는 칼로리를 섭취하면 당연히 체중은 증가할 것이다. 하지만 얼마나? 개인별로 다른 기초대사량, 소화능력, 생활패턴, 오늘 먹은 계란말이에는 소금이 들었는지 설탕이 들었는지 느낌은 오지만 시럽 넣은 커피 한잔과 계란말이 사이에 어느 것이 더 기여하는지 답하기는 선뜻 망설여질 것이다. 이런 부분을 머신러닝의 도입으로 오느 정도 도움을 받을 수 있지 않을까 하는 것이 Ariel의 시도였고 결과는 꽤 극적이다.

FeatureName       HashVal   ...   Weight RelScore
nosleep            143407   ...  +0.6654 90.29%
melon              234655   ...  +0.4636 62.91%
sugarlemonade      203375   ...  +0.3975 53.94%
trailmix           174671   ...  +0.3362 45.63%
bread              135055   ...  +0.3345 45.40%
caramelizedwalnut  148079   ...  +0.3316 44.99%
bun                  1791   ...  +0.3094 41.98%

... (trimmed for brevity. Caveat: data is too noisy anyway) ...

stayhome           148879   ...  -0.2690 -36.50%
bacon               64431   ...  -0.2998 -40.69%
egg                197743   ...  -0.3221 -43.70%
parmesan             3119   ...  -0.3385 -45.94%
oliveoil           156831   ...  -0.3754 -50.95%
halfnhalf          171855   ...  -0.4673 -63.41%
sleep              127071   ...  -0.7369 -100.00%

위의 내용은 vowpal-wabbit이 주어진 데이터 내에서 귀납적으로 추론한 체중을 증감시키는데 기여한 각 행동들의 연관성이다. 재미있는 것은 이렇게 뽑아놓은 데이터를 늘어놓고 나면 신기하게도 왜 그런지 설명 할 수 있게 된다는 점이다.

https://github.com/arielf/weight-loss

다이어트 자체에 관한 부분은 생략하고 (Ariel 본인도 이에 대해서는 정확한 과학적 설명이 없다고 경고한다) 머신러닝을 이용한 귀납추론에서 가능한 한 단식 기간을 확보하는 것(long-fasting), 혈당지수를 참고하여 음식을 선택하기 시작하는 것과 같은 연역적 인사이트를 이끌어낸 부분이 주목할만하다. 머신러닝은 시야를 확장하는 도구로 쓰인 셈이다.

게임운영 지표분석에 머신러닝을 활용한다면 개별 아이템 performance를 볼 수 있지 않을까?

Ariel의 다이어트 프로젝트가 성립하기 위한 필요조건 중 라이브 서비스와 상당히 유사한 점을 발견 할 수 있는데:

  • 음식물 섭취는 체중에 24시간 정도면 반영된다. (24시간 정도면 섭취한 음식이 어떤 형태로던 배출되었을 것이므로) – 24시간동안의 일별 매출
  • 다양한 행동이나 식단이 입력되지만 결과는 체중이라는 수치로 수렴한다. – 매출지표
  • 여러 종류의 음식과 행동 중에서 체중의 증감에 영향을 끼치는 것을 골라내 원하는 방향으로 집중하는 것은 게임 운영에서 매출과 유저 만족도의 증감에 영향을 끼친 업데이트 요소들을 분류하는 것과 비슷하다.
  • 긍정적으로 분류된 것들을 분석하여 같은 경향의 행동(업데이트)을 계속해가고 반복 분석하는 것으로 점진적인 개선을 이루어 낼 수 있을 것이다.

입력된 여러가지 아이템이 하나의 수치로 나타나는 것 중 제일 친숙한 것이라면 일별 매출과 판매 물품 목록일 것이다. 일별 매출 변화도 그날 자정에 정산된 매출과 판매된 아이템의 itemId 목록을 쉽게 뽑을 수 있으니 Ariel의 코드를 거의 수고를 들이지 않고 사용 할 수 있다.

saleslog
date_iid_price_purchases_users

간단한 스크립트로 Ariel의 VW 트레이닝셋 작성 스크립트에 사용 할 수 있는 형태로 데이터를 만들어 집어넣었다.

#!/usr/bin/perl -w

use strict;
use warnings;

my ($previous_row, $date, $itemname, $sales) = ('') x 4;

while (<>) {
    chomp;
    my @fields = split(',');
    if ($fields[0] eq $date) {
    print $previous_row if $previous_row;
    print " $fields[1]:$fields[2]";
    $previous_row = '';
   } else {
    $previous_row = "\n$fields[0],$fields[1]:$fields[2]";
    $date = $fields[0];
   }
}

각종 세부적 수치의 설정에 대한 “감”이 경험적으로 얻어지는 것이라면 머신러닝으로 적절한 트레이닝셋을 이용하여 훈련시켜 사용 할 수 있다. 새로운 게임의 경우는 트레이닝 셋을 구성할 자료 자체가 없으니 초기값은 전통적인 방법을 따라야 하겠지만 한달 정도 베타테스트를 진행했다면 트레이닝 셋을 구성하기 위한 최소한의 자료로는 충분할 것이다. 6

Ariel의 github 소스를 거의 손대지 않고 (그래프가 보기 쉽게 나오도록 R로 출력하는 부분을 약간 수정하는 정도) 그대로 뽑아낸 데이터는 굉장히 흥미롭다. vowpal-wabbit을 이용한 분석은 어디까지나 도구이므로 해석은 사람의 몫이니 한번 들여다보자.

sales_score.png

먼저 유념할 점은 일별 매출 증감에 녹아있는 굉장히 약한 신호를 머신러닝으로 증폭하여 보는 것이기 때문에 그래프의 수치는 어디까지나 매출의 증가와 감소에 얼마나 연관성이 있는 것으로 보인다는 점일 뿐 loss 100% 라고 해서 매출이 그만큼 많이 떨어졌다는 이야기는 아니다. 7각 아이템이 얼마나 팔렸는가를 보는 것은 기존에 엑셀 등으로 간단히 보던 선형적 분석이고 여기서 보여지는 것은 수백수천종이 넘는 아이템들이 판매되고 있는데 어떤 아이템이 인기가 있을 때 매출이 증가하고 감소하는지를 알아내는 것이다. 매 업데이트마다 여러 복잡한 변화가 추가될 때 개별 변경사항마다 잘 한 것과 그렇지 않은 것을 구분 할 수 있게 된다.

여기서는 아이템 매출을 분석했지만 이외에도 어떤 게임에서 매출과 유저 활동을 분석했을 때 10개의 맵이나 레벨 중 negative 경향이 강한 것이 있다면 보상이 지나치게 좋거나 너무 쉬운 것은 아닌지 등을 의심 해 볼 수 있다. 귀납적 분석은 머신러닝이 도출하고 이를 토대로 사람이 연역적 분석을 통해 왜 negative/positive인지 찾아내 이후 업데이트에 반영하는 것이다.

매출 감소에 영향을 미치는 아이템들

감소 부분에서는 치장용 아이템들 일부와 가챠박스 한종, 리소스 충전 아이템이 보인다.

매출 증가에 영향을 미치는 아이템들

증가 부분에서는 역시 치장용 아이템들 대다수와 리소스 아이템이 보인다. 그 외 대량으로 소모되는 기준 아이템들이나 가챠박스는 상대적 중간값(0%)에 수렴하므로 여기서 상하단에 위치한 아이템 리스트는 매출 증가라는 목표를 기준으로 잘 설정된 아이템들과 그렇지 않은 것들로 나뉘는 셈이다.

그리고 전체적으로 봤을 때 인상적인 것은 동시기 업데이트 된 같은 item_id 그룹에서도 positive와 negative가 확연하게 갈렸다는 점이다. 단순히 업데이트 구간별로 매출을 평가하는 것이 아닌, 개별 요소를 분석하여 negative에 해당하는 아이템 가격이나 스탯을 조정하는 분석도구로 쓰일 수 있다는 가능성을 보여준다.

item_id 700번대 업데이트와 800번대 업데이트에서 일부 아이템은 매출에 긍정적sales positive지만 negative에 해당하는 아이템들도 있다. 내용을 리뷰하며 원인은 몇 가지로 좁힐 수 있었는데:

  • 아이콘, 스킨 등 스탯에 영향을 주지 않는 치장용 아이템의 경우 호불호 경향이 뚜렷하다
  • negative 치장용 아이템을 주로 구매한 유저층(특정 직업 등)이 소비를 덜 한다
  • negative로 분류된 itemId_10010 가챠박스의 경우 가성비가 지나치게 높지 않은가? 가치에 비해 가격이 너무 낮게 설정되어 있거나 필요 이상으로 과도한 할인이벤트를 시행
  • positive가 높은 아이템의 경우 어떤 상황에서 소모되는지 확인하여 해당 이벤트나 게임모드를 강화한다. itemId_1046 리소스 아이템을 많이 소모하게 만든 이벤트는 매출 증대에 긍정적이었던 반면 itemId_141이 주로 소모된 경우는 오히려 매출 감소와 관련이 있다
  • 스탯과 무관한 치장용 아이템의 경우는 단순히 유저의 선호도를 보여주는게 아니라 이런 치장용 아이템을 구매한 유저층이 전반적으로 더 소비를 한다는 신호다. 긍정적으로 나온 스타일을 더욱 장려하고 이런 유저층에 맞는 업데이트를 기획한다

샘플에서는 치장용 아이템의 존재로 가려진 감이 있지만 negative에 해당하는 가챠박스를 발견할 수 있었던 것처럼 어떤 아이템이 적정가보다 싸다는 것도 발견 할 수 있다.

이러한 지표를 참고삼아 이후 업데이트의 방향성을 설정하고 동일한 분석을 반복하는 것으로 negative를 줄이고 positive를 늘려가면 매출에 긍정적인 영향을 줄 수 있을 것이다.

머신러닝을 이용한 지표분석의 확장

여기서는 손쉽게 확인 할 수 있는 유료 아이템 매출 지표를 가지고 돌려봤지만 분석의 축이 되는 지표를 변경하는 것으로 다향한 분석이 가능하다. 가령 예를 들자면:

  • 각종 업데이트 및 광고 실행 후 신규유입 유저수를 기준으로 유입에 얼마나 도움이 되었나를 분석
  • 게임 내 각 레벨이나 스테이지, 아이템, 클래스 플레이 빈도와 PCU/CCU 연관성 분석
  • 게임 내 어떤 activity를 거쳤을 때 유료아이템 구매를 하는 컨버전이 이루어지는가? 또는 리텐션이 변화하는가?
  • 다수의 기획자가 제출한 변경사항의 sales performance를 분석하여 각각에 대한 평가 지표와 개선방향을 도출 할 수 있다

이번은 본격적인 팀 프로젝트가 아닌 개인적인 실험이었으므로 간단하게 응용 할 수 있는 vowpal-wabbit을 사용했지만 같은 형식으로 구글의 텐서플로우나 아마존 머신러닝을 도입하여 다양한 시점에서의 분석을 실행 할 수 있다. 워페이스의 경우 게임서버에서 출력되는 대량의 로그를 hadoop으로 처리하고 tableau와 엑셀의 pivot table을 이용한 선형적 분석이 주로 사용되었는데 튜토리얼 포기 시점이나 유저 리텐션과 같은 지표를 분석할 당시 이런 비선형적 분석이 가능했으면 좀 더 명확한 개선 방안을 찾을 수 있지 않았을까.

맺음말 – 수년 안에 지표분석에도 머신러닝이 일반화 될 것

실험적인 적용이었지만 과거 몇년간의 로그에 적용해보면서 BI에 요청해서 받아보던 지표와는 완전히 다른 관점에서 운영지표를 분석해볼 수 있었다.

머신러닝을 실험적으로 지표분석에 도입하며 깨달은 점이 있다면 SPSS나 Tableau등을 이용하여 분석을 제공하는 BI나 사업부서가 따로 있더라도 다양한 시점에서 실시간 비선형 분석을 보려면 라이브팀 자체에서 머신러닝 분석 시스템을 구축하는 편이 좋겠다는 점이다.

기존에는 그냥 엑셀 피벗테이블 정도로 선형 분석을 바로 보면서 논의 할 수 있었지만 현재 머신러닝이 받아들이는 형식이 대부분 CSV나 텍스트 뭉치이다보니 파이썬이나 펄스크립트의 활용은 지표를 읽어야 하는 직군이라면 비개발/개발 무관하게 필수적이 되지 않을까 하는 생각이다. 머리속에 어떤 인사이트가 떠오르더라도 스크립트를 이용한 텍스트 데이터 조작을 할 수 없다면 머신러닝을 활용하는데 한계가 있다.

그리고 귀납적인 분석을 머신러닝이 해준다고 해도 보여지는 데이터가 그런지 연역적인 논리와 숨겨진 팩터를 찾아내는 것은 여전히 사람의 몫이다.

구글의 텐서플로우나 아마존 머신러닝 센터처럼 개인도 쉽게 머신러닝을 적용해 볼 수 있는 8 기반이 마련되었고 게임운영이야말로 유저의 activity를 로그로 확인 할 수 있는 머신러닝 적용에 최적의 환경이라고 할 수 있다.

이미 미국 월마트 같은 곳에서는 과거 데이터를 머신러닝으로 분석하여 매출을 예측하는 시도를 하고 있는데 게임 운영도 수년 안에 패러다임의 변화가 올 것으로 예상된다. 미리미리 준비를 해둬야 할 듯.

Notes:

  1. 회사에 따라 사업팀, BM 전문가, 게임 기획자, 프로듀서 등 결정하는 사람의 직군마저 다른 경우도 있다.
  2. 유저간 트레이드가 가능한 시스템의 경우 게임 통화량에 따라 적정가로 수렴하게 되지만 MMO의 시대가 저물면서 자유거래 시스템이 있는 게임이 오히려 드물어졌다.
  3. 이번 업데이트 후 유저 플레이타임 증가, 매출증가 등
  4. 이 글을 쓰기 시작한건 2016년 8월이지만 이런저런 이유로 이제서야 퍼블리싱 하게 되었음
  5. 야후에서 시작된 머신러닝 프로젝트로 현재는 MS의 지원을 받고 있다
  6. 규모가 있는 회사라면 내부 테스트 세션을 몇 번 거치는 과정에서 수치의 설정을 극단적으로 바꿔가며 기본적인 방향을 탐사해볼 수도 있겠다
  7. 퍼센트 수치는 Relation Score로 얼마나 연관성이 높은가에 대한 것이다. 지표 전체를 두고 보면 이 데이터의 지표는 매출이 계속해서 지지부진한
  8. 이 글에서 사용된 vowpal-wabbit은 VM에 설치한 우분투 리눅스에 설치한 것이다

블로그를 시작하면서

이전부터 조금 길게 글을 쓰고 싶다는 욕구는 계속 있었는데 어느새 쌓이고 쌓여서 이대로 간다면 책으로 써도 되지 않을까? 싶은 수준이 되었습니다.

이전에는 트위터에 생각나는대로 적어두고 언젠가 마이그레이션용 데이타를 받아서 정리하면 되지 않나 하는 막연한 생각을 가지고 있었으나 2016년 중순 트위터가 정보 공유의 공간으로 완전히 의미를 상실한 지금이라도 블로그 형태로 자료를 정리할 필요를 느껴서…

말하자면 에버노트에 생각을 정리하는건 좋지만 정작 에버노트에 길게 글을 써도 봐줄 사람이 없다는 문제를 해결할 필요가 생긴 셈입니다. 나중에 피드백에 대한 주제를 작성 할 때 좀 더 자세하게 쓰고 싶은 주제인데 굳이 댓글 같은 의견 상호교환이 없더라도 길게 쓴 글을 자신이 다시 되읽는 셀프-피드백의 과정이 해답을 찾는데 도움이 된다고 생각한 점이 제일 크고요.

대부분의 글은 트위터에 짧게 적은 말들의 부연 비슷한 느낌이 될 가능성이 큽니다. 트위터가 망해가는(😭😭😭) 플랫폼이라고 해도 여전히 아무말 하기에는 좋은 동네라 의견이 있다면 그쪽으로 부탁드립니다.

Under Construction

블로그가 하나 필요해서 그간 미루던 워드프레스 설치를 감행했습니다.

GitHub에 Jekyll을 깔아서 써도 좋다는 조언에 혹했으나 갈아엎는 작업이 너무 즐거워 보여서 (농담이 아니라 GitHub의 Pages가 가진 한계 안에서 최대한 꾸미는 도전 자체가 게임으로 의미가 있음) 글쓰기에 집중하기 힘들 것 같아 안이한 선택으로 달리는 중입니다.

그래도 언젠가 Understanding LSTM Networks 같은 힙한 스타일로 블로깅을 할 날이 올거라고 믿습니다. Hakyll에 다른 모듈들 다닥다닥 붙여서 깔끔하게 긴 글을 쓰는 그런 날이…