[iOS]Google Analytics iOS #2 イベントを計測する / 無料版の制限

2013.05.30

はじめに

前回の「[iOS]Google Analytics iOS #1 ページビューを計測する」に引き続き、Google Analytics iOSについて書いていきます。
今回は、前回作成したプロジェクトを使って「Event Tracking」の動作を試してみたいと思います。

Event Trackingは「ボタンを押した」「画面を閉じた」といった特定のイベントを計測するための機能です。
アプリに関する操作データをニーズに合わせて収集できます。

実装

概要

イベントの計測を設定する際に、下記の4つの要素を指定することができます。

内容
NSString category アプリで発生するイベントの主な分類項目
NSString Action 特定のイベント カテゴリに属する操作
NSString Label さらに細かく分類するためのオプション要素
NSNumber Value 値を明示的に割り当てたり、「downloadTime」など、別の場所で定義した変数から得られる値を割り当てたりすることができる

こうした要素の値は、GoogleAnalyticsのレポート画面に表示されます。
各要素を適切な値に設定することで、レポートの参照や分析が容易になります。

イベントを計測したい部分で「trackEventWithCategory:withAction:withLabel:withValue: 」メソッドを呼ぶことで、計測されたデータはGoogleAnalyticsに送信されます。
例えば下記のように、category:uiAction、Action:buttonPress、withLabel:buttonName Value:100と、それぞれの値を設定します。

[tracker trackEventWithCategory:@"uiAction"
                     withAction:@"buttonPress"
                      withLabel:buttonName
                      withValue:[NSNumber numberWithInt:100]];

前回作成した「AnalyticsTest」プロジェクト(前回の記事はこちらです)にEventTracking用のコードを追加していきます。
MasterViewControllerの「addButtonを押したイベント」と「セルをタップしたイベント」と...
analytics-for-iOS-2-02

UITableView編集時の「Deleteボタンを押したイベント」を計測してみたいと思います。
analytics-for-iOS-2-01

プラスボタンを押したイベント

addButtonのアクションハンドラであるinsertNewObjectメソッドで「trackEventWithCategory:withAction:withLabel:withValue:」メソッドを呼び出します。

Category MasterViewController
Action buttonPress
Label addButton
Value nil
- (void)insertNewObject:(id)sender
{
    if (!_objects) {
        _objects = [[NSMutableArray alloc] init];
    }
    [_objects insertObject:[NSDate date] atIndex:0];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    
    // 追加
    [[GAI sharedInstance].defaultTracker trackEventWithCategory:@"MasterViewController"
                                                     withAction:@"buttonPress"
                                                      withLabel:@"addButton"
                                                      withValue:nil];
    //                                                      
}

セルをタップしたイベント

セルがタップされて詳細画面に遷移する際にprepareForSegue:メソッドが呼ばれるので、
ここで「trackEventWithCategory:withAction:withLabel:withValue:」メソッドを呼び出します。

Category MasterViewController
Action didSelectCell
Label (セルの行番号)
Value nil
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDate *object = _objects[indexPath.row];
        [[segue destinationViewController] setDetailItem:object];
        
        // 追加
        [[GAI sharedInstance].defaultTracker trackEventWithCategory:@"MasterViewController"
                                                         withAction:@"didSelectCell"
                                                          withLabel:[NSString stringWithFormat:@"index:%d",indexPath.row]
                                                        withValue:nil];
        //                                                           
    }
}

Deleteボタンを押したイベント

編集モード時にDeleteボタンが押された時にcommitEditingStyle:forRowAtIndexPath:メソッドが呼ばれるので、
ここで「trackEventWithCategory:withAction:withLabel:withValue:」メソッドを呼び出します。

Category MasterViewController
Action buttonPress
Label deleteButton
Value nil
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [_objects removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        
        // 追加
        [[GAI sharedInstance].defaultTracker trackEventWithCategory:@"MasterViewController"
                                                         withAction:@"buttonPress"
                                                          withLabel:@"deleteButton"
                                                          withValue:nil];
	//                                                        
        
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }
}

コードの追加ができたら、アプリを実行し、設定したイベントを発生させてみます。
暫く待つと、GoogleAnalyticsのレポート画面に反映されるはずです。

レポートを確認

GoogleAnalyticsの管理画面を開き、左側メニューの「ユーザーのロイヤリティ」→「イベント」→「サマリー」と辿ってください。
イベントの計測結果を確認できると思います。
analytics-for-iOS-2-03

補足:スタンダード版とプレミアム版の違いについて

前回は画面表示を、今回はイベントを計測するように設定しましたが、計測された操作はそれぞれ「ヒット」としてGoogleAnalyticsに送信されます。
このヒットの数が1000万を超えない範囲であれば、制限されることもなく無料で使えます。

GoogleAnalyticsにはスタンダードとプレミアムの2種類のサービスがあり、ヒット数の上限などの違いがあるようです。

スタンダード プレミアム
利用料 無料 100 万円/月(想定価格)
1ヶ月あたりの上限ヒット数
(処理が保証される上限)
1000万ヒット 10億ヒット
データの更新頻度の上限 20 万回
(これを超えると、データ更新が 1 日1 回に抑えられる)
20 億回

Google アナリティクスが提供するサポート

データ収集の上限: 1 か月のヒット数が 1,000 万回を超えると、超過したヒット数については処理される保証がなくなります。プレミアム アカウントの場合、この上限は 1 か月に 10 億回です。

データの更新頻度の上限: 標準のアカウントでは、Google アナリティクスに訪問数が 1 日に 20 万回以上送信されると、データ更新が 1 日に 1 回に抑えられます。日次処理は、協定世界時の 12 時に開始され、約 10 時間続きます。これにより、最大 2 日間、レポートや指標の更新に遅延が生じる場合があります。その日のうちに処理できるようにするには、送信する訪問数を 1 日あたり 20 万回未満にまで減らす必要があります。プレミアム アカウントの場合、訪問数の上限は 1 日 20 億回まで拡大されます。

データ制限

GoogleAnalyticsに送信されるヒット数を削減するにはアプリから送信されるデータをサンプリングすると良いようです。

1 か月のページビューが数百万回もあるウェブサイトの場合は、_setSampleRate メソッドを使用して、データをサンプリングするためのトラッキング コードを設定することをおすすめします。サイトのヒット数をサンプリングすると、アカウントのヒット制限の範囲内で信頼できるレポートを作成できます。標準の Google アナリティクス アカウントのヒット数の上限は、1 か月あたり 1,000 万件です。プレミアム アカウントの場合は、1 か月あたり 10 億ヒット以上です。データの収集時にサンプリングを行うと、クライアント サイド側でヒットが破棄され、Google アナリティクスによる収集や処理は行われません。このため、プレミアムの非サンプリング レポートで、破棄されたヒットを復元することはできません。また、セッション サンプリングとは異なり、データ収集のサンプル レートに基づいてレポート結果が推定されることはありませんれません。ただし、アカウントのデータ量が減るため、レポートの応答時間が速くなる可能性はあります。

Google アナリティクスでのサンプリングの仕組み

まとめ

今回は「Event Tracking」を使ってアプリ内で発生するイベントを計測してみました。
計測したい箇所にコードを1文追加するだけでイベントを計測出来ます。

「どの機能が使われているか」等のユーザーの操作データを収集できるので
アプリの機能改善に役に立つと思います。

参考記事

Google Analytics ヘルプ イベントについて