廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

ロングテールSEOのためのパレート図の紹介と RGoogleAnalytics による実践

モチベーション

ロングテールSEOとは

検索エンジンからのサイトへの訪問数を増やしたい場合、みんながいっぱい検索してる人気のあるキーワード(ビッグワード)からのアクセス数を稼ぐのは競合とか多くて大変。それよりも、ニッチなキーワード(複合キーワード、かけあわせワード)を積み重ねてあくせくアクセスしてもらおうみたいな話。

例えば「家」とか「猫」とかのキーワードはいっぱい検索されているだろうけど、これらのワードで検索結果画面の上位表示を目指すのは大変そう。
それよりも「家猫 猫じゃらし」とか、「猫 ペット可 家」とか、そういったワードをコツコツねらっていこう。

こういうのが「ロングテールSEO」とか呼ばれて、ある程度重要視されている。

検索にガンガンヒットさせるSEOの教科書

検索にガンガンヒットさせるSEOの教科書

(pp.230-231 を参照)

ちなみにパレートの法則(80対20の法則、二八の法則)とかロングテール理論というのは自然科学的な意味での理論法則じゃないので注意、念のため。

ロングテールとかの可視化

そういった「ロングテール」とかを気にする場合、パレート図を使うといいと思う。

パレート図は棒グラフを大きい順に並べて、各項目の累積構成比を折れ線で示したもの。

各項目のうちどれが重要でどのくらいの割合を占めているのかわかりやすい。

あとで実物をお見せする。

実践

前置き

R の qcc パッケージに pareto.chart というパレート図を描画する関数がある。
pareto.chart {qcc} | inside-R | A Community Site for R

でも、これだと各項目がソートされるので「その他」を末尾にくっつけることができない。

検索キーワードは何百通りもあるので全部表示するのは現実的でない。

訪問数トップ20のワードだけ出して、あとは「その他」でまとめたい。

だから一行だけコードを書き換えてソート機能をオフにできるようにして、pareto.chart2 と名づけた(create unsorted Pareto chart · GitHub)。

これを使ってパレート図を描く。

コード

まずは RGoogleAnalytics を使って Google アナリティクスから API でデータを引っ張ってくる。

RGoogleAnalytics をいじっている - 廿TT を参照。

library("RGoogleAnalytics")
query <- QueryBuilder()
access_token <- query$authorize()

ここでアクセストークンをコピペ。

ga <- RGoogleAnalytics()
ga.profiles <- ga$GetProfileData(access_token)

