自分のデータでやってみる。ちょっとマイナーかもしれないが、離脱率を例にする。
方式としては、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
で、擬似的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
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,全ページの離脱率")