20090915-20091015アクセス解析

このサイトabc-analytics.comと、wiki.slash-reader.comのデータを見てみる。

最終的にどういうactionに落とす事ができるか不明だけど、それを意識して進める。

キーワードに的を絞る。

検索流入数(左がwiki.slash-reader.com(wiki), 右がabc-analytics.com(wp))

2009年9月15日火曜日,4,0
2009年9月16日水曜日,6,0
2009年9月17日木曜日,2,0
2009年9月18日金曜日,1,1
2009年9月19日土曜日,1,0
2009年9月20日日曜日,3,0
2009年9月21日月曜日,1,0
2009年9月22日火曜日,6,0
2009年9月23日水曜日,3,3
2009年9月24日木曜日,8,2
2009年9月25日金曜日,9,1
2009年9月26日土曜日,3,0
2009年9月27日日曜日,2,0
2009年9月28日月曜日,6,1
2009年9月29日火曜日,10,5
2009年9月30日水曜日,7,0
2009年10月1日木曜日,6,6
2009年10月2日金曜日,13,3
2009年10月3日土曜日,2,2
2009年10月4日日曜日,4,1
2009年10月5日月曜日,12,3
2009年10月6日火曜日,9,5
2009年10月7日水曜日,6 ,9
2009年10月8日木曜日,6 ,3
2009年10月9日金曜日,1,6
2009年10月10日土曜日,0,6
2009年10月11日日曜日,2,3
2009年10月12日月曜日,4,2
2009年10月13日火曜日,12,8
2009年10月14日水曜日,6,4
2009年10月15日木曜日,10,12

キーワードの種類(wiki:116, wp:87)、セッション数は(wiki:165, wp:86)。

wpの方は、セッション数= keywordの種類。競合がないキーワードの組み合わせでの流入になっている。(検索ボリュームが非常に少ない検索フレーズを示している、と思う)

ちなみに、google にindexされるようになって検索にかかるようになったばかり。サイトの年齢が若くても、そんなにハンディが無い印象。被リンクをもらう事が大事。

ちなみにwordpressだと、yahooは上手くindexしてくれないよう。現在、1記事だけindexされてるだけ。その後、全然indexしてくれない。企業の人がwordpressでやるときは、この辺りどうするのだろう???(樂天ビジネスなんかを見ると、時々wordpress案件があるし、他にもwordpressサイトはたくさんある)

検索されたキーワードは、複合検索が多く、非常に小さな検索ボリューム(下で分析する)。ビジネス上のコンバージョンを考えないのであれば、long tailをこつこつ積み上げれば、アクセスは集められるような気がするが、金銭的な価値回収が難しい。このような価値を回収できるアマゾンのビジネスのすごさが、いまさらながら理解できた気がする。

こん検索もあった。

intitle:変動 | intitle:変更 | intitle:seo | intitle:sem intitle:google or intitle:yahoo

なるほど、こうやって検索するのか、勉強になる。

個別には、マイナスキーワードでの検索もあった。使った事がないけど、使わないと検索生活の質が落ちるのかもしれない。

csvに落として、rubyでこちょこちょやる。

昔、どっかで見た、csvファイルを読んで、そのまま列単位でオブジェクトにしてくれるscritpを改変したものを使う(csvのactive-record版みたいなイメージ) ちなみに、ファイルはこんな感じ。場合によっては、エクセルより手軽になる。

さて、流入キーワードを見ていく。

複合検索が以外に多い。

[単語数: 流入回数]を見る。

wp:   [[1, 11], [2, 29], [3, 28], [4, 11], [5, 8]]

wiki: [[1, 7],  [2, 23], [3, 55], [4, 20], [5, 7], [6, 3], [10, 1]]

(10wordsはさっき上での検索タイプ)

中心値は、3 words辺り。まあ、それぐらいにニッチにならないと、検索で上位に出てこないからだろう。

でも、5 wordsくらいで検索する人もかなりいるという事だ。

見た目のシンプルさにこだわるgoogleが 検索窓をあえて横長にするわけだ。

(参考記事: 8語以上の複合キーワード検索が伸びている)

求めてる情報を単語単位で見てみる。

