Intro

Esse markdown tem como objetico apresentar um estudo de caso para o uso da ferramenta CausalImpact Pacote do Google (para mais informações) feito em um determinado produto em um grande instituição financeira. A idéia é validar a usabilidade da ferramenta (R) com a ferramenta do GooglAnalytics para cenários onde não for possível uso de teste A/B tradicional e mais importante, podendo fazer uso como indicador de performance.

Sobre o modelo

Para a modelagem do pós-período, usamos como treinamento o período de 35 dias de dados temporais retirados da ferramenta GoogleAnalytics que se referem a página de meta (o arquivo encontra-se no repositorio/files/analitics.xlsx e foi alterado para preservar a fonte), isto é onde inicia o fluxo de contratação do produto de interesse. A função forecast HoltWinters foi escolhida para nosso artigo e usamos de tratamento orientado a objeto para retirar o modelo (linha tracejada pré-período, como veremos) e também a predição pós-período que teria acontecido, como controle do modelo no uso da ferramento CausalImpact. Assim o modelo para inferência, temos grande ganho no uso de Modelo de espaço de estado de suavização exponencial.

Sobre o fluxo

Para a maioria dos produtos da instituição, há varios meios de captação de clientes. Porém para os produtos digitais, há varias campanhas ou meios até inicio de funil. Todos os meios (seja pela homepage, pagina do produto, adwords, instagram ou qualquer outra mídia acaba na página analisada). Em tempos em tempos há uma alavancagem por meio de promoção por campanhas com homepage dedicada. E é nesse ponto que vamos explorar a página de início de funil, examinando o aumento de fluxo e estimar de maneira sólida a melhora dado o início dessa campanha.

Modelagem

O relatorio do vindo do googleanalytics geralmente é exportado como .csv ou .xlsx, nesse caso temos um arquivo xlsx

library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#Leitura Dados GA
#Os dados vem do relatorio manual do GA de um período escolhido
campanha <- read_excel("files/analytics.xlsx")

head(campanha)
## # A tibble: 6 x 9
##   Página    Data   `Visual~ `Visuali~ `Tempo ~ Entr~ `Taxa~ `Porce~ `Valo~
##   <chr>     <chr>     <dbl>     <dbl>    <dbl> <dbl>  <dbl>   <dbl>  <dbl>
## 1 9fb22be3~ 20180~        0      1456        0     0      0       0      0
## 2 9fb22be3~ 20180~        0      1392        0     0      0       0      0
## 3 9fb22be3~ 20180~        0      1281        0     0      0       0      0
## 4 9fb22be3~ 20180~        0       658        0     0      0       0      0
## 5 9fb22be3~ 20180~        0       616        0     0      0       0      0
## 6 9fb22be3~ 20180~        0      1691        0     0      0       0      0
#Tratamento dos dados

dados <- dplyr::select(campanha, Data, "Visualizações de páginas únicas")
nlinhas <- nrow(dados)-1
dados <- dados[1:nlinhas,]

Para esse modelo, é importante termos o pré-periodo que são os dados até o início da campanha.

#Criamos os dados do período pré campanha para nosso modelo
pre.periodo <- data.frame(dados$`Visualizações de páginas únicas`[1:37])

Assim podemos ver como é o comportamento dos clientes na página de início de funil. Notamos aqui um problema de frequência na segunda semana. Esse problema específico se deu a um erro de configuração durante o período.

#Transformamos em time-series
nts <- ts(pre.periodo, frequency = 7)
plot(nts)

Assim, usamos o pacote holtwinters para modelar nossa pequena série, vemos aqui o fit tem grande influencia pelo período da segunda semana.

#Fazemos o modelo mais simples possível, porém devemos usar o alpha e gama.
#Pois o smooth é bom
fit <- HoltWinters(nts)
plot(fit)

Assim, podemos usar o pacote forecast e usar os parametros de nosso modelo holtwinters. Selecionamos o tamanho do período da campanha, que durou 23 dias.

## Cria o Modelo ##
library(forecast)

#Fazemos o forecast
modelo <- forecast(HoltWinters(nts), 23)
plot (forecast(HoltWinters(nts), 23))

