GoogleAnalyticsで簡単にABテストを行うRailsのGemを作ってみた

会社に自分が導入した、GoogleAnalyticsを使ってABテストを行う実装が大体固まって来たので、Rails用のGemとして切り出しました。
自分用メモ&社内共有用等を含めてGemの使い方を紹介します。

# そもそも何故ABテストにGoogleAnalyticsをそのまま使うのか
まあ当時はGoogleOptimizeがなかったので、これしか方法がなかった、というのが答えなのですが、GoogleOptimizeが正式版になった今でも何故そっちに移行しないのかには理由があります。
GoogleOptimizeは自分は業務では使ったことが無いのですが、個人的に軽く使ってみた感じとしては、jsでいじれる範囲でのUI的な部分しかテストできないため、かなり限定的にしか使用できないように感じました。
UI部分のみの変更しかしないような場合はいいのですが、例えばレコメンドのロジックを変えてABテストを行いたいなどの場合には使用することが大変(やろうと思えばできなくはないです)なため、あえて移行する必要はまだ無いと考えています。
webマーケや企画系の人がサクッとUI変更だけ試すという場合にはOptimizeでもいいかもしれないですね。

# 作ったGemについて
https://github.com/ykogure/google_analytics_ab_test_on_rails
https://rubygems.org/gems/google_analytics_ab_test_on_rails

今回作成したGemでは、GoogleAnalyticsへセッション切り分け用のイベントトラッキングを送信する方法として、GoogleTagManagerを通す方法と、analytics.jsで直接イベントを送信する2種類の方法を選択できるようにしています。
自分のサイトに合わせて選んで下さい。

