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

廿TT

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

時系列で見て安定している KPI の探し方

R Google アナリティクス グラフ

要約

見よう見まねでぼくのブログの KPI を策定してみた。

  • 折れ線グラフでスパイクをチェック
  • 変動係数で散らばりをチェック
  • 箱ひげ図で曜日効果をチェック

良き KPI とは

KPI は時系列で見て安定していることが求められる。

tokoroten 氏は KPI を乱高下させる要因を「スパイクノイズ」と「ホワイトノイズ」に分類した(DAUを評価指標から捨てた会社の話 )。

ここでは言葉の厳密な定義はあまり重要じゃなくて、「ホワイトノイズ」は普段からある増減、「スパイクノイズ」は急激な増減くらいに捉えておいたほうが便利。

あんちべ『データ解析の実務プロセス入門』は時系列で見て安定する指標の例として、以下の様な事例を紹介している。

  • ドリコム社:5日連続でプレイしている利用者数
  • コロプラ社:インストール後一週間以上経過した利用者数

これをそのまままねするのは難しい。

  • そのようなデータをとるのが難しい
  • ぼくのブログはゲームアプリではない(ので毎日アクセスするようなものではない)
  • そのように利用者数を絞ると数が少なすぎるため、安定してくれない

別の方法を考えよう。

スパイクノイズの除去

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("")

f:id:abrahamcow:20160804090427p:plain

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.019               0.022               0.033               0.057               0.258               1.078 

sessionsPerUser、bounceRate あたりの変動が小さそうだ。

曜日効果

このブログでも曜日の影響はある。

土日はアクセスがすくない。

f:id:abrahamcow:20160804090535p:plain

土日と平日で比較して差がでない指標を選ぼう。

この手の比較には箱ひげ図がいいと思う。

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)

f:id:abrahamcow:20160804090624p:plain

sessionsPerUser は平日と土日で分布に変化がなさそう。

結論

sessionsPerUser が良さそう。

  • 折れ線グラフで見てスパイクノイズがない
  • 変動係数、箱ひげ図でみてホワイトノイズが小さい

KPI を決めたら Google アナリティクスのマイレポートに登録しておこう。

f:id:abrahamcow:20160804091023p:plain

ただしこれは当ブログでの傾向であって、他のサイトにも当てはまるかはわからない。

今後の課題

KPI には以下のようなことが求められる。

  • わかりやすいこと
  • 操作可能な変数であること
  • KGI と結びついていること
  • 変動の説明が一意的であること
  • 時系列で見て安定していること

(あんちべ『データ解析の実務プロセス入門』より)

今回はこのうち「時系列で見て安定していること」をチェックしたにすぎない。

sessionsPerUser はユーザーの一人あたりの訪問回数と解釈できるが、セッションとは、ユーザーとはなにかを厳密に考えるとけっこう難しい。

また割り算値なので、分母のユーザー数が変化したのか、分子のセッション数が変化したのか、変動の説明が一意的でない。

他の指標と同時にみる、わかりやすい説明を考えるなどの工夫が必要。

参考文献

www.slideshare.net

データ解析の実務プロセス入門

データ解析の実務プロセス入門