Проверка результатов A/B теста

A/B-тесты это основной способ решения споров об интерфейсах в команде. Но часто эти споры решаются неверно, потому что ключевая ошибка при анализе результатов A/B теста это сравнение двух средних, без подбора критерия, оценки выборки. Беглый визуальный анализ отчетов в GA по принципу «где график выше, та версия и лучше» приводит к ошибочным выводам и стоит бизнесу кучу денег. Если до этого момента вы обходились знаниями, что онлайн-калькуляторы должны показать «p < 0.05» и «нормальное распределение похоже на колокол», то в этой статье я постараюсь расширить ваш кругозор.

Все примеры будут продемонстрированы для R-Studio. Общий процесс анализа: экспериментальный дизайн → сырые данные → обработанные данные → выбор статистической модели → суммарная статистика → p value. С экспериментальным дизайном дизайнеры справляются, про остальные шаги давайте говорить подробнее.

 

Формируем гипотезу

При формировании гипотезы руководствоваться лучше простыми понятиями: цели бизнеса, как эти цели достигаются клиентами и как это можно измерить (Single A/B test или Multi A/B test). Не менее важно понимать, как данные будут собираться и валидироваться, и как будут вноситься изменения по результатам теста. При этом предполагается, что проблема репрезентативности и достаточности объёма выборки решена.

Но будем честны, часто задача будет ставиться по принципу: «у нас упала прибыль, посмотри, че там такое». Или приходит продукт-менеджер или гейм-дизайнер, рассказывает про уже реализованную фичу на проде, и просит узнать эффективность этой фичи. При этом нет информации, на что эта фича была направлена, на каких данных ее исследовать, как ее операционализировать. В случае столь слабо формализованных задач нужно придумывать гипотезы самостоятельно и думать, откуда взять данные для формирования этих гипотез. Помогает консолидация данных из разных источников.

Либо, в качестве источника гипотезы банальный спор менеджеров продукта и проекта, результат коридорного опроса, желание оптимизировать CRO. Тестировать фичи, которые очевидно улучшат конверсию, достаточно бесполезная работа. Лучше тестировать фичи, у которых отдача бизнесу непредсказуема. В таких фичах обычно кроется рост всех ключевых метрик: CTR (Click Through Rate), конверсия, CPA, ROAS, CPI. Должен сказать, что при малом количестве данных очень сложно оценивать небинарные метрики (средний чек, выручка), результаты обычно очень шумные. A/B тесты для бинарных задач проводить просто (выполнено/не выполнено).

При проверке гипотезы помним, что нулевая гипотеза про отсутствие отличий. Альтернативная гипотеза о значимости различий. Ошибка первого рода происходит, когда мы отклоняем нулевую гипотезу в пользу альтернативной гипотезы, при условии что справедлива нулевая гипотеза. Ошибка второго рода происходит, когда верна альтернативная гипотеза, но было принято решение принять нулевую гипотезу.

 

Запуск A/B теста и сбор данных

Либо вы идете к разработчику и он каким то образом все делает за вас, и при работе с мобилками это основной способ проведения A/B теста. Либо используете GTM или Google Optimize, где разделяем трафик, готовите визуальное представление гипотезы и задаете условия ее отображения (сегменты и тому подобное). В результате будет возможность менять не только цвет и тексты на странице, но и создавать новые функциональные сущности или развивать имеющиеся, а также успешно сегментировать гипотезы еще на этапе запуска. Это дает большое преимущество в условиях ограниченных технических и финансовых ресурсов крупного бизнеса.

В идеальном случае после запуска теста через определенное время тест проверяется, и делается переоценка кол-ва дней, нужных для сбора данных. Торопиться при сборе данных не надо, средний цикл оформления банковской услуги это 2 недели, значит, это минимальный срок для сбора данных.

Данные не обязательно собирать самостоятельно, основные источники данных это:
1. Данные из собственных приложений, сайтов, расширений и т.д.
2. Снифферинг незашифрованного трафа на крупных узлах обмена данными.
3. Покупка данных сторонних поставщиков — создателей приложений, расширений, рекламных/баннерных сетей, малвари, червей и т.д., как легитимным, так и не очень образом.
4. Покупка данных о посещаемости каких-нибудь ресурсов, которые готовы продать данные.
5. Хантинг людей.

 

Характеристика и нормализация данных

