RubyからGoogle Analytics API を扱う"Legato"の使い方

Legatoの使い方をかんたんにメモします。

https://github.com/tpitale/legato

LegatoはGoogle Analytics API を扱うためのライブラリです。以前メジャーだった今はメンテナンスされていないGarbとコンパチブルです。


## 通常データの取り扱い（コアレポーティングAPI）

Legatoを使うとRuby的にGoogleAnalyticsのデータを取り扱えます。

以下クラスはAPI経由で取得するデータの定義です。metricsが指標で、dimensionsがデータの取得軸です。dimensionsによって分割されたデータが返ってきます。

```rb
    class OrganicKeyword
      extend Legato::Model

      metrics :sessions, :bounces, :bounceRate, :exits, :exitRate, :pageviews, :screenviews
      dimensions :channelGrouping, :keyword

      filter :keywords_contain, &lambda {|keywords|
        keywords.map{|keyword|
          contains(:keyword, keyword)
        }
      }
      filter :only_organic, &lambda {
        eql(:channelGrouping, "Organic Search")
      }
    end
```

以下のコードでは、検索エンジン経由でかつ、keywordsが含まれるアクセス解析データがrowsに返され、さらにそれをkeywordとセッション数がペアになったマップに格納しています。

```rb
rows = OrganicKeyword.only_organic.keywords_contain(keywords).results(profile, options)
map = rows.inject({}){|result, v|
  result[v.keyword] = v.sessions
  result
}
```

###ソートの方法

この部分がちょっと分かり辛かったので説明します。

セッション数の大きい順でソートするには以下のように先頭に"-"ハイフンを付けます。

```rb
results(start_date: 7.days.ago, end_date: Time.now, sort: "-sessions")
```

複数の検索条件を指定する場合、配列にして渡します。以下のコードはコンバージョンの多かった順でのソートを優先します。

```rb
results(start_date: 7.days.ago, end_date: Time.now, sort: ["-goalCompletionsAll", "-sessions"])
```


###フィルタリングの方法

Legatoを使ったfilterのAND検索とOR検索が少し分かりづらかったので、この説明をします。

以下AND検索の例です。

```rb
filter :for_keyword, &lambda {|v| contains(:keyword, v)}
OrganicKeyword.for_keyword("Qiita").for_keyword("Ruby") # AND検索
```

以下OR検索の例です。mapにして値を返しているのがポイントです。これらは全てORで繋がれて検索で利用されます。

```rb
filter :for_keyword, &lambda {|keywords|
        keywords.map{|keyword|
          contains(:keyword, keyword)
        }
      }
OrganicKeyword.for_keyword(["Qiita", "Ruby"]) # OR検索
```

OR検索の方法として、以下のように|(パイプ)で単語を繋ぐ方法もあります。この場合、つないだ文字が長くなるとGoogleAnalyticsのフィルタ指定可能な上限文字数の128文字を超えやすくなるので注意が必要です。

```rb
filter :for_keyword, &lambda {|v1, v2| contains(:keyword, "#{v1}|#{v2}")}
OrganicKeyword.for_keyword("Qiita", "Ruby") # OR検索
```

Filter Expressionsの正規表現についての箇所に128文字超えると400 Bad Requestをサーバーから返すとありました。https://developers.google.com/analytics/devguides/reporting/core/v3/reference#filterExpressions

Legatoのフィルタリングで正規表現を使うには#contains を使う必要があります。他に使えそうなものとして#substring がありますが、こちらは正規表現が使えません。この理由はGoogleAnalyticsのフィルタで使うOperatorの指定にあります。

以下はLegatoのメソッドとオペレータと、GoogleAnalyticsフィルタリングのオペレーターとdescriptionを組み合わせたものです。#containsと#does_not_containに正規表現が使える事が分かりますね。

```rb
matches          => '==', # Exact match
does_not_match   => '!=', # Does not match
contains         => '=~', # Contains a match for the regular expression
does_not_contain => '!~', # Does not match regular expression
substring        => '=@', # Contains substring
not_substring    => '!@'  # Does not contain substring
```

## マルチチャネルの取り扱い

Legatoでは以下のようにCore Reporting APIと同じ感覚でMulti-Channel Funnels Reporting API (MCFレポーティングAPI) を扱えます。{tracking_scope: :mcf}とつけてあげるのがポイントになります。

```rb
    class MultiFunnel
      extend Legato::Model

      metrics :firstImpressionConversions,
      :impressionAssistedConversions,
      :totalConversions,
      :assistedConversions,
      :firstInteractionConversions,
      :lastInteractionConversions,
      {tracking_scope: :mcf}

      dimensions :basicChannelGroupingPath,
      :keywordPath,
      :sourceMediumPath,
      {tracking_scope: :mcf}
    end
```

マルチチャネルでは、ウェブサイトで起こったコンバージョンを経路別で分析したり、アシストCVの取得が出来ます。

## リファレンスへのリンク集

Legato
https://github.com/tpitale/legato

Legatoのフィルタリング説明
https://github.com/tpitale/legato/wiki/Filtering

コアレポーティングAPIのリファレンス
https://developers.google.com/analytics/devguides/reporting/core/v3/reference

コアレポーティングAPIのソート説明箇所
https://developers.google.com/analytics/devguides/reporting/core/v3/reference#sort

マルチチャネルの概要
https://support.google.com/analytics/answer/1191180

MCFレポーティングAPIのリファレンス
https://developers.google.com/analytics/devguides/reporting/mcf/v3/