ウェブサイトの主要なURLのIndexチェックはCustom Search APIを利用する

SEOでGoogle検索のランキングチェックをしている企業や個人も多いと思います。Search Consoleでのレポートも多いため普段はそちらをチェックしているのですが、以前なんの拍子でか主要ページURLがIndexから外れていたという事がありました。Search Console側では数日後に検知されていましたが。

ただ、これを気に主要ページだけでもIndexチェックを自動的に回したいなと思い、毎月1回主要ページをのIndexチェックをCustom Search APIを利用することにしました。
Index調査は色々ツールもあるでしょうし、もっと簡単に分かる方法もあるとは思いますが今回はCustom Search APIを利用した場合です。
※1日100リクエストまで無料なので無料枠範囲内で毎日別のURLチェックをすることである程度低価格 OR 無料範囲内でチェック可能

ざっと適当なコードはこちら。


API_KEY = '' #consoleで発行したAPI KEY
CUSTOM_SEARCH_ENGINE = '' #Custom search engineで発行されたID

def get_url(search_keyword):
    urls = []
    query = 'https://www.googleapis.com/customsearch/v1?key=' + API_KEY + '&cx=' + CUSTOM_SEARCH_ENGINE + '&num=1&q=' + quote(search_keyword)
    res = urllib.request.urlopen(query)
    data = json.loads(res.read().decode('utf-8'))
    
    try:
        urls.append(data["items"][0]["link"])
        return urls
    except:
        # Indexされていないことを伝える通知とか

こんな感じでCustom Search APIを叩いていきます。
検索キーワードはGoogle先生おなじみの `site:` を利用していきます。

例) site:www.google.co.jp

で叩いているURLを見れば分かるように1位しか取得していません。1位のURLがIndexしたいURLと同一であればIndexされている。そうでなければされていないと判断でしていきます。

ただ必ず1位になるわけではない点は注意です。
適切にウェブサイトが整えられていて、サイト内リンク構造もキレイであれば基本的には1位になるわけですが、そうでない場合は1位に来ないのでそこは反省しましょう(?)

(参考)Custom Search JSON API

Google AnalyticsのRealtime APIの結果を雑にSlackに流す

Google AnalylticsのRealtime APIはGoogle Analytics画面のレポート>リアルタイムの数字をAPIで取得するものですが、公式ドキュメントにあるとおりベータで利用するには事前申請が必要...と思っていた訳ですが、普通にたたけばデータ取得できたのでこの数字を雑にSlackへ流すことにしました。

直近のイベントをSlackや別の何かですぐに気づきたい場合に利用できます。
V3のエンドポイントに対してRealtime API専用のdimensionsやmetricsを設定していく感じになります。無駄にDataFrameとか使っていますが出力を多少キレイにするためにtabulateパッケージを使ってSlackへ投稿していますので、以下のソースはサンプルというレベルです。

import httplib2
import json
import requests
import pandas as pd
from oauth2client.service_account import ServiceAccountCredentials


def ga_realtime():
    SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
    KEY_FILE_LOCATION = '' #file path

    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        KEY_FILE_LOCATION, scopes=SCOPES)

    session = requests.Session()
    session.headers = {'Authorization': 'Bearer ' +
                       credentials.get_access_token().access_token}

    args = {
        'ids': 'ga:00000000000',  # viewID
        'metrics': 'rt:totalEvents',
        'dimensions': 'rt:eventCategory,rt:eventAction,rt:eventLabel',
        'filters': 'rt:eventAction==click'
    }

    response = session.get('https://www.googleapis.com/analytics/v3/data/realtime?ids={}&metrics={}&dimensions={}&filters={}'.format(
        args['ids'], args['metrics'], args['dimensions'], args['filters']))
    result = response.json()

    list = []

    try:
        rows = result['rows']
        for row in rows:
            list.append(row)
        df = pd.DataFrame(list, index=None, columns=[
                          'category', 'action', 'label', 'count'])

        WEB_HOOK_URL = 'https://hooks.slack.com/services/....'  # webhookurl
        requests.post(WEB_HOOK_URL, data=json.dumps({
            'text': df,
            'username': u'bot',
            'icon_emoji': u':robot_face:'
        }))
    except:
        pass