Предположим, данные готовы, они могут быть в формате csv или Excel. Их может быть много или мало, они могут быть распределены нормально и ненормально. Проверка на нормальность данных нужна, чтобы центральная предельная теорема выполнялась на малых выборках. Если выборки большие и наблюдения независимые, то предположение о нормальном распределении для теста Стьюдента не нужно (т.к. работает центральная предельная теорема). На 1000 пользователях не удастся отследить мелкие изменения (1-2%), но изменения в 20-30% можно.

Предположим, что данных мало, значит, нужна проверка о типе распределения данных. Не факт, что удастся отличить равномерное распределение от нормального на очень маленькой выборке. В общем случае, нужно построить график столбчатой диаграммы и посмотреть его форму. Нормальное распределение выглядит как колокол с тремя сигмами с каждой стороны. Если выборки гомогенные и распределение нормальное, то наш выбор это t-Критерий Стьюдента. Если же по графику видно, что распределение с отклонением на левую сторону графика, то используется хи-квадрат Пирсона.

Если мы говорим про оценку средних, то при достаточном кол-ве наблюдений данные будут распределены нормально. Это большой плюс работы над крупным продуктом, в котором всегда много данных: при любом распределении исходных величин распределение выборочных средних будет стремиться к нормальному. Результат попросту зависит от мощности, т.е. от размера выборки. Идеально нормальных данных быть не может, если под реальной жизнью не понимать результат работы функции rnorm(). Да и данные в нашем случае дискретны и являются набором точек. Поэтому на большой выборке shapiro-wilk всегда будет значимым. А вот на выборках 10-15 значений он всегда незначимый из-за недостаточной мощности.

Выбросы надо смотреть на box-plot и удалять ручками, как и дубли. Если это невозможно, то применяется правило трех сигм: убрать все значения, которые выходят за три стандартных отклонения и посмотреть, как изменятся наши данные. Но будет большая потеря данных, что может быть критично. Другой способ это метод трансформации по Боксу-Коксу. При этом надо понимать, что удаление выбросов только для применения того или иного критерия—не верный подход. Прагматичнее для начала посмотреть срезы, где явно будут видны различия.

 

Давайте сгенерируем данные таким способом usersExport <- data.frame(n = 3:90) и построим график boxplot(usersExport). Мы получим практически идеальный график, на котором есть квантили.

Как читать график boxplot: точка или линия соответствуют средней арифметической, эту точку окружает квадрат, его длина соответствует точности оценки генерального параметра. Усы от квадрата соответствуют своей длиной одному из показателей разброса или точности. Для формирования boxplot нужно написать комманду boxplot(имя переменной). Можно для эксперимента создать дырки в данных usersExport <- usersExport[-sample(3:90, 23), ] и посмотреть, как изменится график boxplot.

Вот пример графика с выбросами:

Проверить данные на нормальность можно простым взглядом по qqplot(). При больших объемах тесты практически всегда покажут отклонения от нормального распределения. Поэтому, если данные получились очень ненормальные, например, время, проведенное за смартфоном или финансовые всегда показатели ограничены снизу, то нужна нормализация или хотя бы удаление выбросов. Переходя к цифрам, различие в 5% не такое уж и большое. На большей выборке будет совсем близко к 0,05. Кроме того, многие тесты устойчивы к умеренным отклонениям от нормального распределения. Просто даже очень небольшие отклонения от нормальности будут значимы на больших выборках, но это справедливо для всех стат. тестов.

qqplot(rt(a,df=3), x, main="t(3) Q-Q Plot")
abline(0,1)

Мы видим, что R-Studio нарисовал график Q-Q (слева). На таком графике отображаются данные в отсортированном порядке по сравнению с квантилями из стандартного нормального распределения. За исключением выбросов, точки расположены более менее по прямой, хотя и скашиваются. Значит, наши данные искажены. На это также указывает, что точки расположены вдоль линии в середине графика, но отгибаются в конце. Такое поведение характеризует наличие в выборке более высокие значений, чем ожидалось от нормального распределения. Пример нормального распределения показан на графике Q-Q справа.

Еще один пример нормальных данных: вводим команду для генерирования данных x <- rnorm(100). Строим график с линией qqline(x), и добивает гистаграммой hist(x).

Пример ненормальных данных: y <- rgamma(100, 1), затем qqnorm(y); qqline(y), и гистограмма hist(y).

 

Выбираем победителя

