グラフで図示してみる(GAのweighetdSortとの比較)

自分のデータでやってみる。ちょっとマイナーかもしれないが、離脱率を例にする。

方式としては、http://www.seomoz.org/blog/build-your-own-weighted-sort の人の方式の、全体の平均値を平均に、全体の精度を最大の値をもつセッション数にする。

Rで関数を書いておく。

weighted.mean <- function(data, elm, denom, prior.mean=NULL, prior.num=NULL, cname=NULL){
  if(is.null(prior.num)){
    prior.num = max(data[,denom])
  }
  if(is.null(prior.mean)){
    prior.mean <- sum(data[, elm])/sum(data[, denom])
  }
  print((prior.mean)*100)
  cname <- ifelse(is.null(cname),"w.rate", cname)
  data <- transform(data,
                    #w.rate.asis=(data[,elm]/data[,denom]),
                    tmp = (ifelse(data[,denom]==0,
                                   prior.mean,
                                   (data[,denom]/prior.num)*(data[,elm]/data[,denom]) +
                                   (1 - data[,denom]/prior.num)*(prior.mean)
                                   )
                            )
                    )
  colnames(data)[which(colnames(data) == "tmp")] <- cname
  data
}

こんな感じにしておいて、dataにはデータフレーム(僕のGAデータ取得ツールから作られる), elmには "exits", denomには"pv"と対象セグメントの文字列(データセットのカラム名)を指定。 prior.numはデフォルトで最大pv、prior.meanは今回なら全体の離脱率となる。


あとは、googleの加重並び替えのデータは、ウェブ上からしか取れないので、ウェブ上からダウンロードして、データを洗浄しておいて、Rで横こんでおく。

d0 <- read.csv("data/exits-test.csv")
R> str(d0)
'data.frame': 285 obs. of  7 variables:
 $ Page   : Factor w/ 285 levels "/","/%E3%82%A2%E3%83%89%E3%83%90%E3%83%B3%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%EF%BC%8D%E6%A9%9F%E8%83%BD%E3%81%8C%E8%BF%BD"| __truncated__,..: 147 270 109 271 276 262 146 212 68 13 ...
 $ pv     : int  157 218 54 142 65 104 146 86 68 42 ...
 $ upv    : int  138 178 52 118 49 79 112 67 55 34 ...
 $ avtos  : num  1604 1635 903 1893 1156 ...
 $ b.rate : num  0 0 0 0.009 0.0208 ...
 $ e.rate : num  0.79 0.748 0.87 0.725 0.738 ...
 $ d.index: num  5.36 5.34 4.6 7.08 5.06 ...

e.rateが離脱率。b.rateが直帰率で、d.indexがダラーインデックスだけど、今回は使わない。Pageがfactorだけど、まあいい。メンドだ。
これは、weighted sortで並び替えた順番になっているので、とりあえず、番号を振っておく。

d0 <- transform(d0, g.rank=(rownames(d0)))
R> head(d0[,-1])
   pv upv  avtos   b.rate e.rate d.index g.rank
1 157 138 1603.6 0.000000 0.7898   5.355      1
2 218 178 1635.4 0.000000 0.7477   5.337      2
3  54  52  902.6 0.000000 0.8704   4.596      3
4 142 118 1893.4 0.009009 0.7254   7.085      4
5  65  49 1156.2 0.020833 0.7385   5.061      5
6 104  79  456.5 0.000000 0.6731   6.013      6

ページは見た目が壊れるので、外して表示。単に行の番号を新たにつけただけ、google のweighted sortに番号としてだけ。

で、weighted meanを計算して新たな列を作る。その前に離脱数をだしておく。
d0 <- transform(d0,exits=(e.rate * pv)) 
d0$e.rate * d0$pv
  [1] 124 163  47 103  48  70  95  58  47  31  31  41  13  13   7  14   6   6  10  18   8   8   5
 [24]   5  12   9   6  13  17   8   9   9  10   3   8   5   5   2   2   2   2   2   2   6   3   3
 [47]   4   4   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
 [70]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
 [93]   1   1   1   1   1   1   1   1   5   5   2   2   2   2   2   6   3   3   3   7   7   0   0
[116]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
[139]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   4
[162]   4   1   1   1   1   1   1   1   1   1   1   1   1   1   1   2   6  10   3   0   0   0   0
[185]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
[208]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
[231]   0   0   0   0   0  12   1   1   2   7   3   8   0   0   0   0   0   0   0   0   0   0   0
[254]   0   0   1   1   1   2   2   0   0   0   0   0   0   6   4   0   0   0   7   4   0   0   1
[277]   0   6   2   9   9  24  17 112  41

この段階で、GAのweighted sortがどんな感じで振り分けを行っているかがわかる。数字の小さいものは真ん中に押し込められてる。
で、擬似的ETVを計算して列を付加。

d1 <- weighted.mean(d0, "exits", "pv", "etv")
head(d1)
                                                                  Page  pv upv  avtos   b.rate
1                                               /multi-cookie-tracking 157 138 1603.6 0.000000
2 /what_are_visits_entrances_uniqueviews_pageviews_in_google_analytics 218 178 1635.4 0.000000
3                                          /gnur-with-google-analytics  54  52  902.6 0.000000
4                                    /what_is_user_in_google_analytics 142 118 1893.4 0.009009
5                                            /wordpressにcse。iframe編  65  49 1156.2 0.020833
6                              /track_outbound_as_a_event_and_pageview 104  79  456.5 0.000000
  e.rate d.index g.rank exits    etv
1 0.7898   5.355      1   124 0.6986
2 0.7477   5.337      2   163 0.7129
3 0.8704   4.596      3    47 0.6335
4 0.7254   7.085      4   103 0.6532
5 0.7385   5.061      5    48 0.6140
6 0.6731   6.013      6    70 0.6124
Pageの文字列が長いせいで、見た目が悪いけど、最後の列のetvが計算結果。

plot(d1$etv,xlab="GAによる順番",ylab="こちらの推定値",type="l",main="全ページの離脱率")

こちらの計算とGAのweighted sortが同じ結果であれば、GAの順番通りに単調減少になるはず。
ジグザグが生じてる部分は両者が不整合。
TOP50に絞って散布図にして見てみる。

tmp <- d1[d1$g.rank<51,]
R> plot(tmp$etv,xlab="GAによる順番",ylab="こちらの推定値",type="b", main="TOP50,全ページの離脱率")
ちょっとバラバラとはいえなくはないが、、、実用上(問題ページのあぶり出し)には問題ないと考える。
下位50はというと、
nrow(d1)
[1] 285
R> tmp <- d1[d1$g.rank>235,]
R> plot(tmp$etv,xlab="GAによる順番",ylab="こちらの推定値",type="b",main="BOTTOM50,全ページの離脱率")


こちらは悪くない感じだ、、、、もちろん、上も使えると考えるけど、、、


Comments