모델 하나를 들여다볼 때 내가 가장 오래 멈춰 있던 지점은, 광고주가 실제로 묻는 숫자인 ROAS가 모델 안 어디에도 손잡이로 존재하지 않는다는 사실이었다. 매출을 설명하는 회귀식에는 응답 계수, 포화 모수, 이월 보유율이 손잡이로 달려 있다. 정작 “광고비 1달러가 매출 얼마를 만들었나”는 그 손잡이들을 다 돌린 뒤에야 계산되어 나오는 출력이다. Google이 2026년 초 공개한 MMM 보정 논문을 구현자 눈으로 읽은 메모다. 돌려 보지는 않았고 저자들과 관계는 없다.

알고 싶은 값이 출력이면, 지식을 넣을 자리가 없다

실험을 하나 돌려서 “이 채널의 ROAS는 3 근처”라는 결과를 얻었다고 하자. 이 숫자를 모델에 알려 주고 싶은데, 모델에는 ROAS라는 입력 칸이 없다. 그래서 종래 방식은 응답 계수의 사전분포를 이리저리 바꿔 끼우면서, 거기서 흘러나오는 ROAS가 실험값 근처에 설 때까지 맞춰 본다. 손잡이를 돌려 가며 출력이 원하는 값이 되길 기다리는 셈이다.

구현자로서 이 루프가 싫은 이유는 분명하다. 응답 계수는 포화·이월 모수와 한 덩어리로 얽혀 있어서, 그 사전분포 하나를 바꾸면 ROAS 분포가 어디로 움직일지 손으로 역산해야 한다. 게다가 실험이 아주 확실해서 ROAS를 좁게 묶고 싶어도, 응답 계수 쪽 손잡이만으로는 그 좁은 분포가 나오지 않을 때가 있다. 알고 싶은 값을 출력 자리에 둔 대가다.

출력을 입력으로 뒤집기

논문의 수가 여기서 깔끔하다. ROAS 공식을 응답 계수에 대해 풀어서, 응답 계수를 ROAS의 함수로 다시 쓴다.

β = H(ROAS, 지출, 포화·이월 모수, 지역 편차)

지출과 보정 구간은 이미 아는 값이니, 이 H는 닫힌 식으로 바로 계산된다. 그러면 모델에서 응답 계수가 서 있던 자리에 이 H를 꽂아, ROAS를 파라미터로 가진 모델로 바꿀 수 있다. 전에는 응답 계수에 사전분포를 걸었는데, 이제 ROAS에 직접 건다. 실험이 준 범위를 음수가 안 나오게 로그정규로 바꿔 그 칸에 넣으면 끝이다. 샘플러 입장에서는 그냥 파라미터 하나가 응답 계수에서 ROAS로 바뀐 것뿐이다.

까다로운 경우도 같은 틀로 접힌다. 아래는 내가 구현한다면 신경 쓸 세 갈래다.

상황모델 쪽 처리구현할 때 조심할 점
실험이 단기만 잼보정 구간을 실험 기간으로 좁히거나 전체로 넓혀 선택어느 쪽이 “장기 평균”을 대표하는지는 데이터가 아니라 판단
한 채널에 실험 여러 개지출로 가중한 집계 ROAS 하나로 합침실험별 ROAS를 따로 두면 식별이 안 됨, 합쳐야 품
교란이 관측 안 됨대리 변수로 통제, 사전분포로 편향 완화완화지 제거가 아님, 남은 편향을 0으로 착각하지 말 것

5라는 숫자보다 남은 것

시뮬레이션 결과 자체는 짧다. 보정 없는 모델의 사후 ROAS 퍼짐이 보정한 쪽의 다섯 배쯤이었고, 교란을 못 본 상황에서도 사전분포가 편향을 꽤 줄였다. 근거가 시뮬레이션뿐이라는 점, 인과 해석이 “모든 교란을 통제했다”는 못 믿을 가정에 선다는 점은 저자들이 먼저 적어 둔다. 그래서 이 방법은 실험을 모델에 넣는 통로를 닦아 줄 뿐, 실험이 엉성하면 엉성한 값을 그대로 꽂는다.

내가 측정 시스템을 짠다면

내 일은 AI 검색에서 브랜드가 얼마나 인용되는지를 재는 쪽이다. 그래서 이 논문의 교훈을 코드 설계 원칙으로 바꿔 읽게 된다. 재고 싶은 인과량을 지표의 출력으로 두지 말고, 처음부터 파라미터로 세워 두라는 것.

지금 흔한 GEO 대시보드는 노출 점수나 점유율 같은 합성 지표를 내놓는다. 그 숫자는 경쟁사 활동, 모델 업데이트, 질문 구성이 한데 섞인 출력이라, “이 페이지를 이렇게 고쳤더니 인용이 늘었다”는 실험 결과를 꽂을 입력 칸이 없다. MMM이 응답 계수를 더듬던 상황과 똑같다. 내가 짠다면 인용 변화량을, 바꾼 것과 전후 측정으로 바로 추정되는 양으로 모델 전면에 둔다. 합성 점수는 거기서 파생되는 보조 출력이면 된다. 출력을 입력으로 뒤집는 이 한 수가, 측정값에 실험을 꽂을 수 있느냐 없느냐를 가른다.