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

廿TT

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

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

R Google アナリティクス

目的

Webアクセス解析データの可視化を以下の二つに大別するとすると、

  1. 定点観測型:重要な指標の傾向を整理して把握する
  2. 課題発見型:データをある側面から眺めて新たな仮説を立てる

今回やろうとしているのは前者です。

KPI設計や定期レポーティングの参考にしていただければ幸甚。

エンゲージメント指標

ユーザーがサイトに定着しているか、ユーザーがサイト内でどのように行動しているかを測る指標は、Webアクセス解析の分野で「エンゲージメント指標」と総称されます。

主なエンゲージメント指標には、

  • 直帰率
  • 平均ページビュー(ページ/セッション)
  • 新規率(新規セッション率)
  • 平均滞在時間(平均セッション時間)

があります。

f:id:abrahamcow:20141231121551p:plain
Google アナリティクス『ユーザー サマリー』レポート)

これらはすべて何かを何かで割った値、比率や割合の形をとります。

比率や割合の弱点

比率や割合の欠点に「値の変化について解釈が一意でない」という点があります。

例えば、新規率( = 新規セッション数 / セッション数)が上昇した場合、新規セッションが増えたおかげで新規率が上がったのか、再訪セッションが減ったせいで新規率が上がったのかわかりません。

平均ページビュー( = ページビュー数 / セッション数)や、平均滞在時間( = 合計セッション時間 / セッション数)が増加した場合、サイトを閲覧しまくるヘビーユーザー層が増えたのか、軽くながめるライトユーザー層が減ったのか判断できません。

(割合や比率が常にダメだなんて言ってないからね。目的に合わせて使おうという主張です。)

分布を要約するという発想

ヒストグラム

滞在時間(セッション継続時間)の分布を見てみます。

あらゆるデータはある数字の付近に散らばったり集中したり、いろいろと分布しています。

分布を見るためにはヒストグラムが適しています。

問題解決手法>QC七つ道具>ヒストグラム

f:id:abrahamcow:20141230122742p:plain

この図は2014年11月にこのブログを訪れたセッションの継続時間のヒストグラムです。

平均滞在時間はこれを要約したものです。

箱ひげ図

データの特徴を代表的に(要約して)数字で表したものを要約統計量といいます。

平均値は要約統計量のなかでも特に大事なものですが、これだけにこだわる必要はありません。

最小値、最大値や四分位数も要約統計量です。

さきほどの滞在時間のデータを要約(summary)してみます。

最小値 第一四分位数 中央値 平均値 第三四分位数 最大値
0.00 0.00 0.00 66.07 0.00 3456.00


用語:

  • 第一四分位数:データを小さい順に並べて25%番目に来る値。データが100個だったら25番目の数字。
  • 中央値(メジアン):データを小さい順に並べて真ん中に来る値。
  • 第三四分位数:データを小さい順に並べて75%番目に来る値。データが100個だったら75番目の数字。

です。

これらの数字も見てやると、データがどのように散らばったり集中したりしているのかわかります。

そして箱ひげ図(ボックスプロット;boxplot)を使うとこれらの要約統計量をぱっと見で把握できます。

  • 四分位数・箱ひげ図
    • (このページ「わかりにくい」「わけわからん」みたいなコメントがいっぱいつけられてるけど、え? だめ? ぼくは親切な説明だと思ったな…。手を動かして自分でも計算してみてください。そうしたらたぶん理解しやすくなります。)

通例、箱の上下から延びる「ひげ」の長さは、箱の長さの1.5倍に設定されています。

「(第三四分位数 - 第一四分位数)×1.5 」を超えた値は外れ値(outlier)として、点で表します。

2013年7月から2014年11月までの当ブログのセッション継続時間を月次で箱ひげ図にしてみました。

f:id:abrahamcow:20141230132152p:plain

平均滞在時間の推移もオレンジの折れ線で重ねて描画してあります。

箱は下に固まって潰れています。つまり最小値から第三四分位数まで、ほとんどのセッションが継続時間 0(直帰)ということです。

そして点の部分に注目すると、2013年7月から2014年1月からまで、長時間のセッションが増えてきていることがわかります。以降、その傾向を維持したまま推移しています。

