自分のデータでやってみる。ちょっとマイナーかもしれないが、離脱率を例にする。
方式としては、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.rank1 157 138 1603.6 0.000000 0.7898 5.355 12 218 178 1635.4 0.000000 0.7477 5.337 23 54 52 902.6 0.000000 0.8704 4.596 34 142 118 1893.4 0.009009 0.7254 7.085 45 65 49 1156.2 0.020833 0.7385 5.061 56 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.rate1 /multi-cookie-tracking 157 138 1603.6 0.0000002 /what_are_visits_entrances_uniqueviews_pageviews_in_google_analytics 218 178 1635.4 0.0000003 /gnur-with-google-analytics 54 52 902.6 0.0000004 /what_is_user_in_google_analytics 142 118 1893.4 0.0090095 /wordpressにcse。iframe編 65 49 1156.2 0.0208336 /track_outbound_as_a_event_and_pageview 104 79 456.5 0.000000 e.rate d.index g.rank exits etv1 0.7898 5.355 1 124 0.69862 0.7477 5.337 2 163 0.71293 0.8704 4.596 3 47 0.63354 0.7254 7.085 4 103 0.65325 0.7385 5.061 5 48 0.61406 0.6731 6.013 6 70 0.6124plot(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,全ページの離脱率")