サンプルだとイベントデータを取得していて且つフィルタでアクションが `click` のものだけを取得しています。

今個人的にはGCP内、具体的にはGoogle Functionsで動かしており。KEYはGCSで管理してしまっているため上のコードだけではちゃんと動かないのですが。
サクッと作って誰かに通知したいとかそんな用途だと、このくらいのレベル感がとても良い気がします。

Google Analytics(無料版)データをAPI v4を利用してBigqueryへ入れる

marketechlabさんの無料版データを有料版と同じようにBigqueryへ格納する方法は凄くいいなぁと思いつつ、一長一短あるなぁと思いながら見ていました。
  • bot排除が必要(逆にメリットとしてbotの動きを知れる)
  • bigqueryへの格納方法にもよりますが分析コストが高いflat化したり
  • 既存GUIを見る事で足りるデータはあると思う(例えばブラウザバージョン分布等)
  • Bigqueryで舐めるデータ量が多そうなので工夫が必要かも?
bot以外の項目に関してはGAの有料版と同じだし、メリットも多い...ということでそちらへ切り替えようかどうしようか…と考えつつ、現状は力技で解決してしまっているため、今やっている方法も全くダメなんだよなぁといろいろ悩んでしまいました。

現状のデメリットとしては...
  • 分析したいデータという観点でデータの組み合わせ、抽出スパン等を事前に考える必要がある
  • 場合によってはlogだと1レコードで取得できる部分がテーブル違い等で重複して取得している場合がある
あたりでしょう。

■現状の構成

基本GCPで解決しているのは同じで、基本以下のような流れで進みます。現状だとStorageを挟む必要性もない構成なのですが、なんとなく噛ませてしまっていますね。あと鍵管理でKMSを利用していない部分が駄目。
  1. Cloud Scheduler
  2. Cloud Pub/Sub
  3. Cloud Functions
  4. Cloud Storage
  5. Bigquery
■取得データの取捨選択
キーはclientIDです。
  • clientIDベースの閲覧ページとページごとの滞在時間
  • clientIDベースのイベントデータ
  • clientIDベースの流入経路とランディングページ
他社と同様にcustom TaskでタイムスタンプとclientIDをセットでカスタムディメンションへ格納しています。

function() {
  return function(model) {
    var cid = model.get('clientId');
    var timestamp = new Date().getTime();
    model.set('dimension3',  timestamp + '_' + cid);
  }
}

最終的にBigqueryへ格納する際にこのくっつけている部分は分離しています。
分離はpythonのpandasを利用していてカスタムディメンション1に格納していた場合、そのデータを分割して元データをdropして整形しています。

analytics = initialize_analyticsreporting()
response = get_report(analytics, query)
df = get_dataframe(response)
ga_df = pd.concat([df['dimension1'].str.split('_', expand=True),df], axis = 1).drop('dimension1', axis = 1)

あとはデータの組み合わせの通りにGoogle Analytics V4経由でデータを抽出していきます。


#パターン1
'metrics': [{'expression': 'ga:sessions'},{'expression': 'ga:uniquePageviews'},{'expression': 'ga:pageviews'},{'expression':'ga:pageLoadTime'}],
'dimensions' : [{'name' : 'ga:dimension1'},{'name' : 'ga:pagePath'}]

#パターン2
'metrics': [{'expression': 'ga:uniqueEvents'}],
'dimensions' : [{'name' : 'ga:dimension1'},{'name' : 'ga:eventCategory'},{'name' : 'ga:eventAction'},{'name' : 'ga:eventLabel'}]

#パターン3
'metrics': [{'expression': 'ga:sessions'}],
'dimensions' : [{'name' : 'ga:dimension1'},{'name' : 'ga:channelGrouping'},{'name' : 'ga:source'},{'name' : 'ga:medium'},{'name' : 'ga:campaign'},{'name': 'ga:landingPagePath'}]

