본문으로 건너뛰기
LinkProfit

링크 로테이터와 스스로 최적화하는 분할 테스트

LinkProfit Team읽는 데 12분
  • ab-testing
  • link-rotator
  • analytics
이 페이지의 목차

기능 목록에서 거의 똑같아 보이지만 전혀 다른 질문에 답하는 기능이 둘 있습니다. 로테이터는 단축 링크 하나의 트래픽을 여러 목적지에 나누어 보냅니다. A/B 테스트는 트래픽을 변형들 사이에 나누고 어느 쪽이 더 나았는지 알려 줍니다. 둘 다 링크 하나 뒤에 주소를 여럿 두지만, 측정인 것은 그중 하나뿐입니다.

이 글은 둘이 실제로 갈라지는 지점, 각각에서 가중치가 어떻게 움직이는지, 한 방문자를 한 목적지에 붙들어 두는 일이 왜 분배 자체보다 중요한지, 상태 점검이 무엇을 알아낼 수 있고 무엇을 알아낼 수 없는지, 자동 가중치 재계산이 어떻게 동작하며 왜 이르게 움직이기를 거부하는지, 그리고 언제 더 단순한 도구가 맞는 선택인지를 다룹니다.

로테이터는 운영 도구이고, 분할 테스트는 측정입니다

이 구분은 학술적인 것이 아닙니다. 어떤 동작을 거저 얻고 어떤 동작을 여러분이 따로 만들어 둘러싸야 하는지가 여기서 갈립니다.

| | 목적지 로테이터 | A/B 분할 테스트 | | --- | --- | --- | | 목적 | 목적지가 바뀌어도 주소 하나를 계속 살려 두기 | 목적지를 비교하고 결정하기 | | 가중치 | 상대적이며 값은 자유 | 합이 정확히 100인 정수 | | 선택지 묶음 | 계속 바뀌며 최대 20개 | 테스트 기간 내내 고정 | | 선택지별 제한 | 클릭 상한, 기간 창, 국가와 기기 조건 | 없음 — 변형은 그냥 변형 | | 고장 처리 | 응답하지 않는 목적지를 자동으로 제외 | 해당 없음 | | 끝나는 방식 | 끝나지 않고 계속 돌아감 | 승자, 또는 솔직한 “아직 아니다” |

로테이터가 제 몫을 하는 곳은 주소가 고정된 쪽이고 목적지가 움직이는 쪽일 때입니다. 오퍼 세 개보다 오래 살아남을 인쇄된 코드, 프로필 소개의 링크, 광고주가 매주 소재를 갈아 끼우는 제휴 매체의 자리가 그렇습니다. 분할 테스트가 제 몫을 하는 곳은 질문이 하나 있고 그것에 답할 만한 트래픽이 있을 때입니다. 같은 계정에서 링크에 따라 둘 다 쓰는 것은 정상이지만, 링크 하나에서 둘을 함께 돌리고 있다면 대개 둘 중 하나는 아무 일도 하지 않고 있습니다.

가중치는 상대적이고, 지금 후보가 누구인지에 따라 다시 계산됩니다

로테이터의 가중치는 백분율이 아니라 몫입니다. 어떤 목적지의 몫은 그 가중치를 지금 후보인 목적지들의 가중치 합으로 나눈 값입니다. 그래서 가중치 3, 2, 1은 각각 2분의 1, 3분의 1, 6분의 1을 뜻하고, 네 번째 목적지를 추가해도 손으로 다시 맞춰 줄 것이 없습니다.

후보인지 아닌지는 가중치보다 먼저 판정되며, 이 순서가 이 기능을 장식이 아니라 운영 도구로 만듭니다. 목적지가 후보에서 빠지는 경우는 이렇습니다. 꺼져 있을 때, 전체 클릭 상한이나 하루 상한을 다 썼을 때, 기간 창이 아직 열리지 않았거나 이미 닫혔을 때, 방문자의 국가나 기기가 그 목적지의 조건 밖일 때, 그리고 상태 점검이 그것을 내렸을 때입니다. 남은 목적지들이 자기 가중치에 비례해 그 몫을 흡수합니다. 새벽 3시에 아무도 무엇을 고치지 않아도 즉시 그렇게 됩니다. 모든 목적지가 빠지면 대체 목적지가 나머지를 받고, 대체 목적지가 없으면 링크는 오류 페이지가 되는 대신 기본 목적지를 계속 제공합니다.