query$Init(start.date = "2014-10-01",
           end.date = "2014-10-31",
           dimensions = "ga:landingPagePath",
           metrics = "ga:sessions",
           sort = "-ga:sessions", #降順
           #filters="",
           segment="gaid::-5", #自然検索トラフィック
           #max.results = ,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

lp <- ga$GetReportData(query)
#ランディングページのデータ取得完了

query$Init(start.date = "2014-10-01",
           end.date = "2014-10-31",
           dimensions = "ga:keyword",
           metrics = "ga:sessions",
           sort = "-ga:sessions", #降順
           #filters="",
           segment="gaid::-5", #自然検索トラフィック
           #max.results = ,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

kw <- ga$GetReportData(query)
#キーワードのデータ取得完了

library(qcc)
library(RColorBrewer) 
#デフォルトの色が好みじゃないので RColorBrewer を使う
source("ParetoChart2.R")
#pareto.chart2 を読み込み
#
#library(devtools)
#source_gist("https://gist.github.com/abikoushi/722ce195fb70df5cc679")
#で行けるかと思ったんだけど
#windowsだとsource_gist関数が動かないので
#ダウンロードしてご利用ください。

kw2 <- kw[kw$keyword !="(not provided)",]
#(not provided) を除く

kw_20 <- kw2$sessions[1:20]
kw_20[21] <- sum(kw2$sessions[-c(1:20)])
names(kw_20) <- c(kw2$keyword[1:20],"その他")
#上位20件を取った

old = par(mar = c(7, 4, 0.5, 2)) #余白の調整
#nihongo()
pareto.chart2(kw_20,unsorted=TRUE,
             ylab = "セッション",ylab2="累積比率", main="",
             col=brewer.pal(length(kw_20), "Blues"))
par(old) #余白を元に戻す

出力は下図の通り。

f:id:abrahamcow:20141122020035p:plain

棒グラフが平べったい感じの並びになってる。

ぼくのブログは少数のビッグワードが強い比重を占めてる感じではなく、いろんなかけあわせワードでちょっとずつアクセスを稼いでいる。

弱小サイトにありがちなパターンだと思う。

ちなみに、一旦除いた (not provided) は2162セッションあった。

> kw[kw$keyword =="(not provided)",]
         keyword sessions
1 (not provided)     2162

キーワードのバリエーションは529あった。

> dim(kw2)
[1] 529   2


ついでに自然検索経由のランディングページ(入口ページ)も合わせて見てみる。

lp_20 <- lp$sessions[1:20]
lp_20[21] <- sum(lp$sessions[-c(1:20)])
names(lp_20) <- c(1:20,"21位以下")
#nihongo()
pareto.chart2(lp_20,unsorted=TRUE,
              ylab = "セッション",ylab2="累積比率", main="",
              col=brewer.pal(length(lp_20), "Blues"))

f:id:abrahamcow:20141122020705p:plain

ページのパスは長いのでグラフのラベルに入れると文字が小さくなっちゃうし、画像にしちゃうとコピペができないので、別ファイルに書きだすことにした。

cat(paste(1:20,"\t","http://abrahamcow.hatenablog.com/",lp$landingPagePath[1:20], "\n", sep=""),
    file="~/Desktop/lptop20.txt")
#URLをくっつけている

アウトプットはこんな感じのテキストファイルになる。

1	http://abrahamcow.hatenablog.com/entry/2014/01/25/232720
 2	http://abrahamcow.hatenablog.com/entry/2014/02/06/003147
 3	http://abrahamcow.hatenablog.com/entry/2013/03/21/223717
 4	http://abrahamcow.hatenablog.com/entry/2013/08/03/160222
 5	http://abrahamcow.hatenablog.com/entry/2014/03/23/064859
 6	http://abrahamcow.hatenablog.com/entry/2014/06/04/021238
 7	http://abrahamcow.hatenablog.com/entry/2014/03/05/001432
 8	http://abrahamcow.hatenablog.com/entry/2013/03/19/231405
 9	http://abrahamcow.hatenablog.com/entry/2014/05/07/024305
 10	http://abrahamcow.hatenablog.com/entry/2014/02/12/225428
 11	http://abrahamcow.hatenablog.com/entry/2014/03/07/165255
 12	http://abrahamcow.hatenablog.com/entry/2014/07/13/222936
 13	http://abrahamcow.hatenablog.com/entry/2014/08/13/031519
 14	http://abrahamcow.hatenablog.com/entry/2014/01/05/081748
 15	http://abrahamcow.hatenablog.com/entry/2014/10/19/190552
 16	http://abrahamcow.hatenablog.com/entry/2013/03/22/004017
 17	http://abrahamcow.hatenablog.com/entry/2013/10/28/035435
 18	http://abrahamcow.hatenablog.com/entry/2014/09/19/055830
 19	http://abrahamcow.hatenablog.com/entry/20110318/1300395659
 20	http://abrahamcow.hatenablog.com/entry/2013/11/03/022616

タブ区切りなので Excel とかにも貼り付けられていいと思う。

避けるべき可視化

良いグラフ・悪いグラフ

以上で本エントリーの趣旨はだいたい述べ終わった。
が、パレート図を「良い例」として理解するために「悪い例」についても触れておく。

例1)3D風グラフ

f:id:abrahamcow:20141122022115p:plain
ロングテールSEOとは?戦略的メリットと複合キーワード集客法

立体的にしたり奥行きをつけたりすると、手前が大きくみえ奥が小さく見える。
これは統計グラフというよりはイラストなので、こういう言いがかりは野暮かもしれないが、データから傾向を探るときには、3Dっぽい表現の飾りは排除したほうがいいだろう。

例2)絵グラフ