ちなみにGoogleTagManagerを使う方法では、自分が作ったGoogleTagManager用のGemの[GTMonRails](https://github.com/ykogure/gtm_on_rails)を使うようになっています。

※下記記事にGTMonRailsの導入方法については記載されています
[GoogleTagManagerを簡単に使うためのRails用Gemを作ってみた(GTMを使ったPV計測の設定方法)](https://qiita.com/ykogure/items/ebca38c038f996fb361f)

# 導入&設定手順
## Gemの導入
Gemfileに

```rb:Gemfile
gem 'google_analytics_ab_test_on_rails'
```

と書いて`bundle install`します。
インストール後、

```bash
rails g google_analytics_ab_test_on_rails:install
```

のコマンドを実行し、初期設定(configファイル生成等)を行います。

## Gemの設定
生成された`config/initializers/google_analytics_ab_test_on_rails.rb`でGemの設定を変更します。

### sender
GoogleTagManagerかanalytics.jsか、イベントトラッキングの方法を選ぶ設定。
「:gtm」か「:analytics_js」を設定値に入れる。

### tracking_event_category
GoogleAnalyticsのイベントカテゴリを設定する。
nilを設定した場合、"railsのコントローラ#railsのaction"が自動で設定される。

### tracking_event_action
GoogleAnalyticsのイベントアクションを設定する。
nilを設定した場合、"ab_test"が自動で設定される。

### tracking_event_label
GoogleAnalyticsのイベントラベルを設定する。
「{ab_test_name}」の部分に指定したABテストの名前が入り、「{ab_test_value}」にABテストの値が入る。

## GoogleTagManagerの場合
https://qiita.com/ykogure/items/ebca38c038f996fb361f
この記事にあるGTMonRailsのGemの設定を行う。

次に、下記のトリガー・タグを設定すればGoogleAnalyticsへイベントを送信できます。

<img width="980" alt="スクリーンショット 2018-02-13 13.41.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/108414/2d15791e-13ea-93e6-93b1-75e3bc205622.png">

<img width="1044" alt="スクリーンショット 2018-02-13 13.42.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/108414/e086b4c2-6fbf-5af0-fd8e-0fecf635b4ce.png">


## analytics.jsの設定
analytics.jsを使用する場合、

```erb:application.html.erb
<%= render_ab_test_analytics_js %>
```

bodyタグ内のanalytics.jsの計測タグより後に上記ヘルパータグを入れる。

## ABテストを設定する
### ABテストの開始
```rb:controllerやview
ab_test_start(:aiueo, ['A_pattern', 'B_pattern'])
```
上記のように記述することで、「aiueo」という名前のABテストを開始する事ができます。
ABテストの開始とは、1度目のアクセスの場合に、GoogleAnalytics側にABテストの名前と振り分け内容を含むイベントを送信することと、セッションに同じ内容を保存することです。

### ABテストの振り分け
```rb:controllerやview
if get_ab_test_value(:aiueo) == 'A_pattern'
 # 処理内容A
else
 # 処理内容B
end
```
ABテストの開始の記述後、``get_ab_test_value``で現在のセッションの振り分け内容を取得し、それに応じて処理を分岐させます。

また、振り分けに関しては、下記のように記述することも可能です。

```rb:controllerやview
ab_test_start(:aiueo, ['A_pattern', 'B_pattern']) do |ab_test_value|
  if ab_test_value == 'A_pattern'
   # 処理内容A
  else
   # 処理内容B
  end
end
```

### ab_test_startメソッドについて
```rb
ab_test_start(:aiueo)
```
ABテストの振り分け候補を設定しない場合、デフォルトで'true'または'false'が文字列で設定されます。

```rb
ab_test_start(:aiueo, ['A_pattern', 'B_pattern', 'C_pattern'])
```
3パターン以上の振り分けも設定できます。

```rb
ab_test_start(:aiueo, {'A_pattern' => 1, 'B_pattern' => 9})
```
デフォルトの振り分け率は等確率でパターン振り分けを行いますが、上記のようにHashを設定することで、振り分け率を設定可能です。

```rb
ab_test_start(:aiueo, ['true', 'false'], event_category: 'カテゴリー')
```
`config/initializers/google_analytics_ab_test_on_rails.rb`でも設定可能ですが、場合に応じてab_test_startメソッド毎に上記のようにイベントカテゴリ・アクション・ラベルを設定可能です。

## ABテストマネージャの設置
ABテストが設置されているかどうかや、ABテストの両パターンをテストするために切り替えたりすることのできる「ABテストマネージャ」を設置します。

```erb:applicatin.html.erb
<%= render_ab_test_manager %>
```
上記ヘルパータグを設置することで、画面上に固定で表示されるABテストマネージャを設置することができます。
実際には、ユーザー側に見えてしまうのは問題だと思いますので、適宜条件を指定して、管理者側しか見られないようにすることが必要になります。(IP制限等)

### 設定
デフォルトでは、ABテストマネージャは下部に固定されるものになっており、さらにABテストマネージャ自体のビューは変更できません。

```bash
rails g google_analytics_ab_test_on_rails:views position_top
rails g google_analytics_ab_test_on_rails:views position_bottom
```
上記のコマンドを実行することで、2種類のABテストマネージャ用viewファイル``app/views/google_analytics_ab_test_on_rails/_ab_test_manager.html.erb``を作成することができる。
このviewファイルを変更することで、ABテストマネージャのviewを好きに変更できます。

---

これで一通り設定は完了です。
以下に計測方法の一例を書いておきます。

ただ、計測方法に関してはKPIや状況によって変わると思いますので、そこは適宜やってもらえればと思います。

## 計測方法
GoogleAnalytics側での計測方法を簡単に書いておきます。

<img width="982" alt="スクリーンショット 2018-02-13 13.28.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/108414/494214ee-fea6-24f9-04dc-c19225271df2.png">

上記のようなセグメントを設定します。AパターンとBパターン等振り分けの分を作成します。

<img width="1263" alt="スクリーンショット 2018-02-13 13.30.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/108414/a811324a-c5ba-bc8e-26b9-a337c95ce7e0.png">

そして、KPIがCVRの場合には、このように自分は「集客 > 概要」の項目で見ていることが多いです。
あとはセッションに対するコンバージョン数等の数値から、各パターンにおいて有意差があるかどうかt検定したりすればABテストの結果がだせると思います。

# 今後追加したい機能
- 現状Gemに入っているABテストマネージャのビューは、自分が今会社で担当しているサイトに最適化してあるレイアウトのため、より汎用性の高いbootstrap用等のデフォルトビューの生成機能を追加したい。
- 新しいGoogleAnalytics用のタグである、gtag.jsへの対応