Skip to content

Instantly share code, notes, and snippets.

@parkjinwoo
Created December 3, 2014 12:35
Show Gist options
  • Save parkjinwoo/e1a42dace50699034397 to your computer and use it in GitHub Desktop.
Save parkjinwoo/e1a42dace50699034397 to your computer and use it in GitHub Desktop.
A/B Testing

고객을 어떻게 나눌까?

  • 가령 운영중인 사이트가 **고객고유번호(user_id)**를 임의의 정수로 관리되고 있는 상태다.
  • 상품 소개 화면에서 구매버튼을 누르면 결제화면으로 넘어가는데,
  • 버튼 색깔에 변화를 줘서 테스트 하고 싶다.
  • 10%의 사용자에게는 빨간버튼을 보여주고,
  • 또 다른 10%의 사용자에게는 파란버튼을 보여주고,
  • 나머지 사용자에게는 원래버튼을 보여주고 싶다. 고객을 어떻게 나눌까?
  • **고객고유번호(user_id)**를 10으로 나눈 나머지는 0부터 9까지다.
  • 이 나머지 값이 같은 사용자끼리 같은 그룹으로 묶는다. 그룹0, 그룹1, ..., 그룹9.
  • 그룹0은 테스트 A로 그룹1는 테스트 B로 지정하고 싶다고 가정하자.
def ab_test_target:
  group = user_id % 10
  if group == 0:
    return 'A'
  elif group == 1:
    return 'B'
  else:
    return 'C'

트래킹은 어떻게 할까?

  • 사용자의 액션을 tracking 할 수 있는 환경이 필요한데,
  • 보통 특정 서버에 로그를 남긴다.
function tracking(params) {
  var i = new Image();
  i.src = 'http://tracking.example.com/beacon.gif' +
    '?uid' + params.user_id + '&grp=' + params.group + '&page' + params.page;
}
  • 그룹별로 분기처리하여 콘텐츠를 보여주고 그에 따른 트래킹 코드를 심는다.
<!-- 상품소개화면 -->
<p>
  <img src="상품_이미지.jpg" alt="상품 이미지" />
</p>

{% if ab_test_target is 'A' %}
  <button>빨간구매버튼</button>
{% elif ab_test_target is 'B' %}
  <button>파란구매버튼</button>
{% else %}
  <button>원래구매버튼</button>
{% endif %}

<script>
  var user_id = {{ user.id }},
      group = {{ ab_test_target }};
  tracking({user_id:user_id, group:group, page:'view'});  
</script>
<!-- 결제화면 -->
<p>
  <button>결제버튼</button>
</p>

<script>
  var user_id = {{ user.id }},
      group = {{ ab_test_target }};
  tracking({user_id:user_id, group:group, page:'pay'}); 
</script>

모든 뷰에 대해 그냥 퉁친다면

  • count(*).where(grp='A', page='view') => viewA
  • count(*).where(grp='B', page='view') => viewB
  • count(*).where(grp='A', page='pay') => payA
  • count(*).where(grp='B', page='pay') => payB

한 사용자가 여러번 본 것에 대한 중복을 제거하고 싶다면

  • count(distinct uid).where(grp='A', page='view') => viewA
  • count(distinct uid).where(grp='B', page='view') => viewB
  • count(distinct uid).where(grp='A', page='pay') => payA
  • count(distinct uid).where(grp='B', page='pay') => payB

빨간버튼과 파란버튼 중 상대적으로 구매를 많이 유도하는 것은

  • payA / viewApayB / viewB 를 비교하여 높은 것이라고 할 수 있을까?

A/B 테스팅 전문 도구를 쓰면

  • 트래킹 코드 심고 분석하는 과정이 좀 더 편해진다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment