拆分测试

作者: Reuven Lerner

很多人访问您的网站固然好。如果人们不仅访问您的网站,而且还喜欢您的内容,那就更好了。但是,最好的是当您网站的访问者做您希望他们做的事情时——注册您的新闻通讯、注册您的 SaaS 应用程序或购买您的产品。

访问者成为客户的比率称为“转化率”,这可能是网络业务的首要任务。如果您可以将 10% 的访问者转化为客户,那么您做得比可以将 5% 的访问者转化为客户的人好两倍。

是什么导致人们更频繁地转化?这是一个我仍在学习答案的问题,整个互联网营销人员和“转化优化”专家行业也是如此。问题是,通常很难知道什么会奏效。您应该使用绿色按钮还是红色按钮?您的标题应该是问题还是陈述句?

检查文案效果最流行和有效的方法之一是进行“拆分测试”,有时也称为“A/B 测试”。虽然我多年前就听说过 A/B 测试,但我直到最近才真正开始应用它。

在本文中,我描述了一种在您的网页上运行拆分测试的简单方法。我在此处展示的示例是用 Ruby 编写的,但是有很多不同语言的 A/B 测试库。也有第三方企业可以帮助您进行 A/B 测试,无论是在您自己的网站上还是在您的邮件列表、潜在客户页面和其他产品上。

一切都与转化有关

当您进行拆分测试时,要记住的最重要的事情是您试图让用户做某事。那件事是什么取决于您的网站。亚马逊的目标是让您购买商品。谷歌的目标是让您点击广告。邮件列表订阅表单的目标是让人们注册。

一旦访问者实现了您的目标,他们就被“转化”为客户。目标是增加此类转化的数量——为您带来更多客户、订阅者或系统用户。拆分测试的关键见解是,通过更改页面的文本、图形甚至布局,转化的数量也会发生变化。问题是,您的各种想法中哪一个效果最好?

拆分测试使用科学方法,并以简单的统计数据为后盾,试图回答这个问题。在科学中,您可以使用对照和实验来检验假设。拆分测试的工作方式相同。您采用现有的文本和备用文本,并将它们展示给您的用户。其中一个可能会比另一个效果更好。您分析数据以了解哪个效果更好,然后使用最好的那个。然后您重新开始,尝试通过拆分测试找到另一个改进。

为了使拆分测试有效,您需要做几件事

  • 定义什么算作转化。这通常用用户到达网站上的特定页面来描述,例如成功销售后出现的“感谢”页面。

  • 定义对照文本和备用文本。

  • 等待足够的用户看到两者。

  • 分析数据。

介绍 Split

本专栏的常客都知道,我倾向于使用 Ruby on Rails 进行大部分 Web 开发工作。Rails 不是唯一用 Ruby 编写的 Web 框架,尽管它肯定是使用最广泛的。所有现代基于 Ruby 的 Web 框架都使用“Rack”与调用它们的 HTTP 服务器软件进行通信。这类似于 Python 世界的 WSGI。在两种情况下,其思想是 HTTP 服务器不需要过多地了解 Ruby 或 Python 应用程序(或框架),反之亦然。这意味着知道如何使用 Rack 的库可以与任何框架一起使用,而不仅仅是 Rails。在 Ruby 的特定情况下,Rack 敏感的 gem 因此可以与 Rails、Sinatra 或任何其他遵循 Rack API 的东西一起使用。

Split gem 由 Andrew Nesbitt(和许多贡献者)编写,是这样一个代码包,能够为任何兼容 Rack 的应用程序服务器提供拆分测试执行和分析。它基于许多早期的拆分测试 gem,包括 Patrick Mackenzie 著名的 A/Bingo gem。Split 背后的想法是,您确定您的转化目标,自动尝试用户上的两个或多个变体,收集有关其中哪些实际设法实现更多转化的统计数据,然后再次开始测试。

Split 为您处理了大部分工作,使您可以专注于您想要更改的网站部分,而不是设置实验和报告结果的机制。Split 还实现了一些功能,以确保您结果的统计效力。例如,它一次只会让每个参与者参与一个实验,并且只有在至少 30 人看过之后才会比较结果。当然,这些选项是可以更改的,但对于您想要运行的大多数基本测试来说,默认值已经足够好了。

