RでGoogle Analtyics: 時間帯別グラフ

Rという統計用?言語でData Export Apiを使うscriptを書きました(コードはこちら)

(2010/12/10 追記 )どうやら googleの中の人も R用のライブラリーを出したみたいです。テストもついてるし、サンプル誤差もついてくるので、僕自身もあっちを使うつもり。account系のデータ、ゴールとかも取れるといいなと思う

統計用言語なのですが、グラフ出力も充実しており、latticeというパッケージを使うと分類した上でのグラフ表示が一行でだせます(マニュアル見る時間がかかるけど)。なので、グラフを図示していきます。

下のような感じでデータを取得します。

#認証tokenを取得
auth <- getAuth(email, password)
#アカウント+プロファイル情報を取得
acs <- getAccounts(auth)
>str(acs)
str(ac) 'data.frame': 45 obs. of 4 variables:
$ ac.ids : chr "xxxx";,"xxxx" ...
$ ac.names: chr "名前1" ,"名前2" ...
$ pr.ids : chr "1111111","222222" ...
$ pr.names: chr "xxxx","xxxx", 

#プロファイル名で検索
> ac[grep("abc.*wiki",ac$pr.names),]
ac.ids ac.names pr.ids pr.names
10 188512 abc-analyticsさん 25.... abc-only-wiki-except-me
12 188512 abc-analyticsさん 255xxx... 

#キーワードを取得(デファルトで過去一ヶ月)
data <- getData(auth,id=2551xxxxx,metrics=c("visits"),dimensions=c("keyword"))
[1] "https://www.google.com/analytics/feeds/data?ids=ga:25513728&dimensions=ga:keyword&metrics=ga:visits&start-date=2010-09-03&end-date=2010-10-03"
[1] "visits"
[1] "(1-874)/874"
[1] 2
                                         keyword visits
14                                     (not set)    341
573 googleanalytics タイトル別のコンテンツ index     29
651                                         utma     17
851                        目標到達プロセス 画面     16
36                                     _gaq.push     15
221                         funnel visualization     14
662                                         utmz     11
853                     目標到達プロセスの放棄数      8
316                        google analytics wiki      8
30                                          _gaq      8
> str(data)
'data.frame':    874 obs. of  2 variables:
 $ keyword: chr  "(not set)" "googleanalytics タイトル別のコンテンD
[1] "visits" num 341 29 17 16

それで、時間帯別の表示をlevelplotという機能を使って表示していきたいと思います。

セッション数を時間帯と地域別で取得

data <- getData(auth,id=25513728,
+ metrics=c("visits","goal3Completions"),
+ dimensions=c("date","hour","region"),
+ start.date="2010-08-30",end.date="2010-10-03",
+ max.results=10000)
[1] "https://www.google.com/analytics/feeds/data?ids=ga:25513728&dimensions=ga:date,ga:hour,ga:region&metrics=ga:visits,ga:goal3Completions&start-date=2010-08-30&end-date=2010-10-03&max-results=10000"
[1] "visits"           "goal3Completions"
[1] "(1-10000)/1060"
[1] 5
          date hour region visits goal3Completions