로테이터는 가중치를 쓰지 않는 분배 방식도 두 가지 제공합니다. 연속된 클릭을 연속된 목적지로 보내는 라운드 로빈, 그리고 똑같이 나누는 균등 분배입니다. 미러 사이의 부하 분산에는 라운드 로빈이 맞습니다. 연속된 클릭이 서로 다른 곳에 떨어지는 것을 보장하는 유일한 방식이기 때문입니다.

A/B 분할 테스트는 반대로 동작하며, 거기에는 그럴 만한 이유가 있습니다. 이쪽 가중치는 합이 정확히 100이어야 하는 정수입니다. 리디렉터가 방문자를 0부터 99까지의 구간에 넣고 누적 가중치를 훑어 내려가기 때문에, 그 범위에 빈틈이 있으면 아무도 처리하지 않는 트래픽이 생깁니다. 가중치를 쓰는 로테이터 분배는 합성 방문자 10만 명으로 검증하며 설정한 몫에서 1퍼센트포인트를 벗어나지 않아야 합니다. 트래픽을 나눈다고 주장하는 도구라면 이 정도 정밀도는 기대할 만합니다.

한 방문자를 한 목적지에 붙들어 두기

고정 없는 로테이션은 헛소리를 만듭니다. 방문자가 링크를 열어 오퍼 A를 보고, 한 시간 뒤에 다시 와서 오퍼 B를 보면, 그 클릭들로 만든 퍼널 보고서는 모두 소설이 됩니다. 조금 틀린 것이 아니라 소설입니다. 분자와 분모가 이제 서로 다른 페이지를 가리키기 때문입니다.

그래서 방문자 고정 기간은 곁다리가 아니라 정식 설정이고 0일부터 30일까지 정할 수 있으며, 그 장치는 두 겹으로 되어 있습니다. 기본 배정은 그날의 방문자 지문에서 결정적으로 파생되므로 세션도, 데이터베이스 행도, 방문자마다 저장하는 무엇도 없이 안정적으로 유지됩니다. 그다음 여러분 자신의 리디렉션 도메인에 설정된 퍼스트파티 쿠키가 선택된 목적지를 기간 내내 이어 나가는데, 방문자 고정이 지문 솔트의 야간 교체보다 오래 살아남는 것은 이 덕분입니다.

여기서 따라 나오는 결과 두 가지는 겪어서 알기보다 미리 알아 두는 편이 낫습니다. 쿠키를 지우거나 다른 기기로 오는 방문자는 파생된 배정으로 되돌아가는데, 이 배정은 하루 안에서는 안정적이지만 날이 바뀌면 반드시 그렇지는 않습니다. 분석 계층이 식별자를 영구 보관하지 않으려고 감수하는 것과 같은 맞바꿈입니다. 그리고 이미 고정된 방문자는 여러분이 가중치를 바꿔도 그대로 고정된 채 남습니다. 그 목적지가 아직 후보인 한 고정이 분배를 이기기 때문입니다.

눈에 보이는 효과를 내는 구현 세부 사항이 하나 있습니다. 로테이터는 A/B 분할 테스트와는 다른 조각의 방문자 지문에서 자기 구간을 뽑아냅니다. 같은 조각을 나눠 쓰면 두 배정이 서로 얽혀서, 변형 A에 속한 사람들은 목적지 목록의 일부만 조직적으로 보게 됩니다.

상태 점검, 그리고 죽은 페이지를 로테이션에서 빼내기

목적지는 썩습니다. 파트너가 페이지를 내리고, 인증서가 만료되고, 오퍼가 중단되고, 도메인이 만료되었다가 자기 자신을 파는 파킹 페이지로 되돌아옵니다. 그동안 단축 링크는 자기 몫의 트래픽을 계속 벽으로 보내고, 주간 보고서가 나오기 전까지 아무도 알아차리지 못합니다.

