読者です 読者をやめる 読者になる 読者になる

廿TT

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

Google アナリティクスの Page Depth を可視化 + KPI 割り算主義への懐疑

R Excel Google アナリティクス

追記

本エントリを書いたときはまだ考えがまとまりきっていなかったので、主張にあいまいな部分があります。
この記事に興味を持たれたかたは下記の投稿を先にご覧になることをおすすめします。


エンゲージメントを測る指標はエンゲージメント「率」だけじゃない。やみくもに割り算値をKPIにするのはよくない。 - 廿TT

※また、本文中のコードに一部あやまりがあります。すみません。

比率や割合は良い指標か?

KPI、KGI といった用語の説明は他のサイトを参照して欲しい。
KPIとは 【 Key Performance Indicator 】 〔 重要業績評価指標 〕 - 意味/解説/説明/定義 : IT用語辞典

Web 業界ではよく比率や割合を KPI にすることが推奨される。

よく聞く指標の名前も CVR とか CTR 、新規率、アクティブ率、リピート率とか R のつくやつが多い気がする。

Lean Analytics: KPIにしてはいけない8つの指標 - Hive Color では、「比率や割合であること」が「良い指標」の原則として挙げられている。

が、ぼくはなんでもかんでも割り算するのはよくない気がする。

そう思ったのは、たぶんぼくがいっつもカーブフィッティング(曲線あてはめ - Wikipedia)ばっかりやってるせいかもしれない。

例えば久保拓弥(久保拓弥 (@KuboBook) | Twitter)は、割り算した値を使って回帰分析をするのはよくない、と強調している。
なんでも割り算するな!(pdf)

統計モデルに観測値と観測値の割り算値を入れても問題ない: ニュースの社会科学的な裏側 というエントリもあるが、まああえて割り算を推奨する理由はないわな。

実際、Web 業界で KPI をモニタリングするときに回帰分析とかはまずやらないだろうけど、でも KPI というのは KGI に対する説明変数と位置づけたほうがわかりやすい。

なので、「良い指標は比率や割合である」と言い切ってしまうと、表やグラフで指標を眺めるにしても似たような問題が起こってくるんじゃないか。

アンド、割り算主義っていうのは標本平均万能主義とも言える。

分布の形を見ずに、常に平均値を代表値として採用することはおすすめできない。

中央値は平均値と類似した目的で使うが、用途によっては中央値のほうが平均値よりも優れている。これはたとえば年収の場合を考えてみるとわかりやすい。
貧富の差が激しい国では、一部の富裕層が平均年収をつり上げてしまっている為、平均年収は「普通の人」の年収よりもずっと高い値になってしまう。この為平均年収は「普通の人」の生活水準を推し測るには向かない。
一方中央値は、年収が低い順に国民を並べたときに丁度真ん中になる人の年収を表している為、一部の富裕層の年収は中央値に影響せず、中央値は「普通の人」の生活水準により近くなる。
実際例えばフォーブスの世界長者番付にランクインするような億万長者が1万人の市に引っ越してくれば平均年収はつり上がってしまうが、年収の中央値はほとんど変わらない。ビル・ゲイツ等の大金持ちが引っ越しただけで、「普通の人」の生活水準が変化するとはいえず、中央値のほうがより直感に近い事が納得されるであろう。

中央値 - Wikipedia

訪問時の閲覧ページ数を見る

さて、Lean Analytics: KPIにしてはいけない8つの指標 - Hive Color では、KPI にすべきない指標の代表例として PV 数(ページビュー数)が挙げられている。

なのでこいつを割り算した指標、「ページ/セッション」を見てやろう。
ページ/セッションというのは、ページビュー数をセッション数で割ったものなので、一回の訪問あたりに閲覧されたページ数と解釈できる。

このブログを書いてるぼくとしては、いろんな記事を読んでくれたほうが嬉しいので、ページ/セッションは高いほうがいい。

f:id:abrahamcow:20140817175950p:plain

Google アナリティクスの「ページ/セッション」を見ると、2013年7月は高い値、その後低下傾向が続き2014年1月には上昇したけどその後また低下傾向だ。

