廿TT

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

ggplot2 でラザニアプロット(ある値以上の値を合算したヒートマップ)

geom_lasagna.R · GitHub を書きました。

ラザニアプロットというのは要は時系列データについてのヒートマップ(色付きテーブル)です(ラザニアプロット(fields パッケージの image.plot にちょっと一工夫) - 廿TT)。

さて、Web 解析の分野ではよく「エンゲージメント指標」として、「ページ/セッション」や「直帰率」、「新規セッション率」などを使います。

「エンゲージメント指標」のほとんどは割り算値です。

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

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

そこでもうちょっと分布の情報を保ったまま、数字を要約して時間的に比較する方法として、ヒートマップを使うことが考えられます。

Google アナリティクスのデータを使って R の ggplot2 でヒートマップを書いてみます。

library(ggplot2)
library(googleAnalyticsR)
library(dplyr)

ga_auth()
account_list <- ga_account_list()
ga_id <- account_list[3,'viewId']

gadata <-
  google_analytics_4(ga_id,
                     date_range = c("2017-05-29","2017-06-04"),
                     metrics = c("sessions"),
                     dim_filters = filter_clause_ga4(list(dim_filter("pageDepth","NUMERIC_GREATER_THAN","0"))),
                     dimensions = c("date","userType","pageDepth"),
                     max = 20000)

gadata=gadata %>% 
   mutate(pageDepth=as.numeric(pageDepth))

ggplot(gadata,aes(x=date,y=pageDepth,fill=sessions))+
  geom_tile()
> head(gadata)
        date    userType pageDepth sessions
1 2017-05-29 New Visitor         1      394
2 2017-05-29 New Visitor        12        1
3 2017-05-29 New Visitor         2       28
4 2017-05-29 New Visitor         3        8
5 2017-05-29 New Visitor         4        2
6 2017-05-29 New Visitor         5        2

f:id:abrahamcow:20170605014739p:plain

縦軸がページ深度、横軸が日付、色の濃さがセッション数です。

これでもいいといえばいいのかもしれませんが、上のほうがまばらになっているし、変化がわかりにくい。もう少し情報をまとめたいところです。

そこである値以上の値を合算して、ヒートマップにすることを考えます。

そのために geom_lasagna を書きました。

source("https://gist.githubusercontent.com/abikoushi/80ca3be0bb191be1bd03acf069e513b9/raw/654303cdc5c9a37a4c94a42e7bf75bdf2ee24529/geom_lasagna.R")

ggplot(gadata,aes(x=date,y=pageDepth,fill=sessions))+
  geom_lasagna(or_more = 3)

f:id:abrahamcow:20170605015412p:plain

3~ は 3以上という意味です。引数 or_more でいくつ以上の値を合算するか選びます。

geom_lasagna_text で各セルにセッション数を乗せることができます。

ggplot(gadata,aes(x=date,y=pageDepth,fill=sessions))+
  geom_lasagna(or_more = 4)+
  geom_lasagna_text(aes(label=sessions),or_more = 4,color="white")

f:id:abrahamcow:20170605015431p:plain

ggplot2 なので facet とかもできます。

ggplot(gadata,aes(x=date,y=pageDepth,fill=sessions))+
  geom_lasagna(or_more = 4)+
  geom_lasagna_text(aes(label=sessions),or_more = 4)+
  scale_fill_continuous(low = "white",high = "cornflowerblue")+
  facet_wrap(~userType, nrow=2)

f:id:abrahamcow:20170605015725p:plain

geom_lasagna_label を使うとこんなふうになります。

ggplot(gadata,aes(x=date,y=pageDepth,fill=sessions))+
  geom_lasagna(or_more = 3)+
  geom_lasagna_label(aes(label=sessions),or_more = 3)

f:id:abrahamcow:20170605015838p:plain

以上です。

abrahamcow.hatenablog.com

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

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集

Rグラフィックスクックブック ―ggplot2によるグラフ作成のレシピ集