
"클라우드" 트렌드를 네이버에서 검색하면 상승세인데, 구글에서 검색하면 정체다. 어느 쪽이 맞는 걸까? 둘 다 맞다. 보는 시장이 다를 뿐이다.
한국 시장의 검색 트렌드를 분석하려면 네이버와 구글 양쪽을 동시에 봐야 한다. 네이버는 국내 사용자의 관심을 반영하고, 구글은 글로벌 트렌드의 국내 유입을 보여준다. 문제는 이 두 소스의 데이터 형식이 완전히 다르다는 것이다. 네이버는 공식 DataLab API로 일간 데이터를, 구글은 비공식 라이브러리 pytrends로 주간 데이터를 제공한다. 이 둘을 통합하여 교차 분석하는 Python 라이브러리를 처음부터 만들었다.
네이버 트렌드만 보면 한국에서 "뭐가 뜨고 있는지"는 알 수 있지만, 그게 글로벌 흐름인지 국내 한정인지 구분할 수 없다. 반대로 구글 트렌드만 보면 한국 특수한 관심사를 놓친다. 예를 들어 "수능" 같은 키워드는 네이버에서 폭발적이지만 구글에서는 거의 보이지 않는다. 반대로 "Kubernetes"는 구글에서 꾸준한 상승세인데 네이버에서는 한참 뒤에야 관심이 올라온다.
이 괴리를 데이터로 읽을 수 있다면, 마케팅 타이밍이나 콘텐츠 전략에 쓸모가 있다. 그래서 두 소스를 하나의 분석 파이프라인으로 묶기로 했다.
두 소스의 데이터를 통합하려면 공통 모델이 필요하다. Pydantic v2로 핵심 모델을 먼저 정의했다.
TrendPoint: 날짜 + 값 한 쌍. 네이버든 구글이든 결국 이 형태로 정규화된다.
TrendData: 키워드 + TrendPoint 리스트 + 소스(naver/google).
TrendComparison: 정렬된 두 시계열 + Pearson 상관계수 + 괴리 구간 리스트 + 모멘텀 점수.
이 모델 위에 NaverClient(async httpx), GoogleClient(sync pytrends), 그리고 교차 분석 엔진인 TrendComparator를 얹었다.
TrendComparator의 핵심은 5단계 파이프라인이다.
1. 시계열 정렬: 네이버는 일간, 구글은 주간이라 직접 비교가 불가능하다. 7일 간격으로 리샘플링하고 공통 기간만 추출한다.
2. 정규화: 네이버와 구글 각각 최대값 100 기준으로 정규화한다. 절대치 비교는 의미 없고, 추세의 형태를 비교하는 것이 핵심이다.
3. Pearson 상관계수: 두 시계열의 상관을 -1~1 사이 값으로 계산한다. 0.8 이상이면 네이버와 구글에서 비슷한 패턴으로 움직이는 키워드, 0.3 이하면 두 시장에서 완전히 다른 양상을 보이는 키워드다.
4. 괴리 감지: 정규화된 값의 차이가 임계값(25)을 넘는 시점을 찾는다. 이 구간이 의미 있는 인사이트를 제공하는 핵심 부분이다.
5. 모멘텀 계산: 최근 30일 평균과 이전 기간 평균을 비교해서 상승/하락 추세를 판단한다.
실제 코드를 보면 이렇다.
class TrendComparator:
def compare(self, naver: TrendData | None, google: TrendData | None) -> TrendComparison:
# 1. 시계열 정렬 (7일 간격 리샘플링, 공통 기간)
aligned_naver, aligned_google = self._align_time_series(...)
# 2. 정규화 (최대값 100 기준)
norm_naver = self._normalize(aligned_naver)
norm_google = self._normalize(aligned_google)
# 3. Pearson 상관계수
correlation = self._compute_correlation(norm_naver, norm_google)
# 4. 괴리 감지 (임계값 25 초과 시)
divergences = self._detect_divergences(norm_naver, norm_google)
# 5. 모멘텀 (최근 30일 vs 이전 기간)
momentum = self._compute_momentum(norm_naver, norm_google)
return TrendComparison(...)NaverClient는 공식 API라서 구현이 깔끔하다. async httpx로 호출하고, 응답 JSON을 TrendData로 변환하면 된다. 최대 5개 키워드를 동시에 조회할 수 있다.
# NaverClient - async httpx 기반
async with NaverClient() as client:
data = await client.fetch_trend(["파이썬", "자바스크립트"], start, end)GoogleClient는 사정이 다르다. pytrends가 비공식 라이브러리인데다, urllib3 2.x와 호환 문제가 있었다. 특히 retries 파라미터 처리가 바뀌면서 기본값으로 두면 에러가 났다. retries=0으로 설정하고 자체 재시도 로직을 구현하는 것으로 해결했다.
# GoogleClient - pytrends 래퍼 (retries=0, 자체 재시도)
self._pytrends = TrendReq(hl="ko", tz=540, retries=0)
google = GoogleClient()
data = google.fetch_trend(["Python", "JavaScript"], period_months=3)이 라이브러리에서 가장 흥미로운 부분은 괴리 감지다. 정규화된 네이버 값과 구글 값의 차이가 25를 넘는 구간을 찾는데, 이 괴리의 방향에 따라 해석이 달라진다.
click으로 CLI를 붙여서 터미널에서 바로 분석할 수 있게 만들었다. dotenv도 지원해서 네이버 API 키를 .env 파일에 넣어두면 자동으로 로딩된다.
# 키워드 비교
uv run search-trend compare "Claude" "ChatGPT" --period 3m
# 단일 키워드 심층 분석
uv run search-trend analyze "AI" --deep -p 1y가장 시간을 잡아먹은 건 pytrends의 urllib3 호환 문제였다. pytrends 4.9.2가 urllib3 2.x의 retries 파라미터 처리 변경을 따라가지 못해서 런타임 에러가 났다. 공식 이슈에도 올라온 문제인데, 해결책은 retries=0으로 설정하고 자체 재시도 로직을 만드는 것이었다.
또 하나 배운 것은 pytrends의 trending_searches()(rising 기능)가 더 이상 안정적으로 동작하지 않는다는 것이다. 비공식 라이브러리는 Google 내부 변경에 취약하다. 의존하는 기능의 범위를 최소화하고, 핵심인 시계열 데이터 조회만 사용하기로 했다.
라이브러리를 만들고 나니 키워드 분석이 CLI 한 줄로 끝난다. 이전에는 네이버 DataLab 웹사이트에서 수동으로 검색하고, 별도로 Google Trends 웹에서 같은 키워드를 검색해서 눈으로 비교했다. 이제는 하나의 명령으로 양쪽 데이터를 가져오고, 상관계수와 괴리까지 자동으로 계산된다.
데이터 소스가 다를 때 중요한 건 "공통 모델을 먼저 정의하는 것"이다. TrendPoint, TrendData라는 공통 언어를 만들어놓으니 네이버든 구글이든, 나중에 다른 소스를 추가하더라도 같은 파이프라인에 흘려보낼 수 있다. 비공식 API에 의존하는 부분은 최소한의 기능만 사용하고, 불안정한 기능은 과감히 빼는 것이 장기 유지보수에 유리하다.
그대로는 불가능하다. 네이버는 일간, 구글은 주간 데이터를 주고, 정규화 기준도 다르다. 7일 간격으로 리샘플링하고 최대값 100 기준으로 재정규화해야 비교할 수 있다.
비공식 라이브러리라 Google 내부 변경에 취약하다. urllib3 2.x 호환 문제도 있어서 retries=0으로 설정하고 자체 재시도 로직을 구현했다. trending_searches 같은 기능은 불안정해서 제거했다.
네이버 > 구글이면 국내에서만 관심이 높은 키워드, 구글 > 네이버이면 글로벌 트렌드가 국내에 아직 유입되지 않은 키워드다. 이 괴리가 좁혀지는 시점이 마케팅 타이밍이 된다.