これはあんまり嬉しくない結果だ。

一方、もうちょっとページビューの分布の形を見る方法を考える。

そこで Page Depth(一回の訪問あたりに閲覧されたページ数) の色付きテーブル(ヒートマップ)を R で作ってみる。
Analytics Help

#データ取得
library(RGoogleAnalytics)
query <- QueryBuilder()
access_token <- query$authorize()

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

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

#ga:pageDepth # 滞在中のページビュー
query$Init(start.date = "2013-07-01",
           end.date = "2014-07-31",
           dimensions = "ga:yearMonth,ga:pageDepth",  
           metrics = "ga:visits", # metrics を visits に。
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

pd <- ga$GetReportData(query)


#データ整形
t1 <- paste(
  substr(pd$yearMonth,1,4),
  substr(pd$yearMonth,5,6),
  "01",
  sep="/")
t1 <- as.Date(t1)
pd$month <- t1

pd[,2] <-as.numeric(pd[,2])

library(dplyr)
#dplyr の filer 関数、標準の subset よりもはやいらしいので使ってみた。
pd4 <- filter(pd,pageDepth>4) #ここ>4ではなく>=4にすべきですね。
#申し訳ありません。まちがえました。
pd4visits <- tapply(pd4$visits, pd4$month,sum)
pd4df <- data.frame(month=as.Date(names(pd4visits)),visits=pd4visits, pageDepth="4~")


rownames(pd4df) <- NULL

tmp <- filter(pd,pageDepth<4)

newpd <- rbind(tmp[,-1],pd4df)

newpd$pageDepth <- as.character(newpd$pageDepth)

#
library(ggplot2)
library(scales)

#描画
theme_set(theme_bw())

p2 <-ggplot(newpd, aes(month, pageDepth))
p2 +  geom_tile(aes(fill = visits)) + 
  geom_text(aes(fill = newpd$visits, label = newpd$visits)) +
  scale_fill_gradient(low = "white", high = "#f39800") +
  scale_x_date(labels = date_format("20%y/%m"))

f:id:abrahamcow:20140817181417p:plain
縦軸の 4~ は 4以上という意味。

アクセスが多いほど色が濃くなる。

(余談だが、2014年4月の Page Depth = 0 に visits = 1 が入っている。閲覧ページ数ゼロでアクセスするのは高橋名人でも不可能なので、これは明らかに異常値である。
わざと取り除かずに残しといた。なんでこうなるのか、わかる方いらっしゃいましたら教えていただけると幸い。)

さて、7月のページ/セッションは高めだったけど、ヒートマップの色は真っ白。分母が小さかったので大きい値になってるだけだ。

右上のほうはだんだん色がついてきてる。2ページ以上閲覧されるアクセスはだんだん増えてきてる。

これはちょっと嬉しい結果だ。

ヒートマップ(色付きテーブル)について

最初は折れ線グラフで傾向を見ようと思ったんだけど、色付きテーブルのほうがわかりやすいみたいだった。

p1 <- ggplot(data=newpd, aes(x=month,y=visits))
p1 + geom_line(colour="#0068b7") +
  facet_wrap(~pageDepth, ncol=length(unique(newpd$pageDepth)))+
  theme(legend.position="none")+
  scale_x_date(labels = date_format("20%y/%m"))

f:id:abrahamcow:20140817182941p:plain

ヒートマップは 3 次元のデータを可視化するのに便利だ。

等高線みたいなグラフを作ってみてもおもしろいかもしれないが、つかれたので今回はやらない。

ぼくは R でやったけど、Excel はヒートマップをかんたんに作れる。

f:id:abrahamcow:20140817183714p:plain

Excel あんまり好きじゃないけど、Excel の条件付き書式とスパークラインはわりと好き。なんかかわいいから。

VBA とか書けるひとなら API でデータを引っ張ってくるところから Excel でできるんだろうけど、ぼくは書けないので、R でクロス集計して csv に書き出した。

unq1 <- sort(unique(newpd$pageDepth))
unq2 <- sort(unique(newpd$month))

tab1 <-matrix(NA,nrow=length(unq1),ncol=length(unq2))

rownames(tab1) <- unq1
colnames(tab1) <- unq2

for(j in 1:length(unq2)){
  for(i in 1:length(unq1)){
    tmp =with(newpd,  visits[month == unq2[j] & pageDepth == unq1[i]])
    tab1[i,j] = ifelse(length(tmp) == 0, NA, tmp) 
  }
}

colnames(tab1) <- as.character(unq2)

write.csv(tab1, file="ga_heatmap.csv")

ヒートマップを書く時の注意点なんだけど、デフォルトの赤から緑のカラースケールは基本的に使わないほうがいい。

f:id:abrahamcow:20140817183946p:plain
赤から緑のカラースケール、いちばんクリックしやすい位置に置いてある。

f:id:abrahamcow:20140817184029p:plain

人口の何パーセントくらいかは忘れたけど、赤緑色弱の人はわりと多いので、せっかく作ったグラフが伝わらなくなる可能性が高い。

その点を守ってエクセル使いましょう。

ぼくはマックとアイフォンとグーグルクロームとグーグルアナリティクス使ってるけど、やっぱグーグルとアップルばっかりの世の中になったら良くないのでヤフーとかマイクロソフトがんばれ。

KPI 割り算主義の止揚

KPI 割り算主義がなぜ生まれたかというと、Web マーケティングの多くがダイレクトマーケティングだからだ(憶測だけど)。

ダイレクト・マーケティングとは - コトバンク

例えば、宇佐美進典のこんな発言。
(この文章の趣旨に異論はない)

メディア運営において、短期的には「Webマーケティング施策」はもちろん必要だけれど、中長期でみると「ブランド化」が必要なフェーズになってきているんだと思う。あと、リスティング広告を多用したアービトラージ型のメディアは今後はどんどん厳しくなっていくと思うな。

宇佐美 進典 - メディア運営において、短期的には「Webマーケティング施策」はもちろん必要だけれど、中長期でみると「... | Facebook

ダイレクトマーケは、1 円あたりでどんだけの成果を出せるかが勝負。
特にリスティング広告検索連動型広告)なんかでは、それは典型的。