サイトのテーマの単語(google sites, anallytics)と付随してくる単語を取り出す。

まず、関係なさそうなもの(テーマ単語がないもの)を切る。(先ほど、mycsv.rbのファイルから)

obj.map(&:keywords).select{|e| e =~ /google|site/}.map{|e| e.gsub(/google|site|sites/, “”)}

切った後に、テーマ単語を消して表示する。

その後、回数は計って順列表示

wiki:(一回はのぞく)

[“apps”, 18],
[“api”, 15],
[“docs”, 5],
[“サイト”, 5],
[“gdata”, 5],
[“analytics”, 5],
[“連携”, 4],
[“favicon”, 4],
[“css”, 4],
[“コピー”, 4],
[“商用”, 3],
[“wiki”, 3],
[“問題点”, 3],
[“目次”, 2],
[“utmz”, 2],
[“xml”, 2],
[“script”, 2],
[“doc”, 2],
[“使い方”, 2],
[“cookie”, 2],
[“data”, 2],
[“キャビネット”, 2],
[“html”, 2],
[“ページ”, 2],
[“list”, 2],
[“送信”, 2],
[“atom”, 2],
[“活用”, 2]]

wp(analytics)

[“python”, 8],
[“trackpageview”, 5],
[“form”, 4],
[“api”, 4],
[“data”, 4],
[“アナリティクス”, 4],
[“-trackevent”, 3],
[“gdata”, 3],
[“計測”, 3],
[“getaccountlist”, 3],
[“gdata..service”, 2],
[“import”, 2],
[“ドメイン”, 2],
[“wordpress”, 2],
[“dataservice”, 2],
[“sites”, 2],

みごとに、当初自分の想定しなかった単語が(テーマの付属語として)最上位に来た。

被リンクがあったからだろう。結局、被リンクされるかどうかが分かれ目。

いずれにせよ、数が少ないので、何とも言えないけど、api関連は競合も少ないのだろう。

今度は、検索キーワード単位から、それをばらした単語単位にして、滞在時間の総計順を出す。

キーワード[ sessions, pageviews, stayonsite]という表記。

wiki

  • app(s)  [25, 76, 5395]
  • api  [19, 29, 3291]
  • docs [8, 45, 1615]

wp

  • python [5, 16, 1422]
  • trackpageview[1,1,653]
  • api [4, 12, 1692]

とりあえず、次にどういう行為をして欲しいという事はこれではわからない。

うーん、、

カノニカルタグの復習

http://searchengineland.com/canonical-tag-2-0-google-to-add-cross-domain-support-27222

上の記事を読んで、勉強した。

canonicalの意味(cobuild)

If something has canonical status, it is accepted as having all the qualities that a thing of its kind should have.
* …Ballard’s status as a canonical writer.

日本語で、正規軍というと、権威に認められたという感じ。正規化というと、余分な要素を落として、必要な性質だけを残すというイメージ。

で、

<link rel=”canonical” href=”aaaaa-link”/>だけど、

Q.  what これ何?

A. (x)HTMLのタグ。検索エンジンは、これを見て、hrefに書いたaddressにredirectする。

Q. where どこで利用されているの?

A.重複コンテンツが有る場合、こっちが正規のページだと証明する為のタグ。queryなどのパラメータが付いたけど、中身が同じだという場合、複製されたページには、<link ref=”canonical” href=”正規軍のページ”/> と入れておく。

Q.  why なんで必要なの?

A.検索エンジンの為(それは自分の為)。こちらが正規のページだよと宣言して、重複コンテンツによるページの評価の拡散をさける。

Q.  when いつから始まったの?

A.  検索エンジンがこのタグを考慮しますよといったのは、、わからん。対応するという記事は、Google web mater central blogの記事(2009年二月)。 他の大手の検索エンジンも対応してるらしい。

Q. why なんで、今頃書いているの?

A.今までは、クロスドメイン間では使えなかった(サブドメインではOK)が、

http://searchengineland.com/canonical-tag-2-0-google-to-add-cross-domain-support-27222 クロスドメイン間での、重複コンテンツでも、カノニカルタグを認識してくれるようにするらしい。Googleは。年末(2009年)をめどに。らしい。

