검색 콘솔에서 "트래픽을 확인해 보라"는 메일이 왔습니다. 열어 보니 유입 키워드가 처음으로 잡히기 시작했더군요. 그래서 물었습니다 — 이 데이터를 봇 자기개선에 쓰고 있나?
답은 "안 쓰고 있음"이었고, 검토 결과는 "안 붙이는 게 맞음"이었습니다. 여기까지는 30분짜리 작업이었습니다. 문제는 그 30분 뒤에 벌어졌습니다. 제가 그 결론을 내릴 때 본 데이터가, 제가 짜놓은 상한선에 잘려 있었습니다.
시작하기 전에 하나 여쭙겠습니다. 지금 판단의 근거로 삼는 리포트가 몇 행까지 담도록 짜여 있는지 아십니까? 저는 몰랐습니다. 제가 직접 짠 도구였는데도요.
1차 결론: "롱테일이 애초에 없다"
검색 리포트를 열었습니다. 28일 기준 노출 3,255, 클릭 30. 클릭이 붙은 쿼리는 8개였고 그중 6개가 특정 앱의 브랜드명 검색이었습니다. 비브랜드 실클릭은 2개.
나머지는요? 노출은 있는데 순위가 50~99위였습니다. 5페이지 밖. 이건 "수요가 있는 키워드"가 아니라 색인 초기에 구글이 아무 쿼리에나 한 번씩 매칭해 본 흔적입니다.
그래서 결론냈습니다. 봇 자기학습에 이 데이터를 넣으면 잡음을 학습한다. 근거도 붙였습니다 — 표본이 없고(클릭 30), 게다가 쇼츠·텍스트 봇은 웹 검색 순위에 영향을 못 주니 피드백 루프가 아예 닫히지 않는다. 닫히지 않는 루프는 학습이 아니라 미신이죠. 극소표본을 되먹이던 루프는 전에 한 번 끊은 적이 있어서 이 판단 자체는 빨랐습니다.
여기까지는 맞았습니다. 문제는 제가 덧붙인 한 문장이었습니다. "롱테일 발굴이 목적인데 롱테일이 애초에 데이터에 없다."
그 문장을 쓰면서 걸린 것
같은 문단에서 저는 이렇게도 적었습니다. "사이트당 상위 10쿼리만 저장한다." 두 문장이 나란히 있었는데 한참을 못 봤습니다.
TOP_N = 10 # top 쿼리/페이지 수"롱테일이 없다"는 판정을, 롱테일을 담지 않도록 짜인 데이터로 내리고 있었습니다. 사이트당 상위 10개. 브랜드 검색이 있는 사이트는 그 10줄을 브랜드가 다 차지합니다. 정의상 롱테일은 11번째부터 시작하는데, 11번째부터를 버리고 있었던 겁니다.
한 줄 고쳤습니다.
TOP_N = 100 # 브랜드 쿼리가 상위 10줄을 채워 롱테일이 안 보이던 문제100으로 올린 결과
쿼리행 112 → 467. 그리고 이런 게 나왔습니다.
772 노출 picross logic nonogram 순위 37.5
112 pcos diet 순위 64.2
82 money anxiety disorder 순위 93.6
74 hrv breathing 순위 39.3
24 nonogram picross solving tips 순위 9.7 ← 1페이지인데 클릭 0맨 위 줄을 보세요. 단일 쿼리 772노출. 제가 "수요가 없다"고 판정한 그 데이터셋의 어느 사이트에서, 노출 상위 열 줄 바로 아래에 앉아 있었습니다. 그리고 맨 아래 줄 — 순위 9.7위, 즉 검색 결과 1페이지인데 클릭이 0입니다. 이건 순위 문제가 아니라 제목·스니펫 문제고, 값싼 수정이 실제로 존재하는 유일한 자리입니다.
없던 게 아니었습니다. 제가 안 담고 있었습니다.
같은 날, 같은 오류를 한 번 더
기분이 나빠진 김에 다른 지표도 같은 질문으로 때렸습니다. "이 숫자는 무엇을 담도록 허락받았나?"
전날 저는 봇들이 앱 방문을 만드는지 처음으로 계측선을 붙이고 그 리포트를 보며 이렇게 기록해뒀습니다. "앱 하나가 전체 세션의 **73%**를 차지한다. 34개로 분산하지 말고 그 앱에 더블다운하라."
그래서 확인했습니다. 분석 태그가 붙은 앱이 몇 개인지.
HAS 6개
MISS 26개32개 중 6개. 73%는 전체 포트폴리오에서의 73%가 아니라 **계측된 6개 안에서의 73%**였습니다. 같은 날 올린 채널별 유입 비교 글에도 이 숫자를 그대로 실었으니, 그 글의 앱 점유율 부분은 이 글로 정정합니다(채널 비교 자체도 같은 분모 위에서 잰 값이라 계측이 다 붙은 뒤 다시 재야 합니다). 나머지 26개는 세션이 0이었던 게 아니라 셀 수가 없었습니다. 실제로 그 26개 중 한 앱은 같은 기간 검색 클릭이 18로 전체 1위였는데, 유입 리포트에는 존재하지 않는 앱이었습니다.
부끄러운 부분은 이겁니다. 저 6개는 실수가 아니라 과거의 제 결정이었습니다. 몇 달 전 "UTM 링크를 받는 5개 앱에만 태그를 달자, 38개 전부는 과설계다"라고 판단했고 그건 그때 맞았습니다. 그 사이 봇들이 훨씬 많은 앱으로 링크를 뿌리기 시작했는데, 결정만 남고 조건이 바뀐 걸 아무도 안 봤습니다.
여기서 여쭙겠습니다. 당신이라면? 대시보드 숫자를 그대로 믿고 "1등 앱에 더블다운"으로 가겠습니까, 아니면 그 숫자를 만든 계측 커버리지부터 세어 보겠습니까? 저는 하루 동안 전자였습니다.
고친 것
- 검색 수집 상한
TOP_N10 → 100. 단, 화면은 클릭순 10줄만(전량은 JSON 원장에). 상한을 올리는 것과 그걸 다 보여주는 건 다른 문제입니다. - 분석 태그 26개 앱에 일괄 배선 — 코드 주입, 환경변수, 프로덕션 배포, 라이브 26/26 확인. 이제 앱별 비교가 처음으로 공정해집니다.
- 유입 리포트에 캠페인·콘텐츠 축 추가. 쇼츠 한 편이 어느 앱·어느 언어로 방문을 만드는지 셀 수 있게.
- 그리고 게이트를 문서에 박았습니다. 셀당 세션 30 이상이 되기 전엔 이 값을 자동 가중치에 넣지 않는다. 지금 실측은 셀당 1~2입니다. 상한을 고쳤다고 표본이 생기는 건 아니니까요.
자가진단 3줄
- 지금 판단에 쓰는 리포트의 행 상한이 코드 어디에 박혀 있습니까? 찾는 데 1분 넘게 걸리면 그 숫자를 근거로 쓰면 안 됩니다.
- "A가 X%를 차지한다"를 읽고 있다면, 분모에 들어간 대상이 몇 개입니까? 측정 안 되는 대상은 0이 아니라 모름입니다.
- 과거에 "지금은 이만큼이면 충분"이라고 좁힌 결정이 있다면, 그때의 조건이 아직 유효합니까?
솔직한 부분
여기까지 읽으면 "그래서 결론이 뒤집혔겠군" 싶겠지만, 안 뒤집혔습니다.
롱테일은 있었습니다. 하지만 순위가 37~93위라 클릭은 여전히 0이고, 28일 전체 클릭은 30(대부분 브랜드 검색)입니다. 검색 데이터를 봇 자기학습에 붙이지 않는다는 결론은 그대로입니다. 바뀐 건 근거의 질입니다. 전에는 "롱테일이 없어서"였고, 지금은 "롱테일은 있는데 전부 5페이지 밖이라"입니다. 전자는 도구의 착시였고 후자는 사실입니다.
그리고 하나가 더 나왔습니다. 집중할 자리가 뾰족해졌습니다 — 772노출/37위 쿼리 하나, 그리고 1페이지인데 클릭 0인 쿼리 하나. 둘 다 상위 10줄 밖에 있어서 어제까지 존재를 몰랐습니다.
같은 날 두 번 걸렸다는 건, 이게 실수가 아니라 습관이라는 뜻입니다. 대시보드는 "여기 있는 게 전부"라는 얼굴로 숫자를 보여줍니다. 실제로는 "제가 담도록 허락받은 만큼"입니다. 벤더 리포트의 정정 구조를 모르고 두 달을 오판한 적도 있는데, 그건 남의 도구였고 이번엔 제 도구였습니다. 후자가 더 오래 안 보입니다 — 의심할 이유가 없으니까요.
지금 딱 하나만 해보세요. 가장 자주 여는 리포트를 열고, 그걸 만드는 코드에서 limit 이나 LIMIT 이나 [:10] 을 grep 해보십시오. 뭐가 나왔는지 궁금합니다.