Как искать аутлаеров

В PBI:

Создаем отдельную табличку:

without_outliers = FILTER(SUMMARIZE(Query1;Query1[card];"count";COUNT(Query1[card]));[count]<40)

С помощью SUMMARIZE создаем сводную табличку и фильтруем аутлаеров с помощью FILTER

Потом связываем

 

В R:

boxplot(dataset$count)
out = boxplot(dataset$count)$out
out_data = as.data.frame(out)

 

 

Настройка удаленного сервера для работы

Вводная часть здесь: https://data36.com/data-coding-101-install-python-sql-r-bash/

R лучше устанавливать по этому туториалу: https://www.digitalocean.com/community/tutorials/how-to-install-r-on-ubuntu-16-04-2

Rstudio также отсюда https://data36.com/data-coding-101-install-python-sql-r-bash/ , только можно версию по свежее.

Mysql по этому туториалу: https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-16-04 Там же нужно будет создать юзера для mysql , можно сделать это вот так https://www.digitalocean.com/community/tutorials/mysql-ru

 

 

 

Как скачать данные из GA c помощью R и сохранить в MySQL на своей машине

План прост:

1. Поставить Mysql на машину
2. Создать там нужное бд и таблицы
3. Загрузить данные за позавчерашний день через R
4. Настроить скрипт загрузки с динамическими датами http://sotnik.biz.ua/blog/ppc_in_power_bi/
5. Запустить по крону его через 5 минут https://2steps.pro/r-script-launching-with-task-scheduler.html
6. Если все ок, то ставим крон на 9.30

 

 

1. Поставить Mysql на машину

Скачиваем mysql-installer-web-community-5.7.19.0 и следуем установщику. Если что, то гуглим.

Чтобы войти в мускул:

mysql -u root -p

2. Создать там нужное бд и таблицы

Так как кодировка R и винды cp1251, то нужно создать дб в этой же кодировки.

CREATE DATABASE organic_data1 CHARACTER SET cp1251 COLLATE cp1251_general_ci;

А затем нужные таблицы:

CREATE TABLE ga_organic_data(
 date DATE,
 sourceMedium VARCHAR(256),
 landingPagePath VARCHAR(256),
 deviceCategory VARCHAR(256),
 hostname VARCHAR(256),
 sessions INTEGER,
 transactions INTEGER,
 transactionRevenue DECIMAL
 );

3. Загрузить данные за позавчерашний день через R

Коннектимся к бд и загружаем:

conMySQL1 <- dbConnect(MySQL(), dbname = "organic_data1", user = "root", password = "makarovs", host = "localhost",port=3306)

dbWriteTable (conMySQL1, "ga_organic_data", ga_organic_data, row.names = FALSE, append = TRUE)

Сложность была в определении hostname и имени пользователя. Помогла статья: https://stackoverflow.com/questions/4093603/how-do-i-find-out-my-mysql-url-host-port-and-username 

4. Настроить скрипт загрузки с динамическими датами

library(RMySQL)
library("googleAuthR")
library("googleAnalyticsR")
library("jsonlite")


conMySQL1 <- dbConnect(MySQL(), dbname = "organic_data1", user = "root", password = "makarovs", host = "localhost",port=3306)

old_data <- dbReadTable(conMySQL1, "ga_organic_data")
last_date <- max(old_data$date)
start_date <- as.character.Date(as.Date(last_date)+1)
end_date <- as.character.Date(Sys.Date() - 1)


# Сюда вставить то, что в json-файле. Обязательно заменить обратный слеш \ на двойной \\
json <- '{

}
'

