GA: Custom Variableを使う(応用編)

2010/01/24 追記
この記事の方法は、レポートでも上手く活用できてません。
また、nameとvalueに値を積んでいくのは、keyとvalueで、64byteまでという制限にも引っかかり易いので、よくない方法だと分かりました。
そういう事を了承して、以下を読んで下さい。

タイトルに応用編が付くのは、getXKeyなど、内部的なapi?を使ってるからです。ある日、突然動かなくなる可能性もあるので、毎日checkが必要です。

さて、先週末までにCustom Variableが全てのGoogle Analytcsユーザに導入されたようです。

Custom Variableを使えば、アクセス解析運用の柔軟性が増します。

と言うことで、試してみました。

CustomVariableでの値の設定の仕方は?

pageTracker._setCustomVar(slot, key, value, scope)という形です。

slotは、1-5までの数字を割り当てます。(レポート側で、この番号がアドバンスセグメントの項目に出てきます。)

key, valueは、好きな文字列を。(keyは、nameという名称の時もあります。同じです)

scopeは、設定した値がどれだけ生き延びるかです(デフォルト設定は3のpage-level)

  • 1だと、user-levelで、cookieに値が書き込まれ、ユーザー単位で管理が可能です。
  • 2だと、session-levelで、そのセッションをラベル付けします。(セッション内で、複数回、値を設定していくと、上書きされます)
  • 3だと、page-levelです。ページ単位でラベル付け。使いどころ?Googleのお話では、特定条件でページをカテゴライズすると。

繰り返しますが、slotは5つまで使えます。(上書きはできます)

今回は、ユーザレベルに的を絞ります。

ここでは、トラフィックについての値を割り当ててみます。

  • トラフィックでの分類をしながら
  • keyに流入元を、valueに日付をいれます。

具体的には、

keyには、drssrs…という感じで、d:direct, r:referrer, s:検索エンジンと場合分けして、文字列を足します(セッション開始時に)。

valueには、-20091001-20091102-20091127という感じで日付を足していきます。

そして、単純にsetCustomVarだと、値が毎回上書きされてしまうので、追記する形をとります。(応用編にした理由です)

公式APIと言っていいのか不明なメソッドですが、以下のようメソッドを追加してやって、

 pageTracker._mySetOrPushCv = function(slot, key, value, scope){
       this._initData();
       var strName = this._getXKey("8", slot) || "";
       var strValue = this._getXKey("9", slot) || "";
       this._setCustomVar(slot, strName+"-"+key, strValue+"-"+value, scope);
 };

pageTracker._mySetOrPushCV(2, source, “20091207”, 1)

pageTracker._trackPageview();

とします。

トラフィックの場合分けですが、ga.jsの内部の判定を利用できればいいのですが、難しそうなので、手元で簡易に判定します。

