2015年4月29日水曜日

【KPI分析(第3回)】DAUに代わるKPI編

ソーシャルゲーム(に限らずアプリ全般)のKPI分析講座、第3回目は「DAUに代わるKPI編」です。
1回目、2回目は下記をご覧ください。

【KPI分析(第1回)】用語解説編
【KPI分析(第2回)】DAUを狂わすノイズ編

前回の「DAUを狂わすノイズ編」では、ホワイトノイズやスパイクノイズによってDAU(daily active users)が増減してしまうということを書きました。
ゲームが面白いかどうか以外の部分でDAUは大きく変動してしまうので、DAUを指標にしていては、本当楽しんでいるユーザーがどれだけいて、どのような推移をしているのかはわかりません。

そこで、ホワイトノイズやスパイクノイズを取り除いた新たなKPIが必要です。
ただ、実際のところコレといった業界共通の指標というのは存在していません。
各社が自社のタイトルにマッチしたノイズの取り除き方を行い、それを指標としているといった感じです。

ここでは、その指標を公開している3社(現在はもっと洗練された取り方をしているかも)の例を取り上げます。

<コロプラ>
まずは、「白猫プロジェクト」や「黒猫のウィズ」などの超ビッグタイトル連発のコロプラさん。
コロプラさんはQAU(Quarterly Active Users)という指標を採用しています。


QAUとは、アプリをダウンロードしてから7日以上経ったユーザーを対象としたアクティブユーザーの値です。
アプリの継続率は、ダウンロード後7日間で急激に低下し、その後はある程度安定していきます。
なので、ダウンロード後7日間のユーザーを取り除くことで、定着したユーザーのみを抽出しています。
これにより、広告出稿などによる急激なダウンロード数の増加があり、DAUが跳ね上がっている場合も、QAUは7日後も遊んでくれているユーザーのみを抽出した値のため、ある程度安定した値になります。
ただ、この方法ではユーザーの気まぐれが起因しているホワイトノイズは取り除けません。
例えば、プッシュ通知などを行うと、休眠ユーザーが一時的にアプリを起動したりするので、QAUも一時的に跳ね上がってしまいます。

<gloops>
続いてブラウザソシャゲで一時代を築いたgloopsさん。ソシャゲのデータマイニングにおいては最初期から力を入れていらっしゃいます。
基本的にはコロプラさんと同じ考え方ですが、こちらの記事によると、gloopsさんの場合はゲーム開始後30日間というのを指標の区切りにしています。
過去30日間のログイン日数でユーザーを数段階に分類し、セグメント別にユーザー推移を見たり施策を検討したりしています。
さらに、ゲーム内のパラメータ(強さ)とクロスさせてセグメント化することで、「昔はハマっていたけど最近はあまりプレイしていない」といったユーザー層も可視化でき、より具体的な施策を行いその結果をウォッチすることができます。
ただ、このやり方はデータマイニングの非常に高度なノウハウや仕組み、人員が必要です。また、タイトルによって指標が異なるため、タイトルをまたいでの指標としては使えないので、簡単には導入できない(使いこなせない)方法だと思います。

<ドリコム>
最後はドリコムさんです。
ドリコムさんは、コロプラさんやgloopsさんの事例を参考に、さらにホワイトノイズを除去するために5日間連続でログインしたユーザーのみを抽出しています。
これにより、広告出稿により急激にDAUが上昇しても(スパイクノイズ)対応でき、気まぐれでログインしたユーザー(ホワイトノイズ)も除去された、純粋に毎日楽しんでいるユーザーのみを対象とした推移を見ることができます。
さらに、この指標でとれたユーザーの課金額が全体の売上の80%以上を占めているということで、売上に影響を与えるユーザーを常にウォッチできる非常に優れた指標だと言えます。
ただ、メンテナンスなどでログインできない時間帯があると、大きく下がってしまうので、5日間中4日間ログインしたユーザーを対象にするなど、さらなる試行錯誤をされているようです。

このように各社様々な「ゲームの面白さ」を測るKPIを検討しています。
ゲームのジャンルによってもそのKPIは異なるし、会社の規模(人員やお金)によっても使いこなせるKPIは変わってきます。
ただ、大事なのは数値を見ることではなく、その先にあるユーザーを見ることなので、そのあたりを忘れず自社にあったKPIを追求していくのが大切ですね。

2015年4月22日水曜日

Intellij IDEAでクリップボードを有効にする方法

Intellij IDEAは独自のCopy&Pasteの機能を実装しているようで、
デフォルトのままだとクリップボード(Clipboard)を利用できないようです。
※ほかのアプリでコピーした内容をペーストできない。

このような状態になってしまった方は次の内容を試してみてください。
私はこの方法で利用できるようになりました。

修正ファイル

Windows:

「<IntelliJ IDEA>/bin/idea.properties」次の内容を追加する。
※Macでも同様のファイルがあると思います。

idea.use.alt.clipboard.sync=true


Mac:

ide.mac.useNativeClipboard=True


2015年4月13日月曜日

Android StudioとUnityで一緒に開発する方法

今日はAndroid StudioとUnity両方で開発する方法を伝えます。

私の環境は次の内容です。
Unity 4.6.2f1
Android Studio 1.1.0

まずはUnityで次の作業を実施してください。

1. Build Settings (Ctrl + Shift + B)を開く
2. PlatformでAndroidを選んでSwitch Platformをクリック
3. Google Android Projectのチェックボックスにチェックを入れる
4. Exportをクリックしてフォルダを選択する。