您可以像安装任何其他 Ruby gem 一样安装 split


gem install split -V

请注意,我使用 rvm,即 Ruby 版本管理器,它允许我在任何给定时间使用多个 Ruby 版本。使用 rvm 的一个副作用是 gem 安装在我自己的主目录中,而不是在系统上。因此,我不需要在 gem 命令前加上 sudo;根据您的系统配置,您可能需要这样做。

安装 gem 后,您还需要安装并启动 Redis,这是一种非常快速且流行的键值存储。多年来,我在许多项目中使用过 Redis,并且我一直对它在缓存方面的实用性感到惊讶。在 Split 的情况下,Redis 用于跟踪您正在运行的实验。您可以通过执行以下命令启动 Redis


redis-server
运行拆分测试

现在您已经安装了 gem 和 Redis,您就可以执行一些实验了。让我们使用 Sinatra 创建一个简单的网站,其中页面显示一个链接。虽然 Sinatra 以简单和允许您创建单页应用程序而闻名,但我通常倾向于使用包含多个文件的配置:应用程序本身、Rack 配置文件 (setup.ru) 和 Gemfile(用于列出我想使用的所有 Ruby gem)(通过“Bundler”管理 gem)。这些在列表 1、2 和 3 中显示。

列表 1. linksplit.rb,主 Sinatra 应用程序

#!/usr/bin/env ruby

class LinkSplit < Sinatra::Base
  enable :sessions
  helpers Split::Helper

  get '/foo' do
    erb :foo
  end

  get '/bar' do
    finished('click_text')
    erb :bar
  end
end
列表 2. config.ru,LinkSplit 的 Rack 配置文件

Bundler.require

require './linksplit.rb'
require 'split/dashboard'

run Rack::URLMap.new("/" => LinkSplit.new,
                     "/split" => Split::Dashboard.new)
列表 3. Gemfile,由 Bundler 使用

source 'https://rubygems.org.cn'

gem "sinatra"
gem 'split', github: 'andrew/split'

让我们简要回顾一下它们。setup.ru 文件是 Rack 运行您的应用程序的方式。如果您想在没有任何外部 HTTP 服务器的情况下运行应用程序,您可以使用 rackup 命令


rackup config.ru

然后,Rack 将运行一个 HTTP 服务器(默认为 Ruby 自带的内置 WEBrick 服务器),充当服务器和您的应用程序之间的粘合剂。config.ru 基本上引导您的应用程序,加载 Gemfile 中列出的 gem(感谢 Bundler),然后加载您的应用程序和运行 Split 仪表板所需的特殊代码。

然后您做一些有趣的事情。您不是简单地运行您的应用程序,而是告诉 Rack 它应该将请求路由到不同的位置。任何以 / 开头的内容都应该转到 LinkSplit.new,这意味着 Sinatra 应用程序的新实例。但是,任何以 /split 开头的内容都将路由到一个完全独立的 Sinatra 应用程序 Split::Dashboard.new,它是 Split gem 的一部分。

Sinatra 应用程序定义了两个不同的 URL,这两个 URL 都可以通过 HTTP GET 请求访问。第一个 /foo 显示 foo.erb 文件(位于 views/foo.erb 中)的内容,如列表 4 所示。虽然表面上看,此文件与任何其他 ERb(嵌入式 Ruby)文档没有什么不同,但它包含拆分测试的明显标志


<% ab_test("click_text", "Click on me!", 
 ↪"Click here!") do |click_text| %>
    <%= click_text %>
<% end %>

ab_test 方法,由以下行加载


helpers Split::Helper

在 linksplit.rb 中,一次执行多项操作:它定义了一个拆分测试(第一个参数),并提供了您感兴趣测试的两个替代方案。在本例中,您可以看到您正在测试“Click on me!”(对照)的转化率是否比“Click here!”(实验)更高。然后,您将一个块传递给 ab_test 方法。该块可以包含您想要的任何文本,并且可以任意长或短。要认识到的关键是块参数(在本例中为 click_text)将包含两个文本字符串之一。

