廿TT

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

"(not provided)" を考慮した検索キーワードごとの訪問数の推定

  • Google アナリティクスから検索キーワードのデータをとってくると、" (not provided) " というのが入ってる。
  • これは「検索キーワードが取得できませんでした」という意味なので他のキーワードと同じ扱いはできない。
  • かといって取り除いてしまうのも(場合によっては)問題がある。
  • そこで、" (not provided) " がもともとなんだったのか推定したい。
  • 素直に考えて同じページにたどり着いたからには、同じようなキーワードで検索していたんだろう、と推測できる。

(ここまでは前回といっしょ)

なので " (not provided) " の訪問数を他のキーワードに割り振ることを考える。
たとえば、ページ "http://aaaaushisan.blogspot.jp/2012/03/r-sort-order.html" に訪れた人の検索キーワードはこんなものだった。

キーワード 訪問数
(not provided) 70
r order 17
r sort 4
r ソート 4
order+r 3
order by sort 違い 1
order r 1
order+sort 違い 1
r order 並べ替え 1
r order 例 1
r with order 1
r 整列 元の 1
r 並び替え 1
r 並べ替え 1
r 並べ変え 1
r+order 1
r+sort+order 1
r+関数+order 1
r並べ替え 1
to in order to 違い 1


"(not provided)" の訪問数70をそれぞれのキーワードに

(あるキーワードの訪問数)/( "(not provided)" を除くキーワードの訪問数の和 )

ぶんずつ割り振る。
つまりたとえば "r order" には (17/(17+4+4+...+1))*70 を足す。


これでたぶん最尤推定になってるはず。
それをやってみた結果がこちら。

f:id:abrahamcow:20130713233605p:plain
検索キーワードごとの訪問数。上位20位まで図示。


"r order" の推定値が "母数" の推定値より長くなってるところとかがおもしろい。
"(not provided)" でキーワードが隠れていたときは "母数" が多く見えたけど、本当は "r order" のほうが "母数" より集客力のあるキーワードだった、のかもしれない。


以下が R のコード。


#csvファイルの最初(ヘッダ)と最後(フッダ)はあらかじめ消してある。

#setwd("~/Documents/dotR")
dat1 <- read.csv(
  "Analytics すべてのウェブサイトのデータ オーガニック検索トラフィック 20130606-20130706.csv"
  ,stringsAsFactors = FALSE
)
head(dat1[,c("キーワード","訪問数","ランディング.ページ")])
lp <- unique(dat1[,"ランディング.ページ"])
l <- length(lp)
mat1 <-c()
for(i in 1:l){
  tmp <- dat1[dat1[,"ランディング.ページ"]==lp[i],
              c("キーワード","訪問数")]
  flg <- tmp[,"キーワード"]=="(not provided)"
  if(all(flg) | all(!flg)){
    mat1 =rbind(mat1,as.matrix(tmp))
  }else{
    mat1 =rbind(mat1,
                cbind(tmp[!flg,"キーワード"],
                      tmp[!flg,"訪問数"]*
                      (1 +tmp[flg,"訪問数"]*(1/sum(tmp[!flg,"訪問数"])))
        )
    )
  }
}
#
KW_Vis_est <-tapply(as.numeric(mat1[,2]),factor(df1$"キーワード"), sum)
KW_Vis_est_df <-data.frame(KW=names(KW_Vis_est), Visit_est=as.numeric(KW_Vis_est))
KW_Vis <-tapply(dat1[,"訪問数"],factor(dat1[,"キーワード"]), sum)
KW_Vis_df  <-data.frame(KW=names(KW_Vis), Visit=as.numeric(KW_Vis))
result <-merge(KW_Vis_df,KW_Vis_est_df)
result <- result[order(result$Visit, decreasing=TRUE),]
#nihongo()
par(las=1, mai = c(0.85, 3, 0.68, 0.35))
barplot(t(as.matrix(result[20:1,3:2])),names.arg=result$KW[20:1],
        beside=TRUE, horiz=TRUE,
        col=c("white", "grey80"))
legend("bottomright", c("灰色:実測値", "白:推定値"))