f:id:abrahamcow:20141122022629j:plain
http://www.tokyo-np.co.jp/article/economics/news/CK2014112002000138.html

尺度(ものさし)は線の長さなのに、三角形で表現してるせいで、面積のほうに目が言ってしまい、誤解を招く。
これも統計グラフというよりはイラストなのかもしれないが、データの図示という観点から言うと、ふつうにパレート図にしたほうがいい。


世の中にはイラストとして優れていて、かつデータの視覚化としても優れている理想的な「インフォグラフィック」や「データビジュアライゼーション」もあるだろう。
でも基本的な図示において誤りを避けるためには、絵とか陰影とか奥行きとか、余計な装飾はつけず、棒グラフはただの棒にしておいたほうが安全。

例3)円グラフ

f:id:abrahamcow:20141122045611p:plain
ロングテールSEOとは?戦略的メリットと複合キーワード集客法

人間の目は円グラフを比較するのが苦手なので、原則としてあまり用いないほうがよい。


統計グラフのウラ・オモテ―初歩から学ぶ、グラフの「読み書き」 (ブルーバックス)

統計グラフのウラ・オモテ―初歩から学ぶ、グラフの「読み書き」 (ブルーバックス)

品質管理はクリエイティブだよ

話題が拡散してしまいそうだが、最後にもうひとつだけ言わせて欲しい。

どこだったかで、
「かつて、統計学を学んだものは企業では品質管理のなどの『守り』のポジションに回されることが多かった。しかし、近年ビッグデータの利活用が盛んになりデータサイエンティストと呼ばれる職種が……」
云々というような文章を見たことがあるんだけど、品質管理は地味でつまんない仕事みたいなイメージを持たないで欲しいな。

品質管理はデータ活用の歴史が長くて、学ぶところ多いと思う。

パレート図品質管理の7つ道具(QC7つ道具)の一つなんだけど、Web系の人とかマーケティングの人とかにも役立つツールだと思う。

Web系の人とかマーケティングの人とかは、今後どんどん品質管理の分野に接近してクロスオーバーしてって欲しい。

特にパフォーマンス型のマーケティング施策で「ROI最適化」なんて、「歩留まりを上げる」っていう発想と一緒じゃないか。

ぼくにはどうも、マーケターはエンジニアを「顧客視点を持てない技術バカ」だと思ってるような、エンジニアはマーケターを「お客様視点とか言うわりに、定義の曖昧なカタカナ語を振り回して舌先三寸で商品を売りつけるチャラ男」だと思ってるような、そんな対立が感じられる。

……っていうかぼく自身が若干マーケティング理論とかをバカにしてるんだけど、やっぱりお互い仲良くしないとやっていけないので、そのへんの偏見とかを払拭していきたいですね。

で、「データドリブンなマーケティング」とかやってくんだったら、品質管理の7つ道具のうち、散布図ヒストグラムは抑えておくといいと思う。

問題解決手法>QC七つ道具>ヒストグラム
問題解決手法>QC七つ道具>散布図

あと、永田靖『品質管理のための統計手法』(日経文庫)は、微分積分とかの数学の予備知識をほとんど要求してないのに、高度なところまでコンパクトにまとめているので、統計学の入門書としておすすめ。

品質管理のための統計手法 (日経文庫)

品質管理のための統計手法 (日経文庫)

追記:リスティング広告検索連動型広告)について

本記事は「ロングテールSEOのための」という体で書いたが、検索連動型広告(有料検索)についても同じ考えかたを使いまわすことができる。

検索連動型広告を成功に導くSEM戦略 増補改訂版

検索連動型広告を成功に導くSEM戦略 増補改訂版

(p.78 を参照)

RGoogleAnalytics で有料検索トラフィックについてのデータを引っ張ってくるためには、クエリの "segment" に "gaid::-4" を入れてやればいい。

こんな風だ。

query$Init(start.date = "2014-10-01",
           end.date = "2014-10-31",
           dimensions = "ga:keyword",
           metrics = "ga:sessions",
           sort = "-ga:sessions", #降順
           #filters="",
           segment="gaid::-4", #有料検索トラフィック
           #max.results = ,
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

Query Explorer — Google Analytics Demos & Tools