В зависимости от количества и нормальности данных мы выбираем разные критерии для выявления победителя. Если данные нормально распределены, то используем бернулевский тест, гаусовские расчеты. Смотрим степени свободы, победил вариант, не победил вариант.

Для начала рассмотрим тест Шапиро-Уилка. Критерий Шапиро-Уилка это W-критерий, который также позволяет оценить нормальность. Если W=1, то выборка точно нормально распределена. Все, что выше 0,75, можно считать нормальным распределением. Для выполнения теста Шапиро-Уилка предназначена функция shapiro.test(x), принимающая на вход выборку x объема не меньше 3 и не больше 5000. Генерируем нормальные данные, x <- rnorm(4600), и используем тест shapiro.test(x). Мы видим следующий текст:

Shapiro-Wilk normality test
data: x
W = 0.99947, p-value = 0.222

Смотрим на p-value = 0.222 и принимаем нулевую гипотезу.

W это значение статистики теста, в данном случае это 0.99947, что считается отличным результатом, т.к. выборка изначально имеет нормально распределенные данные. Чтобы отклонить нулевую гипотезу, p-value должно быть не выше альфы 0,05 (максимум 0,1). Проверим на ненормальных данных:  y <- rgamma(100, 1), shapiro.test(y).

Shapiro-Wilk normality test
data: y
W = 0.9829, p-value < 2.2e-16

P-value < 2.2e-16, что намного меньше 0.05, практически 0. Мы отклоняем нулевую гипотезу. Сначала смотрим, меньше ли 0.05, потом сравниваем средние или медианы. На несимметричных данных медиана значительно лучше отразит центральную тенденцию, чем обычное среднее.


A/B-тесты подразумевают два набора данных, поэтому тест нужно проводить для обоих выборок. Это не обязательно тест Шапиро-Уилка, это может быть и непараметрический ранговый U-критерий Манна-Уитни. Если данные непрерывные, то в простых случаях хорошо работают критерии Манна-Уитни/Краскела-Уоллиса, в которых нулевые гипотезы на сравнения распределений и медианы. Распределение 50 на 50 подразумевает использование формулы Бернулли, а может быть и Байесовский многорукий бандит. Если же использовалось сплит-тестирование, то нужно использовать непараметрический дисперсионный анализ — критерий Краскела-Уоллиса. Рассмотрим с примерами.

Критерий Байеса рекомендуется при большом количестве данных. Идея в получении 500 раз выпадение орла из 1000 бросаний монетки, и считается по формуле C500(1000) * 0.5^(500) * 0.5^(500), т.к. броски друг от друга никак не зависят. У Байаса всегда есть априорное распределение, а значит, нужно иметь свои представления о параметрах исследуемового процесса. Что, в принципе, является основой образа мышления дизайнера. Если по каким то причинам не нравится Байеc, то можно использовать Стьюдента или Бернулли для больших выборок.

Стьюдент. T-тест или определение t-критерия Стьюдента является простейшим способом проверки точности среднего значения для данных с естественными значениями. Выборки должны быть независимыми и нормально распределенными (чем больше результатов, тем ближе распределение к нормальному). Это гарантирует концентрацию плотности значений вокруг среднего значения, что позволяет делать выводы о генеральной совокупности, имея только информацию о выборке. Провести тест легко: x = rnorm(1000000) и y = rnorm(1000000). Команда t.test(x,y). Получаем следующие данные:

data: x and y
t = -1.1696, df = 2e+06, p-value = 0.2422
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.004424298 0.001117388
sample estimates:
mean of x mean of y 
-0.0007571144 0.0008963404

Видим p-value = 0.2422. Так как мы всегда обеспокоены тем, является ли p больше или меньше 0,05, то при 0.2422 > 0.05 есть основания не отвергать нулевую гипотезу. P-Value это достигнутый уровень значимости (пи-величина)—наименьшая величина уровня значимости, при которой нулевая гипотеза отвергается для данного значения статистики. По P-Value происходит проверки (и отклонения) «нулевой гипотезы». Чем меньше значение Р, найденное для набора результатов, тем меньше вероятность того, что результаты случайны. Результаты считаются «статистически значимыми», когда это значение ниже 0,05 (или 5%). Если удастся довести значение до 0,005, то уже хорошо, сильно уменьшится количество позитивных неправильных результатов. При 0,05 считается нормой 1/3 неправильных выводов. В идеальном мире даже 0,005 должно быть лишь приблизительной наводкой на финальное решение. В физике или при исследовании генов используется 0.0000003. Чем ниже значение p, тем выше перевес в пользу альтернативной гипотезы.