上記を行うことで次の内容のフォルダが出力されます。

出力フォルダ
│  AndroidManifest.xml
│  project.properties

├─assets
│  └─bin
├─libs
│  │  QCARUnityPlayer.jar
│  │  unity-classes.jar
│  │  Vuforia.jar
│  │
│  └─armeabi-v7a
│        
├─res
│  ├─drawable
│  │      app_icon.png
│  │    
│  └─values
│          strings.xml
│        
└─src
    └─Javaパッケージ

※ 「libs/armeabi-v7a」は環境によって異なると思います。

ここからAndroid Studioに反映していきます。
Android Studioのプロジェクトが次のようになっていると思います。
存在しないフォルダがある場合は手動で作成してください。
※ assets,jniLibsあたりが無いかもしれません。

Android Studio
├─.gradle
├─.idea
├─app
│  ├─libs
│  └─src
│      ├─androidTest
│      └─main
│          ├─assets
│          ├─java
│          ├─jniLibs
│          └─res
├─build
└─gradle


1. Unity側の「assets」をAndroid Studioの「app/src/main/assets」にコピーする。
2. Unity側の「libs/*.jar」をAndroid Studioの「app/libs」にコピーする
3. Unity側の「libs/armeabi-v7a」をAndroid Studioの「app/src/main/jniLibs」にコピーする。
   ※「armeabi-v7a」以外にもフォルダがあった場合はそのフォルダもコピーしてください。
4. Unity側の「res」配下の内容をAndroid Studioの内容とマージする。
5. Unity側のAndroidManifest.xmlとAndroid Studioの内容とマージする。
6. Unity側の「Javaパッケージ」を「app/src/main/java」にコピーする。


あとは「UnityPlayerNativeActivity」を継承した独自のActivityを作成したり、
直接「UnityPlayerNativeActivity」を修正したりしてActivityを開発してください。
一度ここまで行ってしまえば、
Unity側を更新した際は、
「assets/bin」を置き換えるだけでUnity側の内容が更新されます。
※ 念のため、Android Studionの「assets/bin」を削除した後、コピーしてください。

それでは楽しいAndroid, Unityライフを

2015年4月8日水曜日

Android で Myo のデータを取得しよう

どうも、モーション認識部分を担当している太田です。m(_ _)m 

みなさん、Myo ご存知ですか?
知らない方のために、リンク貼っておきます。(for Developer)


・・・どうです?楽しそうでしょ?

 Developer 向けに様々な SDK が公開されています。
が、残念なことに一番面白そうな筋電位データ (EMG) が Android で見れない!

なので、Bluetooth 通信からゴリゴリと取得してみました。
参考にしたのは、制作元が公開している Bluetooth の仕様(C++ のヘッダファイル)と Android のサンプルページ。
https://github.com/thalmiclabs/myo-bluetooth https://developer.android.com/guide/topics/connectivity/bluetooth-le.html

サンプルページの固有値に関して、Myo の仕様に合わせていけば万事 O.K. です。
ただし注意としては、characteristic から取得できるバイト値がリトルエンディアンであること。また、Myo が送信するデータの種類をユーザ側から設定しないといけないので、Myo のコマンドをデータ取得より先に設定してあげることが必要になります。
Myo の仕様を見るとデータ類は全て notification によって取得されるので、この辺りの実装も当然必要です。


まぁ、こんな感じに取得できます。カッコ内の値は秒間のデータ数です。


値を取得するのは出来たのですが、characteristic の notification の設定を有効にすると characteristic の read が使えません。その逆もまた然りです。(T^T)
今のところ、設定の早いもん勝ち状態です。

Android の仕様なのか掴みきれてませんが、同じようなことを言ってる人がチラホラ・・・。
http://stackoverflow.com/questions/17910322/android-ble-api-gatt-notification-not-received
http://stackoverflow.com/questions/22817005/why-does-setcharactersticnotification-not-actually-enable-notifications
そもそも、notification の設定をする descriptor を BluetoothGatt に書き込むのが解せません。。。

どなたか良いアイデアあれば教えて下さい。m(_ _)m

2015年4月3日金曜日

Node.js+Socket.ioを利用してサーバ<->サーバ間通信

クライアント<->サーバ間でリアルタイム通信をしたい場合にsocket.ioを利用すると思いますが、
今回はこれを利用してサーバ<->サーバ間通信を実現してみます。

※ socket.ioのバージョンは「1.3.5」を利用しています。


受信側:
server.js

var socketio = require("socket.io");
var io = socketio.listen(3000);
console.log("start socket.io server.");
io.sockets.on("connection", function (socket) {
console.log("user connect!")

socket.on("message", function (data) {
console.log(data);
});
});

受信側は特に特殊な実装はなし。
クラサバ通信の時と同じ実装で問題ありません。


では、次に送信側の実装内容です。

送信側:
client.js

var io = require('socket.io-client');
var socket = io('http://localhost:3000');
  socket.on('connect', function () {
    socket.emit("message", 'send message.');
});


socket.io-clientパッケージを利用すれば簡単に実装できてしまいました。


最後に起動方法を記載して終了とさせていただきます。

受信側:
]$ sudo npm install socket.io
]$ node server.js
start socket.io server.

送信側:
]$ sudo npm install socket.io-client
]$ node client.js

※ 受信側を実行した後、送信側を実行すると受信側に次のメッセージが表示されます。

user connect!
send message.