如何为多个内容实验选择变体?

时间:2013-04-24 00:11:44

标签: google-analytics content-experiments

我正在使用Javascript API进行Google Analytics内容实验,看起来您有两种选择:

  1. 一次运行一个实验并让Google分配变体,您可以使用chooseVariation()
  2. 获取变体
  3. 一次运行多个实验,并使用setChosenVariation()
  4. 自行分配变体

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

4 个答案:

答案 0 :(得分:19)

我认为你没有遗漏任何东西。我的理解是GA实验API允许您使用Choose Variation command将访问者分配到单个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的测试结果,因为内容实验中使用的统计测试会假设独立性。即使您的实验是独立的,您也需要在所有变异组合中进行相等的分割。

我希望有所帮助!

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

  • 仅为1次实验加载cxApi补丁
  • 加载cxApi plain,并失去调用chooseVariation()函数的能力,让你实现自己的选择算法(这是一种耻辱,因为谷歌的多臂强盗想法非常聪明)。

所以我做了一些关于google cxApi js如何修补1个实验的逆向工程,它发现它只是将实验信息(变量权重)捆绑在文件的中间,我尝试手动触摸捆绑包添加多个实验,现在我可以为每个实验调用cxApi.chooseVariation(experimentId),并且效果很好!

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

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

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

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

答案 3 :(得分:2)

这个解决方案对我来说效果很好。好处是:

  • 没有node.js需要
  • 不需要更改网站 - 网站仍可完全缓存
  • 使用了Google Multi-Armed-Bandit方法,没有补丁
  • 易于维护

Javascript模块提供执行多个Google实验的所有功能:

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代码段 - 可以在页面上多次集成:

(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));

用于通过Google API生成新版本的PHP(API),我使用了这个类:

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);