Q. more 他には。

A.リンク先を示す(href)時には、相対pathでもOK。

A. リンク先が404なら、canonicalタグは無視。

Markezineにセミナーに行ってきた。

 

11時から後のセッションをA,B会場をはしごして、聞いてきた。

  • Google adwords(PDCAに沿った製品紹介)
  • アクセス解析事例(セグメンテーション事例)
  • ぐるなび-ウェディング事例(omnitureのツールのテストツール事例)
  • データマイニングASP企業(計算機のパワーを最適化領域を広げる)
  • webコンサル企業 (beBit webサイト上のビジネス収益の最大化、説得力があった)
  • ECショップ請負(IMJ フランチャイズで、village vanguardのonline shopをする。本業はコンサル)

技術系のセミナーの9割は自慢でできている(それがおもしろい)が、マーケティングのセミナーは、、なんだろ、、パワポでできていると感じた。お話の親切度は、だんぜんこちら。セミナー上でも、マーケティングされてるからか。

上から順に、僕の誤解も含まれたメモを残しておく。

 

Google adwords

  • PDCAに合わせて、製品を紹介するというのは、Googleの巨大さと感じた。
  • P: 検索キーワードの盛り上がりのstart-endを google insightsを使って説明。
  • P: サイト情報は、adplanner
  • D: コンテンツマッチは内容にマッチ、インタレストマッチは見る人にマッチ WS000000
  • D: placement広告も使って。urlを入れるとそのサイトにマッチした広告が、gadget, 動画、イメージ 右図
  • C: analyticsで、CPCの順位での比較もできる
  • C: optimizerを使う。

 

 

アクセス解析イニシアチブ(キーワードはセグメンテーション)

  • セグメンテーションをすれば、見える、行動できる
  • プレゼンは二人の掛け合いだった。なんかリズム感がよかった。聞きやすかった。
  • 理論(F1層など)と実例(実際の行動) の二つのセグメンテーションがあるが、、
  • セグメンテーション例
    • 入り口ページ
    • キーワード
    • 新規 or repeat
    • 地域
    • 訪問PAth, directory
    • converted user
    • 訪問頻度、回数
    これらを掛け合わせて
  • 実際例
    • 価格サイトと検索エンジンからの違い
    • クリックする場所による違い
    • 住宅サイト、勤務先で見る場所、探す物件の場所
    • 結婚情報サイトは、訪問回数を重ねながら、アクションが進む
      • (会員登録、メルマガ、式場、ウェディングドレス、二次会、エストの順)
  • 試行錯誤できるツールが良いツール(サクサク、遡れる、やり直せる)
    • Google analyticsは良いが、goal設定がさかのぼれない
    • confy analyticsは、ユーザ分類がシナリオに沿ってできる、コンバージョンの履歴も遡れる

 

