iOSアプリで、Google AnalyticsのABテスト機能を使う その2


[今開発中のPlayer!](https://itunes.apple.com/jp/app/id897872395)というiOSアプリでABテストを行うために、各種サービスを検討したり自前で何とかしようか迷いつつ、Google Analyticsを利用することにしました。


[iOSアプリで、Google AnalyticsのABテスト機能を使う その1 - Qiita](http://qiita.com/mono0926/items/c7abf2503cbccf26c5ab) の続きです。

## Google Tag Managerの設定

### ABテスト用の変数を作成

Tag Managerのcontainer作成直後は変数が空なので、ABテスト用の変数を作りましょう。


![Screen Shot 2015-06-23 at 17.01.05.png](https://qiita-image-store.s3.amazonaws.com/0/19398/044067f8-34cb-25a6-2cd1-f367cd4b5dfa.png "Screen Shot 2015-06-23 at 17.01.05.png")

こんな感じで条件など設定します。
この例だと、'cut'がtrueの時はある画面をスキップさせる試みです。
2通りになっていますが、複数パターンを一気に試せます。
(後述の通り、バンディットアルゴリズムで効率良く)

![Screen Shot 2015-06-23 at 17.06.08.png](https://qiita-image-store.s3.amazonaws.com/0/19398/a1ce650b-0413-a69e-5610-214844a07bca.png "Screen Shot 2015-06-23 at 17.06.08.png")

無事に一覧に現れました(　´･‿･｀)

![Screen Shot 2015-06-23 at 17.09.45.png](https://qiita-image-store.s3.amazonaws.com/0/19398/d5343522-a391-676f-edaa-396e7c0fdf27.png "Screen Shot 2015-06-23 at 17.09.45.png")

### Puslish

Publishという、変更をコミットするような操作を行います。

![Screen Shot 2015-06-23 at 17.15.23.png](https://qiita-image-store.s3.amazonaws.com/0/19398/4b54a76e-6e96-4911-9e61-ba937d9c4672.png "Screen Shot 2015-06-23 at 17.15.23.png")


また、アプリに配置するために、Containerファイルをダウンロードしましょう。

`GTM-XXXXXX_v1` のようなファイル名のバイナリファイルですが、`GTM-XXXXXX` のようにリネームしておきましょう。

![Screen Shot 2015-06-23 at 17.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/19398/ea099878-2120-ca03-dd3a-8e51daa35ab3.png "Screen Shot 2015-06-23 at 17.15.55.png")


## クライアント実装

ざっくりこんなイメージです。

- `GTM-XXXXXX` という設定ファイルのようなものをローカルに持って取り急ぎそれを参照
- 起動直後に最新の設定ファイルをダウンロード
- 設定ファイルは、TAGContainerのインスタンスとして読み取って、その値を元にクライアントの挙動を変える


### import

これらをimportしましょう。

```swift
#import <TAGManager.h>
#import <TAGContainer.h>
#import <TAGContainerOpener.h>
```

### GTM-XXXXXXをプロジェクトに追加

所望のものをファイルTargetに設定すればパスはどこでもOKです。


### AppDelegateで諸々記述

必要なところのみ貼ります。


```swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, TAGContainerOpenerNotifier {
    private lazy var tagManager = TAGManager()
    private var tagContainer: TAGContainer?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {    
        TAGContainerOpener.openContainerWithId("GTM-XXXXXX", tagManager: tagManager, openType: kTAGOpenTypePreferFresh, timeout: nil, notifier: self)
        return true
    }
    
    // MARK: - TAGContainerOpenerNotifier
    func containerAvailable(container: TAGContainer!) {
        // 試したらこの時点でメインスレッドで返ってきたけど、ドキュメント通りに一応
        dispatch_async(dispatch_get_main_queue()) {
            self.tagContainer = container
            // こんな感じで値が取れる
            let value = container.stringForKey("ex")
            return
        }
    }
}
```


これで無事にABテスト環境が整いました。
Google Analyticsの「行動」の「ウェブテスト」に、項目が現れるはずです。

Tag Manager周りは他にも色々機能があり、けっこう奥が深いです。

## 気づいた点など

- どの設定が適用されるかは、再起動などしても固定
	- インストールし直すと変わる
- Variationsに設定できる値は後から編集出来ない
	- 変更したい場合、作り直し


## いまいちな点

テストの指標が4つから選べますが、例外・クラッシュはABテストで測ることってあまり無いはずなので、実質、スクリーンビューとセッション時間の2択です（´・ω・｀）
本当は継続率を測りたかったのですが、スクリーンビュー数でも大体似てくるかなと妥協しました（´・ω・｀）

![Screen Shot 2015-06-23 at 17.02.58.png](https://qiita-image-store.s3.amazonaws.com/0/19398/a4cabd12-0103-bef2-e7bf-d881547dcfb1.png "Screen Shot 2015-06-23 at 17.02.58.png")





## 余談: 本当は「ABテスト」ではなく「多腕バンディットテスト」

分かりやすさのために「ABテスト」と表現していますが、「多腕バンディットテスト」という表現が正確なようです。

[多腕バンディット テスト - アナリティクス ヘルプ](https://support.google.com/analytics/answer/2844870?hl=ja&ref_topic=1745207)に詳しく書いてあって面白いです(　´･‿･｀)

ざっくりいうと、テスト対象の分布を最適に配分調整して、効率を高めていくというものです。
また、パフォーマンスが良い方に傾斜配分していってくれるので、テストでUXが下がっちゃうユーザーも減ります。
自前実装だとけっこう大変だと思うので、そこのあたり面倒見てくれて助かります。
オプションで等配分にしたりも出来ます。

このあたりの記事も有名かと思います。

- [ABtesting - A/Bテストよりすごい？バンディットアルゴリズムとは一体何者か - Qiita](http://qiita.com/yuku_t/items/6844aac6008911401b19)
- [バンディットアルゴリズム入門と実践](http://www.slideshare.net/greenmidori83/ss-28443892)