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

廿TT

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

(R + Google アナリティクス)継続率を計算してみる

Google アナリティクス R

継続率にはいろんな定義がありえる。

ここで計算するのは「ある日に初回訪問したユーザーのうち、x日以内に再訪問したユーザーの割合」のこと。

Google アナリティクスのディメンション、sessionCount で訪問の回数がわかる。daysSinceLastSession で前回訪問日がわかる。

これから sessionCount = 2 のユーザーを取り出して、daysSinceLastSession を見れば、初回訪問が何日前だったのかわかる。

イデアはこんな感じ。

sessionCount = 2 のユーザーに対して、下表のようなものをつくり、対角成分の和をとれば、「ある日」に初回訪問して4日以内に再訪問したユーザーの数がわかる。

f:id:abrahamcow:20160213021643p:plain

7日以内継続率は下のように計算する。

library(RGA)
library(dplyr)
library(pipeR)
library(tidyr)
library(scales)
library(ggplot2)
###RGAパッケージでデータ取得###
authorize()
prof <-list_profiles()
dat1 <-get_ga(profile.id = prof$id[1],
              start.date = "2014-01-01",
              end.date = "2016-01-31",
              dimensions = "ga:date,ga:sessionCount,ga:daysSinceLastSession,ga:yearMonth",
              metrics = "ga:users")
###継続率を計算する関数を定義###
calc_repeater<-function(dat1,span=7){
  df_newusers <-dat1 %>%
    dplyr::filter(session.count==1)%>%
    select(-c(session.count,days.since.last.session)) %>%
    rename(newusers=users)
  tmp <-dat1 %>%
    dplyr::filter(session.count==2)%>%
    spread(days.since.last.session,users,fill=0)%>%
    select(-c(session.count,year.month))
  unique_date<-sort(unique(dat1$date))
  N <- length(unique_date)
  df_repeatUU <- data.frame(
    date=unique_date[1:(N-span)],
    repeatUU=sapply(2:(N-span+1),function(i)sum(diag(as.matrix(tmp[i:(i+7),3:(span+2)]))))
  )
  left_join(df_newusers,df_repeatUU,by="date") %>%
    mutate(repeat_rate=repeatUU/newusers)
}
###計算###
repeater <-calc_repeater(dat1)
###プロット###
ggplot(repeater,aes(x=date,y=repeat_rate))+
  geom_line()+
  scale_y_continuous(labels=percent)+
  scale_x_datetime(date_labels = "20%y/%m")

f:id:abrahamcow:20160213022700p:plain

日によって増減が激しくて KPI としては使いにくいかな、と感じた。せっかく苦労して計算したのに……。

新規訪問者数(ある日に初回訪問したユーザー)、継続訪問者数(ある日に初回訪問したユーザーのうち、7日以内に再訪問したユーザー)、継続率(ある日に初回訪問したユーザーのうち、7日以内に再訪問したユーザーの割合)を並べてみる。

repeater_gg <-gather(repeater,variable,value,-c(date,year.month))
repeater_gg$date <-as.POSIXct(repeater_gg$date,origin="1970-01-01")
ggplot(repeater_gg)+
  geom_line(aes(x=date,y=value,colour=variable))+
  facet_wrap(~variable,scales = "free",nrow = 3)

f:id:abrahamcow:20160213023047p:plain

バズに引っ張られて継続率も大きく変動していることがわかる。とはいえバズに引っ張られるのがダメな指標かというと一概にそうとはいえない。
バズが連れてきた人がリピーターになっているからこそ高い数字が出ている。
ただし計算方法の都合上、直近の再訪問を評価しているので、長期的に定着しているのかはわからない。

abrahamcow.hatenablog.com