第10回では、
なお、
分析ルールの作成
前回の
今回の例ではスタンプの利用回数をカウントするだけの非常にシンプルなルールを作成します。
もし、
分析ルールについて詳しく見ていきましょう。
Name
分析ルールの名前を設定します。わかりやすい名前を設定してください。
今回は
Data
分析対象データのソースの種類を設定します。KiiChatアプリで使用してきたchat_
Aggregate using
集計する対象と、
Filter by type
Event Dataは1つの共通のバケットに複数の種類のイベントデータを保存していくようなイメージになります。これらのイベントの種類を区別するためにTypeを設定します。今回はスタンプを送信したタイミングで発生するイベントなので
Dimensions
分析結果をグルーピングする設定です。今回はスタンプの人気を分析する為に、
イベントデータの送信
分析ルールを作成した後は、
まずイベントデータを送信するメソッドをChatStampクラスに実装します。
public static void sendUsageEvent(ChatMessage message) {
    if (message.isStamp()) {
        try {
            KiiEvent event = KiiAnalytics.event("stamp_usage");
            event.set("stamp_uri", message.getStampUri());
            event.push();
        } catch (IOException ignore) {
            Logger.w("failed to send event");
        }
    }
}
最初にKiiAnalytics#event(String)メソッドにイベントタイプを指定してKiiEventのインスタンスを生成します。KiiEventには任意のkey-valueを設定することができます。
先ほど分析ルール作成で集計の対象として設定した”
ここで実装したメソッドは、
private class SendMessageTask extends AsyncTask<Void, Void, Boolean> {
    private final ChatMessage message;
    private SendMessageTask(ChatMessage message) {
        this.message = message;
    }
    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            this.message.getKiiObject().save();
            // イベントデータの送信
            ChatStamp.sendUsageEvent(this.message);
            return true;
        } catch (Exception e) {
            Logger.e("failed to send messsage", e);
            return false;
        }
    }
}
分析結果の確認
Flex Analyticsの分析結果は、
以下の図は、
このようなデータの分析はアプリケーションをマネタイズする上でとても重要な要素になります。例えばゲームアプリなどの場合は、
分析結果のアプリケーションからの利用
Flex Analyticsの分析結果はアプリケーションから利用することも可能です。
ここではサンプルとしてスタンプを人気順
スタンプ一覧の取得処理は既に実装済みなので、
/**
 * 人気順でソートする為のComparatorを取得します。
 * Analyticsの結果を元に人気順を判定するため、KiiCloudとの通信が発生します。メインスレッドでは実行しないでください。
 *
 * @return ChatStampを人気順でソートするためのComparator
 */
public static Comparator<ChatStamp> getPopularityComparator() {
    try {
        // 直近1ヶ月のスタンプの利用データを取得
        Calendar cal = Calendar.getInstance();
        SimpleDate end = new SimpleDate(cal.get(Calendar.YEAR),
            cal.get(Calendar.MONTH) + 1,
            cal.get(Calendar.DATE));
        cal.add(Calendar.MONTH, -1);
        SimpleDate start = new SimpleDate(cal.get(Calendar.YEAR),
            cal.get(Calendar.MONTH) + 1,
            cal.get(Calendar.DATE));
        DateRange dateRange = new DateRange(start, end);
        ResultQuery query = ResultQuery
            // スタンプのURIごとにグルーピング
            .builderWithGroupingKey(“stamp_uri”)
            // 直近1ヶ月のデータのみ取得
            .withDateRange(dateRange)
            .build();
        GroupedResult result = KiiAnalytics.getResult(ApplicationConst.AGGREGATION_RULE_ID, query);
        List<GroupedSnapShot> snapshots = result.getSnapShots();
        // Analyticsの結果をMapに格納する、key=スタンプのURI, value=スタンプが使用された回数
        final Map<String, Long> stampUsageMap = new HashMap<String, Long>();
        for (int i = 0; i < snapshots.size(); i++) {
            try {
                // Analyticsの結果は日別(pointInterval)に分割されて配列として取得されるので、合計値を計算する
                long usage = 0;
                for (int j = 0; j < snapshots.get(i).getData().length(); j++) {
                    usage += snapshots.get(i).getData().getLong(j);
                }
                stampUsageMap.put(snapshots.get(i).getName(), usage);
            } catch (JSONException e) {
                stampUsageMap.put(snapshots.get(i).getName(), 0L);
            }
        }
        // スタンプの使用回数でソートする
        return new Comparator<ChatStamp>() {
            @Override
            public int compare(ChatStamp lhs, ChatStamp rhs) {
                // 比較対象のスタンプの使用回数を比較する
                long lhsUsage = stampUsageMap.get(lhs.getUri()) == null ?
                    0L : stampUsageMap.get(lhs.getUri());
                long rhsUsage = stampUsageMap.get(rhs.getUri()) == null ?
                    0L : stampUsageMap.get(rhs.getUri());
                // 使用回数が多い順(降順)にソートしたいので、通常のComparatorの定義とは逆の戻り値を返す
                if (lhsUsage > rhsUsage) {
                    return -1;
                } else if (lhsUsage < rhsUsage) {
                    return 1;
                } else {
                    return 0;
                }
            }
        };
    } catch (KiiAnalyticsException ignore) {
        // Analytics結果の取得に失敗した場合は、デフォルトの新着順のComparatorを返す
        Logger.w("failed to get analytics result", ignore);
        return getNewlyComparator();
    }
}
人気順の定義ですが、
まず、
最後にKiiAnalytics#getResult()にResultQueryと分析ルールのIDを指定することで分析結果を取得します。
分析結果はGroupedSnapShotクラスで表現されます。少しわかりづらいですが、
{
    "snapshots" : [
        {
            "name" : "kiicloud://buckets/chat_stamps/objects/xxxxx1",
            "data" : [ 4, 10, 8, 12 ],
            "pointStart" : 1385823600000,
            "pointInterval" : 86400000
        },
        {
            "name" : "kiicloud://buckets/chat_stamps/objects/xxxxx2",
            "data" : [ 0, 2, 1, 4 ],
            "pointStart" : 1385823600000,
            "pointInterval" : 86400000
        }
    ]
}
nameフィールドにスタンプのURIが設定されており、
これらをもとに、
まとめ
今回は、
ユーザの行動を収集、