要約
見よう見まねでぼくのブログの KPI を策定してみた。
- 折れ線グラフでスパイクをチェック
- 変動係数で散らばりをチェック
- 箱ひげ図で曜日効果をチェック
良き KPI とは
KPI は時系列で見て安定していることが求められる。
tokoroten 氏は KPI を乱高下させる要因を「スパイクノイズ」と「ホワイトノイズ」に分類した(DAUを評価指標から捨てた会社の話 )。
ここでは言葉の厳密な定義はあまり重要じゃなくて、「ホワイトノイズ」は普段からある増減、「スパイクノイズ」は急激な増減くらいに捉えておいたほうが便利。
あんちべ『データ解析の実務プロセス入門』は時系列で見て安定する指標の例として、以下の様な事例を紹介している。
これをそのまままねするのは難しい。
- そのようなデータをとるのが難しい
- ぼくのブログはゲームアプリではない(ので毎日アクセスするようなものではない)
- そのように利用者数を絞ると数が少なすぎるため、安定してくれない
別の方法を考えよう。
スパイクノイズの除去
Web 解析の分野でエンゲージメントとかロイヤリティと総称される指標の代表例として、以下のようなものがある。
このなかで時系列でみて安定している指標を探してみよう。
- avgSessionDuration(平均滞在時間)
- percentNewSessions(新規率)
- sessionsPerUser(セッション/ユーザー)
- pageviewsPerSession(ページビュー/セッション)
- bounceRate(直帰率)
上記の指標をまとめて取ってくる Googleアナリティクスから持ってくるクエリは以下のようになる。
#後で使うパッケージをまとめてロードしておくlibrary(RGA)library(tidyr)library(dplyr)library(cowplot)library(scales)library(gridExtra) authorize() prof <-list_profiles() dat1 <-get_ga(profileId = prof$id[1], start.date ="2016-01-01", end.date ="2016-07-31", dimensions ="ga:date", metrics ="ga:sessions,ga:avgSessionDuration,ga:percentNewSessions, ga:sessionsPerUser,ga:pageviewsPerSession,ga:bounceRate")
バズった(または炎上したともいう)ときに引っ張られて激しく動く指標だと参考にしにくい。
常日頃の運用が反映されて、もう少し長期のスケールで動いてくれると望ましい。
これは折れ線グラフで確認できそうだ。
まとめてプロットする。
point1 <-as.integer(as.Date(dat1$date[which.max(dat1$sessions)]))#point1 はバズった日を抜き出している dat_g <-gather(dat1,key,value,-date) ggplot(dat_g,aes(x=as.Date(date),y=value,colour=key))+ geom_line(size=1)+ geom_vline(aes(xintercept=point1),linetype=2)+ facet_wrap(~key,scales ="free_y")+ theme(legend.position="none")+ scale_x_date(date_labels ="20%y/%m/%d")+ xlab("")+ylab("")
percentNewSessions はバズに引っ張られていることがわかる。
ホワイトノイズの除去
tokoroten 氏が代表的なホワイトノイズとして上げているのがユーザーの気まぐれ、曜日効果、サーバメンテナンスなどである。
サーバメンテナンスは諦める
これの影響を除去するのは難しい。
ユーザーの気まぐれ
ユーザーの気まぐれで日々大きく変わる指標は望ましくない。といっても、なにを基準にして「大きく変わる」と判断すればいいのか迷った。
変動係数でみるのはどうだろう。
変動係数とは標準偏差を標本平均で割ったもので、スケールの異なる指標同士を比較することができる。
R では以下のように計算できる。
vc <- apply(dat1[-1],2,sd)/apply(dat1[-1],2,mean) round(sort(vc),3)
アウトプットはこんな感じ。
sessionsPerUser bounceRate percentNewSessions pageviewsPerSession avgSessionDuration sessions 0.0190.0220.0330.0570.2581.078
sessionsPerUser、bounceRate あたりの変動が小さそうだ。
曜日効果
このブログでも曜日の影響はある。
土日はアクセスがすくない。
土日と平日で比較して差がでない指標を選ぼう。
この手の比較には箱ひげ図がいいと思う。
flag <-ifelse(weekdays(dat1$date)=="土曜日"|weekdays(dat1$date)=="日曜日","土日","平日") theme_set(theme_cowplot(font_family ="HiraKakuProN-W3")) p1 <-ggplot(dat1)+ geom_boxplot(aes(x=flag,y=avgSessionDuration)) p2 <-ggplot(dat1)+ geom_boxplot(aes(x=flag,y=percentNewSessions)) p3 <-ggplot(dat1)+ geom_boxplot(aes(x=flag,y=sessionsPerUser)) p4 <-ggplot(dat1)+ geom_boxplot(aes(x=flag,y=bounceRate)) p5 <-ggplot(dat1)+ geom_boxplot(aes(x=flag,y=pageviewsPerSession)) grid.arrange(p1, p2, p3, p4,p5,nrow=2)
sessionsPerUser は平日と土日で分布に変化がなさそう。
結論
sessionsPerUser が良さそう。
- 折れ線グラフで見てスパイクノイズがない
- 変動係数、箱ひげ図でみてホワイトノイズが小さい
KPI を決めたら Googleアナリティクスのマイレポートに登録しておこう。
ただしこれは当ブログでの傾向であって、他のサイトにも当てはまるかはわからない。
今後の課題
KPI には以下のようなことが求められる。
- わかりやすいこと
- 操作可能な変数であること
- KGI と結びついていること
- 変動の説明が一意的であること
- 時系列で見て安定していること
(あんちべ『データ解析の実務プロセス入門』より)
今回はこのうち「時系列で見て安定していること」をチェックしたにすぎない。
sessionsPerUser はユーザーの一人あたりの訪問回数と解釈できるが、セッションとは、ユーザーとはなにかを厳密に考えるとけっこう難しい。
また割り算値なので、分母のユーザー数が変化したのか、分子のセッション数が変化したのか、変動の説明が一意的でない。
他の指標と同時にみる、わかりやすい説明を考えるなどの工夫が必要。