ぐるなび-ウェディングの実例

    • 結婚マーケット
      • 年70万組(1/4は再婚、60%が結婚式その内70%が二次会)
      • 平均支出 300万
      • 基本は地産地消(これは僕のあて言葉)
      • マクロ数字は、動かせないので、来た人を逃がさない対策
    • ominutureのツール(マーケターが、システムに頼らず施策するのが目的)
      • 実例とタイトルに有ったが、数字は少しでただけ。これはでも、しょうがないのかも。
      • テストをしてるときに、SEO上のランクへの懸念があったけど、問題ないよう。(ツールのおかげなのかは不明
    • 紙の資料がないので、あまり思い出せない。

 

データマイニングを活用したダイレクトマーケティングの事例(ブレインパッド)

  • データマイニング、計算エンジンの開発、webシステムの構築 の三本柱らしい
  • ファンドが入っていたり、取引先に大企業が並んでたり、してる会社。
  • プレゼンの人は、最初緊張してた用だが、途中から良くなった。
  • レコメンドエンジン
    • 四つの型だったような(分かった気になったが、理解し忘れた)
      • next buying(これを、、これを買ってるって奴か?)
      • target(に合わせた推薦??)
      • segment(を作ってくれる??)
      • target間(targetの関連がsegmentのような気もするが、、)
    • 神様(期待値がある。神様は100発100中。ランダムは直線で平均値へ。モデルはその中間を上に登る)
  • さくっとセグメント抽出(ペン図などが出る)できて、そのセグメント構成データが出せる。

 

成果を上げる!効果測定・改善のポイント(beBit)

  • 今日聞いた中では、いろんな意味でお得感が一番あった。(僕は企業担当者ではないので、その立場の人だとわからないが)
  • プレゼンの人は、声が裏返ったりしてたが、自信に裏付けられたトークだと感じた。
  • 抜本改善と運用チューニングの二つに、サイト運営を分かれるが、運用チューニングは難しい。
    • 時間が少ない。
    • 分析項目が多すぎて、パラリシスする。
  • アクション可能な領域を絞る。
    • 8つの指標で十分。(流入数、CTR, 直帰率、CVR、再来訪CV、Assist、フォーム到達率・率、最終ビジネス成果
    • 指標ではなく、シナリオを作る。
    • シナリオとは?
      • 流入経路+閲覧開始ページ———|||BLACK-BOX|||———–Goalで評価。
      • 入り口と出口のみ。
      • サイト内は追うべからず。blackboxにする。
      • シナリオが存在してから、それに付随して指標がある。(シナリオが機能しているか、どうかを見る。)
      • 再訪問を把握する(これは、他のセミナーでも出てきた。重要なのかも)
      • 機能したシナリオは、ビジネス最終成果の沿って検証。再訪問も。
      • 機能しないシナリオは、途中にgoalポイントを置いて検証。伸ばせる領域の発見。
      • 間接的な評価を入れる。(認知が必要、購買への意志決定は数時間から数ヶ月)
        • 時間が掛かるもの、一回の認知ー固有名詞検索、集客コンテンツが効果をあげるもの。
      • シナリオを流せるようにするために、テスト。
      • ABテストでも、多変量テストのような解決策を考える?
    • ツールの携帯対応始めた。

 

タイミングを逃さないECサイト戦略とは。(IMJ)

  • Village vanguardのEC店舗をフランチャイズでやっている!!。
  • 売上は伸びている。伸ばしている。
  • KPIを決めて、施策とヒモづける。
  • メルマガ、セグメント配信したけど、だめだった。
  • 分析した。
  • カテゴリ購買分析と詳細購買分析
  • カテゴリ、、この商品はどのタグ?
  • そのままランキングを出すので良いの?
  • リコメンドのルールを、紹介文に入れた方が良い。
  • メルマガのトップには、リコメンドで動的に。
  • メルマガ配信内容も、配信をずらして、反応を見ながら動的に変える(エンジンを使って)(このあたりがタイミングだったか?)
  • 集客用のページ(キーワードを中心にして)を作って売る。
    • サイト内分析
    • 検索エンジン対策
    • 収益シミュレーション
    • 周辺キーワードの考慮
    • ページ構造も検索エンジンに合わせる
  • メルマガのdemographic別配信は、アメリカでは御法度??らしい(政治的な理由??、単に上手くいかないだけ??)
  • 最後は本のプレゼントを使ったPRに感心した。

全体の感想。

午後の後半は、スタミナ切れして、妄想モードに入って、聞き逃す事が増えてしまった。午後話す人は、大変。

PDCAという単語を、百万回聞いた。

再訪問の評価が大事らしい。

解析と行動は、仲が悪く、離反しやすいので、首輪しとく。

ajaxが原因のindex漏れを修正

* index : ここでは、googleの検索に引っかかる(indexされる)ようになる事。webmaster-toolを使うと確認でかきる。(もしくは、site: abc-analytics.com みたいな形で検索する、両者は一致しない事もあるが)

このwordpressは、carrington-blogというthemaを使わせてもらっているのだが、bloggerから移転してきたときに、上手くリンクをredirectさせずにいたせいか、個別記事がindexされずに、webmaster-toolを見ながら、悶々としてた。

categoryや月、日にちではindexされるのに、個別記事がindexされなかった。apacheのlogをみても、googlebotは頻繁にくるんだけど、すぐに帰って行く。

時間が経てばそのうち拾うかなと思っていたんだけど、だめ。sitemap.xmlには個別記事のurlは入っているので、bloggerからの移転や、subdomainを作ったり、redirectしたので、ペナルティなのかなと、想像を巡らせていた。

で、なぜカテゴリだけindexされるんだろうと、カテゴリを示すURLを入れると、そこで示されていた個別記事のリンクは、ajax読み込みになっていて、urlが変化しないようになっていた。

ユーザーによっては便利なのかもしれないけど、検索エンジンに優しくないので、ajaxを停止した。設定画面をよく見たら、ajax機能はon-off できるようになっていた。 offにした。

しばらくしたら、3つほどindexされていた。ただ、どのurlがindexされたのかが、よくわからない(見る方法はあるのかな?)。site: abc-analytics.com だと、以前から30ほど検索されている。(上手く、リンクがわたせず、404を表示してしまったのもあった。ほとんど修正された(googleに)が、まだあるかもしれない)

ブラックボックスな部分も多い仕組みなので、時間をかけて見るしかないのだろう。

bit.lyを中継して、twitterに投稿してもらう

(注 これは試行錯誤日記なので、きちんと使う人は、この記事にTwitterでコメント」ボタンの記事URLをbit.lyで短縮するようにしたよ、とかがいいのかもしれない, PHPであらかじめやった方がスマートだろうし)

2009/09/26 1:45 書き直した。

最近、個別記事にtwitter this! のボタンが付ける方法を紹介する記事(Twitterに記事を投稿できるようにするWordPressのコード)を見るようになってきたので、自分でも作ってみた。

上のサイトで、twittrerの画面に、タイトル・リンク付きで飛ばしてあげる方法が書いてあった。

<a href="http://twitter.com/home?status=この記事読んでね <?php the_permalink(); ?>" title="Send this page to Twitter!" target="_blank"><img src="画像のURL" /></a>

というものだった。

今回は、short-urlサービスを絡ませて、出すようにする。

あと、topページからでも、個別記事のtitle, urlが情報として飛ぶようにする。

サービスは、bit.lyを使う。

sign-upして、api-keyをもらっておいて。

function my_add_twitter(_url, _title) {
  var xfgd = 'id';
  var fdsr = 'api-key';
  var api = 'http://api.bit.ly/shorten' + '?version=2.0.1' + '&format=json' + '&callback=Callback' + '&login=' + xfgd + '&apiKey=' + fdsr + '&longUrl=';
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = api + encodeURIComponent(_url) ;
  document.body.appendChild(script);
  Callback.url = _url;
  Callback.title = _title;
}

function Callback(json) {
  var u = arguments.callee.url;
  var t = arguments.callee.title;
  var url = 'http://twitter.com/home/?status=' + encodeURIComponent( t+' '+json.results[u]['shortUrl']);
  location.href = url;
}

これを、実行されるjsファイルに書いておく。

で、リンク先から <a href=”#” onclick=’l="<?php the_permalink() ?>";t="<?php the_title() ?>";my_add_twitter(l,t);’

と呼び出してやれば、アイコンを付けた記事のurlがshortenされて、twitterの投稿画面に行ってくれる。

しかし、titleとurlをglobal変数に入れてしまった。Callback.apply([url, title], arguments)とかやろうとしたけど、callback関数があらかじめ定義されてないとだめなのかな? よくわかってないので、global変数で動けば良いとした。

関数もオブジェクトなので、プロパティをsetしてやって、関数定義内でarguments.calleeで読んでやれば、setしたプロパティも取れた。とりあえず、global変数は消せた。定義した関数もその名前のグローバル変数になっているのだろうけど、、。

アクセスの時間変化を見る

Ascii.jpでの連載、Analyticsで検索トラフィックのアクセス解析、の途中までをなぞった。

変化率ほどのデータがないので、データの引き算だけ。 ほとんどゼロだし。

以前、書いたpythonライブラリで、データを並べて, google-spreadsheetまで、持ってくるところまでやる。

そして、それをlist-viewの形にする。

https://spreadsheets.google.com/lv?key=0AjYVCUWmaoq6dHJHM3FUYkhtZlBTWGRMSG1EenVDRVE&f=0

これで、期間データの比較をspreadsheetに落とすまで、自動化できた。

データについては、wiki.slash-reader.comは、当初 google sitesに魅せられて始めたが、google analyticsに興味が移ってしまって、コンテンツのてこ入れができない。

また、blog.slash-reader.comと、このabc-analytics.comをまとめる必要がある。

pythonのコード。

pythonのリスト処理に、まだ時間が掛かってしまう。何時間もかかった、エクセルの生産性に追いつけない。

import gdata.analytics
import gdata.docs
import datetime
import os
import re
#import pdb;pdb.set_trace()

def getGaData(dimensions, metrics, flt, sort, sdate, edate):
   gas = gdata.analytics.service.AnalyticsDataService()
   gas.ClientLogin("email”, "pw")
   # profileを集めてくる。
   lt = gas.GetAccountList()
   # そのprofileのtableIdを取る。tableIdが複数の場合は知らない
   id = [x.tableId[0].text for x in lt.entry][2]
   # このtableIdを元に、metricsとdimensionを指定する(10こずつ取れるようだけど、とりあえず一個,hour,pageviews)
   # for metrics
   data = gas.GetData(id,
                      ‘,’.join(dimensions).rstrip(),
                      ‘,’.join(metrics).rstrip(),
                      flt, sort,
                      sdate, edate,
                      1, 1000)
   data = [[x.dimension , x.metric] for x in data.entry]
   header = [x.replace("ga:","") for x in dimensions + metrics]
   #import pdb;pdb.set_trace()
   data.insert(0,header)
   return data

def writeCSV(iter, filesuffix):
   import csv
   filesuffix = [] if filesuffix == None else filesuffix
   filename = os.getenv("HOME")
   filename += "/ga_data/GA-"
   filename += "-".join([x.strftime("%Y%m%d") for x in filesuffix])
   filename += ".csv"
   writer = csv.writer(file(filename,"wb"))
   writer.writerows(iter)
   return filename

def putSpData(filename):
   import re
   f, ext = filename.split(".")
   f = re.sub(r’.*/’,”,f)
   tp = gdata.docs.service.DOCUMENT_LABEL
   cl = gdata.docs.service.DocsService()
   cl.ClientLogin(“name”, ‘pw’)
   _checkFilename(f, cl)
   ms = gdata.MediaSource(file_path=filename,
                          content_type=gdata.docs.service.SUPPORTED_FILETYPES[ext.upper()])
   cl.Upload(ms, f)

def _checkFilename(filename, cl):
   lt = cl.GetDocumentListFeed()
   item = [x for x in lt.entry if x.title.text==filename]
   if len(item) > 0:
       cl.Delete(item[0].GetEditLink().href)

if __name__ == "__main__":
   dimensions = ["ga:source", "ga:keyword"]
   metrics = ["ga:visits","ga:newVisits"]
   d1_sd = datetime.date(2009,9,1)
   d1_ed = datetime.date(2009,9,9)
   d2_sd = datetime.date(2009,9,10)
   d2_ed = datetime.date.today()
   flt = ""
   sort = ""
   d1 = getGaData(dimensions, metrics, flt, sort, d1_sd, d1_ed)
   d2 = getGaData(dimensions, metrics, flt, sort, d2_sd, d2_ed)
   header = d1[0]

#df1,df2のデータ構造を揃える
   df1 = dict( [ (tuple(x[0]), x[1] + [0,0]) for x in d1[1:]] )
   df2 = dict( [ (tuple(x[0]), [0,0] + x[1]) for x in d2[1:]] )

#df1,df2のmerge, merge方法は、[3:4]を更新する形 
   for k in df2:
       if k in df1:
           df1[k] = [df1[k][3:4], df1[k][3:4]]
       else:
           df1[k] = df2[k]
   #import pdb;pdb.set_trace()
   data = [[k[0],k[1]] + df1[k] for k in df1]
   data.insert(0, header + ["ga:visits", "ga:newVisits"])
   filename = writeCSV(data,[d1_sd,d1_ed,d2_sd,d2_ed])
   putSpData(filename)