Следующий критерий, Манна-Уитни, позволяет протестировать, что результаты случайных наблюдений из одной группы могут быть выше, чем в другой. Это непараметрический критерий, альтернатива t-test, которому нужны нормально распределенные данные. Если нет информации о нормальности распределения, используем критерий Манна-Уитни, имея ввиду, что он не покажет тонких различий между выборками. Причина в том, что t-критерий работает на основе сравнения средних из фактических наблюдений, в то время как критерий Манна-Уитни использует сравнение рангов, что позволяет ему быть устойчивым к выбросам.

Используем команду wilcox.test(mpg ~ am, data=mtcars) получаем сообщение, “не могу подсчитать точное p-значение при наличии повторяющихся наблюдений”. Если вас смущает это сообщение, измените команду на wilcox.test(mpg ~ am, data=mtcars, exact=FALSE). Это объяснит программе, что мы все понимаем, и не ждем точного расчета p-value. Получилось W = 42, p-value = 0.001871. Напомню, P-Value должно быть не выше 0,05.

А теперь возьмем два набора наблюдений и протестируем:

a = c(123, 105, 147, 142, 119, 129, 130, 87 ,301, 92, 177, 141, 137, 112, 138, 128, 114, 197, 198, 210, 101, 125, 134, 214, 110, 100, 152, 122, 144, 148 ,153 ,212)
b = c(154, 512, 120 ,131 ,124 ,118 ,178 ,140 ,136, 68, 162, 127, 78 ,106, 133, 655 ,155 ,169 ,199 ,108 ,143, 341 ,121 ,139, 166, 174, 184, 98, 135, 132, 146, 209)
 wilcox.test(a,b)

На выходе получаем:

data: a and b
W = 455, p-value = 0.4507
alternative hypothesis: true location shift is not equal to 0

У нас есть наше любимое P-Value, которое куда больше, чем 0,05. Мы принимаем нулевую гипотезу. W является статистической статистикой Уилкоксона и, как следует из названия, является суммой рангов в одной из двух групп.

Если р < 0,05, то нулевая гипотеза про отсутствие отличий отвергается.

С Бернулли схожая история, берет два вида данных (орел/решка, мальчик/девочка, красное/черное). rbinom(200, size = 1, p = 0.68) где  1. Грубо говоря, rbinom скажет, сколько будет орлов, если сыграть определенное кол-во раз в монетку. Пример показывает сразу 200 испытаний Бернулли. Посмотрим, как мы можем сравнить два испытания Бернулли, т.к. данные очень похоже на результат бинарного A/B теста:

varA <- rbinom(200, 20, 0.5)
varB <- rbinom(200, 20, 0.25)

И используем hist(varB, probability = TRUE, col = gray(0.9)) для двух наборов данных. На графиках мы видим 200 биномиально распределенных случайных чисел для испытаний размером = 20 и с разной вероятностью возникнования интересующего нас события p = 0,25 и 0,50.

Процесс выглядит так: узнаем про выбросы с помощью boxplot, проверяем выборку на нормальность с помощью теста Шапиро Уилко, охарактеризовать распределение с помощью QQnorm, и выбрать метод анализа. Если данные нормальные, используем Бернулли, Гаусса, Стьюдента. Ненормальные (график сглажен по одной из сторон): Хи-квадрат, Байес, Пуассон.

 

Не только R

Сейчас любой аналитик (не важно, UX, бизнес, дашбордист, ресерчер, разработчик) должен уметь в R и Python. Но базовый навык работы в Excel по прежнему помогает быстро решать многие задачи. При работе над продуктом требуются быстрые выводы по популярным метрикам, dau/mau, конверсия в регистрацию, и показатели метрик часто меняются. Распространенная практика это использовать среднее для всех первичных KPI, если распределение нормальное. Это позволяет делать первичные выводы очень быстро. Понять тип распределение можно с помощью стандартного/среднеквадратичного отклонения. в Excel для этого используется функция =сроткл. Формула выглядит как STD=√[(∑(x-x)2)/n], и расшифровывается как корень из суммы квадратов разниц между элементами выборки и средним, деленной на количество элементов в выборке.

В примере выше видно, что, не смотря на практически одинаковые средние значения, видны огромные колебания данных вокруг среднего значения второго варианта. Первый вариант заслуживает больше доверия.

