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

廿TT

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

Google アナリティクスデータの変化を検知するための CUSUM 管理図

問題

例えばソーシャルメディアで炎上してたりしたらサイトの訪問(セッション)数は伸びるだろう。

セッション数を定点観測していればなんらかの異常があったときにすぐに対処できる……はずだ。

Googleアナリティクスオタクの私が、毎日見ているたった1つのレポートの、本当の見方を教えよう[第60回] | Googleアナリティクスとは/衣袋教授のGoogleアナリティクス入門講座 | Web担当者Forum では、サイトの定点観測として「毎日見るのは[ユーザー]>[サマリー]レポートだけ」「いつもと同様の折れ線グラフになっていれば、そこで終わり。それ以上の深入りはしない。」という手法が紹介されている。

ここで述べられていることはただしいと思う。けど、このやり方で気づきにくい小さい「異常」も中にはある。

下図は Google アナリティクス[ユーザー]>[サマリー]レポートのセッション数です。

f:id:abrahamcow:20160226064702p:plain

なんらかの変化や異常に気づきますか?

このグラフを見て「お、異常だ」と思う人はかなり勘がいいと思う。

ぼくはなにも異常だと思わなかった。

でも実はこの期間は free-share-buttons.com というスパムからのセッションが伸びていたのです。

f:id:abrahamcow:20160226064609p:plain

下図は free-share-buttons.com 経由のセッション数。

f:id:abrahamcow:20160226064617p:plain

こういうのはフィルタ設定したりして除外しておきたい。

free-share-buttons.comリファラスパムをフィルターで排除する方法! | AnalyzeFindOut~アクセス解析を調べる

わずかな変化を見逃さない CUSUM 管理図の紹介

さて、こういう小さい変化にはどうやって気づけばいいだろう。

CUSUM(累積和)管理図が便利です。

CUSUM 管理図とは、

\xi_k=\sum_{i=1}^{k}( x_i - \bar x)

をプロットしたもの。

ここで x_ii 日目のセッション数。\bar x は対象期間の平均セッション数。

RGA パッケージによる実践

R を使って実際に CUSUM 管理図を書いてみます。

# RGA パッケージでデータ取得
library(RGA)
library(dplyr)
library(tidyr)
library(ggplot2)
authorize()
prof <-list_profiles()
dat1 <-get_ga(profileId = prof$id[1],
              start.date = "2015-06-01",
              end.date = "2015-07-31",
              dimensions = "ga:date,ga:channelGrouping",
              metrics = "ga:sessions")

#channelGrouping もついでに出しておく

ss <- dat1 %>%
  group_by(date)%>%
  summarise(sessions=sum(sessions))%>%
  mutate(cusum = cumsum(sessions-mean(sessions))) #CUSUM

#以下プロット
p1 <-ggplot(ss)+
  geom_point(aes(x=date,y=cusum))+
  geom_line(aes(x=date,y=cusum))
p1

f:id:abrahamcow:20160226070629p:plain

細かいジグザグは7日単位の周期性なのでよいとして、全体に V 字型の傾向が見て取れたら要注意。

f:id:abrahamcow:20160226070822p:plain

セッション数に変化が生じています。

CUSUM 管理図はなにをやってるか。

\xi_k=\sum_{i=1}^{k}( x_i - \bar x) という式を読み解いてみよう。

 x_i - \bar x というのは平均からのぶれだ。

 \sum_{i=1}^{k} というのは「1 番目から k 番目までを足す」という意味。

平均からのぶれを累積していくことになるので、平均以下の期間が続いていれば下降傾向、平均以上の期間が続いていれば上昇傾向になる。

変化以降セッションが増加しているなら CUSUM 管理図は V 字型、変化以降セッションが減少しているなら ∧ 字型の折れ線グラフになる。

f:id:abrahamcow:20160226064628p:plain

変化点を出して変化の要因をさぐる。

どの時点で変化が生じたか知るには \xi_k の絶対値が最大になるところを見ればよい。

cp <- which.max(abs(ss$cusum))
p1+geom_vline(aes(xintercept =as.integer(date[cp])),linetype=2,colour="red")
> ss$date[cp]
[1] "2015-07-12 JST"

変化の要因をさぐるには変化点の前後でセッション数の内訳を見ればよい。

pre <- dat1%>%
  dplyr::filter(date<date[cp])%>% #変化点前
  group_by(channelGrouping)%>% #チャネルグループ毎の
  summarise(sessions=mean(sessions)) #平均セッション数

post <- dat1%>%
  dplyr::filter(date>=date[cp])%>% #変化点後
  group_by(channelGrouping)%>%
  summarise(sessions=mean(sessions))

channelcompare <-left_join(pre,post,by="channelGrouping")

channelcompare の中身はこうなった。

channel.grouping 変化前 変化後
(Other) 1.0 3.13
Direct 42.6 18.04
Organic Search 235.5 225.75
Referral 8.8 21.37
Social 4.0 4.74

増加が大きいのは Referral なので、あとは Google アナリティクスの管理画面から、[集客]>[すべてのトラフィック]>[参照サイト]を見れば冒頭に述べたように free-share-buttons.com からのアクセスが伸びていることに気づける。

アマゾンアフィリエイトのコーナー

『異常検知と変化検知』は、まだちゃんと読んでないけど、おそらくいい本だと思います。

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

ロングテールSEOのためのパレート図の紹介と RGoogleAnalytics による実践 - 廿TT でも述べたが、品質管理と Web 解析は似ている気がする。

品質管理のほうがデータ分析の歴史が長い分、学ぶところは多いのではないだろうか。

Web 解析のための管理図入門みたいな本があったらおもしろいと思うんだけど。

品質管理のための統計手法 (日経文庫)

品質管理のための統計手法 (日経文庫)

足し算を Σ で書く方法くらいは知っておいて損はない。

新課程 チャート式 基礎と演習数学B

新課程 チャート式 基礎と演習数学B