# функция для авторизации
gar_auth_service <- function(json, scope = getOption("googleAuthR.scopes.selected")){
 
 endpoint <- httr::oauth_endpoints("google")
 
 secrets <- jsonlite::fromJSON(json)
 scope <- paste(scope, collapse=" ")
 
 if(is.null(secrets$private_key)){
 stop("$private_key not found in JSON - have you downloaded the correct JSON file? 
 (Service Account Keys, not service account client)")
 }
 
 google_token <- httr::oauth_service_token(endpoint, secrets, scope)
 
 Authentication$set("public", "token", google_token, overwrite=TRUE)
 Authentication$set("public", "method", "service_json", overwrite=TRUE)
 
 return(invisible(Authentication$public_fields$token))
 
 }

# авторизируемся
gar_auth_service(
 json = json,
 scope = "https://www.googleapis.com/auth/analytics"
)

# id представления GA
ga_view <- '46195197'


df <- dim_filter("sourceMedium","REGEXP","(google / organic|yandex / organic)")
fc <- filter_clause_ga4(list(df))


# Выгружаем данные
ga_organic_data <- google_analytics_4(ga_view, 
 date_range = c(start_date,end_date),
 dimensions=c('date','sourceMedium','landingPagePath','deviceCategory','hostname'), 
 metrics = c('sessions','transactions','transactionRevenue'),
 dim_filters = fc,
 anti_sample = TRUE)


dbWriteTable (conMySQL1, "ga_organic_data", ga_organic_data, row.names = FALSE, append = TRUE)

dbDisconnect(conMySQL1)

5. Запустить по крону его через 5 минут 

 

Дебаг с помощью Google Tag Assistant

Врубаем record: http://joxi.ru/bmo6zYouxe5j4r и выполняем нужные действия, а потом смотрим отчет: http://joxi.ru/V2VRL5nSxRza72
Очень удобно смотреть что записалось в кастом деменшен или какая текущая кампания/канал. Также можно тестить кроссдоменное отслеживание.

Как исключать источники перехода

https://support.google.com/analytics/answer/2795830?hl=ru

Фишка в том, что там в поле фильтр по содержит:

В списке исключаемых источников перехода используется вариант соответствия «СОДЕРЖИТ». Например, если ввести example.com, трафик со страницы sales.example.com также будет исключаться (поскольку доменное имя содержит example.com).

 

Рефлексия по задаче

Если использовать метрику users и date одновременно, то метрика users будет завышена. Это справедливо при нескольких вызовах API.

Как делать сводные aggregate(sessions ~ sourceMedium, data =ga_data, FUN = sum)

Команда .libPaths() покажет папки где хранятся пакеты. В первую из них можно зайти и удалить пакет.

Скачивая через devtools ты скачиваешь последнюю версию. Т.е. не стабильную.

Как запускать скрипты R со своего сервака

Чтобы перейти в RStudio нужно перейти по адресу http://46.101.128.25:8787 или что то типо того

Устанавливаем пакеты, как обычно, но некоторые из них установятся во временную папку
#The downloaded source packages are in
# ‘/tmp/RtmpSPFiKl/downloaded_packages’

Чтобы установить их оттуда нужно ввести команду
install.packages(list.files(«/tmp/RtmpfbgkOs/downloaded_pack‌ages/»,full.names=TR‌UE),repos=NULL)

Подробнее тут https://stackoverflow.com/questions/26269673/r-install-packages-to-install-downloaded-packages

есть еще вот классный мануал https://www.digitalocean.com/community/tutorials/how-to-set-up-r-on-ubuntu-14-04

 

 

 

 

Пост о статистической значимости

Что значит статистическая значимость.
«Изменение позволило достичь повышения конверсии на 20% с статистической значимостью 90%». К сожалению, это утверждение вовсе не равнозначно другому, очень похожему: «Шансы повысить конверсию на 20% составляют 90%». Так о чем же речь на самом деле?

90% — это вероятность проявления каких бы то ни было изменений в конверсии. Другими словами, если бы мы проводили десять А/B-тестов, чтобы получить этот результат, и решили бы проводить все десять до бесконечности, то один из них (так как вероятность изменений 90%, то 10% остаётся на неизменный исход), вероятно, закончился бы приближением результата «после теста» к первоначальной конверсии – то есть, без изменений. Из остающихся девяти тестов некоторые могли бы показать рост, составляющий куда меньше 20%. В других результат мог бы превысить эту планку.

Т.е. если говорить про p- value, то это вероятность получить такие же или более выраженные отличия. Чем больше уровень p-value, тем больше шанс, что в последующих тестах мы получим более отличающиеся значения. Вот так, никакой гарантии!

Как тестировать изменения в относительных величинах(конверсии, например)

Любую конверсию можно представить вот так:

Это так называемый биномиальный эксперимент.

Биномиальный эксперимент состоит из n испытаний, каждое из которых может
принимать одно из двух значений: «успех» или «неудача».
Каждое испытание должно быть независимым — исход предыдущего испытания не влияет на результат следующего. Вероятность успеха одинакова для каждого испытания. В примере с монетами каждое испытание — подбрасывание монеты. Успехом мы считаем выпадение решки. Неудачей — выпадение орла.

Можно проверить в калькуляторе http://getdatadriven.com/ab-significance-test Там используется односторонний критерий (one-sided test) t.test в R

Как тестировать изменения AOV

Скопировать ревень для транзакций для двух вариантов:

Вставить в калькулятор http://www.evanmiller.org/ab-testing/t-test.html

 

 

 

Регулярки и ругулярки в JS

Нам нужно отследить с помощью регулярки ссылку https://tver.petrovich.ru/catalog/18410/164371/

Как это сделать обычной регуляркой

/catalog/.+/\d+
/catalog/.+/[0-9]+
/catalog/[0-9]+/[0-9]+
/catalog/\d+/\d+

. точка означает любой символ

+ означает один или более

Т.е. запись .+ ищет любые символы до следующего элемента регулярки.

\d любая цифра

\d+ находит числа – последовательности из 1 или более цифр:

[0-9] последовательность цифр, вообще тоже самое что и \d Вообще так указываются последовательности, например [A-Za-z0-9] ищет все буквы в любом регистре и цифры, а вот так наоборот не ищет [^A-Za-z0-9]

Как это сделать регуляркой в JS

Слеши "/" говорят JavaScript о том, что это регулярное выражение. Они играют здесь ту же роль, что и кавычки для обозначения строк. Т.е. ругулярку нужно писать в /регулярка/ И из это возникает необходимость экранировать /, вот так \/

Вот так ищется нужный url:

if (window.location.href.search(/catalog\/[0-9]+\/[0-9]+/) > 1){…..}

Подробнее

https://learn.javascript.ru/regular-expressions-javascript

http://www.regextester.com/