abrahamcow.hatenablog.com
の続きです。
めったに起きないコンバージョンの成長の非定常ポアソン過程によるモデル - 廿TT では一日に複数のコンバージョンが発生しても、それは一回とカウントしていました。
これはもったいない。
こういうのはグループドデータ(Grouped data - Wikipedia)として扱う。
グループドデータの非定常ポアソン過程の尤度を書いてやるとこうなります。
ここで は日付,
は発生したコンバージョン数です。
引き続き強度関数 にロジスティックモデルを仮定しました。
2016年 6月30日までのデータを使って, 2016年11月30日までのCVを予測してみます。
library(dplyr) dayly <-read.table("~/Downloads/report.txt",skip=2,stringsAsFactors = FALSE) tmp <- dayly %>% select(V1,V4) %>% setNames(c("date","CV")) %>% mutate(date = as.Date(date)) dates <-data.frame(date=seq.Date(min(tmp$date),max(tmp$date),by="1 day")) dayly_all <-left_join(dates,tmp,by="date") %>% mutate(CV=ifelse(is.na(CV),0,CV)) dayly_learn <- dayly_all %>% dplyr::filter(date<=as.Date("2016/6/30")) #plot(CV~date,data=dayly_all,type="h",xlab="date",ylab="CV") #plot(cumsum(CV)~date,data=dayly_all,type="s",xlab="date",ylab="CV") logis <- function(x,pars){ a <- pars[1] b <- pars[2] c <- pars[3] a/(1+b*exp(-c*x)) } CVs <- dayly_learn$CV n <- nrow(dayly_learn) LL <- function(par,Lambda){ par <-exp(par) t1 <- (1:n)/1000 #数字が大きくなると数値計算が難しくなるので適当な数で割ってスケーリングしています。 t2 <- (1:n+1)/1000 sum(CVs*log(Lambda(t2,par)-Lambda(t1,par))- (Lambda(t2,par)-Lambda(t1,par))) } opt_logis <-optim(c(6,0,0),LL,Lambda=logis,control = list(fnscale=-1)) N <- nrow(dayly_all) plot(cumsum(CV)~date,data=dayly_all,type="s",xlab="date",ylab="CV",lwd=2) lines(dayly_all$date,logis((1:N)/1000,exp(opt_logis$par)),col="blue",lwd=2.5) abline(v=as.Date("2016/6/30"),lty=2)
以下は累積コンバージョン数のグラフで、青線は予測値です。
使用したデータは report.txt · GitHub に置いておきます。