Crossbar plot は次のような図です。
これがなにを表すかは場合によります。
今回は箱の上の辺にデータの75%点、真ん中の線に中央値、箱の下の辺に25%点を割り当てました。
いわば退化した箱ひげ図です。
次の図はあるランディングページを経由した訪問の、月ごとの平均滞在時間のグラフです。直帰セッションはのぞいています。
なかなか変動が激しくて、これを見ていると一喜一憂しそうです。
上述の Crossbar plot とくらべてみます。
メジアンは150前後で安定していることがわかり、分布が上のほうに伸びているか、下のほうに伸びているかを読み取ることができます。
平均滞在時間の推移は多くの場合、一部のヘビーユーザー(か、ボット?)の寄与に大きく引っ張られるので、分位点で見たほうが冷静に評価できます。
なにも工夫せずに滞在時間の分布をそのままプロットしたのが以下の図です。
こちらのほうが情報量は多いのですが、カテゴリが増えてくると比較が困難になります。
以下 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))
みたいにやっても同じ結果が得られるのですが、このやり方はなんとなくあまりかしこそうに見えない。