長時間のセッションが増えてきているというの嬉しい結果です。

一方、平均滞在時間の推移、オレンジの折れ線グラフだけを取り出して描いてやるとこうなります。

f:id:abrahamcow:20141230132135p:plain

平均滞在時間は激しく変動しているように見えますが、すでに箱ひげ図を見てみたみなさんは、これに一喜一憂することはないでしょう。

外れ値に引っ張られて平均滞在時間が変動しているだけです。

ちなみに、現在主流になっているこの形の箱ひげ図を考案したのはテューキーです。

テューキーはまた、仮説検定(確証的データ解析)ばかりが重視されている風潮に反対し、探索的データ解析 (EDA) も重要だと提唱した。

ジョン・テューキー - Wikipedia

テューキーは天才的な数学者として、理論面でも数多くの業績を残していますが、このような応用面への貢献も多く、昨今話題の「データマイニング」の開祖の一人と言えます。

統計学を拓いた異才たち(日経ビジネス人文庫)

統計学を拓いた異才たち(日経ビジネス人文庫)

色付きテーブル(ヒートマップ)

訪問時のページ数
  • 平均ページビュー = ページビュー数 / セッション数
  • 直帰率 = 1ページしか閲覧しなかったセッション数 / セッション数

はともに、訪問時のページ数の分布を要約したものと捉えられます。

この分布の要約には色付きテーブルをおすすめします。

f:id:abrahamcow:20141230133916p:plain

縦軸の「5~」は「5以上」ということです。
(この "5" という数字には特に根拠はありません。みんな5段階評価に慣れてるかな、くらいの理由です。また、0 ページ閲覧のセッションという異常値も 1 件ありますが、おそらく Google アナリティクスの仕様によるものと思われます。)

例えば10月は1ページしか閲覧していないセッションが増えていますが、複数ページを閲覧したセッションも増えています。

ぼくとしてはサイトを閲覧しまくるセッションが増えたのも、軽くながめるセッションが増えたのも、ともに喜ばしいことです。

直帰率や、ページ/セッションでは、このような傾向は読み取れません。

f:id:abrahamcow:20141230135113p:plain

f:id:abrahamcow:20141230135122p:plain

リピートの回数

新規率はリピートの回数の分布を要約したものと捉えられます。

新規訪問の獲得と再訪問(ユーザーの定着)はともに興味のあることですから、これもやはり色付きテーブルをおすすめします。

f:id:abrahamcow:20141230135940p:plain

2014年10月は再訪セッション(リピートの回数 > 1)の水準を維持したまま、新規セッション(リピートの回数 = 1)が増えています。

10月の記事はよかったみたいですね。

2014-10-01から1ヶ月間の記事一覧 - 廿TT

このような傾向は、新規率だけを眺めていると読み取りにくいかと思います。

f:id:abrahamcow:20141230135335p:plain

R による実践

データ取得

統計ソフト R ではこのような図示をかんたんに行えます。
(っていうかおれがコード書いたんでそれを使いまわしてください。)

R から APIGoogle アナリティクスのデータを取得する方法は、
RGoogleAnalytics をいじっている - 廿TT
を参照してください。


library("RGoogleAnalytics")
query <- QueryBuilder()
access_token <- query$authorize()

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

#データ取得
ga <- RGoogleAnalytics()
ga.profiles <- ga$GetProfileData(access_token)

sta = "2013-07-01" #データ取得期間
en = "2014-11-30"

#sessionDuration:セッション継続時間
query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:yearMonth,ga:sessionDurationBucket",  
           metrics = "ga:sessions", 
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           max.result = 10000,
           access_token=access_token)

sdb <- ga$GetReportData(query)

#pageDepth:訪問時のページ数
query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:yearMonth,ga:pageDepth",  
           metrics = "ga:sessions", 
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           max.result = 10000,
           access_token=access_token)

pd <- ga$GetReportData(query)

#visitCount:リピートの回数
query$Init(start.date = sta,
           end.date = en,
           dimensions = "ga:yearMonth,ga:visitCount",
           metrics = "ga:sessions",
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           max.result = 10000,
           access_token=access_token)

vc<- ga$GetReportData(query)