Então usamos os dados de forecast para completar nossa série temporal.

#o mesmo que modelo
dados.forecast <- forecast(HoltWinters(nts),16)

plot(fit$fitted[,1])

Unimos os dados do analytics com o forecast:

#Monta os dados do modelo + predicao em x1
x1 <- append(fit$fitted[,1], modelo$mean)


plot(ts(x1))

E também temos os dados reais do periodo. Visivelmente notamos o aumento na página de início de funil de vendas. Em seguida transformamos em matriz, pois o modelo exige esse formato.

y <- dados$`Visualizações de páginas únicas`
plot(ts(y))

#Consolida as duas ts
dados_final <- data.frame(y,x1);
dados_final <- data.matrix(dados_final)

Desse modo temos os dados prontos para verificar o efeito causal da campanha.

### Causal Impact ###
library(CausalImpact)

pre.period <- c(1, 37)
post.period <- c(38, 53)

impact <- CausalImpact(dados_final, pre.period, post.period)


plot(impact)

Como vemos acima, o nosso modelo (tracejado) tem menor erro nas datas próximas ao inicio da campanha, pelo fato de estar mais afastado ao período de erro de medição.

De maneira mais explícita, o pacote nos permite ver todas as métrica e ainda exporta um relatório robusto sobre os resultados. Onde o que importa a nós é o efeito relativo.

summary(impact)
## Posterior inference {CausalImpact}
## 
##                          Average       Cumulative    
## Actual                   1452          23233         
## Prediction (s.d.)        1055 (51)     16881 (819)   
## 95% CI                   [957, 1158]   [15314, 18528]
##                                                      
## Absolute effect (s.d.)   397 (51)      6352 (819)    
## 95% CI                   [294, 495]    [4705, 7919]  
##                                                      
## Relative effect (s.d.)   38% (4.9%)    38% (4.9%)    
## 95% CI                   [28%, 47%]    [28%, 47%]    
## 
## Posterior tail-area probability p:   0.001
## Posterior prob. of a causal effect:  99.9%
## 
## For more details, type: summary(impact, "report")

Como mencionado:

summary(impact, "report")
## Analysis report {CausalImpact}
## 
## 
## During the post-intervention period, the response variable had an average value of approx. 1.45K. By contrast, in the absence of an intervention, we would have expected an average response of 1.06K. The 95% interval of this counterfactual prediction is [0.96K, 1.16K]. Subtracting this prediction from the observed response yields an estimate of the causal effect the intervention had on the response variable. This effect is 0.40K with a 95% interval of [0.29K, 0.49K]. For a discussion of the significance of this effect, see below.
## 
## Summing up the individual data points during the post-intervention period (which can only sometimes be meaningfully interpreted), the response variable had an overall value of 23.23K. By contrast, had the intervention not taken place, we would have expected a sum of 16.88K. The 95% interval of this prediction is [15.31K, 18.53K].
## 
## The above results are given in terms of absolute numbers. In relative terms, the response variable showed an increase of +38%. The 95% interval of this percentage is [+28%, +47%].
## 
## This means that the positive effect observed during the intervention period is statistically significant and unlikely to be due to random fluctuations. It should be noted, however, that the question of whether this increase also bears substantive significance can only be answered by comparing the absolute effect (0.40K) to the original goal of the underlying intervention.
## 
## The probability of obtaining this effect by chance is very small (Bayesian one-sided tail-area probability p = 0.001). This means the causal effect can be considered statistically significant.

Conclusão

Vemos que o report fornecido complementa a análise significativamente e traz as com rigor o resultado. Complementamos ainda com o resultados divulgados oficialmente para o produto que estudamos, resultantes da página da campanha publicitária. Onde foram designados exatamente 406 leads para o início do fluxo de contratação.

Como o nosso modelo não possui dados de lead da página da campanha, podemos fazer a análise comparativa como validação e nesse ponto essa abordagem foi muito boa usando apenas a média do forecast.

Você percebe que temos um grande número de variáveis criadas nesse artigo. Não é necessário, mas o recurso foi utilizado para ficar mais didático;