Na trhu existuje několik produktů, které pomáhají eshopům správně spravovat své produkty na vyhledávačích zboží, jako je heuréka nebo například zboží.cz. Úkolem těchto nástrojů je biddování (nastavení ceny za proklik) automatizovat podle uživatelem zadaných pravidel, minimalizovat náklady (finanční i časové) na správu těchto kanálů a zároveň maximalizovat obrat.
Cílem mé práce bylo statisticky vyhodnotit a zároveň kvantifikovat vliv jednoho z těchto nástrojů (BEED) na obraty a zisk spravovaných eshopů. Pro statistické vyhodnocení vlivu v čase jsem použila BSTS model - bayesian structural time-series model. Jedná se o machine-learningový model, který se, jak název napovídá, využívá pro vyhodnocení vývoje událostí v čase. Momentálně se často používá v marketingu, kde umožňuje stanovit efektivitu kampaně.
BSTS model pracuje s daty uspořádanými podle data, pro správné provedení výpočtu je potřeba nadefinovat období před startem kampaně (pre.period) a následné období po startu kampaně (post.period). Začátek kampaně v mém případě definoval datum nasazení BEEDu. Pre.period a post.period by měly být v poměru 70:30.
Jako závislou proměnnou jsem v tomto případě použila revenue eshopu z kanálu ovlivněného nástrojem a jako vysvětlující proměnnou jsem použila revenue eshopu z kanálu neošetřeného žádným nástrojem, tudíž "Organic Traffic". Stejná analýza následně proběhla i s údaji ohledně nákladů na biddování v BEEDu.
BSTS model se vytvoří na hodnotách pre.period a následně během post.period predikuje hodnoty, kterých by závislá proměnná dosahovala bez zásahu v podobě spuštění nástroje.
Pro tyto výsledky následně vyjádří statistickou významnost a jejich absolutní i relativní rozdíly - ať už pro průměrné nebo kumulované hodnoty:
Projekt jsem zpracovávala v programovacím jazyku R.
Data jsem získávala z Google Analytics, kam jsem přistupovala skrz API pomocí R balíčku RGoogleAnalytics (Pearmain a kol., 2015). Jak si nastavit API v GA a získat přístupové tokeny jsem psala v předchozím příspěvku. Samotný BSTS model je implementován v balíčku CausalImpact (Brodersen a kol., 2015).
Kód je k nahlédnutí zde:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
devtools::install_github("Tatvic/RGoogleAnalytics") | |
### REQUIREMENTS #### | |
library(RGoogleAnalytics) | |
library(dplyr) | |
library(plyr) | |
library(CausalImpact) | |
library(zoo) | |
### ACESS TO API #### | |
#Update the client.id and client.secret from the file you downloaded | |
client.id <- "xxxxxxxxxxxxxx" | |
client.secret <- "xxxxxxxxxxx" | |
token <- Auth(client.id,client.secret) | |
# Save the token | |
save(token,file="./token_file") | |
# Load the token | |
load("./token_file") | |
# Validate the token | |
ValidateToken(token) | |
### QUERY FOR TESTED DATA #### | |
# Create query for tested data | |
query.init <- Init(start.date = "YYYY-MM-DD", | |
end.date = "YYYY-MM-DD", | |
dimensions = c("ga:date", "ga:source"), | |
metrics ="ga:transactionRevenue", | |
max.results = 10000, | |
segments = "sessions::condition::ga:source=@heureka", | |
sort = "ga:date", | |
table.id = "ga:xxxx") | |
# Create the Query Builder object so that the query parameters are validated | |
query <- QueryBuilder(query.init) | |
# Extract the data and store it in a dataframe | |
heureka.data <- GetReportData(query, token) | |
head(heureka.data) | |
# Group data by date | |
heureka.data <- heureka.data %>% group_by(date) %>% dplyr::summarise(num = n(),transactionRevenue = sum(transactionRevenue)) | |
head(heureka.data) | |
### QUERY FOR CONTROL #### | |
# Create query for control data | |
query.init <- Init(start.date = "YYYY-MM-DD", | |
end.date = "YYYY-MM-DD", | |
dimensions = c("ga:date", "ga:medium"), | |
metrics ="ga:transactionRevenue", | |
max.results = 10000, | |
filters = "ga:medium==organic", | |
sort = "ga:date", | |
table.id = "ga:xxxxx") | |
# Create the Query Builder object so that the query parameters are validated | |
query <- QueryBuilder(query.init) | |
# Extract the data and store it in a data-frame | |
organic.data <- GetReportData(query, token) | |
head(organic.data) | |
# Merge dataframes by date | |
all.data <- merge(heureka.data,organic.data,by="date",all = T) | |
head(all.data) | |
# Select only date and revenue columns | |
revenue.data <- dplyr::select(all.data, date, transactionRevenue.x, transactionRevenue.y) | |
head(revenue.data) | |
# Rename columns | |
revenue.data <- plyr::rename(revenue.data, c("transactionRevenue.x"="heureka.revenue", "transactionRevenue.y"="organic.revenue")) | |
head(revenue.data) | |
# Transform yyyymmdd into regular date | |
sapply(revenue.data, class) | |
revenue.data$date <- as.Date(revenue.data$date, "%Y%m%d") | |
head(revenue.data) | |
sapply(revenue.data, class) | |
revenue.data[is.na(revenue.data)] <- 0 | |
### CAUSAL IMPACT ANALYSIS #### | |
# Define pre and post period for GCI | |
pre.period <- as.Date(c("YYYY-MM-DD", "YYYY-MM-DD")) | |
post.period <- as.Date(c("YYYY-MM-DD", "YYYY-MM-DD")) | |
# Run the analysis | |
impact <- CausalImpact(revenue.data, pre.period, post.period) | |
# Visualize the results | |
plot(impact) | |
# Summary | |
summary(impact) | |
summary(impact, "report") |
Pro milovníky GUI je v shiny napsána i pěkná webová aplikace GA effect, která poskytuje stejné grafické i textové výstupy jako R CausalImpact.
Reference:
Brodersen et al., 2015, Annals of Applied Statistics. Inferring causal
impact using Bayesian structural time-series models.
http://research.google.com/pubs/pub41854.html
Michael Pearmain. Contributions from Nick Mihailowski, Vignesh Prajapati,
Kushan Shah, Nicolas Remy and person) (2015). RGoogleAnalytics: R Wrapper
for the Google Analytics API. R package version 0.1.5.
https://CRAN.R-project.org/package=RGoogleAnalytics
Hadley Wickham (2011). The Split-Apply-Combine Strategy for Data Analysis.
Journal of Statistical Software, 40(1), 1-29. URL
http://www.jstatsoft.org/v40/i01/.
Hadley Wickham, Romain Francois, Lionel Henry and Kirill Müller (2017).
dplyr: A Grammar of Data Manipulation. R package version 0.7.1.
https://CRAN.R-project.org/package=dplyr