배율 0.38이 1.03으로 뒤집혔다 — 발행일을 통제하니 사라진 두 신호

·

블로그 글 98편의 주간 조회수를 제목 형태별로 갈라 봤다. 어떤 제목이 유입을 받는지 규칙으로 만들어서 린트에 넣을 생각이었다. 처음 나온 표에서 규칙 두 개를 만들 뻔했고, 둘 다 틀렸다.

처음 본 표

전체 98편을 그냥 두 덩어리로 나눠 중앙값을 비교했다. 아래 숫자는 실측한 주간 조회수 데이터를 직접 돌려 찍은 것이고, 같은 스크립트를 다시 실행하면 재현된다.

쉼표(2절 제목)   해당  46편 중앙  9.5 | 나머지 52편 중앙 50.5   배율 0.20x
"총정리"        해당  17편 중앙 36.0 | 나머지 81편 중앙 30.0   배율 1.20x
"자격" 포함      해당  49편 중앙 63.0 | 나머지 49편 중앙  9.0   배율 6.68x

쉼표가 0.20배다. “제목을 쉼표로 두 절 나누면 조회수가 5분의 1”이라는 규칙이 바로 나올 것 같은 숫자다. 표본도 46 대 52로 균형이 맞다.

그런데 자격 포함이 6.68배인 게 걸렸다. 단어 하나가 그렇게까지 할 리가 없다. 자격이 들어간 글은 대부분 주택 공고글이고, 안 들어간 글은 법률·서류 개념글이다. 즉 이 6.68배는 단어의 효과가 아니라 주제의 효과다.

같은 의심을 쉼표에도 해 봐야 했다.

첫 번째 통제 — 주제

주거 관련 글만 남기고 다시 셌다.

주거     66편 중앙 48.0  합 5,301 (전체 조회수의 89%)
비주거   32편 중앙  6.5  합   671

주거글이 트래픽의 89%를 낸다. 그래서 주거·비주거를 섞어 놓으면 무엇을 재도 그 차이가 먼저 나온다. 주거글 66편 안에서만 쉼표를 다시 봤다.

쉼표   23편 중앙 29.0 | 나머지 43편 중앙 54.0   배율 0.54x

0.20배에서 0.54배로 올라왔다. 절반 이상이 주제 효과였다는 뜻이다. 그래도 0.54배면 여전히 나쁘다.

두 번째 통제 — 발행일

발행일별 중앙값을 뽑아 봤더니 이런 모양이었다.

2026-07-29   1편 중앙  15.0
2026-08-05   3편 중앙  16.0
2026-08-12   5편 중앙   6.0
2026-08-14  15편 중앙  72.0
2026-08-16   4편 중앙 151.0
2026-08-18  11편 중앙  46.0
2026-08-20   9편 중앙  39.0

8월 13일을 기점으로 완전히 다른 블로그다. 그 전은 한 자릿수, 그 후는 수십 회다. 유입이 이 시기에 늘었다.

그리고 두 집단의 발행일 분포를 확인했다.

쉼표글  발행일: 07-29 ~ 08-23  (초기부터 고르게)
무쉼표  발행일: 08-05 ~ 08-22  (사실상 08-13 이후에 집중)

쉼표를 쓴 제목은 초기 글에 몰려 있었다. 초기 글은 유입이 붙기 전에 발행됐으니 조회수가 낮을 수밖에 없다. 쉼표가 조회수를 깎은 게 아니라, 조회수가 낮던 시기에 내가 쉼표를 즐겨 썼던 것이다.

주거글이면서 8월 13일 이후에 발행된 56편으로 좁혀 다시 셌다.

쉼표          14편 중앙 57.0 | 나머지 42편 중앙 55.5   배율 1.03x

0.38배가 1.03배가 됐다. 효과가 없다.

‘총정리’도 같았다

총정리는 주거글·발행일 통제 후 0.59배로 나왔다. 이것도 규칙으로 만들 뻔했다. 그런데 총정리를 제목에 쓴 글에는 국민임대주택이란?, 청년안심주택이란? 같은 개념 설명글이 많았다.

제목에 이란이나 물음표가 든 개념글을 빼고 다시 셌다.

개념글 제외 후: 총정리 10편 중앙 57.0 | 나머지 43편 중앙 66.0   배율 0.86x

0.59배에서 0.86배. 나쁜 것은 총정리라는 단어가 아니라 개념 설명글이라는 종류였다. 단어는 그 종류에 자주 딸려 오는 표식이었을 뿐이다.

살아남은 신호

전부 무너진 건 아니다. 같은 통제를 통과하고 오히려 커진 것이 있었다.

신호전체 98편주거·08-13 이후 56편
단지 고유명3.56배3.63배
지역명만1.74배1.30배
쉼표 제목0.20배1.03배
”총정리”1.20배0.86배