예약된 점검이 방문자가 하듯이 목적지를 따라가 네 가지를 기록합니다. 상태 코드, 리디렉션 사슬의 홉 수, 응답 시간, 그리고 TLS 인증서의 만료일입니다. 목적지를 추가할 때 기록해 둔 지문, 즉 최종 호스트와 페이지 제목과 대조하기도 하는데, 이제 파킹 페이지에서 멀쩡한 200을 돌려주는 주소가 걸리는 것이 이 대조 덕분입니다. 링크 검사기도 같은 탐침 위에 서 있으며, 규모가 큰 워크스페이스가 자기 모니터링을 트래픽 발생원으로 바꿔 놓지 못하도록 같은 목적지를 15분에 한 번보다 자주 다시 점검하지는 않습니다.

그다음에 무엇을 할지는 링크마다 고르는 문제입니다. 기본 동작은 요란하지만 수동적입니다. 링크 목록에서 해당 목적지에 표시가 붙고, 소유자에게 요약 메일이 가고, 웹훅이 발사됩니다. 자동 제외를 켜 두면 회복될 때까지 로테이션에서도 빠지는데, 조용히 삭제되는 대신 자동 비활성화로 표시되므로 '로테이터는 문제없다'는 말이 누군가 확인한 사실이 됩니다. 다시 켜는 일을 손으로 하게 둔 것은 일부러입니다. 한 번 깜빡인 페이지는 또 깜빡이고, 트래픽이 돌아가기 전에 사람이 그것을 봐야 하기 때문입니다.

솔직하게 밝히는 한계가 둘 있습니다. 점검은 저희 인프라에서 돌아가므로 페이지가 응답한다는 사실은 확인하지만, 특정 국가의 특정 기기에서 온 방문자에게 제대로 응답한다는 사실까지 확인하지는 못합니다. 그리고 파킹 페이지 탐지는 알려진 패턴을 대조하는 방식이라, 오퍼만 빠진 채 완벽하게 정상인 페이지를 돌려주는 목적지는 여전히 멀쩡해 보입니다. 어떤 상태 표시보다 목적지별 전환 데이터가 더 중요한 이유가 여기에 있습니다.

엣지 네트워크 전체에서 지켜지는 상한

클릭 상한은 같은 링크가 열두 나라에서 동시에 열려도 지켜져야 의미가 있습니다. 1,000클릭으로 제한한 목적지가 1,400을 내보내는 원인은 지역마다 따로 도는 카운터입니다. 데이터센터 열네 곳이 저마다 100까지 세면서 저마다 아직 상한 아래라고 믿은 것입니다.

이것을 피하는 설계는 두 가지 속도로 돌아갑니다. 카운터의 스냅숏이 링크의 캐시된 설정 안에 실려 다니므로, 리디렉터는 뜨거운 경로에서 왕복 통신을 하지 않고도 목적지가 대략 어디쯤 와 있는지 압니다. 목적지가 상한까지 수십 클릭 안으로 들어오면, 리디렉터는 응답하기 전에 공유 저장소에서 권위 있는 예약을 받는 방식으로 전환합니다. 그래서 마지막 한 자리를 두고 동시에 들어온 클릭 둘은 하나의 원자적 증가로 정리되고, 진 쪽은 상한을 넘는 대신 다른 곳으로 갑니다.

맞바꿈을 그대로 적자면 이렇습니다. 경계에서 멀리 있을 때 그 숫자는 실시간 집계가 아니라 스냅숏입니다. 그래서 상한은 정확함이 중요한 곳에서는 정확하고, 중요하지 않은 곳에서는 근사입니다. 상한이 없는 목적지가 있지도 않은 제한 때문에 왕복 통신 비용을 내지 않는 것이 바로 이 덕분입니다.

자동 최적화가 실제로 동작하는 방식

스스로 최적화하는 분할 테스트가 평범한 분할 테스트에 더하는 것은 하나뿐입니다. 목표에서 더 잘하고 있는 변형 쪽으로 가중치를 다시 계산하는 예약 작업입니다. 구간 배정, 방문자 고정, 보고 등 나머지는 그대로이고, 리디렉터는 이 모드가 있다는 사실조차 알지 못합니다. 자기 대신 계산된 평범한 가중치를 받을 뿐이기 때문입니다.