列表 4. views/foo.erb

<html>
  <head>
    <h3>Foo</h3>
  </head>
  <body>
    <h1>Foo</h1>
    <p>
      <a href="/bar">
        <% ab_test("click_text", "Click on me!", 
         ↪"Click here!") do |click_text| %>
          <%= click_text %>
        <% end %>
      </a>
    </p>
  </body>
</html>

因此,上面的拆分测试将比较两个不同链接的功效。但是,您可以轻松地切换 HTML 标记的类(从而给出不同的样式,包括颜色和字体)、不同的位置、添加图片或任何其他内容。

一旦到位,Split gem 将生成一个实验,向您的每个用户显示这些文本字符串之一。通常,您会希望平等地展示它们。有一些方法可以更改比例,以便您仅向一小部分用户展示您的实验文本。

但是,仅显示这些不同的文本还不够。您还需要能够告诉 Split 访问者何时“转化”——也就是说,何时他们实现了您设定的目标。在这种特定情况下,您想知道哪个文本在让用户点击链接方面更有效。因此,您应该在用户点击链接时向 Split 报告转化。换句话说,在 Sinatra 应用程序的 “/bar” 方法处理程序中,您调用 “finished” 方法,并将您要指示已完成的实验名称传递给它


finished('click_text')

一旦您进行了拆分测试,您就可以坐下来等待用户访问您的网站。有些人会得到第一个测试,有些人会得到第二个测试。您如何知道哪个更有效?通过使用 Split 仪表板,当您为 Rack 设置路由时,您已将其连接到 /split。它将显示响应您的每个实验文本的用户的百分比,因此您可以看到哪个更有效。Split 还会告诉您它对本次测试结果的信心。一般来说,您测试的人越多,您对结果就越有信心。但是,统计数据也表明,即使是(令人惊讶的)小样本量也可以为您提供有趣且有意义的结果。

仪表板在几个方面很有用。首先,它允许您查看您的各种实验,查看有多少人正在查看您的每个实验文本,以及有多少人完成和未完成测试。它还允许您在检查数据后永久使用两个实验文本之一。这在几个方面很有用。这意味着非程序员可以控制和决定每个文本。但是,这也意味着您不必在实验结束后回到代码中并删除您的实验。您可以花一些时间,让 Split 系统为您处理。您还可以重置统计数据,让您可以尝试新想法或抛弃旧想法。

结论

拆分测试是一个强大的工具,可以帮助确保实现您的目标——无论这些目标是在线销售商品还是仅仅让人们注册您的邮件列表。Split gem 可与任何基于 Rack 的网站配合使用,并且它使实施和然后对您的优化实验采取行动变得非常容易。我鼓励您在您自己的 Web 应用程序上尝试一些实验,看看是否可以找到让您的用户转化为客户的方法。如果是这样,祝贺您!您已经发现,现代在线营销既需要了解编程,也需要了解客户。

资源

此处描述的 Split gem 位于 https://github.com/andrew/split。如本文所示,Split 可与任何基于 Rack 的 Web 应用程序配合使用,这基本上意味着 Ruby on Rails 和 Sinatra。

您可以在 https://sinatra.ruby-lang.org.cn 上阅读有关 Sinatra 的更多信息。

A/Bingo gem 的作者 Patrick Mackenzie 撰写了大量关于转化优化的文章。您可以在 http://www.kalzumeus.com 上阅读他关于该主题的文章。特别是,在他的“最受欢迎”页面上查找“转化优化”标题。

Reuven M. Lerner 是一位资深的 Web 开发人员,提供 Python、Git、PostgreSQL 和数据科学方面的培训和咨询服务。他撰写了两本编程电子书(Practice Makes Python  和  Practice Makes Regexp),并为程序员发布免费的每周新闻通讯,网址为 http://lerner.co.il/newsletter。Reuven 在 Twitter 上发推文 @reuvenmlerner,与妻子和三个孩子住在以色列的莫迪因。

加载 Disqus 评论