10

我正在为 Google Analytics Content Experiments 使用 Javascript API,您似乎有两种选择:

  1. 一次运行一项实验并让 Google 分配您可以使用的变体chooseVariation(),或者
  2. 一次运行多个实验并使用自己分配变体setChosenVariation()

(1) 让谷歌控制分配给每个变体的用户数量,这是我需要的,但我有几个实验。这似乎很基本。我错过了什么?

4

4 回答 4

19

我不认为你缺少任何东西。我的理解是,GA Experiments API 允许您使用选择变化命令将访问者分配给单个 A/B/N 测试的任何版本:

cxApi.chooseVariation();

但是,只有在页面加载 api.js 时指定了实验 ID,才能使用此功能。

如果您想做的是同时在一个页面上运行多个 A/B 测试,这实际上是多变量测试,不幸的是,这在 GA 内容实验中“开箱即用”不可用(它以前可通过 Google 网站优化器使用)。您仍然可以使用自己的存储桶“伪造”它,代码如下:

<!-- 1. Load the Content Experiments JavaScript Client -->
<script src="//www.google-analytics.com/cx/api.js"></script>

<!-- 2. See if the visitor has seen an experiment already -->
<script>
// loop through all active experiments server-side. 
cxApi.getChosenVariation(
 $experimentId
 );

<!-- 3. Bucket the visitor if he isn't bucketed already -->
// loop through your live experiments 
  cxApi.setChosenVariation(
    $chosenVariation,             // The index of the variation shown to the visitor
    $experimentId                 // The id of the experiment the user has been exposed to
  );
</script>

您需要决定是希望访问者一次只查看一个实验还是同时输入多个实验。

第一个选项可能更可靠,但意味着您必须将访问者分成很多桶,这意味着您的测试需要很长时间才能返回结果。

如果您使用第二个选项,则需要小心:如果您的实验不是独立的,您将无法信任来自 Google Analytics 的测试结果,因为内容实验中使用的统计测试假定独立。即使您的实验是独立的,您也需要在所有变体组合中进行平均分配。

我希望这会有所帮助!

于 2013-05-13T14:19:07.097 回答
2

我使用 node.js 脚本解决了这个问题。

开箱即用的 Google 内容实验让您可以选择:

  • 加载仅针对 1 个实验修补的 cxApi
  • 加载 cxApi plain,并失去调用 chooseVariation() 函数的能力,使您实现自己的选择算法(这很遗憾,因为谷歌的多臂老虎机想法非常聪明)。

因此,我对如何为 1 个实验修补 google cxApi js 进行了一些逆向工程,结果证明它只是将实验信息(变化权重)捆绑在文件中间,我尝试手动触摸捆绑包添加多个实验,并且现在我可以cxApi.chooseVariation(experimentId)为每个实验打电话了,而且效果很好!

权重每 12 小时更改一次,因此我将其自动化,我创建了一个 node.js 小应用程序,该应用程序将从谷歌下载 cxApi,然后为您指定的每个实验重复下载它,并为您的所有实验修补一个 cxApi。

瞧!,在任何页面上进行多次实验。

这是回购:https ://github.com/benjamine/mutagen ,随意分叉

这个 node.js 应用程序将为多个实验修补 cxApi,并且还将打包(和缩小)您的变体

于 2014-02-20T00:36:00.677 回答
2

当同时运行多个实验时,问题是如果您的一个实验的访问者与您网站上运行的另一个实验的元素进行交互,那么很难考虑这些交互影响。这会扭曲您的数据并导致一些错误的结论。如果您对如何分析多个并发实验绝对有信心,那么安全并一次运行一个实验是可以的。

于 2013-05-09T09:35:55.577 回答
2

This solution works very well for me. The benefits are:

  • no node.js required
  • no changes to site needed - site remains fully cacheable
  • Google Multi-Armed-Bandit approach used, no patch
  • easily maintainable

Javascript Module providing all functionality for executing multiple Google Experiments:

var runExperiment = (function(jQ) {

    var apiUrl = '/ga-experiments-api.php?preview=true&experimentId=',
        experimentId,
        variations;

    var chooseAndApplyNewVariation = function() {
        if (typeof jQ !== 'undefined') {
          jQ.ajax({
              type: 'get',
              url: apiUrl + experimentId,
              success: function(data, status){
                  var choosenVariation = data.choosenVariation;

                  if (typeof choosenVariation !== 'undefined' && choosenVariation >= 0) {
                      cxApi.setChosenVariation(choosenVariation, experimentId);
                      applyVariation(choosenVariation);
                  }
              }
          });
        }  
    };

    var applyVariation = function(chosenVariation) {
        var variationFunction = (typeof variations[chosenVariation] === 'function') ? variations[chosenVariation] : false;

        if (variationFunction) {

            variationFunction.apply();
            sentGaEvent();
            console.log(experimentId, chosenVariation);
        }
    };

    var sentGaEvent = function() {
        if (typeof ga !== 'undefined') {
            ga('send', 'event', 'experiment', 'view');
        }
    };

    return function(experiment) {
        experimentId = experiment.id;
        variations = experiment.variations;

        if (typeof cxApi !== 'undefined') {

            var chosenVariation = cxApi.getChosenVariation(experimentId);

            if (chosenVariation >= 0) {

                applyVariation(chosenVariation);

            } else {

                chooseAndApplyNewVariation();
            }
        }
    };
})(jQuery);

Javascript Snippet for running single experiment - can be integrated multiple times on page:

(function(jQ) {
    var experiment = {
        'id': 'RHwa-te2T_WnsuZ_L_VQBw',
        'variations': [
            function() {},
            function() {
                jQ('#nav #menu-item-2000927 a').text('Shop + Abo');
            }]
    };

    runExperiment(experiment);
}(jQuery));

PHP (API) for generating new variations through Google's API, I used this class:

https://github.com/thomasbachem/php-gacx

<?php

use UnitedPrototype\GoogleAnalytics;

require_once dirname(__FILE__) . '/libs/googleAnalytics/Experiment.php';

$experimentId = (!empty($_GET['experimentId'])) ? $_GET['experimentId'] : null;

$returnData = array(
    'experimentId' => $experimentId,
);

try {
    $experiment = new GoogleAnalytics\Experiment($experimentId);

    $variation = $experiment->chooseNewVariation();

    if (is_integer($variation)) {

        $returnData['success'] = true;
        $returnData['choosenVariation'] = $variation;
    }

} catch (Exception $exception) {

    $returnData['success'] = false;
    $returnData['error'] = $exception;
}

header('Content-Type: application/json');

echo json_encode($returnData);
于 2014-06-03T13:34:51.680 回答