이 작업은 한 시간마다 돌아가며 세 단계로 이뤄집니다. 먼저 지난번 실행 이후 각 변형의 클릭 증가분을 모아 저장된 표본에 더합니다. 그다음 성공 횟수에 1을, 시행 횟수에 2를 더하는 평활화된 비율로 각 변형에 점수를 매깁니다. 그래서 클릭이 세 번뿐인 변형이 만점을 기록하는 일도, 0으로 나누는 일도 생기지 않습니다. 마지막으로 변형마다 최소 5점을 먼저 확보해 둔 뒤, 100점을 그 점수에 비례해 정수 단위로 변형들에 나누어 줍니다.

이 최소치가 알고리즘에서 가장 중요한 한 줄입니다. 0까지 깎인 변형은 관측을 다시는 쌓지 못하므로, 그것을 버리기로 한 판단이 그 판단을 낳은 표본이 어떤 것이었든 영구히 굳어 버립니다. 5점은 계속 배우기에 충분하고, 신경 쓰지 않아도 될 만큼 값이 쌉니다.

관문이 열린 뒤에 실행된 두 변형짜리 예시입니다:

| 변형 | 클릭 | 목표 이벤트 | 원시 비율 | 평활화 점수 | 새 가중치 | | --- | --- | --- | --- | --- | --- | | A | 620 | 31 | 5.00% | 5.14% | 54 | | B | 610 | 25 | 4.10% | 4.25% | 46 |

알고리즘이 하지 않은 일에 주목하십시오. 전환율에서 대략 5분의 1쯤 되는 상대 차이가 90/10이 아니라 54/46 분배를 만들었습니다. 가중치 재계산이 승자독식 규칙이 아니라 점수에 비례하는 방식이기 때문입니다. 자동 최적화는 기울일 뿐 갈아타지 않습니다. 갈아타고 싶다면 승자를 손으로 확정하십시오. 그러면 모든 트래픽이 한 목적지로 가고 실험은 끝나며, 그 결정은 자동으로 이뤄진 결정들과 나란히 링크의 기록에 남습니다.

최소 표본이 이 모든 것보다 먼저인 이유

최적화 작업이 무엇이든 건드리도록 허락받기 전에, 관문 두 개가 분배를 균등하게 붙들어 둡니다. 달력 시간으로 재는 워밍업 기간, 그리고 클릭 수로 재는 최소 전체 표본이며 기본값은 1,000회입니다. 둘 중 하나라도 넘지 못하면 가중치는 조금 조정되는 대신 아예 조정되지 않습니다.

이유는 통계적인 까다로움이 아니라 링크 트래픽의 생김새에 있습니다. 캠페인의 첫 몇 시간은 가장 먼저 게시한 채널과, 링크를 훑는 자동화된 트래픽이 좌우합니다. 링크 클릭 추적 안내서에서 다룬 그대로입니다. 그 구간에서 계산한 비율은 페이지가 아니라 게시 일정을 설명합니다. 더 나쁜 것은, 그 비율을 근거로 움직이는 최적화가 하필 조용한 시간대에 시작된 변형을 굶긴다는 점입니다. 굶은 변형은 증거를 더 느리게 모으고, 그래서 초기의 실수가 스스로를 강화합니다. 최소치는 피해를 제한하고, 관문은 피해를 막습니다.

자동 모드가 하지 않는 일이 둘 있습니다. 이것은 비례에 따른 가중치 재계산이지 축차 검정(sequential test)이 아닙니다. 유의 수준을 계산하지 않고 승자를 선언하지도 않습니다. 승자 선언은 분할 테스트 화면이 변형 표 아래에 찍어 주는 신뢰도 안내 옆에서 사람이 하는 행동으로 남습니다. 그리고 가중치를 다시 계산하는 근거가 되는 표본은 여러분이 먹여 준 목표만큼만 의미가 있습니다. 모든 클릭이 성공으로 세어진다면 구조상 모든 변형이 같은 점수를 받고 분할은 사실상 균등한 채로 남습니다. 기울어지려면 모든 클릭이 도달하지는 못하는 목표가 필요하고, 전환 추적이 바로 그것을 변형별로 기록합니다. 서명된 클릭 식별자가 변형 라벨을 싣고 다니므로 전환 문서에서 설명하는 보고서에서 주문과 매출이 변형 기준으로 나뉩니다.

