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

廿TT

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

{googleAnalyticsR} {ggplot2} Crossbar plot で滞在時間の分布を比べる

Crossbar plot は次のような図です。

f:id:abrahamcow:20170509023433p:plain

これがなにを表すかは場合によります。

今回は箱の上の辺にデータの75%点、真ん中の線に中央値、箱の下の辺に25%点を割り当てました。

いわば退化した箱ひげ図です。

次の図はあるランディングページを経由した訪問の、月ごとの平均滞在時間のグラフです。直帰セッションはのぞいています。

f:id:abrahamcow:20170509083352p:plain

なかなか変動が激しくて、これを見ていると一喜一憂しそうです。

上述の Crossbar plot とくらべてみます。

f:id:abrahamcow:20170509084624p:plain

メジアンは150前後で安定していることがわかり、分布が上のほうに伸びているか、下のほうに伸びているかを読み取ることができます。

平均滞在時間の推移は多くの場合、一部のヘビーユーザー(か、ボット?)の寄与に大きく引っ張られるので、分位点で見たほうが冷静に評価できます。

なにも工夫せずに滞在時間の分布をそのままプロットしたのが以下の図です。

f:id:abrahamcow:20170509090135p:plain

こちらのほうが情報量は多いのですが、カテゴリが増えてくると比較が困難になります。

以下 R のコードです。

library(googleAnalyticsR)
library(cowplot)
library(tidyr)
library(dplyr)
library(zoo)
library(Hmisc)
ga_auth()
account_list <- ga_account_list()
ga_id <- account_list[3,'viewId']

entry_filter <- 
  filter_clause_ga4(list(dim_filter("landingPagePath", 
                                    "BEGINS_WITH", 
                                    "/entry/2013/08/03")))


gadata_sd <-
  google_analytics_4(ga_id,
                     date_range = c("2017-01-01","2017-04-30"),
                     metrics = c("sessions","goal3Completions"),
                     dim_filters = entry_filter,
                     dimensions = c("yearMonth","deviceCategory","sessionDurationBucket"),
                     max=20000)

#平均滞在時間
gadata_avg <-gadata_sd %>% 
  mutate(sessionDurationBucket=as.integer(sessionDurationBucket)) %>% 
  group_by(yearMonth) %>% 
  dplyr::filter(sessionDurationBucket>0) %>%
  summarise(avgSessionDuration=weighted.mean(sessionDurationBucket,sessions))

#滞在時間の分位点
gadata_sd2 <-gadata_sd %>% 
  mutate(sessionDurationBucket=as.integer(sessionDurationBucket)) %>% 
  group_by(yearMonth) %>% 
  dplyr::filter(sessionDurationBucket>0) %>%
  summarise(lower=wtd.quantile(sessionDurationBucket,sessions,0.25),
            median=wtd.quantile(sessionDurationBucket,sessions,0.5),
            upper=wtd.quantile(sessionDurationBucket,sessions,0.75),
            max=max(sessionDurationBucket),
            sessions=sum(sessions))

p1 <-ggplot(gadata_avg,aes(x=as.yearmon(yearMonth,"%Y%m"),y=avgSessionDuration))+
  geom_line()+geom_point()+
  scale_x_yearmon(format = "%m",n=4)+
  xlab("")+ylab("avgSessionDuration")+
  ylim(c(0,NA))

p2 <-ggplot(gadata_sd2,aes(x=as.yearmon(yearMonth,"%Y%m")))+
  geom_crossbar(aes(y=median,ymin=lower,ymax=upper))+
  scale_x_yearmon(format = "%m",n=4)+
  xlab("")+ylab("sessionDuration")

plot_grid(p1,p2,nrow = 2)

gadata_sd1 <-gadata_sd %>% 
  mutate(sessionDurationBucket=as.integer(sessionDurationBucket)) %>% 
  group_by(yearMonth) %>% 
  dplyr::filter(sessionDurationBucket>0)

ggplot(gadata_sd1,aes(x=sessionDurationBucket))+
  geom_linerange(aes(ymin=0,ymax=sessions))+
  facet_wrap(~yearMonth)

googleAnalyticsR の使いかたは、たとえば googleAnalyticsR の使い方(Version:0.1.0) - 廿TT を参照してください。

Google アナリティクスのデータは最初から集計された状態で提供されるので、分位点を出すのには、R の Hmisc パッケージの wtd.quantile 関数を使いました。

quantile(rep(dat$variable,dat$value))

みたいにやっても同じ結果が得られるのですが、このやり方はなんとなくあまりかしこそうに見えない。

abrahamcow.hatenablog.com