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

10
我正在使用Google Analytics内容实验的Javascript API,看起来你有两个选择:
  1. 一次只运行一个实验,并由Google分配变量,您可以使用chooseVariation()获得该变量;或者
  2. 同时运行几个实验并自行分配变量,使用setChosenVariation()
(1) 让 Google 控制分配给每个变量的用户数量,这正是我需要的,但我有多个实验。这似乎非常基础,我错过了什么吗?

你是想达到特定目的吗?还是只是想好奇用GA内容实验JS API有哪些可能性? - nt_1
@nt_1 我的老板有十几个实验想要进行,而且很多还需要同时进行。如果我们能够从GA控制这些实验的话,会更好。 - Michael Lorton
4个回答

19

我认为你没有漏掉任何内容。我的理解是,GA实验API允许您使用“选择变体”命令将访问者分配给单个A/B/N测试的任何版本:(参见此处)

cxApi.chooseVariation();

然而,仅当您在页面上加载api.js时指定实验ID时,此功能才可用。
如果您想在同一页上同时运行几个A/B测试,则这实际上是多变量测试,不幸的是,在GA内容实验中,这不是带有“开箱即用”功能。您仍然可以使用自己的桶分配来“伪造”它,使用以下代码:
<!-- 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中的测试结果,因为Content Experiments中使用的统计测试假定独立性。即使您的实验是独立的,您仍需要在所有变化组合中均匀分配。

希望这可以帮助到您!


1
谢谢,这正是我正在做的事情,但我感到很愚蠢,因为它似乎像是在重新发明轮子。我们一直在进行粗略的多元测试:随机分配相等的拆分,并仅测试(显然)不相关的UI部分。 - Michael Lorton
1
有人可以提供一个完整的示例代码吗?我猜nt_1提供的代码只是方向性的,需要完成/修改才能使其工作,对吗?我在另一个问题中询问了这个(http://stackoverflow.com/questions/23524229/run-multiple-simultaneous-tests-with-google-content-experiments-api),但到目前为止还没有答案。 - migueltic
但是如果您不知道可供选择的变体总数,那么如何在setChosenVariation()中设置$chosenVariation呢? - Jake Wilson

2

这个解决方案对我非常有效,其优点如下:

  • 无需node.js
  • 不需要更改站点 - 站点仍然可以完全缓存
  • 使用Google多臂赌博方法,无需打补丁
  • 易于维护

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

1
嗨Migueltic,抱歉我回复晚了。PHP代码需要放入一个单独的PHP文件(ga-experiments-api.php),该文件应该在您的documentRoot中某个可访问的位置 - 这将作为API,Javascript通过ajax调用此文件。 Javascript模块需要在您的html文件(头部!)中包含,之后您需要包含www.google-analytics.com/cx/api.jsJavascript片段可以放在包含Javascript模块之后的任何位置。 - HKandulla
希望能帮到你。如果不行,请告诉我! - HKandulla
是的,请上传这个类 https://github.com/thomasbachem/php-gacx 并将其包含在您自己的 API 中(如上所述的 PHP 脚本)- 我称之为 ga-experiments-api.php。当您在浏览器中像这样调用它时,您的 API 应该可以工作 /ga-experiments-api.php?experimentId。实验 ID 需要有效。 - HKandulla
我认为我已经正确地按照步骤操作了,但是对我来说根本不起作用(测试变量从未显示,GA在实验仪表板中也没有注册任何会话)。如果您能快速查看一下我的网站源代码(http://www.efetic.com/),看看我做错了什么,请?再次感谢! - migueltic
我查看了你的网站。ga-experiments-api.php没有正确连接到GA。它返回:{"experimentId": "nKELe64ZRXKgv7umRLN11Q", "success": false, "error": {}}。不幸的是,"$returnData ['error'] = $exception;"没有返回实际的异常,所以我无法看到实际的问题所在。你需要调试PHP脚本 - 只需通过此URL调用它:/ga-experiments-api.php?experimentId=nKELe64ZRXKgv7umRLN11Q并输出/调试Try-Clause内的变量($experiment,$variation)。这应该能让你知道问题出在哪里。 - HKandulla
显示剩余5条评论

2
同时运行多个实验时的问题在于,如果您有来自一个实验的访问者与正在运行于您网站上的另一个实验中的元素进行交互,那么很难考虑这些交互效应。这将扭曲您的数据并导致一些错误的结论。如果您绝对有信心分析多个并行实验,那么可以同时运行一个实验,否则最好安全起见逐个运行实验。

1
不需要解释为什么我实际上想要做的事情是不应该做的,但还是谢谢。 - Michael Lorton

2

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

Google Content Experiments默认情况下让你选择:

  • 仅为1个实验加载cxApi补丁
  • 加载普通的cxApi,并失去调用chooseVariation()函数的能力,使您必须实现自己的选择算法(这很遗憾,因为Google的多臂赌博机想法真的很聪明)。

因此,我对google cxApi js进行了一些反向工程,发现它只是将实验信息(变化权重)捆绑在文件中间。 我手动操作该包添加了多个实验,现在我可以为每个实验调用cxApi.chooseVariation(experimentId),效果很好!

权重每12小时更改一次,所以我将其自动化了。我创建了一个node.js小应用程序,用于下载来自Google的cxApi,然后针对您指定的每个实验重复下载并修补具有所有实验的cxApi。

万事大吉!任何页面上都可以进行多个实验。

这是repo: https://github.com/benjamine/mutagen,欢迎fork

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接