こんな組み合わせでデータを取得していっています。
dimensionは最大7、metricsは最大10まで指定できるので増やしたらBigqueryのカラムを追加するという感じでの拡張と新しいデータ取得を行ってテーブルを追加したりと拡張していく事を行っていけば良いと思っています。
最初は1テーブルでも良いですし後から分析したい項目内容にしたがって柔軟な対応が可能です。

デメリットもありますが、気軽に自分にあった内容で分析環境を整えていければ良いかなと思います。

[GTM]SPAで構築されたウェブサイトのハッシュ以下URLトラッキング

## tl;dr

SPAに分類されるウェブサイトでページ読み込みがなく、Google Analytics等のトラッキングができない場合はGTMトリガー「history change」を利用する

## 背景

React等を用いてSPAによるウェブフォームが作成され、それをトラッキングする必要がありました。そんなに多くのSPAを見てきた訳ではない & 自分でSPAのサンプル等を作ったこともなかったのでSPAだから共通して言える事なのかどうかはわかりませんが以下のような特徴がありました

* SPAなので当たり前ですがページ読み込みのない遷移
* ページ遷移後のURLが `#` の後ろにつく
* ウェブ履歴(history)には遷移毎にURLが載ってくる

## 必要な実装

### トラッキングに必要となる要件・要点

1. ページ遷移毎にGoogle Analytics等、トラッキングツールや広告ツールにログを送信すること
2. `#` 以下のURLをバーチャルページビューとしてURLトラッキングできるように実装すること

### ページ遷移毎のログ送信方法

#### 履歴トリガー

SPAでの実装時にブラウザのウェブ履歴にURLが掲載される事がポイント。これはAjaxが出てき5年以上前と全く同じ。SPAでもpushStateが利用されているのか、それともhistory api的ななにかが使われているのかは分かっていないのですが履歴トリガーを使います。

(参考)履歴の変更

### バーチャルページビュー対応

#### Google AnalyticsへのURL送信

Google Analyticsへバーチャルページビューを送信する場合 `Fileds to Set` で `location` を指定するか `page` を指定します。

#### URL整形

この部分は実装方法がサイトごとに異なるかもしれませんが私の場合、こんな感じの実装を行いました。

1. 【変数】 `#` 以降のハッシュ文字列を取得する - URL fragment



2. 【変数】 ハッシュURLを用いてURLを正規化する
こちらは方法は何通りもありますルックアップテーブルを使ってもいいし以下のように正規表現で書き換えても良いと思います。

※input variableや正規表現は適当なのでサイトに合わせて書いてください
※Lookup系テーブルは上から順に評価されることに注意してください

3. Google AnalyticsにURLを送信する
2でパスへ書き換えた場合は `Fields to Set` は `page` で、Step2で書き換えた変数を送信する。フルURLで書き換えた場合は `location` で送れば良いと思います。

## 注意事項

実装で個人的に考慮が漏れた点を1つ注意事項としてあげますが、トラッキング系含めURLにgetパラメータが付いてきた場合の挙動はちゃんと確認するべきでしょう。
最初Lookupテーブルを利用して実装していたのですが、そうすると様々なツールを通してget系パラメータ付で飛んでくるURLのパースがうまくいかない事にリリース直後気づきました。そこで正規表現テーブルへ移行してすぐにリカバリーしたのですがバーチャルURL生成時にちゃんとパラメータ付でも処理されるかは見たほうが良いでしょう。

## 結論

GTMのコードを埋め込んでもらっていれば自由に内部で処理できます。ハッシュ以下のURLも含めてきれいにトラッキング可能ですがツールによってバーチャルページビューをどう投げれば良いかは異なるので調べる必要があります。
ただ個人的にヒートマップツールなんかはバーチャルURLを利用するとデータ取得としては問題ないけれどもヒートマップとしてウェブページの上にレイヤー表示できない部分だけ解決出来ていないので、そういうツール毎に考慮が必要な部分が出てくるかもしれません。