702 2010-09-21   15  Tokyo     11                3
92  2010-09-01   09  Tokyo     11                2
607 2010-09-16   18  Tokyo      9                1
920 2010-09-29   15  Tokyo      8                0
608 2010-09-16   19  Tokyo      8                2
178 2010-09-03   12  Tokyo      8                0
105 2010-09-01   14  Tokyo      8                0
923 2010-09-29   16  Tokyo      7                0
520 2010-09-14   19  Tokyo      7                0
474 2010-09-13   17  Tokyo      7                2
グラフにする。
levelplot(tapply(data$visits,list(data$hour,data$date),sum),  col.regions=colorRampPalette(c("white",  "red"))(256),layout=esuln

2

週末と夜間は空白に近い。

曜日別に傾向があるかもしれない。見てみる。

wdays <- c("a日","b月","c火","d水","e木","g土”) #表示順を揃えるため

levelplot(tapply(data$visits,list(data$hour,wdays[as.numeric(strftime(data$date, "%w"))+1]),sum),  col.regions=colorRampPalette(c("white",  "red"))(256))

3

まあ、なにもない。深夜に起きる人は、木曜くらいから出始めるのか?というか、祝日補正してないせいだろう。

また、サイトによっては、キャンペーンやコンテンツ投入のタイミングが見えるかもしれない。

んじゃ、とりあえず、メディア別にして、期間を長くして平均を見てみる。

d.m <- getData(auth,21600568,metrics=c("visits"),dimensions=c("hour","date","medium"),start.date="2010-01-01",max.results=10000)

d.m.a <- d.m[d.m$medium %in% c("organic","referral","(none)"),]
> levelplot(tapply(d.m.a$visits,list(d.m.a$hour,wdays[as.numeric(strftime(d.m.a$date, "%w"))+1],d.m.a$medium),mean), col.regions=colorRampPalette(c("white",  "red"))(256),sub="曜日別|メディア別”)

4

検索活動は集中するくらいしかわからない。今年の平均だけど、、

これでも、具体的なユーザー像にはならない。

そこで、ある特定のキャンペーンを行った場合の波及効果みたいなのをみたいが、出せるデータがないので、このブログの公開記事の閲覧数の減衰具合みたいなのを見てみる。

d.m <- getData(auth,21600568,metrics=c("entrances"),dimensions=c("hour","date","landingPagePath",”medium”),start.date="2010-08-01",max.results=10000)

rev(sort(tapply(d.m$entrances,d.m$landingPagePath,sum)))[1]
 /multi-cookie-tracking                                                                  338

と一番多い、multi-cookie-tracingを見てみる。メディアタイプを、オーガニックと参照リンクに絞って表示

d.m <- getData(auth,21600568,metrics=c("entrances",”newVisits”),dimensions=c("hour","date","medium"),start.date="2010-01-01",max.results=10000) 

d.m.a <- d.m[d.m$medium %in% c("organic","referral"),]
> levelplot(tapply(d.m.a$entrances,list(d.m.a$hour,d.m.a$date, d.m.a$medium),mean), col.regions=colorRampPalette(c("white",  "red"))(256),sub="特定ページメディア別”)

5

9月1日の深夜に出して、リンク中心にアクセスが上がって、その後は検索にかかるようになる。しかし、検索に乗るのも早いものだ。

次のものは、新規に絞ってみたもの。本当に新規でないのもあるだろうけど。検索による継続的な流入はある。

d.m <- getData(auth,21600568,metrics=c("entrances",”newVisits”),dimensions=c("hour","date","medium"),start.date="2010-01-01",max.results=10000) 

d.m.a <- d.m[d.m$medium %in% c("organic","referral"),]
> levelplot(tapply(d.m.a$newVisits,list(d.m.a$hour,d.m.a$date, d.m.a$medium),mean), col.regions=colorRampPalette(c("white",  "red"))(256),sub="特定ページメディア別”)

6

あとは、、、、

会員情報などとマッチングしてるサイト(外部ソースとの照合は規約違反かも)なら、ユーザー属性別のアクセス状況などは、比較表示しやすいと思います。

検索ワードで属性を分けたり、地域と時間情報と天候情報(外部から引っ張る)で属性を仮定したりと思ったのですが、余裕ができたらやってみたいと思います。

とりたてて何か発見ができたわけではないですが、Rを使うと、こんな感じで手短にグラフ出力ができます。ただ当然ながら、学習曲線はキツイ。ここまで来るのに相当な学習時間がかかりました。データ分析ではなく、データ表示だけなのに、、、

以下コードです。RCURLとXMLが必要です。

こちらに移動しました。

訪問回数別セッション数(vs 参照元)の残存率を見る

リファラー情報の扱いは、他のアクセス解析ツールと違う仕様

Google Analyticsの、他のサービスと違う有名な仕様として、外部リファラーが無い場合のリピーターのリファラー情報は、前回のリファラー情報とするというのがあります。

直接訪問は前回のリファラー情報でレポートとして上がるという事です。最初からノーリファラーなら、ノーリファラーですが。

僕は、他のアクセス解析サービスはよく知らないので、どちらが有用なデータ表示方法かは分からないのですが、GAの仕様を決定した人は、こっちが良いと思ってそうしたんだと思います。

この方法で良いなと思える点

本当は、ユーザー単位で、トラフィック情報の変遷を見ることが出来れば、万事解決なのですが、GAは大きな会社のサービスなので、いろんな事に配慮しなければならず、ユーザー単位のトラフィック情報を見ることはできません。ユーザーグループを作って、カスタム変数に記録すれば、グループ単位では見られるようになりますが、それは置いておきます。

それで良い点はというと、直接訪問を必ず、どこかの参照元の情報に帰属させてる点です。アクセス解析の目的は、コンバージョンの向上にあるわけで、その要因となる流入元情報の寄与を割り振ってるわけです。2,3回目は、bookmarkから来たんだろうけど、一回目は、、、というデータ処理を省くことができるわけです。

もちろん、リピーターは、複数の外部サイトからやってることも多いわけで、その場合は上書きされていくので、きちんとした?データにはならないわけですが。

参照元別の残存率 = コア化するユーザー率を見る

訪問回数と参照元情報をディメンジョンに、セッション数を指標にします。

  visits_against_visit_count

データは、仮想の数字です。サイトの数字を参考にして、乱数を降った擬似的なデータです。 縦軸(Y軸)は、10の対数です。4なら1万。2なら100。 2,3回目までくるのは、1%とかの世界ですね。1以下で10以下です。

あと、データ集計期間の長さによってデータが偏るので、そこも注意した方が良いです。その集計期間の訪問回数というのは、Google Analyticsでは出せないです。出る数字は、全ての測定期間で、何回目の訪問だったかです。

参照元別で残存率が違う場合、主要な参照元の5回目残存率なんかは、気にしても良いかもしれません。この場合だと、Eなんかは2.8(630くらい)から1.8(63くらい)くらいと、10%くらいは残ってくれてます。ほかは、Dなんかは、5回目で、3(1000以上)から1以下(10)になります。

最終的には、コンバージョン率と絡めて、数字を吟味する必要はあるのですが、参照元によって残存率が違う、訪問回数が進むにつれ、1/10, 1/100になっていくけど、参照元に依っては生き残る率が高いのがあるのを気にするのもいいかもしれません。

Google Analyticsのノーリファラーを前回のリファーラー情報に割り振る仕様も、こういう見方をする場合は、データ処理が楽だと思います。

もちろん、あるユーザーの二回目セッションは参照元がAで、三回目はBという事もあるので、訪問回数の残存= ユーザーの残存率 とはならないですが、ある程度は類似するはずです。また、このデータ集計期間に、一回目が入らずに二回目から登場のパターンもありえます。GAは、ある期間内で、何回目の訪問だったかは教えてくれません。

ということで、参照元別に訪問回数別のセッション数を見て、この参照元はコアのユーザーに成ってくれやすい。 裏を言えばリピートしない、というのを把握する話でした。

実はどこかのサイトのデータ整理をしてて、対数グラフにしたら、それなりに見えたので、blogを書きました。 底を求める方法が分からず、何回か検索した。中学生の僕が見たら、僕を殴りに来たかも、、、630 => 10^2.8 は、頭に出なかった、、、

ディレクトリ別到達率、セカンドページセッション数、訪問回数別セグメント

アクセス解析のワークショップに行ってきました(感想は最後に一言)。ワークショップで受けた刺激を元に、僕のサイトのデータでの分析をします。大きく3つ分野を考えます。Q1:特定ディレクトリの到達率、Q2:ナビゲーション、Q3:ユーザセグメントです。

Q1:特定のディレクトリへの到達率を知りたい

とりあえずの手段として、コンテンツの詳細でのページビュー数のcheck

サイト構成がディレクトリ構造になっている場合、コンテンツの詳細で、ディレクトリ単位の集計した指標が見られます。まずは、ページビューを見て、サイト全体との比率を見るのがいいと思います。

directories_in_content_drilldown_report_in_google_analytics

上図の例で行くと、/view_your_report/ディレクトリ配下のページは、全体のページビューの1/4くらいとcheckします。簡単便利です。

ペ-ジビュ-じゃなくて、セッション数で比較したい? この場合、 隣のページ別セッション数を使うのは良くないです。全体の比率を見るには適していません。なぜなら、ページ別セッション数は、ページ別であり、ディレクトリ別セッション数ではないからです(ページビューの方は完全にバラバラなのでOK)。それで、どうするかというと、

アドバンスセグメントの管理画面でディレクトリ別セッション数を知る

全体のセッションの中で、少なくとも特定のディレクトリを通過したセッション数が知りたいです。アドバンスセグメントで、ページをディメンジョンにして、正規表現で対象セッションを絞ります。

uniqueDirectorySessions_in_google_analytics

全体のセッション数が409で、/view_your_reportディレクトリのページを通過したセッション数は124で、全体の1/4強。先ほどのページビューの約1/4とあまり変わらないかもしれませんが、セッション数からイメージしたい人には有用というか、、、安心できます。

また、個別のディレクトリのセッション数の合計は、全体のセッション数と成らない事に注意して下さい。上図の下方の該当セッション数でセッションの重複具合をcheckしておくと良いと思います。今回の場合は、全体409, 個別のディレクトリ(124+64+50+23+19)=280, OR条件での該当セッション数265。ここから、重なり具合を想像すると良いです。

注意はいるものの、ページビュー数とセッション数、それぞれから見た特定ディレクトリの到達率が分かりました。ディレクトリ別のコンテンツ制作労力のバランスを見直す指標になると思います。

Q2:サイト全体のナビゲーションを検証したい

ナビゲーションの言葉の定義が難しいのだけど、受けと攻めの二つの立場を考えて、

  1. 受け。ユーザのニーズにアンサーする。 見たい情報が提示できたのか?
  2. 攻め。ユーザの気持ちに訴求する。 見て欲しいページ(ゴール)への導線の訴求。実際にクリックしてくれたかどうか?

1(受け)は、これ!という指標が思いつかないけど、直帰率がマクロな傾向を示すかもしれないです。または、ページビュー/ ページ別セッションの推移を見ると、ユーザー行動の変化が、マクロ的に出るかも知れません。と思って、

pageviews_divided_by_uniquePageviews

wiki.slash-reader.comの半年のPV/ページ別セッション数。なんにも言えない、、、。アイデア倒れかも。

2(攻め)は、secondPagePathのセッション数見てみるとおもしろそうです。secondPageは最初のクリックページなわけで、意図した訴求がクリック数に結びついているかが分かる。特に、CMSなどでのテンプレートで、全てのページに同じ誘導ボタンが配置している場合、その効果が見えると思います。

特定ページがセカンド閲覧ページとなったセッション数の推移を見る。

secondPagePath_in_google_analyhtics

グラフにするほどのデータが取れなかったので、取得場面のスクリーンショットです。(Data Export APIを使う)

データはこのblogです。トップページ以外のランディングで、次にトップページに移った数。ある意味、blog全体に興味を持ってくれた人の数かもしれない。RSS取得などよりは、弱い興味だけど、、、

あるページへの誘導数を測る時に、このセッション数を出すやり方は良い方法かなと思います。大きなデータで見てみたいですね。

ナビゲーションは、受けと攻めの両面で考える。受けの方は、直帰率や(PV/ページ別セッション数)などで、攻めは、特定のsecondPagePathと成ったセッション数を出して、効果検証という流れを考えました。

Q3:ユーザー像のセグメント

ユーザ像の分類をどうするかですが、基本は、AISMAの視点でいくと思います。強い?キーワードが出てるものは、Sまで来てる。それ以外は、訪問回数でA→Iの移り変わりを見るという感じです。AISGでしょうか。Gはゴールです。コンバージョンです。

検索ワードは、その検索ワード自体が、顕在的なワードか?潜在的なワードか?に分類する必要があるかもしれません。サイトを象徴するワードなどは顕在層として行動特性を分ければ良い。行動特性は、ナビゲーションを見ればいいと思います。コンバージョン率もそうですね。

問題は、検索ワードが潜在的 or なんらかのキャンペーン or 参照サイト といった流入で、Attentionやinterestの段階にいる人を推定したいのですが、、、難しいです。妥協策は、訪問回数をattention, interestの積み上がりと考える事でしょうか。カスタムレポ-トで、訪問回数別のデータを見てみた(ピボットで参照元とクロスする)。

sessioins_by_number_of_visits_and_referrer

Directの内、ある程度は、twitterクライアントからの流入だと考えた方がいいと思ってます。

興味が積み上がった上でのコンバージョンという例がないので、1回目の訪問でコンバージョンしたデータだけですが、訪問回数(=~関心の積み上がり)と、参照元(当初の関心のベクトル)で、ユーザ層を分けて、コンバージョンみたいな行動成果を見たことになりました。

また、ユーザーに限りなく細分化したカスタム変数を持ってもらう事が可能なら、ユーザ単位で見た、複数の外部サイト(広告も含みますね)の貢献が出そうです。その場合は、プライバシーポリシーとの兼ね合いになりそうです。

ユーザ像が明確になれば、行動ターゲティングの導入などに進めるかもしれません。

おまけ: コンバージョンプロセスでの離脱率

Google Analyticsで良く使う目標到達プロセスでの分析も、セミナーでやったのですが、難しいなと思いました。最終的なコンバージョン率が違えば、それで優劣はでます。ただ、改善としては、プロセスを見ながら、いいとこ取りできないか考えるわけです。統計的な処理ができれば最適化と言ってもいいのかもしれません。ただ、演繹的にはムリな気がする。仮説 & テストじゃないとムリっぽいです。

ここら辺りができれば、知的好奇心は満足すると思いますが、PDCAのActionに早く移った方が良いですね。データにこだわるなら、ヒートマップとか、違うリソースによるユーザー属性とかでしょうか、でもこれも、テストの為の情報=仮説作成の為の情報ですね。

ワークショップ、後半はこれからなので、感想の続きがある予定です。

(*)ワークショップの感想としては、自分のパファーマンスの感想なのですが、数字の計算と会話のコンテキストスイッチは、コスト高だと理解しました。知的作業には、どんどんペア(グループ)ワークを入れるべし!と思っていたのですが、そこまで簡単ではない事が分かりました。

サイト(abc-analytics.com)のアクセス分析

前の記事(サイト(wiki.slash-readre.com)へのアクセス分析)に続き、このサイトの今年のアクセス分析。

ソシアルメディア計測

右の図は、ページと流入メディアで、セッション数と滞在時間をクロスしたもの。ソシアルメディアはtwitter。計測方法は、GAに対応したblog投稿通知(bitlyでtwitterに流す)の記事で書いた方法。

権威のある人から言及されるとアクセスがある。

bitly info google analytics cross section page-traffic

上の左図は、bit.lyでの数字。これが、そのままGoogle Analytics側では、右図のように、social mediaとして計測されている。

下の図は、閲覧開始ページでフィルタリングしたもの(アドバンスフィルタを使ってセカンドディメンジョンでのフィルタリング。アドバンスフィルタについては、アドバンスフィルター機能が追加 | Google Analytics, アクセス解析

social media tracking google analytics

12月11日以降のクリックが31で、上のbitlyを見ると、それ以降のアクセスがないので、残りの14は、directの形で戻ってきてくれたvisitということになる。

これは、ピボットにして、Returing Visitorを出せば、確認できる。

pivot google analytics new-returning users

本当は、ユーザ属性をカスタム変数に振る方がいいのかもしれないけど、やらなくても、あるキャンペーンのその後を追う形にはなる。工数がかかるけど。

サイト内検索

google analytics site search google analytics site search with me

上の左図は、今年のサイト検索のデータ。サブディメンジョンで、流入キーワードを出して、その後にサイト内検索をした時のキーワードを表示。さずがに、二単語での検索はないよう。僕は、記事を書く時に、この検索機能をよく使うので便利だと思うけど、外部の人にはありがたみが少ないのかもしれない。チームでコンテンツなどを書いていったり、個人でも記事が溜まってきたりすると利便性が上がりそう。右図は、僕のサイト内検索。サイト内検索時には、ユーザ属性を振っておくべきかもしれない。

サイト内検索もいろいろ記事を書いた。いろいろ間違いはある記事なんだけど、まあ、計測自体はできていると言うことで、、

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

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

wordpressにCSE。iframe編

Under Creative Commons License: Attribution

三番目のリンクは、tyntを使った場合のリンクになる。tyntの使い方: Tyntを導入した

上手くいかなかった計測

Google Analyticsでは、CustomVariableの導入で、計測の幅が広がったので、いろいろとデータを取ってみたりした。ページレベルのスコープで、マウスの位置の時間変化を残したりしたけど、あまり上手い数値はとれなかった。あとはユーザスコープで、ブラウザのサイズをとってみたけど、クロスブラウザ対策を怠って良いデータが取れなかった。

最後におおまかな今年のデータ。データに出すと、firefoxでurlをデコードしてたのが無くなるのが痛い(デコードの仕方: GA reportのURI表示の文字化けを直す)

http://docs.google.com/fileview?id=0B6kZxQAjlXMGYmMzMDEzZjUtYTI0My00M2EwLWI2NmMtZTEzYzA2NzIxYmNl&hl=en

image

サイト(wiki.slash-readre.com)へのアクセス分析

Google Analtyics Motion Chart Keywords-coversion

上図は、12月のキーワード別のモーションチャート。詳細は下の方。

アクセス解析のblogを書いてきたんだけど、ツールの使い方や技術的な説明に留まって、実際の解析はほとんど出来なかった。年末なので、アクセス状況を見ていこうと思う。データは、今年8月から始めた wiki.slash-reader.com(Google sitesを使ったもの)。

wiki.slash-reader.com

wiki.slash-reader.comのアクセス数値

http://wiki.slash-reader.com のアクセス数値。Google SitesでのGoogle AnaltyicsではAPIが使えないので、crudeな数字。僕のセッションはfilter-outしてある。グラフはセッション数と滞在時間。

ピークでも一日34sessions,14分の滞在時間(直帰を除くと30分くらい)。その場合には、20前後のページビューになっていた。

サイトでは、最初はコンテンツをページ毎に作っていたが、途中でblog形式でRSSで出力できる機能がついたので、そちらに書くようになった。たぶん、クリックさせやすい構造になったのかもしれない。と思ってグラフを見たけど違った。関係なさそう。

次に外部からどう見えてるかを示すトラフィック分析

google analyticsでは、参照元の表示が特殊な事に注意する。

Google Analtyics Traffic Source

ここで、セッション数は、このキーワードで来た回数ではない。

誤解を生む説明だけど、

大まかには、このキーワードで来た人が行ったセッション数である。ただし、違うキーワードや外部リンクを経由するとその人は入れ替わる。また、セッション中に検索サイトなどから来た場合はキーワードには追加されるけど、セッションはインクリメントされない。

参考リンク:アクセス解析ツールのいけてない集計仕様ベスト3、第1位,

Google Analyticsでセッション数「0」のキーワードの意味は?

じゃあ、実際の検索による流入ボリュームは?という話だけど、上手く出す方法が見あたらない。

下図のように、新規と既存のユーザをわけておくとと、ある程度の傾向は出る。既存との差分は、検索ではなく、bookmarkなど経由と考える。もちろん、既存でのキーワードの入れ替わりはある。(*) cookie内のutmzでは、新規キャンペーンの数値を測っているし、Ecommerseではキャンペーン開始からの日数を出しているので、レポート側の処理の問題なんだけど、、

image

customVarなどで、キャンペーン(utmz)の入れ替わりを計測しておけば、もっとしっかりした数字はだせそうだ。

キーワード別のサイト内行動パフォーマンスのSWOT分析

SWを滞在時間、OTをセッション数でみていく。データが少ないのが難点。

Google Analyitcs Motion Chart keyword SWOT

12月のキーワード分析。アンサー度として滞在時間をX軸。機会の多さとしてvisit数をY軸。Motinチャートは英語設定にしないと出ない。また、時間経過を入れないといけないので、時間単位を月別にしてる。また、円の大きさはvisitにしたので、Y軸と同じものを見せている。

アクションとしては、右下は広告などを考える。左上は、コンテンツ充実を図るとなる。やらないけど、、、

Google Sitesは、簡単にサイトが作れて、検索エンジンへのindexの登録、analyticsの導入、adsenseの導入、内部検索の導入、paypalのボタン貼り付け、などが簡単にできる。実に恐ろしいサービス。ただ、adwordsのコンバージョントラッキングは、gadgetを作る必要があるかもしれない。

次は、このサイトのアクセス解析。