iOS
ABtesting
Swift
Firebase

目標指標に定義したAnalyticsEventを使用しFirebaseでA/BTestを行う手順(iOS向け)


概要

この記事ではiOS向けにFirebaseでA/BTestを行う際に、

AnalyticsEventをA/BTestの目標指数として使用してTestする方法の手順について説明します。

記事を書いた目的は、

開発者側がリリース前に仕込んだAnalyticsEventでA/BTestを行う方法について触れている記事がないなと思い記事にしてみようと思ったからです。

Firebaseプロジェクト作成の話は割愛し、

AnalyticsEventをA/BTestの目標指数として使用してTestする方法のみの内容になります。

Firebaseプロジェクトの作成はリンクより公式の説明を元に行なった方がわかりやすいのでやってみてください。


前置き

FirebaseでA/BTestを行う方法について説明する際に、とあるストーリーベースで進めていきたいと思います。


ストーリー

FirstViewからSecondViewへ遷移するアプリがある。

FirstViewには"Login"と書かれたボタンが配置されこのボタンを押すことでSecondViewへ遷移する。

SecondViewへ遷移した際のログを取っておりログを見る限りSecondViewへ遷移しているユーザ数が少ない。

そこで、FirstViewに配置してあるボタンを"FaceBookLogin"であることがわかるUIに差し替えた場合

SecondViewへ遷移するユーザは増えるのかどうかをテストする。

スクリーンショット 2018-08-14 0.24.47.png


FirebaseAnalyticsにEventを通知

Analytics.logEvent("showSecondView", parameters: nil)

この一行でSecondViewに遷移した際に、

showSecondViewというEventがFirebaseコンソールのEventへ通知されます。


FirstViewController.swift


import UIKit
import Firebase

class SecondViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
Analytics.logEvent("showSecondView", parameters: nil)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}



EventをConversionに設定


showSecondViewがEventとして通知されているか確認しConversionとして設定

※通知が届くまで時間がかかります

1.png


showSecondViewがConversionに登録されているか確認

2.png


A/BTestを作成

テストを作成ボタンを押すと、NotificationsとRemoteConfigどちらか選択できるのでRemoteConfigを選択してください。

3.png


バリアントの設定

対象となるユーザから均等に分類されます。

50%がコントロールグループ(変更がない今までのバージョン)残りの50%がfaceBookBtn(変更があるバージョン)となります。

A/B/Cテストの場合はそれぞれ33.333%となります。

スクリーンショット 2018-08-13 22.57.25.png


目標設定

5.png


コードの準備

remoteConfig.setDefaults(["btnType": "typeA" as NSObject])

初期値として変更がない今までのバージョン(typeA)を設定しています。

remoteConfig.fetch(withExpirationDuration: TimeInterval(0)

TimeInterval(X)はX秒RemoteConfigの設定値をローカルキャッシュとしてもつことを示します。

今回は、0秒なのでSecondViewControllerに遷移するたびRemoteConfigから値を取ってくるのでその度通信が発生します。


FirstViewController.swift


import UIKit
import Firebase
class FirstViewController: UIViewController {

var remoteConfig: RemoteConfig!

override func viewDidLoad() {
super.viewDidLoad()

self.remoteConfig = RemoteConfig.remoteConfig()
let remoteConfigSettings = RemoteConfigSettings(developerModeEnabled: true)
remoteConfig.configSettings = remoteConfigSettings
remoteConfig.setDefaults(["btnType": "typeA" as NSObject])
remoteConfig.fetch(withExpirationDuration: TimeInterval(0), completionHandler: { (status, error) -> Void in
if status == RemoteConfigFetchStatus.success {
self.remoteConfig.activateFetched()

if let type = self.remoteConfig["btnType"].stringValue {
if type == "typeA"{
//何も変化無し
}else{
//FaceBookLogin
}
}

} else {
}
})
}
}



計測結果

※通知が届くまで時間がかかります

この結果より、faceBookBtnグループの方がSecondViewControllerへ遷移することがわかります。

スクリーンショット 2018-08-13 20.26.16.png


全ユーザに適用するまでの手順


テストの範囲を広げていく

テストを配信するユーザの割合を設定します。

以下のスクショ通りであれば、全ユーザの50%にテストが実施されます。

全ユーザ数が100人とすると、50人のユーザがテスト対象となり、ABそれぞれのパターンが25人ずつ反映される

11.png


テスト結果が十分である場合、全ユーザに効果がある方を反映

22.png


まとめ

1:Eventを通知

2:EventをConversionとして設定

3:A/BTestを作成

4:A/BTestの結果より配信数を伸ばすか撤退か決める

5:十分に効果が見込める場合、全ユーザに配信

手順としては5つ!

今回は、A/BTestを行う方法についての説明でしたが、

重要なのは、どこをテストするか(どこにログを仕込むか)ということなので

テスト箇所についてはチームで議論して実装フェーズまで持っていければあとは環境を整える。

この環境作りの際にこの記事がお役にたてば幸いですmm


最後に

今回のA/BTestではRemoteConfigを用いてテストを行なっているので以下ライブラリを使ってみるとスマートにかけたりするのかなとも思ってたり(まだ試してはいないですが、ゆくゆくは試したい)

Lobster

Firebaseが絡むライブラリをOSSとして展開。。。イイなぁ!