발행일만 통제한 70편 구간에서는 고유명 효과가 4.97배까지 올라갔다. 교란이 이 효과를 오히려 가리고 있었다는 뜻이다.

통제 후에 커지는 신호가 진짜에 가깝다. 반대로 통제하자마자 1로 수렴하면 그건 다른 변수의 그림자다.

도구에 넣은 안전장치

층화를 하면 표본이 급격히 줄어든다. 98편이 56편이 되고, 그 안에서 나누면 한쪽이 8편까지 내려간다. 8편의 중앙값은 한 편만 바뀌어도 출렁인다.

그래서 비교 함수에 최소 표본을 넣고, 미달이면 숫자를 아예 내지 않게 했다.

function cut(pool, name, pred) {
  const a = pool.filter(([t]) => pred(t)).map(([, v]) => v);
  const b = pool.filter(([t]) => !pred(t)).map(([, v]) => v);
  if (a.length < 4 || b.length < 4) {
    console.log(`  ${name} 표본부족(${a.length}/${b.length})`);
    return;                                  // 배율을 계산하지 않는다
  }
  const r = (median(a) + 0.5) / (median(b) + 0.5);
  console.log(`  ${name} ${a.length}편 중앙 ${median(a)} | ` +
              `나머지 ${b.length}편 중앙 ${median(b)}  ${r.toFixed(2)}x`);
}

배율 옆에 항상 표본 수를 같이 찍는다. 3.63x만 보면 강해 보이지만 8편 / 48편 3.63x로 보면 8편이라는 사실이 같이 들어온다.

중앙값을 쓰는 것도 같은 이유다. 이 데이터에서 1위 글 한 편이 856회로 전체 5,972회의 14%였다. 평균으로 보면 그 글이 속한 그룹이 무조건 이긴다.

정리

  • 전체 집계에서 나온 차이는 그룹 구성의 차이일 수 있다. 쉼표 0.20배는 사실 시기와 주제의 차이였다.
  • 의심의 방아쇠는 “말이 안 되게 큰 숫자”다. 자격 6.68배가 이상하다고 느낀 게 나머지를 다시 보게 만들었다.
  • 통제 후 1로 수렴하면 버리고, 커지면 믿는다.
  • 층화는 검정력을 깎는다. 그러니 최소 표본에 미달하면 숫자를 내지 않게 도구를 만들어야 한다.

이 작업을 안 했으면 “제목에 쉼표를 쓰지 마라”는 규칙이 린트에 들어갔을 것이다. 그리고 그 규칙은 이후 모든 글의 제목을 조용히 망가뜨렸을 것이다.

자주 묻는 질문

층화가 왜 필요한가요?

전체 집계에서 보이는 차이가 그룹 구성의 차이일 수 있기 때문입니다. 제 경우 쉼표가 들어간 제목은 대부분 초기에 쓴 법률 개념글이었고, 쉼표가 없는 제목은 대부분 최근에 쓴 공고글이었습니다. 두 집단은 쉼표 말고도 발행 시기와 주제가 통째로 달랐습니다. 그래서 쉼표의 효과처럼 보인 것이 사실은 시기와 주제의 효과였습니다.

표본이 작아지는 문제는 어떻게 하나요?

피할 수 없습니다. 저는 98편을 발행일과 주제로 자르면서 56편까지 줄였고, 그 안에서 다시 나누면 한쪽이 8편까지 내려갑니다. 그래서 저는 어느 한쪽이 4편 미만이면 아예 '표본부족'으로 출력하고 배율을 계산하지 않게 했습니다. 숫자를 안 내는 것이 틀린 숫자를 내는 것보다 낫습니다.

그럼 어떤 신호를 믿어야 하나요?

통제 후에도 남거나 오히려 커지는 신호입니다. 제 데이터에서 고유명 효과는 전체에서 3.63배였는데 발행일을 통제하자 4.97배로 커졌습니다. 교란이 그 효과를 가리고 있었다는 뜻입니다. 반대로 통제하자마자 1에 가까워지는 신호는 애초에 다른 변수의 그림자였다고 보면 됩니다.

배율은 평균으로 내나요, 중앙값으로 내나요?

저는 중앙값을 씁니다. 조회수는 상위 한두 편이 전체의 상당 부분을 차지하는 분포라 평균이 크게 흔들립니다. 실제로 제 데이터에서 1위 글 한 편이 전체 조회수의 14%였습니다. 평균으로 보면 그 한 편이 속한 그룹이 무조건 이깁니다. 다만 중앙값도 표본이 작으면 한 편만 바뀌어도 출렁이니, 표본 수를 배율과 항상 같이 출력합니다.

#데이터분석#통계#교란변수#블로그운영#측정