そこでは広告 1 クリック辺りでどれだけ商品を買ってもらえたか、っていう割り算が大事になる。

一方、ブランド化っていうのは、特定の商品を売るためじゃなくイメージをつくるための施策で、すぐには成果をはっきり示せない。

1 円あたりいくらの成果、という割り算でしのぎをけずってるダイレクトマーケティングとは違う。

つまり、ブランディングのためのマーケティング予算とダイレクトマーケティングのためのマーケティング予算があったら、ブランディングのためのマーケティング予算のほうがじゃぶじゃぶ使えるわけだ。

そこで、これまでダイレクトマーケティングをやってきた Web 担当者が、ブランディングに手をのばすための武器が割り算指標なのだ。

ページ/セッションとかそういった指標は、エンゲージメント指標とか呼ばれたりする。

ユーザーがこのサイトをどれだけ好んでくれているかを指標で測り、好んでくれるユーザーを増やすという目的をたてる。これはブランディングだ。

割り算指標でしのぎをけずってきた人たちが、割り算指標を武器にダイレクトマーケティングからブランディングのためのマーケティングに飛躍しようとしている。

最初に KPI は KGI に対する説明変数だと述べた。

ブランディングを KGI で表すのは難しいけど、例えば顧客生涯価値をあげるのがブランディングの目的の一つだと言える。

顧客生涯価値を推定する説明変数としては、なにが適切だろうか。本当に割り算指標でいいのか。

そういった考え方ができたほうが、ダイレクトマーケからブランディングのためのマーケティングに移行しやすくなると思う。

ついでに、ブランディングっていうのはもちろん顧客生涯価値だけでは測れない。

例えば、かっこいいイメージの会社とかっこ悪いイメージの会社だったら、かっこいい会社のほうが優秀な人材が集まる。