Quantcast
Channel: グラフ - 廿TT
Viewing all articles
Browse latest Browse all 123

可視化で理解するKPIツリー:コンバージョンの寄与度分解

$
0
0

背景

昔Web系コンサルをやっていたときKPIツリーとかを習ったんだけどぼくはこれが苦手だった。

例えばあるサイトのコンバージョン(CV)はサイトへの訪問数(SS)×コンバージョンレート(CVR)だからコンバージョンというゴールを増やしたかったら、SSを増やすかCVRを増やすしかない。

 CV = CVR \times SS

f:id:abrahamcow:20191210224050p:plain
KPIツリー

こうやって順々に要素を順々に分解していけばコンバージョンを増やす方策をロジカルに考えられますね、というわけ。

でも実際にCVの増減に対して、CVRの変化の寄与とSSの変化の寄与、どっちが大きいんだみたいなことをちゃんと比較してるのはみたことない。

そこでここではそれをやってみようと思う。

計算

2つの異なる時期のCV、CV1とCV2があったとする。

前述のとおり、

 CV_1 = SS_1 \times CVR_1

CV_2 = SS_2 \times CVR_2

である。

CVの増減比は CV_2 / CV_1で表せる。

 CV_2/CV_1 = (SS_2 \times CVR_2) / (SS_1 \times CVR_1)

変形すると、

 CV2/CV1 = (SS2_/SS_1)\times (CVR_2/CVR_1)

両辺の対数をとると、

 \log(CV_2/CV_1)=\log(SS_2/SS_1)+\log(CVR_2/CVR_1)

となる。

つまり対数をとって考えると、CVの増減量(左辺)が、\log(SS_2/SS_1)というSSの増減量と、\log(CVR_2/CVR_1)というCVRの増減量の足し算に分解できる。

実践

これは実際に対数をとったCVの増減比をCVRの変化の寄与とSSの変化の寄与に分解した図です。

黒い折れ線がCVの増減、棒グラフがそれに対するCVRとSSの寄与を示す。

f:id:abrahamcow:20191210225858p:plain

201809をベースラインとしてそこからの増減を示している。

0よりおおきければ増加、小さければ減少である。

201901のCV増加なんかはSSの寄与のみに支えられて、CVRはマイナスだったことがわかる。

201909なんかはCVRはほぼ横ばいなので、CVの減少要因はSSの減少に絞られる。

ただし、SSの減少要因はさらにセッション数を様々な方法で層別(ドリルダウン)して調べないとわからない。

上の図を書いたRのコードを貼ります。

なにかの参考になるでしょうか。

library(googleAnalyticsR)library(tidyverse)

ga_auth()
account_list <- ga_account_list()
ga_id <- account_list$viewId[3]

gadata <-
  google_analytics(ga_id,
                   date_range = c("2018-09-01","2019-11-30"),
                   metrics = c("sessions","goal3Completions"),
                   dimensions = c("yearMonth"))

logcont <-function(x, n){
  cj <- log(x)-log(n-x)
  be <- c(cj[-1]- cj[1])
  lN <- log(n)
  be2 <- c(lN[-1]- lN[1])
  lx <- log(x)
  be3 <- c(lx[-1]- lx[1])data.frame(CV=be3,SS=be2,CVR=be)}

out <- logcont(gadata$goal3Completions,gadata$sessions)
out$yearMonth <- gadata$yearMonth[-1]

out2 <- gather(out,key,value,-CV,-yearMonth)

ggplot(out2,aes(x=yearMonth))+
  geom_col(aes(y=value, fill=key))+
  geom_line(aes(y=CV, group=1),size=1)+
  geom_hline(yintercept =0,linetype=2)+
  theme_classic(20)+
  theme(axis.text.x = element_text(angle=90),axis.text = element_text(colour="black"))

関連エントリ

r×2分割表のオッズ比をロジスティック回帰っぽく(閉形式で)計算する関数を書いた - 廿TT


Viewing all articles
Browse latest Browse all 123

Trending Articles