廿TT

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

Google アナリティクスの「リピートの回数や間隔」からユーザーの分布をヒートマップに

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

ヒートマップ, 見た目はきれいだけどグラフとしての表現力は弱いと思っていた.
数値を位置や長さで表す折れ線グラフや棒グラフにくらべると, 数値を色の濃淡で表すヒートマップは, ぼんやりした感じだ.

でも, ヒートマップは縦軸横軸をともに比例尺度(尺度の説明)にとることができる.

森藤&あんちべ『エンジニアのためのデータ可視化[実践]入門 ―D3.jsによるWebの可視化』で指摘されてはじめて気がついた.

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)


クロス集計されたデータに対して用いれば, いわばヒストグラムの2次元版的に分布を把握できる.

「リピートの回数や間隔」指標

f:id:abrahamcow:20140817035135p:plain
このカテゴリのレポートについて - アナリティクス ヘルプ

ディメンション "ga:daysSinceLastVisit" では観測期間内に訪れたユーザーの直前訪問日からの経過日数, "ga:visitCount" では訪問(セッション)の回数が把握できる.

これらは, マーケティングの分野で行われる RFM 指標と呼ばれるものに近いと思う.
ただし "daysSinceLastVisit" は直近のアクセスからの経過時間ではなく, 「観測期間中にアクセスがあったユーザーの、前回のアクセスが何日前だったか」である点に注意する.
RGoogleAnalytics で RFM 指標のヒストグラム - 廿TT

パッケージ RGoogleAnalytics で R にデータを読み込む.
RGoogleAnalytics をいじっている - 廿TT

#library#
library(RGoogleAnalytics)

query <- QueryBuilder()
access_token <- query$authorize()

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

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

query$Init(start.date = "2014-05-01",
           end.date = "2014-07-31",
           dimensions = "ga:daysSinceLastVisit,ga:visitCount",  
           metrics = "ga:visitors,ga:visits",
           table.id = paste("ga:",ga.profiles$id[1],sep="",collapse=","),
           access_token=access_token)

garf <- ga$GetReportData(query)

#ディメンションは文字列型で入ってるので数値型に直す
garf[,1] <- as.numeric(garf[,1])
garf[,2] <- as.numeric(garf[,2])

ヒートマップを描く

取得したデータはこういう形式になってる.

> head(garf)
  daysSinceLastVisit visitCount visitors visits
1                  0          1     9865   9871
2                  0         10       11     11
3                  0         11        9      9
4                  0         12        9      9
5                  0         13        8      8
6                  0         14        3      3

一旦クロス集計表の形に直してみる.

unq1 <- sort(unique(garf[,1]))
unq2 <- sort(unique(garf[,2]))[-1]

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

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


for(j in 1:length(unq2)){
for(i in 1:length(unq1)){
  tmp =with(garf,  visitors[daysSinceLastVisit == unq1[i] & visitCount==unq2[j]])
  res1[i,j] = ifelse(length(tmp) == 0, NA, tmp) 
}
}
> res1[1:6,1:6]
    2   3  4  5  6  7
0 457 119 47 32 25 22
1  58  12 12  7  5  5
2  33  11  5  4  4  2
3  20   8  3  3  2  2
4  17   3  3  1  1  1
5  16   8  1  2  2  1

ヒートマップを描く.

library(ggplot2)
library(reshape2)
library(ggthemes)

res2=melt(res1,id.var="1", value.name = "visitors")

theme_set(theme_bw())

ggplot(res2,aes(as.factor(Var1),as.factor(Var2)))+geom_tile(aes(fill=visitors)) + 
  scale_fill_gradient(low="white",high="#f39800") +
  labs(x = "days since last visit",y = "visit count")

f:id:abrahamcow:20140817063019p:plain

NA は灰色で表示される. NA は 0 人と解釈して問題ない.

見ての通り非常にスパースな(スカスカな)行列になっている.

色付きテーブルを描く

ロングテールな感じで, ぱっと見で把握しづらいので, 集計して要約することを考える.
対数とったりしてもいいかもしれないが, ここでは10より大きいところはすぱっと切っちゃうことにする.

seqr2 <- 0:11
seqf2 <- 2:11

tab2_1 <-matrix(NA,nrow=11,ncol=9)

for(j in 1:9){
  for(i in 1:11){
    tmp = sum(
      with(garf, visitors[daysSinceLastVisit >= seqr2[i] &
                            daysSinceLastVisit < seqr2[i+1] &
                            visitCount >= seqf2[j] &
                            visitCount < seqf2[j+1]])
    )
    tab2_1[i,j] = ifelse(length(tmp) == 0, NA, tmp) 
  }
}

rownames(tab2_1) <- 0:10
colnames(tab2_1) <- 2:10

tab2_2 <- melt(tab2_1, id.var = seqf[2], value.name = "visitors")

ggplot(tab2_2, aes(as.factor(Var1), as.factor(Var2), group=Var2)) +
  geom_tile(aes(fill = visitors)) + 
  geom_text(aes(fill = tab2_2$visitors, label = tab2_2$visitors)) +
  scale_fill_gradient(low = "white", high = "#f39800") +
  labs(x = "days since last visit",y = "visit count")

こんな風だ.

f:id:abrahamcow:20140817063725p:plain

days since last visit = 0, visit count = 2 のところに集中している.
Google アナリティクスでは30分放置してるとセッションが切れるので, この中には一回アクセスしてタブひらきっぱなしにしてた人とかが多く含まれると思う.

ユーザーが定着しているか(リピーターがいっぱいいるか)を見るには, この辺の色が濃くなってるかを見るといいと思う。

f:id:abrahamcow:20140817064925p:plain


ヒートマップの書き方はこのページに教わった。
ヒートマップで行列を可視化する! -ggplot2を用いたmicroarray発現量の可視化をしよう!- - Data Science by R and Python

関連エントリ


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