Ajax実装でGTMを触っていたら `ブラウザ履歴を確認してみる` という行動をすると思いますが、全くの初めてだと迷うかもしれませんが、それほど難しい処理を書く必要は無いのではないかと思います。

## どうでもいいこと

GTMの正規表現テーブル、GAのフィルタみたいに `$A1` みたいな変な書き方ないよな?とか勘ぐって `GTM 正規表現テーブル  書き方` みたいなクエリでGoogle検索したのは内緒。

「電子商取引及び情報財取引等に関する準則」の改訂

経産省から出ていた「「電子商取引及び情報財取引等に関する準則」を改訂しました」というお知らせを見ていたのですが、スマートスピーカーまわりの電子商取引部分が追加されたということで眺めていました。
資料の中では「AIスピーカー」と呼ばれていますが、所謂スマートスピーカーのことですね。


1. AIスピーカーが誤認識した場合
⇒ 注文は無効。ユーザが確認を行って注文を確定するという確認措置を設ける事が有用。

この解説も結構面白くて、スマートスピーカーはユーザが自由にシステムの修正・入れ替えが出来ず事業者側に全て委ねられている事から「ユーザのエージェント」ではないと指摘されています。したがってユーザ自身の指示とは認められず契約は成立しないと。

また回避策として考えられる以下2点

  1. 一定時間内にユーザが注文に対し意思表示しなかったら注文を有効とする
  2. 一定時間内にユーザが注文に対し有効だと意思表示した場合のみ契約成立とみなす
については、1は無効となる可能性が高い。2は問題ない。
このあたりは消費者の利益を一方的に害するなど、既存の民法や消費者契約法に照らし合わせて判断されています。

2. AIスピーカーに対して発注者が言い間違いをした場合
⇒ 注文は無効だが、発注者側に重過失が認められる場合はその限りではない。

この解説で「電子契約法」について触れられているのですが、ちょっと内容忘れているので記載の文章を一部引用しますが

電子契約法第 2 条第 1 項の「電子消費者契約」の定義に①「映像面を介して締結される契約」という要件と②「当該映像面に表示する手続に従って消費者がその使用する電子計算機を用いて送信することによってその申込み又はその承諾の意思表示を行うもの」という要件が付されている
とあり、この「映像面を介して」という部分、前のスマートスピーカーだけでは契約は成立せずユーザに通知し、ユーザがその通知に対して有効な意思表示をした場合に注文が成立するよという内容と合わさって、うまいやり方沢山あるな!とハッとしましたw

例えば…スマートスピーカーで注文した直後にGoogleのログイン通知画面のように、その場でタップさせる画面を用意して、ここに注文内容を表示して、そのまま注文してもらうというのも良い手ですよね。(右の画像はGoogleのBlogより)

それよりも有効なのはAmazon Echo Spotですよね。



これ以上に最適なインターフェースは無いのかもしれないなと思いました。

Amazon Echo Spotは確か日本でも注文出来るようになるんですよね?
このあたりの法的整理が効いてきているのかも。
最近このAmazon Echo Spot、ポツポツ話を聞くようになってちょっと気になり始めました。

Google Spreadsheetの公式add-on 'Google Analytics'が更新しV4対応したものの機能はV3とほぼ同等

Google Spreadsheetで公式に提供されていたGoogle Analytics Add-onが更新されました。
ユーザ数が今日現在で400,062人。

今までの設定シートはコピーされ新しいフォーマットである `Report Configuration` が作成されることでユーザが何か作業を必要とする必要はなく移行が完了していますが、あくまでV3版をV4に置き換えをしただけのようです。


GoogleがAPIのバージョン4を出してから、Google側もアップグレードしたいだろうなーとは思っていました。今年のはじめあたりにGoogle API Console側からV3の設定メニューを恐らく事故だと思うのですが消えていたりしましたし。

左がV3、右がV4

復活したもののすでにアイコンすら無くなっていますけどw
移行は自動で完了したもののV4としての恩恵は受けられません。V4で実現可能な

  • 2期間のデータ比較
  • pivot
  • cohort
  • LTV
