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

廿TT

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

非定常ポアソン過程でアフィリエイトのコンバージョンを予測(グループドデータ版)

R 確率過程

abrahamcow.hatenablog.com
の続きです。

めったに起きないコンバージョンの成長の非定常ポアソン過程によるモデル - 廿TT では一日に複数のコンバージョンが発生しても、それは一回とカウントしていました。

f:id:abrahamcow:20161223212736p:plain

これはもったいない。

こういうのはグループドデータ(Grouped data - Wikipedia)として扱う。

グループドデータの非定常ポアソン過程の尤度を書いてやるとこうなります。

\displaystyle\prod_{i=1}^{k} \frac{(\Lambda(T_i)- \Lambda(T_{i-1}))^{n_i} \exp(-(\Lambda(T_i)- \Lambda(T_{i-1})))}{n_i !}

ここで T_i は日付, n_i は発生したコンバージョン数です。

引き続き強度関数 \Lambda にロジスティックモデルを仮定しました。

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)

以下は累積コンバージョン数のグラフで、青線は予測値です。

f:id:abrahamcow:20161223212849p:plain

使用したデータは report.txt · GitHub に置いておきます。