ヒストグラム

sdb[,2] <- as.numeric(sdb[,2]) #ディメンションは文字列で入ってる。
sdb_201411 <- rep(sdb[sdb[,1]=="201411",2],sdb[sdb[,1]=="201411",3])
#nihongo() #macユーザーは日本語のフォントを指定
hist(sdb_201411,main="",xlab="セッション継続時間(秒)",ylab="頻度(セッション数)")
summary(sdb_201411)

箱ひげ図(折れ線グラフ付き)

sdb[,1] <-paste(substr(sdb[,1],1,4),substr(sdb[,1],5,6),sep="/")
sdb2 <- data.frame(yearMonth =rep(sdb[,1],sdb[,3]),
                   sessionDurationBucket =rep(sdb[,2],sdb[,3]))

mean_sdb <- tapply(sdb2$sessionDurationBucket,sdb2$yearMonth,mean)
#以上がデータの再整形
boxplot(sessionDurationBucket ~ yearMonth,data=sdb2, xlab="年/月",ylab="セッション継続時間(秒)")
points(mean_sdb, type="o", pch=4, col="orange2",lwd=2,cex=1.5) #折れ線グラフを重ねる
grid() #グリッド=格子状の目盛線を引く
#
plot(mean_sdb2[,2], type="o", pch=4, col="orange2",lwd=2,cex=1.5,xaxt="n",
     xlab="",ylab="平均滞在時間(秒)") #折れ線グラフのみ

色付きテーブル

#データの下処理はpageDepthでもvisitCountでも同じなので
#関数化してます。
aggre <- function(pd, ormore = 4){
#  ormore = 4
  subfunc<- function(x){
    t1 <- paste(substr(x,1,4),substr(x,5,6),"01",sep="/")
    as.Date(t1)
  }
  pd$month <- subfunc(pd$yearMonth)
  pd[,2] <-as.numeric(pd[,2])
  name2 <-colnames(pd)[2]
  pd4 <- pd[pd[,2]>=ormore,]
  pd4visits <- tapply(pd4$sessions, pd4$month,sum)
  pd4df <- data.frame(month=as.Date(names(pd4visits)),sessions=pd4visits,
                      paste(ormore,"~",sep=""))
  rownames(pd4df) <- NULL
  tmp <- pd[pd[,2]< ormore,]
  colnames(pd4df) <- c(colnames(pd4df)[1:2],name2)
  newpd <- rbind(tmp[,-1],pd4df)
#  head(newpd)
  newpd[,1] <- as.character(newpd[,1])
  newpd
}

newpd <- aggre(pd,ormore=5) #引数ormoreで5以上を合算することを指定(デフォルトは4)
newvc <- aggre(vc,ormore=5) #5という数字に特に根拠はないので、必要に応じて変えてください

head(newpd)
head(newvc)
#
library(ggplot2)
library(scales)

#描画
theme_set(theme_bw(15,"HiraKakuPro-W3"))

p1 <-ggplot(newvc, aes(month, visitCount))
p1 +  geom_tile(aes(fill = sessions)) + 
  geom_text(aes(fill = newvc$sessions, label = newvc$sessions)) +
  scale_fill_gradient(low = "white", high = "#f39800") +
  scale_x_date(labels = date_format("20%y/%m")) +
  labs(x="年/月", y="リピートの回数")

p2 <-ggplot(newpd, aes(month, pageDepth))
p2 +  geom_tile(aes(fill = sessions)) + 
  geom_text(aes(fill = newpd$sessions, label = newpd$sessions)) +
  scale_fill_gradient(low = "white", high = "#f39800") +
  scale_x_date(labels = date_format("20%y/%m"))+
  labs(x="年/月", y="訪問時のページ数")

参考文献(本文中に言及のないもの)

統計データの視覚化 (Rで学ぶデータサイエンス 12)

統計データの視覚化 (Rで学ぶデータサイエンス 12)

関連エントリ


Google アナリティクスデータKPI設計のための可視化。散布図行列で定点観測するエンゲージメント指標を絞り込む。 - 廿TT


直帰率と新規率の相関を調べて新規訪問者が回遊しやすいサイトになっているかチェックする - 廿TT