あたりは実現されません。(参考)
またdimensionやmetricの書き方等はV4のJSONの記述をそのまま許容するという苦肉の策が取られています。(ドキュメント)


基本的にV3のように指標のカンマ区切り、改行区切りで記述することを許容しつつJSONフォーマットも許容すると。
仕方ないかなと思いつつも思わず苦笑いするところですね。V4のパラメータを一部hidden parametersとして指定を可能としていますがsampling levelに関しては旧addonでも存在していたのでデフォルトで指定できるようにしてあげても良かったんじゃないかと思ったりはします。移行に際して今までもEnumだったのでそのまま `LARGE` 等へ置換してあげればいいだけですし。

このあたりSpreadsheetでは列が非表示となっているようです。



個人的には去年暮れあたりからV3の利用、addonの利用は停止していますが過去に作ったファイルの一部が利用していたので50通くらいメールで「アップデートしといたから!」という内容を受信しました…
今日中に必要なものの9割は利用停止とV4移行を個人で行ってしまおうかと思っています。

改めて考えるCore Reporting V4 APIのメリット

Core Reporting APIのV3を利用している人でV4になかなか踏み出せないという方も多いのではないかと思います。V4がリリースされて1年ちょっと。V3からV4への移行によるメリットは以下目的に集約されるのではないでしょうかということで、少しまとめてみようと思います。

Table of Contents

  1. APIリクエスト数の減少とそれに伴う分析時間の短縮
    1. 2期間のデータ比較
    2. 積み上げグラフ用(historical bucket)データ抽出
  2. V4のみサポートされる機能の利用
    1. pivot
    2. Cohort
    3. LTV
  3. その他注意点なども
    1. session dateが存在しなそう…
    2. V3であったfilterは存在するけど機能分裂
    3. 欲しい機能

APIリクエスト数の減少とそれに伴う分析時間の短縮

■2期間のデータ比較

従来2期間、例えば前年比や前週比、その他特定期間同士を比較する場合V3では2期間それぞれでAPIを叩き、その結果を自分たちで比較する必要がありましたが期間を配列で2つ渡すことが可能となったことによって1リクエストで完結することができるようになりました。

[{
  startDate = 2017 - 11 - 22,
  endDate = 2017 - 11 - 22
}, {
  startDate = 2016 - 11 - 22,
  endDate = 2016 - 11 - 22
  }]

V4では2期間を配列で入れ込みます。期間を複数指定した場合はsortの仕方として2期間の差に対するソートと以前のGoogle Analyticsで存在していた加重平均順が指定できるようになります。例えば2期間のユーザ数の差の降順で表示したい場合のorderBy指定は以下のような指定になります。

{
  orderType = DELTA, fieldName = ga: users, sortOrder = DESCENDING
}

DELTAは差、SMARTが加重平均となります。
2回投げてからSpreadsheetなどでデータを整形するとなると抽出されたデータが100%データであれば問題ありませんが、filterやデータサイズによって返却されたデータの中でしか分析ができません。この部分が解消された今回の2期間比較は大いに利用する価値があると思います。

■積み上げグラフ用(historical bucket)データ抽出

個人的にはこの機能が一番分析スピード、Google Analytics APIへのリクエスト数削減となりました。

例えばdimensionの値によってこのようなグラフを作成したい場合、今まではfilterで個別の条件、この場合は6条件指定してデータを抽出してから一つにデータを並べて描画する必要がありました。
(6リクエスト)

しかしながら今回historical bucketが発生したのでこのデータ抽出は1リクエストで完結します。(6 -> 1リクエスト)

これはかなりデータ抽出時間の削減になります。
historical bucketでは指定した値は範囲の上の値となります。例えば ['1', '3', '4', '7'] という配列が指定された場合、1未満、3未満、4未満、7未満、7以上というデータが返却されます。

V4のみサポートされる機能の利用

■pivot

これが地味に嬉しい機能ですね。GAのpivot…、あまり利用されている方をお目にかかることはない機能ではあります。pivotを利用することで抽出できるデータの幅が広がりますし、2期間比較のところで述べた内容と同じではありますが複数回リクエストしてからSpreadsheetなどでデータを整形するとなると抽出されたデータが100%データであれば問題ありませんが、filterやデータサイズによって返却されたデータの中でしか分析ができないのです。

