BE-commerce 프로젝트
약 4분 분량 검색·추천테스트·검증

A/B 실험 기반을 만들고 합성 사용자 1,000명으로 끝에서 끝까지 돌렸다

목차

추천 A/B 실험을 돌릴 수 있는 기반을 만들고 합성 사용자 1,000명으로 끝에서 끝까지 맞게 도는지 확인했습니다. 같은 사용자는 세 번 방문해도 늘 같은 변형이었습니다. 두 변형에 같은 행동을 주면(A/A) 차이가 나오지 않았고 일부러 넣은 차이는 95% 구간 안으로 복원됐습니다. 노출되지 않은 상품의 클릭과 구매는 한 건도 세지 않았습니다.

이 글의 숫자는 사용자 행동을 제가 정한 확률로 만든 것이라 추천 품질에 대한 주장이 아닙니다. 실험 기반이 믿을 만한 숫자를 내는지만 말합니다.

개요

추천 품질의 최종 판정은 실사용자 A/B입니다. 오프라인 지표(MAP@12)는 켤 후보를 거르는 게이트일 뿐이고 실제로 사용자가 더 클릭하고 사는지는 트래픽을 나눠 봐야 압니다. ch50에서 재구매 우선 혼합이 A/B 후보가 됐습니다. 실사용자 트래픽은 나중에 붙이더라도, 실험을 돌렸을 때 숫자가 맞게 나오는 기반은 먼저 있어야 합니다. 기반이 틀리면 실사용자 결과도 틀립니다.

해시로 고정 배정하고 홈 노출 기록에 변형을 남기고 노출된 상품에 한해 클릭과 구매를 귀속한다. 합성 사용자로 A/A, 주입 복원, 음성 대조를 확인했다

무엇을 만들었나

조각무엇
배정SHA-256(솔트:사용자 id)의 앞 4바이트를 10,000으로 나눈 나머지가 실험군 비율 × 100보다 작으면 실험군입니다. 배정 표를 저장하지 않습니다
변형실험군은 구매 이력 + 재구매 우선, 대조군은 지금 설정 그대로입니다
노출홈 1쪽 응답과 노출 기록 표(home_impressions)에 실험 이름과 변형을 남깁니다
귀속과 분석노출 뒤 30분 안의 클릭, 24시간 안의 구매를 그 노출에 있던 상품만 변형에 귀속합니다. 비율 불일치(SRM) 검정, 두 비율 차이의 95% 구간을 냅니다

배정을 저장하지 않은 이유는 쓰기와 갈라짐입니다. 배정 표를 두면 요청마다 쓰기가 붙고 표와 코드가 어긋날 수 있습니다. 해시는 같은 입력에 늘 같은 답을 줍니다. 새 실험은 새 솔트로 시작합니다. 같은 솔트를 쓰면 앞 실험의 실험군이 그대로 다음 실험의 실험군이 되어 영향이 섞입니다.

노출은 기존 홈 노출 기록에 열 두 개를 얹었습니다. 그 기록은 이미 “응답이 곧 노출”이라는 원칙으로 요청마다 한 행을 남기고 있었습니다.

합성 사용자로 무엇을 확인했나

합성 사용자 1,000명을 가입시키고 사용자마다 홈 1쪽을 세 번 열었습니다. 변형별로 정한 확률로 노출된 상품 하나를 클릭하고 노출된 상품 하나를 샀습니다(주문과 결제 승인까지). 사용자가 실제로 한 일은 정답 파일로 남겨 분석 결과와 맞췄습니다.

음성 대조도 넣었습니다. 변형과 상관없이 사용자의 20%는 노출되지 않은 상품을 클릭하고 3%는 노출되지 않은 상품을 삽니다. 분석이 이것을 세면 귀속 규칙이 틀린 것입니다.

실행사용자(대조/실험)SRM p고정 배정 위반클릭 사용자 차이 [95% 구간]넣은 차이구매 사용자 차이 [95% 구간]넣은 차이
A/A505/4950.7520−0.002 [−0.051, +0.047]0−0.017 [−0.043, +0.009]0
주입 A/B513/4870.4110+0.062 [+0.010, +0.115]+0.10+0.033 [+0.005, +0.060]+0.03
실행귀속 클릭 = 정답귀속 구매 = 정답세지 않은 것
A/A195 = 19545 = 45클릭 216/216, 구매 29/29
주입 A/B239 = 23951 = 51클릭 198/198, 구매 33/33

측정 전에 정한 네 기준을 모두 넘었습니다. 3,000번 방문에서 배정이 바뀐 사용자는 없었습니다. A/A의 두 구간은 0을 포함했고 주입한 차이는 두 구간 안에 들어갔습니다. 노출되지 않은 상품의 클릭과 구매는 한 건도 새지 않았습니다.

넣은 차이는 0.10인데 분석은 0.062를 냈다

분석이 틀린 것으로 보였지만 정답 파일을 보면 맞습니다. 실제로 클릭한 사용자는 대조군 107/513(0.209), 실험군 132/487(0.271)이고 차이가 정확히 0.062입니다. 확률 0.2와 0.3을 사용자 500명씩에게 굴리면 이만큼 흔들립니다. 그래서 기준을 “넣은 값이 95% 구간 안에 드는가”로 잡았습니다.

이 흔들림이 실사용자 실험을 설계할 때의 출발점입니다. 변형당 500명에서 클릭 10%p 차이는 겨우 잡혔고 구매 3%p 차이는 구간 폭(±2.8%p)과 비슷했습니다. 구매 전환 차이를 보려면 표본이 훨씬 많아야 합니다.

한계

  • 합성 행동입니다. 추천이 바뀌어 클릭이 달라지는 경로는 없고 변형이 확률을 정했습니다
  • 귀속 창(30분, 24시간)은 고른 값입니다. 실사용자 데이터로 정해야 합니다
  • 홈 1쪽만 변형을 적습니다. 추천 행이 1쪽에만 있어서 2쪽부터의 클릭은 변형에 귀속되지 않습니다
프로필 사진
작성자 @범수

오늘의 노력이 내일의 전문성을 만든다고 믿습니다.

댓글

댓글 수정/삭제는 GitHub Discussions에서 가능합니다.