로테이터가 필요 없을 때

| 상황 | 더 나은 도구 | | --- | --- | | 지금은 목적지 하나, 다음 달에는 다른 하나 | 링크의 목적지를 수정하면 됩니다. 단축 주소와 그 기록은 그대로입니다 | | 시장마다 다른 페이지 | 순서가 있는 타기팅 규칙 — 결정적이고 읽기 쉽습니다 | | 질문 하나에 후보 페이지 둘 | 신뢰도 안내가 붙은 평범한 분할 테스트 | | 휴대폰은 앱으로, 데스크톱은 사이트로 | 링크에 있는 딥링크 항목 | | 같은 페이지의 미러 여럿 | 라운드 로빈 모드의 로테이터. 바로 이 경우를 위해 만들어진 기능입니다 |

일반적인 규칙은 이렇습니다. 로테이터는 주소가 그대로인 채 목적지가 바뀔 때 자기 복잡함의 값을 하고, 그 밖의 모든 곳에서는 명확함을 대가로 가져갑니다. 가중치로 나눈 몫은 규칙보다 머릿속으로 따라가기 어렵고, 밤 11시에 '이 방문자는 왜 저 페이지를 받았나'를 파헤쳐 본 사람이라면 둘 중 어느 쪽을 읽고 싶을지 압니다. 설정에 관한 자세한 내용은 로테이터 안내서링크 안내서에 있습니다.

오래가는 구성

  1. 질문에 답하는 가장 단순한 도구에서 시작하고, 목적지 목록이 실제로 바뀔 때만 로테이션을 더하십시오.
  2. 뒤에 퍼널이 있는 모든 것에는 최소한 한 세션만큼의 방문자 고정 기간을 두고, 0은 부하 분산에만 쓰십시오.
  3. 실제 한도가 있는 목적지에는 상한이나 기간 창을 주고, 모두 소진되었을 때 오류 페이지가 되지 않도록 대체 목적지를 설정하십시오.
  4. 여러분이 통제하지 못하는 목적지에는 자동 제외를 켜고, 짧은 장애가 조용한 재분배보다 나은 곳에서는 꺼 두십시오.
  5. 스스로 최적화하는 분할 테스트에서 무엇이든 읽어 내기 전에 워밍업 기간과 최소 표본이 지나가게 두고, 승자를 확정하기 전에 신뢰도 안내를 확인하십시오.
  6. 결과는 목적지별로 읽으십시오. 클릭 이벤트에 어느 목적지가 그 클릭을 처리했는지 기록되므로 클릭 수와 순 방문자, 매출이 모두 그 기준으로 나뉩니다.

이 모든 것 뒤에 있는 패턴은 같습니다. 로테이션과 상한, 가중치 재계산은 아무도 보고 있지 않는 동안 링크가 옳은 일을 계속하게 합니다. 어느 목적지가 돈을 버는지 들여다보는 일을 대신해 주지는 않습니다. 대신 제대로 들여다볼 시간을 벌어 줍니다.

많이 묻는 질문

로테이터와 A/B 테스트는 무엇이 다릅니까?

A/B 테스트는 변형 묶음이 고정되어 있고 기간이 정해져 있으며 끝에 판단이 따르는 측정입니다. 로테이터는 운영 도구입니다. 목적지가 들어오고 나가고, 클릭 상한과 기간 창을 지니고, 특정 국가나 기기 종류를 담당하며, 고장 나면 자동으로 빠집니다. 그래서 작동 방식도 그만큼 다릅니다. 분할 테스트의 가중치는 합이 정확히 100이어야 하지만, 로테이터의 가중치는 상대적이며 빠진 목적지의 몫은 남은 목적지들이 흡수합니다. 질문이 있을 때는 분할 테스트를, 운영해야 할 것이 있을 때는 로테이터를 쓰십시오.