Google Analyticsの画面側での領域を以下のように3つに分解すると


APIでは以下のような位置づけになります
① : dimensions
② : pivot.dimensions
③ : pivot.metrics

この辺はあまりヘルプでも詳しく説明されてはいないように思います。

■cohort

コホートも時々見る程度で利用しているという人はあまりお目にかからないような気はしますが、個人的にはスマートフォンだとAndroidとiOSで定着に差がありそうだとか、いくつかsegment別定着数、定着率ウォッチ用に使っていたりします。
OSや何か条件によって定着って結構ぶれますし、普段からなんとなくデータを見ておかないと特にリリース後の異常値に気づかないということもありますので。

例えばAndroidにセグメントをかけつつcohortデータを出す場合は

{
  viewId = , cohortGroup = {
    cohorts = {
      dateRange = {
        endDate = 2017 - 12 - 21,
        startDate = 2017 - 12 - 21
      }
    }
  }, samplingLevel = LARGE, metrics = {
    expression = ga: cohortActiveUsers
  }, dimensions = [{
    name = ga: cohort
  }, {
    name = ga: cohortNthDay
  }, {
    name = ga: segment
  }], segments = {
    dynamicSegment = {
      name = os,
      sessionSegment = {
        segmentFilters = {
          simpleSegment = {
            orFiltersForSegment = {
              segmentFilterClauses = {
                dimensionFilter = {
                  expressions = Android,
                  dimensionName = ga: operatingSystem,
                  operator = EXACT
                }
              }
            }
          }
        }
      }
    }
  }
}
こんな感じになります。(viewIdは抜いています)

※注意点 : 期間指定の仕方
ga:cohortNthDay : startとendが同一日
ga:cohortNthWeek : startが日曜日、endが土曜日
ga:cohortNthMonth : startが1日、endが月末最終日

個人的にはこの期間指定、使いにくいなーって思っています…。

■LTV

今唯一このLTV機能だけは利用していないので若干間違っている部分があるかもしれないのですがAPIでのLTVはcohortの拡張でCohortGroupの中にlifetimeValueが存在しています。
lifetimeValueはtrue,falseの指定をする形になりますのでcohortの期間に関する注意点は同様となります。

{
  viewId = , cohortGroup = {
    lifetimeValue = true,
    cohorts = {
      dateRange = {
        endDate = 終了日入れる,
        startDate = 開始日入れる
      }
    }
  }, samplingLevel = LARGE, metrics = {
    expression = ga: cohortActiveUsers
  }, dimensions = [{
    name = ga: cohort
  }, {
    name = ga: cohortNthDay
  }]
}

こんな感じになるのかなと思います。(viewIDや期間は未指定)

その他注意点など

■session dateが存在しなそう…

session date…これはstack overflowとかを見てもcohortで書けよ的なものも見受けられますし、Googleのヘルプもcohortに紐づくものか?と思われる書き方がされているし、ちゃんとした仕様を把握している人、Googleにも実はいないんじゃ…と思わなくもなく。むしろ開発側の認識と企画側の認識の差が生み出した機能!?

まずはsession dateとはなんぞや?という事ですがsegmentにある「セッション日」です。

これは特定の期間にセッションが存在しているということしか意味していないような動きをしています。その証拠にとあるアカウントでデータを抽出してみたものを見てみます。

分かりやすいようにコホートページで且つセグメントとしてセッション日が特定の日であるという条件にします。

そうするとリテンション割合データはこの通り表示されます。

即ち100%と表示されているのがセグメントで指定した日ですね。
この「セッション日(session date)」には指定した日にセッションが存在したという条件しかかかっていない事が分かると思います。

V3ではこのsession dateには `dateOfSession` というパラメータが存在しましたが、V4では存在しません。この `dateOfSession` = session dateなのか?という点については過去に別のpostをしましたが。