В Excel еще много замечательных способов визуализировать данные, особенно полезны сводные таблицы. Работают по принципу вирутальной группировки стрчоек с одинаковыми названиями товаров. Берется группа и считается для нее сумма, очень удобно. Такие таблицы используются для агрегирования данных и получения отчета.

Главное при проведении тестов это умение делать выводы из цифр, критически мыслить, делать выводы на основе исторических данных, генерировать гипотезы, рассуждать, чувство рациональности и нерациональности. Математический анализ лишь помогает не принять вымысел за правду, но окончательное бизнес-решение принимает по прежнему специалист.

12 комментариев

  1. Andrei Ivashkevich

    Здравствуйте, спасибо за статью. Есть ли способ легко уместить датасет в определенный диапазон?

    • Цветков Максим (Author)

      На примерах: создадим данные

      x <- rweibull(1000,2,66)

      Смотрим на гистаграмму, hist(x), данные не очень то нормальные. В данном искуственном случае требуется предварительно сделать логарифмирование. Или обрезать выбросы. При этом нужно понимать, что выбор способа трансформация зависит от типа данных и направления асимметрии.

      Можно усложнить себе задачу:

      x <- x-5
      x <- log10(x)
      x <- na.omit(x)

      Проверим plot(density(x)), данные сместились, теперь нормализация по Боксу-Коксу не сработает.

      Пару раз встречал решение вида g < - runif(x), не надо так делать, это генерация случайных данных. А вот что-нибудь вроде

      finalData <- (x - mean(x)) / sd(x)

      уже ближе к истине. Принцип: значение минус среднее значение и разделить на стандартное отклонение переменной. Результат будет иметь среднее value = 0 и sd = 1. Строим график qqnorm(finalData). Это стандартизация данных, т.к. преобразование данных, поэтому стандартное отклонение 1.

      Можно просто привести все цифры к диапазону от 0 до 1, возможно, вы это и имели ввиду.

      x <- (x - min(x)) / (max(x) - min(x))

      Также, распространенный способ это x[!x %in% boxplot.stats(x)$out], который также не меняет данные, но фильтрует.

  2. Даня

    Здравствуйте. Есть ли варианты выгрузить данные из GA напрямую, без CSV?

    • Цветков Максим (Author)

      Сначала нужно установить правильные библиотеки, install.packages("RGA") и install.packages("devtools"). И подключить library(devtools), library(RGA). Даем доступ к данным в GA authorize(username = "ваш gmail"), вас перебросит в браузер и будет сформирован код, который нужно будет вставить в R. Будет создано окружение .RGAEnv, которое не видно пользователям.

      В скриптах часто нужно прописывать проверку существования объекта:

      x <- NA

      и затем exists("x").

      list_profiles() позволит определить идентификатор профиля, с которым вы планируете работать. И можно потестировать работу командой get_ga(), которая выдаст информацию вида users 333/sessions 486/pageviews 1505 по первому найденному profileId. Подробный хелп будет по команде browseVignettes(package = "RGA").

      И финальная команда,

      ga_data <- get_ga(
          profileId = "ga:xxxxxxxx",
          start.date = "2017-04-15",
          end.date = "yesterday",
          metrics = "ga:visits,ga:users", 
          dimensions = "ga:source",
          segment = "",
          filter = "ga:medium==organic"
      )

      Запросы можно формировать сколько угодно сложные, т.к. API очень хорошее.

      ga_data <- get_ga(profileId = "ga:xxxxxxxx", 
                        start.date = "2018-10-08", 
                        end.date = "yesterday",
                        metrics = "ga:sessions", 
                        dimensions = "ga:date",
                        filters = "ga:sessions > 0")

      Работать с регулярными выражениями

      ga_data <- get_ga(profileId = "ga:xxxxxxxx", 
                        start.date = "2016-01-01", 
                        end.date = "yesterday",
                        metrics = "ga:sessions", 
                        dimensions = "ga:keyword",
                        filters = "ga:keyword != (not provided) 
                        && ga:keyword != (not set) 
                        && ga:keyword != (other)",
                        sort = "-ga:sessions")

      И потом это все легко визуализируется

      install.packages("ggplot2")
      library(ggplot2)
      ggplot(ga_data, aes(date, sessions)) + geom_line()
      • Артём Клевцов

        Спасибо, я пытался по одной статье делать, не получалось, ваш пример сработал. Буду разбираться дальше. Мне выпало очень много результатов not provided, что это такое?

        • Цветков Максим (Author)

          Большое количество not provided встречается при большом количестве органического трафика. т.к. речь только об органическом трафике, проплаченный трафик Adwords будет показывать слова в PPC.
          Можно с помощью фильтра извлечь все «not provided», это поможет понять, откуда шел трафик.

          Еще можно настроить фильтры таким образом, чтобы было видно, на какие страницы приходят пользователи из not provided.

          В Google Search Console также много ключевых слов, и в нее можно дозагрузить слова из метрики.

  3. Денис Ильин

    Есть ли способ красиво выстроить по возрастающей диапазон дат?

    • Цветков Максим (Author)

      Первое, что приходит на ум:

      setDataYears <- c("1860:2019")
      newData = eval(parse(text=setDataYears))
      plot(newData, edge.arrow.size=.4,vertex.label=NA)
      plot(x=1:160, y=1:160, pch=18, cex=5, col=rainbow(newData))

      А как украсить, тут довольно субъективный вопрос, что такое красиво. Попробуйте использовать библиотеку для красивых цветов:

      install.packages("RColorBrewer")
      library(RColorBrewer)
      display.brewer.all()

      После того, как выберите подходящие вам цвета, используйте следующую команду. Я добавил немного случайности порядку данных:

      newData <- sample(newData)
      colorsSet <- brewer.pal(12, "Paired")
      plot(newData, pch=19, cex=6, col=colorsSet)

  4. Max Proskin

    Для использования Фишера и Хиквадрата на матрицу данных из двух наблюдений требуется много или мало данных? Если данные из опросника и содержат данные для метрик типа SUS SUM. И как лучше визуализировать такого рода данные?

    • Цветков Максим (Author)

      Сгенерируем матрицу распределения двумерных данных: matrixData = matrix(1:9,800,2). Функция берет вектор и преобразовывает в матрицу с колонками. Предположу, что наблюдения являются независимыми и мы можем смело использовать Хи-квадрат или Фишера. Возьмем Хи-квадрат для проверки нормальности распределения данных chisq.test(matrixData). RStudio предупредит о возможной некорректности результатов, потому что хи-квадрат плохо работает, если числа небольшие.

      Возьмем другую матрицу данных: matrixData = matrix(1:5,6,2). Запускаем тест Фишера: fisher.test(matrixData). Фишер это F-тест для сравнения дисперсий двух и более генеральных нормально распределенных небольших по объему данных. Не содержит правила, что p-value должно быть фиксированным значением для принятия нулевой гипотезы. Или критерий хи-квадрат Пирсона с коррекцией непрерывности Йейтса chisq.test(matrixData, simulate.p.value = TRUE). Симуляции нужны для нахождения P-value, позволяет не полагаться на приближение хи-квадрата к распределению тестовой статистики, и ищет p-value точнее за счёт применения генератора случайных чисел. Видно, что полученный P-value 0.6436 намного больше, чем 0.05, значит, выборка не противоречит нулевой гипотезе.

      Основная проблема в том, что нельзя доверять такому малому кол-ву данных. Выводы можно делать, только если в каждой колонке сотни или тысячи наблюдений.

      Для визуализации подойдут коррелограммы/хитмапы.

      install.packages("corrplot")
      m <- matrix(seq(-1,1,length.out=9),nrow=3)
      corrplot(m, method = "pie")

      Можно получить очень красивые графики:

      K <- matrix(runif(48),2,24)
      corrplot(K, method = "pie")

  5. Виктор

    Не могу настроить прокси на Mac под R.

    • Цветков Максим (Author)

      Заходите в Chrome по адресу chrome://net-internals/#proxy, видите адрес типа script:http://wpad/wpad.dat , открываете и видите свой прокси.

      В терминале для включения прокси:
      export http_proxy=http://address.ru:8080
      export HTTP_PROXY=http://address.ru:8080

      Можно с именем и паролем:export http_proxy='http://username:password@address.ru:port/'
      Отключить можно командой: export http_proxy=''

      Далее в RStudio: Sys.setenv(http_proxy="http://address.ru:8080")
      Для удаления созданного окружения в R: Sys.unsetenv
      Проверить, что мы насоздавали: Sys.getenv("http_proxy")

      Еще одно решение это установить cntml: brew install cntlm.

«Взаимодействуя с данным сайтом, вы, как пользователь, автоматически даете согласие согласие на обработку персональных данных» Согласие

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.