로테이터의 가중치는 합이 100이 되어야 합니까?

아닙니다. 로테이터의 가중치는 상대적입니다. 어떤 목적지의 몫은 그 가중치를 지금 후보인 목적지들의 가중치 합으로 나눈 값입니다. 가중치가 3, 2, 1이면 각각 2분의 1, 3분의 1, 6분의 1을 뜻하고, 가운데 목적지가 하루 상한을 다 쓰면 남은 둘이 곧바로 3 대 1로 트래픽을 나눕니다. A/B 분할 테스트는 반대로 동작해서 가중치 합이 정확히 100이 아니면 저장을 거부합니다. 리디렉터가 방문자를 0부터 99까지의 구간에 넣고 누적 가중치와 비교하는데, 그 범위에 빈틈이 생기면 아무도 처리하지 않는 트래픽이 남기 때문입니다.

같은 방문자는 항상 같은 목적지에 도착합니까?

여러분이 정한 방문자 고정 기간 안에서는 그렇습니다. 이 기간은 0일부터 30일까지 정할 수 있습니다. 배정은 방문자마다 저장하는 대신 그날의 방문자 지문에서 파생되며, 여러분 자신의 리디렉션 도메인이 설정하는 퍼스트파티 쿠키가 그 선택을 이어 나갑니다. 쿠키를 지우거나 기기를 바꾼 사람은 파생된 배정으로 되돌아가는데, 지문 솔트가 매일 밤 교체되므로 하루 안에서는 안정적입니다. 기간을 0으로 두면 방문할 때마다 로테이션이 일어납니다. 부하 분산에는 그것이 맞고, 퍼널이 걸린 곳에서는 결코 맞지 않습니다.

상태 점검은 목적지가 고장 났다고 어떻게 판단합니까?

방문자가 하듯이 목적지를 따라가 네 가지를 봅니다. 상태 코드, 리디렉션 사슬의 길이, 응답 시간, 그리고 인증서의 만료일입니다. 목적지를 추가할 때 기록해 둔 지문과 페이지를 대조하기도 하므로, 조용히 파킹 페이지로 바뀐 주소는 아무 문제 없는 200으로 응답하더라도 걸립니다. 같은 목적지는 15분에 한 번보다 자주 다시 점검하지 않으며, 로테이션에서 자동으로 빼는 동작은 기본값이 아니라 여러분이 직접 켜는 선택입니다.

스스로 최적화하는 테스트는 가중치를 다시 계산하기까지 트래픽이 얼마나 필요합니까?

관문이 두 개 열려야 합니다. 워밍업 기간은 여러분이 정한 달력 시간 동안 분배를 균등하게 유지하고, 최소 표본은 변형들이 합쳐서 충분한 클릭을 모을 때까지 — 기본값은 1,000회입니다 — 분배를 균등하게 붙들어 둡니다. 둘 중 하나라도 열리지 않으면 최적화 작업은 조금 조정하는 대신 아무것도 조정하지 않습니다. 이것은 의도된 설계입니다. 가중치 재계산은 그것이 딛고 선 가장 작은 표본만큼만 믿을 만하고, 이 분야의 초기 데이터는 가장 먼저 게시한 채널이 좌우하기 때문입니다.

로테이터가 맞지 않는 경우는 언제입니까?

목적지가 하나로 맞고 나중에 그것을 바꾸기만 하면 될 때입니다. 단축 링크의 목적지를 수정하면 주소는 그대로 둔 채 가리키는 곳만 바뀌고, 클릭 기록도 그대로 붙어 있습니다. 시장마다 다른 페이지가 필요할 때는 순서가 있는 타기팅 규칙이 가중치로 나눈 몫보다 명확합니다. 어떤 방문자가 어디로 갈지가 결정적이고 읽기 쉽기 때문입니다. 그리고 질문 하나에 후보 페이지가 둘뿐이라면, 신뢰도 안내가 붙은 평범한 분할 테스트가 로테이터보다 적은 장치로 답을 줍니다.