V4で日付を指定するには分析期間としてのdateRangeとコホートのdateRangeがありますが、segmentでは存在しません。date使えばいいじゃん…というツッコミもあると思いますがdateはsegmentでは利用出来ません。この `Allowed In Segments` の部分。


その他date関連はすべてセグメント指定には利用出来ない事になっています。
一方でcohort内で指定される日付については指定しなくても指定しても最初のアクセス日としか処理されません。


なので現状は存在しないと思われます。
基本V3で動いていたScriptをV4に移行しているのですが、session dateまわりのものだけは移行出来ませんでした。

すみません…このsession dateまわりに悩みつつ利用しつつはや4年くらい…以前Googleの人に直接聞いたものの個別案件には回答出来ないと言われたままw (聞き方が悪かった説が濃厚

■V3であったfilterは存在するけど機能分裂

APIのV3ではデータに対して何らか条件で抽出する場合、segmentとfilterの2種類存在していました。これはGoogle Analyticsの画面上でも同様で意識的な使い方としては…
  • segment : 解析するデータの母集団に対するフィルタリング
  • filter : 返却されたデータに対するフィルタリング
だと思っています。(あまり意識していなくてもGoogleがうまく抽出しているように見えるような事もある)
segmentは例えば検索経由で流入した人とか、新規ユーザといった分析対象となるユーザやセッション、セッション中のヒットなど母集団を絞り込む機能です。そのためこのsegmentの設定を間違えるとそもそも対象となる母集団にゴミがまじったりといった副作用があります。一方でfilterは返却値に対するフィルタで例えば返却されたURLの中から `hogehoge` という文字列が含まれるものを絞り込むといった用途になります。

例) 検索経由で流入したユーザがランディングしたページがサイトTOPページとなっているセッション数は?

この場合…

segment : 検索経由で流入したユーザ (ユーザレベル , 検索経由)
metric : セッション数
dimension : ランディングしたページURL(ga:landingPagePath)
filter : ランディングしたページURLがサイトTOP (ga:landingPagePath == '/' )

といった感じになります。
即ちdimensionとそれに対するfilterです。

今回V4になってfilterはいくつかに分解されました。
  • サーバ側filter
    • dimensionFilterClauses : dimensionsに対するフィルタ
    • metricFilterClauses : metricsに対するフィルタ
  • 返却データに対するfilter
    • filtersExpression : V3のfilterと同義
まず大きく分けてデータ抽出に対するフィルタと返却されたデータ群に対するフィルタの2種類が発生しました。

今までのV3のフィルタはmetricsに対するフィルタもdimensionsに対するフィルタも書けた訳ですが、抽出後データへのフィルタ一本化されていたように思っています。今回V4化でデータ抽出時にsegmentをした母集団に対して更にdimensions、metricsに対しフィルタをした状態でデータを返却可能となりました。そしてもしそれで足りなかった場合は返却されたデータの中から更にfilterをかけるという構造です。
ただし個人的には従来のフィルタは基本的にClause側へ完全に寄せ、filtersExpressionはV3との互換性確保のために一応用意されているものではないかと感じています。(次のバージョンでは消える…とか)

filtersExpressionではV3のfilterと全く同じ文法で書くことができるようになっています。

■欲しい機能

時々あったらいいなぁ、もしくはあったほうが分かりやすいのでは?と思う機能があります。
  • pivotのmetricsに対するorderby機能
pivotのmetricsは常に降順になっているようで、確かに普通に使っている分には事足りてはいる訳ですが、metricsに対する指定できたら面白いかも…とか、dimensionsの項目に対してアルファベット順とかデータ抽出時に指定出来たほうが良いのでは?と思ったりしています。まだ必要に駆られている訳ではないのですが、もし必要となった場合Spreadsheetに一回出力してから…というのもイケていないので。


さて以上のように長々と書いたわけですがV3で扱いにくい部分が改善され、新機能が利用できるようになったと単純に考えてもメリットはあるように思いますが、何より分析前のデータ抽出時間が短縮するという事、さらに各自の分析ツールに1度でデータを投入できたりといったメリットも結構大きいと思います。