c = document.cookie;
if(!(/_utmb/).test(c) || !(/_utmc/).test(c)){
      var trfc = !document.referrer ? "d" :
      (/https?://.*.(google|yahoo).(com|co.jp)/).test(document.referrer) ? "s" : "r";
      pageTracker._mySetOrPushCv(2, trfc, d, 1);
}

utmcとutmbで新規セッションの判別をして、document.referrerで、直接、リンク、検索エンジンに場合分けします。

最後にまとめて、コードを載せます。

これで、コード側の設定を終わりです。レポート側の話に移ります。

回数でセグメント

アドバンスセグメントで、

image

変な値(%…)が入ってますが、昔の失敗した値です。無視して下さい(消すコードは下の全コードに入れます。)。

また、Keyの値を見せるために完全一致にしてますが、正規表現で{-.}{3,}という感じで3回以上の訪問などと設定します。

image

リピータは、来訪3回以上もあるので、だぶりになるのに注意。後、api側の設定の不備の可能性もあるので、鵜呑みにはできないです。

日付でセグメント

ここまでは、回数でみたわけですが、customVariableのvalueの方での設定には日付をいれたので、

image

例えば、-2009120[1-3]などで正規表現で引っ張れば、

image

12月1ー3日に訪問したユーザのセッションが見られる。4日移行はセッションが一回しかないですが、このサイトへの継続的な訪問者がいないという事ですね。

ここまでで、訪問回数と訪問日でセグメントしたのですが、一応、流入別にkeyの値を入れて、日付をいれているので、流入元+日付でのセグメントも可能なはずです。データが貯まれば、してみたいです。

まとめ

customVariableを使って流入元を追記しました。それをレポート側のアドバンスセグメントで振り分けの設定をして、レポートをみました。keyに流入元、値には日付をいれました。これで、日付を元にしたセグメントが可能になりました。また、今回は流入元だけにしましたが、goalなどを設定して、conversionした場合にkeyをゴール名などで設定して、値を日付にしてもいいと思います。

以下、設定のコピペです。(property-idは変えてます)

 var GA_me = function(){
    var pageTracker = _gat._getTracker("UA-XXXXXX-xx");
    //if(/a/[-1]=='a')console.log(pageTracker);
    var c = document.cookie;
    var d = (function(){
      var date = new Date();
      var y = date.getFullYear().toString();
      var m = (1+date.getMonth());
      m = m < 10 ? "0"+m.toString() : m.toString();
      var day = date.getDate();
      day = day < 10 ? "0"+day.toString() : day.toString();
      return y + m + day;
      })();
    pageTracker._mySetOrPushCv = function(slot, key, value, scope){
      this._initData();
      var strName = this._getXKey("8", slot) || "";
      var strValue = this._getXKey("9", slot) || "";
      strName.replace(/%2d*B/, "-");
      strValue.replace(/%2d*B/, "-");
      this._setCustomVar(slot, strName+"-"+key, strValue+"-"+value, scope);
    };
    if(!(/_utmb/).test(c) || !(/_utmc/).test(c)){
      var trfc = !document.referrer ? "d" :
               (/https?://.*.(google|yahoo).(com|co.jp)/).test(document.referrer) ? "s" : "r";
      pageTracker._mySetOrPushCv(2, trfc, d, 1);
    }
    //the page pathname of the goal you set
    if((/^/profile$/).test(document.location.pathname)){
      pageTracker._mySetOrPushCv(1, "g_"+"profile", d, 1);
    }
    pageTracker._trackPageview();
  }
  var _gaq = _gaq || [];
  _gaq.push(GA_me);
  (function() {
    var ga = document.createElement('script');
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics
.com/ga.js';
    ga.setAttribute('async', 'true');
    document.documentElement.firstChild.appendChild(ga);
    })();

アドバンスフィルター機能が追加

アドバンスセグメントではなく、、アドバンスフィルター。

データ行を絞り込む時に使うフィルターが複数項目で可能になり、対象も指標にまで拡大した。

WS000005

閲覧開始数は少ないけど、直帰率は少ないページを出してみた。

アドバンスドフィルターの利点は、アドバンスセグメントより手軽に、複数項目での絞り込みができるという点だと思う。
*2010/01/08 より正確には、ディメンジョン、セカンドディメンジョン、それぞれのタブにおける指標と、その画面に出ている項目でfilteringができる。

そして、設定をマイレポートに持って行くことができるのが、大きな利点かも。

欠点は、手軽なあまり、フィルタ設定が保存されない点。ページを移動すると、設定も失われる。

正規表現も、いままでのフィルターと同じように使える。

ちなみに、ひとつ注意を引いたのは、

image

と、目立つ色で目立つ場所に、注意書きが表示されてること。

image

英語でも同じように出てる。

これは、

絞り込む項目では、指標を使う事ができるけど、あくまで、フィルターする前のテーブルデータを絞り込みするだけ。

と言いたいんだと思う。

実際に行き違いが生じるケースを、今、思いつかないので、考え方が間違っているかもしれない。


ここから推測思考モード

デメンジョンと指標の違い???、Google Analyticsを始めたころによく悩んだ記憶がよみがえった。

きちんと解決されてないのだけど、イメージとしては、

  • ディメンジョン : 計測されたデータ。生データ(GATCからサーバに送られる数値)
  • 指標 : Google側で、データを整理する際に数字データとして作ったもの。

ディメンジョンを指定するたびに、生データソースから、相当する一つのディメンジョンのテーブルが作られるイメージ。列が指標になる。ただ、これだと、複数のディメンジョンのイメージがつかめない。テーブルを併合させていくという感じなのだろうか?

よくわかってません。だれか教えて下さい。

*2010/03/06 今年になって分かった。ディメンジョンはセッションの絞り込み項目。集合をどうやって規定するか。集計基準。そして、ディメンジョンの沿って集められたセッションについて、数値を集計算出したのが指標。

ga.jsの中のtrackePageview()

ga.jsの理解メモ。わかる所からOutPutすることにします。アドバイスのある方は、指摘をお願いします。

ga.jsのオブジェクト

中にあるものを列挙する。

  • $:       windowsオブジェクトに入る。他のオブジェクトの名前空間?上の親になる
  • $.Fb:    初期値が設定されているオブジェクト。
  • $.Kb:   $.getTracker(propety-id)を呼ぶと作られる。APIを提供する。trackePageviewとか、trackeEventとか、setCustomVarとか
  • $.$:     cookie情報をマネージする。中で、$.Gbを動かす
  • $.Gb:    $.$の元で、実際のcookieの読み出し、書き込み、を行う。
  • $.Jb:    データをサーバーに送るリクエスト部分を仕事にしている
  • $.Hb:   cookieへの処理$.$に命令する。setCustomVarとかもやることになる。
  • $.m:    utmz周りの管理。$.m.wは、campaignの値をプロパティに持つオブジェクト。
  • $.n:     ecommerce周りのデータの管理。$.n.Mbとかはデータ保持用?
  • $.Eb:   システムやブラウザ情報を取得するオブジェクト
  • $.N:    trackEvent関連の処理。customVarの値にも関連する(独自にデータを送らなくなったので)

これだけ。

pageTracker._trackPageview()の流れ

順にいくと、

  1. ga.jsがloadされて、実行される。
  2. windowオブジェクトに、_gat($オブジェクト)という参照ができる。
  3. _gatには、上に挙げたオブジェクトのconstructorと、_getTrackerという関数が、プロパティとして作られる。
  4. _gat._getTracker(property-id)で、APIが定義されている$.Kbが newされ、pageTracker変数を作り参照させる。
  5. pageTrackerのAPIのひとつ、_trackPageviewを実行させる。

で、で、5の_trackPageview。大きく見ると、二つの実行式がある。ちなみに、bはpageTrackerオブジェクト。

  1. b._initData()
  2. b.Kc;

で、で、で、1の b._initData()

これは、他の多くのAPIでも、最初に呼ばれるメソッド。以前はAPIのリストに入っていたけど、今は内部で働くメソッドとして扱われている。最初に説明したコンストラクターが、あちこちでnewされている。

b._initData()の流れ。

  1. b.A = new $.Eb(); b.A.bc();
    • ここで、システム情報やブラウザ情報を取得している。
  2. b.d = b.fc();
    • ドメインチェック。setDomainName(“none”)なら、1が入る。そうでなければ、ドメインハッシュ。
  3. b.i = new $.$(c)
    • クッキーの値を管理するオブジェクトが入る。cは、$.Fbで作られる初期化オブジェクト。APIの設定をすれば、このcのプロパティに値を設定しとける。
  4. b.g = new $.N()
    • setKeyやらValueやらのメソッドが定義される。
  5. n = new $.Hb(c, b.d, b.i, b.g)
    • ここまでで、作ったプロパティの値と、c=(new $.Fb())の値を引数にして、
    • $.Hb()で、実際にcookieへの読み書きを$.$に指示する。
    • ちなみに、n.Mは、utm[abcxzv]がそれぞれ配列で入る。
  6. b.rc()
    • 中で、k = new $.Jb(c)として、送信用のオブジェクトを作っておく。
  7. b.pc()
    • ここで、セッション判定に関わる処理をする関数を呼ぶ。utma,utmb,utmcとかを見る。
  8. n.tc()
    • 5で作ったnのメソッドを実行。utmvの処理など。cookieなどへの書き込みも。
  9. b.ga = b.Yb(b.Za)
    • referral情報の取得
  10. b.Ra = (new $.m(b.d, g.ga, b.r, c)).cc(bi, b.F)
    • utmzの処理をするオブジェクトを作る。キャンペーン管理の。ccではutmzの処理が行われる。
    • 引数のb.iは、クッキー管理オブジェクトの$.$。b.Fは、新規セッションならtrue,じゃなければfalse。
  11. b.ab = new $.N()
    • new $.N()は二回目の実行(二個目のオブジェクト)。これはtrackEvent用。
  12. p = s
    • sはtrueなので、pをtrueにする。9-11はp==falseが条件。重複処理を避けるためか、initDataはあちこちで呼ばれるし。
  13. $.gb || b.sc()
    • Gasoオーバレイ関連の処理 $.gbはb.scの実行でtrueになる。一度initDataが実行されれば、b.sc()は呼ばれない。

initDataはこんな感じ。

b.Kc(a)の中

trackPageviewのもう一つの実行式のb.Kc(a)。

引数のaは、trackPageview(a)のa。pagePathをでっち上げる時に指定する引数。

短いのでコードを出す。

 b.Kc = function (a) {
   if (b.J()) {
      var d = "";
      if (b.g != w && b.g.G()[y] > 0) d += "&utme=" + T(b.g.G());
      d += b.ua(a);
      k.H(d, b.s, b.d);
   }
};

順に見てく。

  1. if(b.J())
    • これは、b.J=function(){return b._visitCode() % 10000 < c.U * 100} b._visitCodeはutmaのなかの二番目を値(sessionユニーク値)を返す。c.Uはサンプルレート。デファルトで100。なので、通常100%でb.J()はtrue。
  2. if(b.g.G(),,,,,
    • b.gは、$.Nオブジェクト。追えてない。utmeはtrackEventの値を送信するのに使われるものなので、その辺りに関係しそう。
  3. d+=b.ua(a);
    • データ送信用文字列作成。b.Aやc( $.Fb初期化オブジェクト)、キャンペーンかどうかとか(utmcr(n))など。
  4. k.H(シス情報, アカ情報, 現在時刻)
    • kは(new $.Jc()); initDataの処理の中で作られている。
    • k.H()は送信処理。$.Jbオブジェクトの中で、<img>タグを作ってDomに埋め込む作業が行われている。

これで、b.kc(a)は、終わり。

trackPageviewの処理の流れ(b.initData(), b.Kc())は、以上。

表面をなぞっただけだし、目的のセッション判別や、キャンペーンの値の処理などまで、届かなかった。

次回に、その辺りを書く。

複数ドメインのtracking

Google AnalyticsのAPIの説明をしながら解説してみたい。

まず、Google Analytisはfirst party cookieを使ってデータを取得・送信している。first-party cookieとは、個々のドメインに対して機能するものなので、違うドメインのcookieとは、連携する事はできない。(行動ターゲティングなどは、画像一つ一つがドメインとなれる事を利用して、複数ドメインでのユーザーの行動追跡を可能にしている、たぶん)

とにかく、データ収集範囲は、ドメインに限定される。

(2010/03/07 cookieの値に関する限りです。google analyticsは、web property IDが同じなら、サイトが違っても、同じレポート上のデータとして扱う)

が、ドメインを超えて、データを収集したい。そこで、Google Analyticsでは、URLにデータを乗せて(post送信もURLにくっつく形)、遷移した別のドメインで、そのデータをga.jsが読み書きするになっている。

これを行うAPIは、_link, _getLinkerUrl , _linkByPost 3つ。同時に、_setAllowLinker(true)が、この3つが機能させるフラグ、trueで機能する、デフォルトはfalse。

また、_ga.jsの中で、ドメインの相違をcheckしているので、それを外すのが_setDomainName()。この引数には、デフォルトで “auto”(そのページのドメインが使われる) “none”(ドメインハッシュを1にする), または、自分で任意の文字列をドメインとして設定することもできるよう。

また、_setAllowHashというものもあり、引数をfalseにすると、ドメインハッシュを行わず、checkも行わない。よって、cookieのドメインcheckをせず、複数ドメインに対応可能になる。又、domain-hashをしないので、実行効率もあがるらしい。

サブドメインの間でデータを取る場合に、_setDomainName(“.sub.hoge.com”)のように、頭に ” . “ を書く事が推奨されているけど、この理由はよくわからない。これは、sub-domain共通でデータを取得してますというのを、わかりやすくするのが理由だろうか?
(2010/03/07 cookieは、.hoge.com のように書くと、サブドメイインでの値の共有になるとの事)

cookieの値の受け渡しができれば、ドメインハッシュ値を同じにして、ga.jsでのdomainチェックを通し、データを送信でき、複数ドメインでのデータを同じプロファイルで扱えることになる。

Iframeでも同様。Iframenも平行してアクセスがあると考える(ページ遷移などでレポートされる遷移の順番は、utmbの番号などを見れば、いいだろうか?)

また、注意するべき点として、setDomainNameは、できるだけ早い順番にかくべき。pageTracker変数を作った後に。_setVarなど(もう廃止項目だけど)を使う場合に、setDomainNameでドメインをそろえてないと、変更前のドメインとなるので、trackePageviewに反映されない。(_setVarの変更でリクエストは飛ぶけど、これも_setCustomVarだと飛ばないよう)なので、

  1. var pageTracker = _gat._getTracker(“UA-XXXXXX-11”)
  2. pageTracker._setDomainName(“none”);
  3. pageTracker._setAllowLinker(true);
  4. pageTracker._setVar(“hogehoge);
  5. pageTracker._trackPageview();

この順番で試したら問題なく、utmvの値も引き継げた。また、htmlの中のリンクに直接 pageTracker変数を使う(<a>タグのonclickなどで)なら、bodyの頭に、上記のコード(1-5)を入れる必要がある。

しかし、外部リンクにいちいち、pageTrackr._linkerなどと書いていくのは、実用上無理がある気がする。めんどくさい。

ので、下の記事にも書いたけど、一括でEventListenerに登録する方が漏れが少ないと思う。google analytics 外部へのリンクを計測する

Googleカスタム検索(Web Element)でGAを使う(運用・改善編)

*この記事は、いつもに増して誤りが多いので、注意して読んで下さい。(しかし、Google Analytics上の定義は理解できないものが多い。みんな苦労してないのかな??)

Googleカスタム検索(Web Element)でGAを使う

前回のGoogleカスタム検索(Web Element)でGAを使う(設定編)の次は、運用(Google Analyticsを使った)になる。

Google Analyticsのレポート画面を確認する

以下は、このデータを自分でサイト内検索を表示した画面。

サイト内で、

  • 何回検索されたのか?
  • それはどのページなのか?
  • 検索した表示された記事がclickされ閲覧されたか
  • 検索した後の、離脱するまでの滞在時間、pageview
  • 再検索した回数
などが記録されている。
項目別に見ていく。
1. 利用状況
サイト内検索をしたセッションと、そうでないセッションをわけてくれる。仮に、サイト内検索した人を追跡したい場合は、前回の記事のutmvの使いどころ、流入元を追加的に記入するみたいなやり方で、cookieのutmvにサイト内検索をしたという値を追記すればいいと思う。(この記事を書きながら、僕のサイトにもそういう設定をした)
2.次の検索キーワード、開始ページ、到達ページ、カテゴリは、同じ指標(メトリックス)を見せてくれる。
表示されるメトリックス
  • 検索結果の平均ページビュー -  検索結果をクリックした
  • 検索結果の離脱率 - 検索直後に直帰した
  • 再検索 - 続けて検索した。
  • その後のページビュー – 検索後の平均ページビュー
検索回数と検索後の行動を記録してくれるという事。
一応、赤丸で囲んだように、ヘルプで説明があるけど、こんな意味だと思う。
をみる。ここの例のところを見ると、
検診結果の平均ページビュー(検索結果をclickした数検索後のpageview数/検索回数)
その後の平均ページビューは、(???/検索したセッションの総数)
???の部分は、検索後のページビューではなく、平均ページビューと同じように検索結果をclickした数に読めるのだが、、、両者の違いは、分母にある、検索回数と検索したセッション数の違いにみえる。僕のレポートに出てる数字も、実感としてはそのように見える。
ただ、最初の定義の部分は、単なるページビューに読める。(これでいいみたい ???はページビューで良いのか??)
下の図は、ディメンジョンが検索キーワード

検索キーワードは、本物?のディメンジョンなので、他のディメンジョンと切り替えが効く。

他の項目(開始ページなどは)は、正式にディメンジョンになってないので、切り替え表示できないのだと思うGoogle AnalyticsのAPIページを見ても、サイト内検索用のAPIはない。検索用のパラメータが途中で入ったら、サイト内検索をしたという処理なんだと想像する。
カテゴリは今回設定してないけど、プロファイルの設定画面で、クエリーパラメータを追加すればいい。
傾向は、時系列でのサイト内検索のデータ(上で書いた項目)を出してくれる。
以上が運用

それで、どうやってデータを生かすか?

設定して、数値を見て、それをどう生かすのかだけど、
自然検索の流入の時と同じ感覚しか思いつかない。
  • キーワードの発掘
  • そのキーワードから見えるニーズに対応したページをみせられているかどうか?
  • コンバージョンに誘導できているかどうか?
  • その他(他にもあるんだろうけど、思いつかない)

サイト内検索してくれた人にお願いする。

たぶん、サイト内検索までしてくれる人には、アンケートみたいなのを頼んでもいいのではないかと思う。
検索直後に出すと迷惑がられそうなので、結果が出ない場合にオンラインフォームを出してみる。
とりあえず、簡単にgoogle spreadsheetで、online-formを作ってみた。普通の検索結果と同じように、”x”を押すと消える。
ウェブページの顔の部分に、検索やアンケート記入を持って行くのは問題かもしれないけど、ユーザの利便性は高まるかもしれない。

Googleカスタム検索(Web Element)でGAを使う(設定編)

Googleカスタム検索(Web Element)でGAを使う

サイト内検索は便利な機能なので、今回、もう一度書く。

まず、Google Custom Search に行ってエンジンを作る。

基本情報を入れる。

名前、説明、キーワード、言語、翻訳、文字コード、検索範囲、広告、Subscribed Links(ユーザがこの

その後、対象サイトを含める。(複数のサイトを含める事もできる)

他にも、いろいろ設定項目があるけど、とりあえずGet codeでコードを取得

これを、サイト上で出現させたい場所に張る。僕の場合は、header部分にいれた。

次に、Google Analyticsでの設定。

新しい設定なので、新規にプロファイルを作っておいて、実験する形がいいと思う。

新しいプロファイルを、設定するドメインの上で作る。

既存のドメインにプロファイルを追加、プロファイル名は適当に。

プロファイルを作成したら、設定。

設定箇所は3カ所

サイト内検索を有効、クエリパラメータ(僕の場合はgにした),

クエリパラメータの削除

こちらの方法では、前の記事で説明したように、ajaxを使っていてURLがanalyticsで取得できない。

その対策上、urlをtrackPageviewで飛ばす形を取っている。

パラメータを削除しておかないと、検索開始ページにクエリが残ってしまい、閲覧開始ページがばらばらになってしまう。

(たぶん、Web Element以外のやり方なら大丈夫だと思う。)

下のscreenshotは、パラメータが残ってしまった場合。

後日直して、正常なデータも入った形。

これで、設定はとりあえずOK。

あとは、Googleカスタム検索(Web Element)でGAを使う(運用・改善編)