Firebase Remote Configを使ってアプリもA/Bテストしよう！

[エイチームライフスタイルアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/ateam-lifestyle)、7日目です。
本日は [株式会社エイチームライフスタイル](http://life.a-tm.co.jp/) のアプリエンジニア @charden が担当します。

皆さんA/Bテストしてますか？
弊社でもLPOだったりEFOだったりといろんなサイト改善でA/Bテストが日々行われています。

Webサービスだといろんな技術でA/Bテストが行える手法があるのですが、モバイルアプリだとスタンダードなものは少ない印象です。

本日は、[Firebase Dev Summit](https://firebase.google.com/dev-summit-17/?hl=ja)で発表されたFirebase Remote ConfigのA/Bテスト機能を使ってモバイルアプリでも簡単にA/Bテストを行ってみましょう。

# Firebase Remote Configとは？

Firebase Remote Config は、Firebaseベース上に値を設定することでアプリのアップデートすることなく、設定値を変更しアプリの動作や外観を変更することができるサービスです。

今回の機能はその設定を全ユーザーに配信する前にA/Bテストを行って優位かどうかを事前に検証するためものです。この機能は2017年12月現在ベータ版で提供されています。

# 導入
## Firebase Remote Config

[Firebase console](https://console.firebase.google.com/?hl=ja)にアクセスしてプロジェクトを追加しましょう。

<img width="449" alt="スクリーンショット 2017-11-26 22.28.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/7668/eae62cd9-3273-94ab-6203-d79f64638fda.png">

ここではサンプルという名前にしています。

![スクリーンショット 2017-11-26 22.28.44.png](https://qiita-image-store.s3.amazonaws.com/0/7668/e7cc25b6-04b5-45c9-99fb-c3bdcc52ac3a.png)

続いてグローバルナビーゲーションからRemoteConfigを選択します。
右上にあるA/Bテストをクリックします。

<img width="384" alt="スクリーンショット 2017-11-26 22.29.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/7668/4186fa0c-4dbd-40bf-a7ca-3877821be47e.png">

テストの作成をしていきましょう。

今回はAndroidのテンプレート「BasicActivity」を使ってFloatingActionButtonの色を変更するA/Bテストを作ってみたいと思います。

| デフォルト | チャレンジャー |
|---|---|
| ![](https://qiita-image-store.s3.amazonaws.com/0/7668/fe107ca4-c702-8301-aca3-fd12fb26619c.png) | ![](https://qiita-image-store.s3.amazonaws.com/0/7668/d22c99fb-1357-b6dd-b262-12d03bab442f.png)  |





![スクリーンショット 2017-11-26 22.34.56.png](https://qiita-image-store.s3.amazonaws.com/0/7668/fe23b5dc-e1ac-a3b9-793d-1103ab632143.png)

A/Bテスト機能ではターゲットとなるユーザーの条件や割合を設定できます。

- バージョン
- ユーザー(課金の有無、ユーザープロパティ)
- 国
- 言語
- Predictions

Predictionsの設定があるのが熱いですね！
(※PredictionsはGoogleの機械学習を利用して自動的に離脱しそうなユーザーなどをセグメントわけしてくれる機能らしい)




ターゲットを作成したらA/Bテストの内容を決めていきます。
A/BだけでなくA/B/nテストなども行うことができます。

![スクリーンショット 2017-11-26 22.36.44.png](https://qiita-image-store.s3.amazonaws.com/0/7668/9a89d5b0-3931-a2ac-f584-3561ac83234f.png)

配信割合を以下のように設定します。

| グループ       |配信割合|  色   |
|:-------------:|:-----:|:-----:|
| デフォルト      |  50%  |#FF0000|
| チャレンジー    |  50%  |#0000FF|


![スクリーンショット 2017-11-26 22.38.33.png](https://qiita-image-store.s3.amazonaws.com/0/7668/7dc7d894-4737-7647-92d8-2ac37366023a.png "スクリーンショット 2017-11-26 22.38.33.png")

最後に目標を設定します。
目標には定着であったり、FirebaseAnalyticsのイベントを設定できます。
今回であればボタンのクリックイベントを設定するのがよいでしょう。

# Android側の設定

Firebaseとの連携については、今回は省略しますが、Tools>Firebaseから設定ツールを呼び出すことで比較的簡単に既存のコードにFirebaseを入れ込むことができます。

今回はBasicActivityのテンプレートのMainActivityの一部を変更して実装しています。
コードの一部はこちら

```kotlin
val firebaseRemoteConfig = FirebaseRemoteConfig.getInstance()
firebaseRemoteConfig.setDefaults(R.xml.remote_config)
firebaseRemoteConfig.fetch(1)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                firebaseRemoteConfig.activateFetched()
            }
            val color = firebaseRemoteConfig.getString("color") //Firebaseで設定した値を取得する
            fab.backgroundTintList = ColorStateList.valueOf((Color.parseColor(color)))
        }
```


# A/Bテストのデバッグ

A/Bテスト機能にはテスト端末で動作テストを行う機能がついています。

```kotlin
Log.d("IID_TOKEN", FirebaseInstanceId.getInstance().token)
```

kotlinだと上記のようなコードでインスタンス ID トークンを取得します。
テスト端末の管理にインスタンス ID トークンと所属するグループを設定することで対象のテスト端末をそのグループに設定してテストすることができます。

このテストはA/Bテストの公開前のみに行うことができるため、A/Bテストを作成したら検証することをオススメします。

# A/Bテストの結果

<img width="964" alt="スクリーンショット 2017-11-28 23.52.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/7668/87898ec5-3ff7-13f0-1d3e-f9069ef4e57f.png">

A/Bテストの結果はベースラインとチャレンジャーを比較して改善結果を見ることができます。
またそれが最適である確率も表示してくれるためにA/Bテストの精度も確認することができます。

テストを開始した後は割合を増やしていくことができます。

最終的にA/Bテストの結果をみてどちらかの配信割合を100％にするとテストは終了となります。


# その他
RemoteConfigだけでなく、Notificationsとも連携できるようです。

Push通知のメッセージをA/Bテストすることでその効果を量ることができます。

# まとめ
- 複数のRemoteConfigを条件に従って出し分けることでA/Bテストが可能
- 目標を定めてどの条件がよかったかを判断できる
- テスト端末で事前にA/Bのパターンを検証できる
- Notificationsにも対応している

A/Bテスト機能はTensorflowなどの機械学習との連携や最適化も視野にいれて動いているようです。
Firebase自体のアップデートもたくさん行われているのを見るとGoogleの力の入れようがわかります。
今後モバイルアプリ開発のプラットフォームにおいて大きな柱になっていくことでしょう。

# 最後に
[エイチームライフスタイルアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/ateam-lifestyle)の7日目、いかがでしたでしょうか。
明日は[株式会社エイチームライフスタイル](http://life.a-tm.co.jp/)に今年入社した@kyntkさんです。お楽しみに！

[株式会社エイチームライフスタイル](http://life.a-tm.co.jp/)では、一緒に働けるチャレンジ精神旺盛な仲間を募集しています。興味を持たれた方はぜひエイチームグループ採用サイトを御覧ください。
http://www.a-tm.co.jp/recruit/