2026년 10월 7일 기준으로 Shifter는 Oxylabs와 Bright Data보다 많은, 가장 큰 규모의 실시간 미국 IP 풀을 보유하고 있으며, 비용은 그 일부에 불과합니다.Shifter는 이제 가장 많은 미국 라이브 IP 풀을 보유하고 있습니다

벤치마크 보기

지식

지오그리드 순위 추적: 블록 단위로 로컬 순위 측정하기

지역 비즈니스에는 단일한 Google 순위가 존재하지 않습니다. 몇 블록마다 순위가 달라지기 때문입니다. 지오그리드로 이를 측정하고 지표를 해석하며 지도에서 조치를 취하는 방법을 소개합니다.

Daniel Okafor

2026년 10월 7일 · 9 분 소요

로컬 비즈니스 소유자에게 “emergency plumber” 검색에서 몇 위에 랭크되는지 물어보면 대개 하나의 숫자만 알려줄 것이다. 보통 자기 사무실에서 검색했을 때 본 숫자다. 그 숫자는 사실이지만, 지도 위의 한 지점만을 설명한다. Google은 검색자와의 거리를 기준으로 로컬 결과의 순위를 부분적으로 매기기 때문에, 같은 비즈니스가 자기 거리에서는 1위지만 1마일 떨어진 곳에서는 8위, 도시 반대편에서는 아예 보이지 않을 수 있다.

지오그리드는 여러 지점에서 동시에 순위를 측정함으로써 이 문제를 해결한다. 비즈니스가 서비스하는 지역 위에 좌표 그리드를 배치하고, 각 지점에서 동일한 Maps 검색을 실행하여 비즈니스가 나타나는 위치를 기록한다. 그 결과는 단일 순위가 아니라 순위의 지도이며, 비즈니스가 어디서 이기고 어디서 사라지는지를 정확히 보여준다.

이 가이드는 그리드를 설계하는 방법, 이를 실행하는 코드, 팀들이 그리드에서 보고하는 세 가지 지표를 읽는 방법, 그리고 그리드를 오해하게 만드는 실수들을 다룬다.

왜 하나의 순위로는 충분하지 않은가

Google 자체 가이드는 로컬 결과의 배경에 있는 세 가지 요소를 지목한다: 관련성(검색어와 리스팅이 얼마나 잘 맞는지), 거리(검색자 또는 검색에 명시된 위치로부터 결과가 얼마나 떨어져 있는지), 그리고 저명성(리뷰, 링크 및 기타 신호를 통해 비즈니스가 얼마나 잘 알려져 있는지)이다. 관련성과 저명성은 한 블록에서 다음 블록으로 거의 변하지 않는다. 거리는 한 걸음마다 변한다.

이는 로컬 순위를 숫자가 아니라 하나의 표면으로 만든다. 프로필이 강력한 치과는 지역 전체에서 상위 3위를 유지할 수 있는 반면, 더 신생인 경쟁자는 자기 문 바로 앞에서만 순위에 들 수 있다. 사무실에서의 단일 확인은 이 두 사실을 모두 가린다. 도시 단위 확인도 마찬가지다. “시카고 내”에서의 결과를 요청하는 것은 로컬 비즈니스가 신경 쓰는 바로 그 변동을 평균 내어 없애버린다.

위치가 더 넓게 검색 결과를 어떻게 형성하는지 처음 접한다면, 로컬 SEO를 위한 지오 타기팅 SERP API 가이드에서 국가 단위부터 좌표 단위까지 세분화 단계를 다루고 있다. 지오그리드는 그 마지막 단계에 위치한다.

그리드 설계하기

그리드에는 세 가지 설정이 있으며, 각각은 지도가 알려줄 수 있는 정보를 바꾼다.

설정제어하는 것적절한 시작점
크기한 변당 지점 수 (7이면 7 x 7 = 49개 지점)동네 비즈니스는 7, 서비스 지역 비즈니스는 9에서 13
간격인접 지점 간의 거리밀집 도시는 0.5에서 1 km, 교외 및 농촌 지역은 2에서 5 km
줌검색이 이루어지는 지도 줌 레벨거리 수준은 15, 더 넓은 지역은 13

세 가지 규칙이 그리드를 정직하게 유지한다:

  • 홀수 크기를 사용하고 비즈니스를 중심에 두어라. 그러면 중앙 지점이 주소 위에 놓이게 되어, 지도는 항상 최선의 경우를 주변 모든 것과 함께 보여준다.
  • 간격을 실제 사람들의 검색 방식에 맞춰라. 커피숍은 도보 거리 내에서 경쟁하고, 지붕 공사 업체는 카운티 전역에서 경쟁한다. 너무 좁은 그리드는 온통 초록색만 보여주고, 너무 넓은 그리드는 빈 셀만 보여준다.
  • 실행 간에 모든 설정을 고정하라. 크기, 간격, 줌, 키워드, 언어, 기기가 동일하게 유지되어야 하며, 그렇지 않으면 두 지도를 비교할 수 없다.

코드

아래 모듈은 그리드를 구축하고, 각 지점에 대해 Maps 검색을 하나씩 준비하며, 각 응답에서 비즈니스를 찾아 결과를 요약한다. 표준 라이브러리만 사용한다.

import math

EARTH_RADIUS_KM = 6371.0088
NOT_FOUND = 21  # one past the 20 places a Maps search returns


def grid_points(lat, lng, size=7, spacing_km=1.0):
    """A size x size grid centred on (lat, lng), points spacing_km apart."""
    if size % 2 == 0:
        raise ValueError("size must be odd so the business sits on the centre point")
    half = size // 2
    points = []
    for row in range(size):
        for col in range(size):
            north_km = (half - row) * spacing_km
            east_km = (col - half) * spacing_km
            p_lat = lat + math.degrees(north_km / EARTH_RADIUS_KM)
            p_lng = lng + math.degrees(east_km / (EARTH_RADIUS_KM * math.cos(math.radians(p_lat))))
            points.append({"row": row, "col": col, "lat": round(p_lat, 6), "lng": round(p_lng, 6)})
    return points


def maps_params(keyword, lat, lng, zoom=15, api_key="YOUR_API_KEY"):
    """Query parameters for one Google Maps search seen from (lat, lng)."""
    return {
        "engine": "google_maps",
        "api_key": api_key,
        "q": keyword,
        "type": "search",
        "ll": f"@{lat},{lng},{zoom}z",
        "hl": "en",
    }


def rank_of(response, place_id):
    """Position of the business in one response, or None when it is not listed."""
    for place in response.get("places_results", []):
        if place.get("place_id") == place_id:
            return place.get("position")
    return None


def summarise(ranks, top=3):
    """ranks: one rank (or None) per grid point."""
    found = [r for r in ranks if r is not None]
    return {
        "points": len(ranks),
        "found": len(found),
        "arp": round(sum(found) / len(found), 2) if found else None,
        "atrp": round(sum(r if r is not None else NOT_FOUND for r in ranks) / len(ranks), 2),
        "solv": round(sum(1 for r in found if r <= top) / len(ranks), 3),
    }


def render(points, ranks, size):
    """The grid as text, north at the top: rank per point, '--' when not found."""
    cells = {(p["row"], p["col"]): r for p, r in zip(points, ranks)}
    return "\n".join(
        " ".join(f"{cells[(row, col)]:>2}" if cells[(row, col)] is not None else "--" for col in range(size))
        for row in range(size)
    )

grid_points는 킬로미터를 구면상의 도(degree)로 변환하므로, 간격은 적도에서 멀어져도 늘어나지 않고 어떤 위도에서든 고르게 유지된다. 지점 0은 북서쪽 모서리이며, 행은 북쪽에서 남쪽으로 진행된다.

하나의 비즈니스와 키워드에 대해 이를 실행하는 것은 짧은 루프다. 각 지점은 Shifter의 SERP API를 통한 하나의 Google Maps 검색이 되며, 좌표는 ll 파라미터로 전달되어 해당 지점에서 검색이 이루어지게 된다:

import json
import os
import time

import requests

from geogrid import grid_points, maps_params, rank_of, render, summarise

API = "https://serp.shifter.io/v1"
KEYWORD = "emergency plumber"
PLACE_ID = "ChIJ_YOUR_PLACE_ID"        # the business you are tracking
CENTER = (41.8781, -87.6298)            # its address
SIZE, SPACING_KM = 7, 1.0

points = grid_points(*CENTER, size=SIZE, spacing_km=SPACING_KM)
ranks = []
for p in points:
    params = maps_params(KEYWORD, p["lat"], p["lng"], api_key=os.environ["SERP_API_KEY"])
    response = requests.get(API, params=params, timeout=60).json()
    ranks.append(rank_of(response, PLACE_ID))
    time.sleep(0.2)

print(render(points, ranks, SIZE))
print(json.dumps(summarise(ranks)))

올바른 리스팅과 매칭하려면, 이름이 아니라 비즈니스의 place_id를 사용하라. 이름은 중복되기 쉽고, 프랜차이즈는 이름을 공유한다. place_id는 해당 비즈니스를 포함하는 어떤 Maps 응답에서든 찾을 수 있다.

우리는 중심 지점으로부터의 거리에 따라 비즈니스의 순위를 매기되 동쪽이 약간 더 약하게 설계된 합성 응답기로 이 모듈을 테스트했다. 출력은 다음과 같다(숫자는 실제 비즈니스가 아니라 합성 테스트에서 나온 것이다):

12 10  9  8 11 12 14
10  8  6  6  8 10 12
 9  6  4  3  6  8 11
 8  6  3  1  5  8 10
 9  6  4  3  6  8 11
10  8  6  6  8 10 12
12 10  9  8 11 12 14
{"points": 49, "found": 49, "arp": 8.31, "atrp": 8.31, "solv": 0.082}

이 패턴은 실제 그리드가 보여주는 것과 동일하다: 주소에서 강하고, 거리에 따라 약해지며, 방향에 따라 고르지 않다.

지도 읽기: 세 가지 지표

팀들은 그리드를 세 개의 숫자로 요약하며, 각각은 서로 다른 질문에 답한다.

지표계산 방법알려주는 것
ARP, 평균 순위 위치비즈니스가 나타나는 지점들에서의 평균 순위순위에 들 때 얼마나 잘 순위를 매기는지
ATRP, 평균 전체 순위 위치”찾을 수 없음”을 21로 계산하여 모든 지점에서의 평균 순위전체 지역에 걸친 전반적인 가시성
SoLV, 로컬 음성 점유율비즈니스가 상위 3위 안에 드는 지점의 비율맵 팩에서 지도를 얼마나 차지하는지

이들은 함께 읽어야 한다. 단 다섯 개 지점에서만 발견되지만 모두 상위 3위 안에 있는 비즈니스는 뛰어난 ARP를 갖지만 ATRP는 낮다. 지도는 그 이유를 보여준다: 작은 지역을 지배하면서 그 밖의 모든 곳에서는 보이지 않는 것이다. 이는 관련성 문제가 아니라 거리 문제를 가리키며, 더 나은 온페이지 작업으로는 고칠 수 없다.

SoLV는 맵 팩, 즉 Google이 일반 리스팅 위에 보여주는 세 개의 로컬 결과에 의존하는 비즈니스에게 가장 중요하다. 4위부터 20위까지는 전체 Maps 목록에 존재하지만, 거기까지 스크롤하는 검색자는 훨씬 적다.

그리드를 사용해 결정 내리기

일회성 그리드는 진단이다. 반복된 그리드에서 가치가 나온다.

  • 같은 그리드로 경쟁사와 비교하라. 중심에서 당신을 앞서는 두세 비즈니스에 대해 동일한 지점으로 실행하라. 그들의 지도는 종종 경쟁자가 저명성(크고 고른 지역)에서 이기는 반면 당신은 근접성에서 이기고 있다는 것을 보여준다.
  • 조치 후의 변화를 측정하라. 새로운 리뷰, 수정된 카테고리, 또는 고쳐진 주소는 몇 주 후 더 넓어진 초록색 지역으로 나타나야 한다. 고정된 그리드 없이는 개선을 노이즈와 구별할 수 없다.
  • 가장자리를 추적하라. 비즈니스의 강한 지역 경계에 있는 셀들이 양방향 모두에서 먼저 움직인다. 이를 관찰하면 중심을 보는 것보다 더 일찍 경고를 받을 수 있다.
  • 서비스 지역 비즈니스는 주의 깊게 확인하라. 주소를 숨기고 현장에서 고객을 응대하는 비즈니스는 종종 매장형 비즈니스와는 매우 다르게 순위가 매겨진다. 더 넓은 그리드는 고객이 있는 곳에서 그들이 나타나는지를 보여준다.

대부분의 비즈니스에는 주간 실행으로 충분하다. 로컬 순위는 실제로 매일 움직이지만, 고정된 설정으로 주간 주기를 실행하면 모든 변동에 비용을 들이지 않고도 추세를 보여준다. 일반적인 오가닉 순위도 함께 추적한다면, SERP 변동성 감지하기 가이드에서 실제 움직임과 일상적인 노이즈를 구별하는 방법을 다루고 있다.

그리드를 오해하게 만드는 실수들

  • 키워드에 도시 이름을 포함해 검색하기. “Plumber Chicago”는 Google에게 어디를 볼지 알려주며 지점의 위치를 무시하게 만든다. 인근 검색자가 사용할 법한 단순한 서비스 용어를 사용하라.
  • 실행 간에 기기나 언어를 섞어 쓰기. 모바일과 데스크톱 Maps 결과는 다르다. 하나를 선택하고 유지하라.
  • “찾을 수 없음”을 20위로 취급하기. 존재하지 않는 비즈니스는 20위인 비즈니스보다 더 나쁘다. ATRP가 21로 처리하듯 별도로 계산하고, 발견된 지점의 수를 보고하라.
  • 물 위나 빈 땅 위로 그리드를 실행하기. 호수나 숲 속의 지점들은 어떤 고객도 검색하지 않을 셀들을 추가한다. 평균을 내기 전에 중심을 옮기거나 해당 셀들을 제거하라.
  • 한 번의 실행을 진실로 받아들이기. 동일한 검색 사이에도 결과는 약간씩 달라진다. 하나의 셀 색이 바뀌는 것이 아니라 여러 실행에 걸쳐 유지되는 패턴에 따라 행동하라.

정확하고 일관된 순위 측정(개인화, 기기, 시간)에 대한 더 넓은 그림은 정확한 키워드 순위를 측정하는 방법을 참고하라.

비용과 규모

그리드의 비용은 단순히 지점 수 곱하기 키워드 수 곱하기 실행 횟수다. 7 x 7 그리드는 키워드당 49회 검색이다. 열 개의 키워드를 주간으로 추적하면 주당 490회 검색, 즉 월간 약 2,100회다. 같은 열 개 키워드에 대한 13 x 13 그리드는 주당 1,690회 검색이다.

이 계산이 그리드 크기를 신중하게 선택해야 하는 주된 이유다. 고객을 유입시키는 키워드로 7 x 7 그리드부터 시작하고, 지도의 가장자리가 여전히 변화하고 있는 키워드만 넓혀가라.

FAQ

지오그리드는 몇 개의 지점을 가져야 하는가?

동네에 서비스하는 비즈니스라면 7 x 7 그리드(49개 지점)로 대개 충분하다. 도시나 카운티 전체에 서비스하는 비즈니스는 더 넓은 간격이 필요하며, 때로는 가시성이 끝나는 지점을 보기 위해 9 x 9에서 13 x 13 그리드가 필요하다.

지오그리드는 우편번호별 순위 확인과 같은 것인가?

아니다. 우편번호 확인은 한 지역에 대해 하나의 검색을 실행하고 하나의 순위를 반환한다. 지오그리드는 각 좌표에서 검색을 실행하므로, 지역 내에서 순위가 어떻게 변하는지를 보여주며, 이는 거리 기반 로컬 결과가 의존하는 바로 그것이다.

왜 내 비즈니스는 사무실에서는 1위지만 도시 반대편에서는 아닌가?

거리는 Google 로컬 결과의 주요 요소 중 하나다. 주소 근처에서는 거리가 유리하게 작용한다. 더 멀어지면, 검색자에게 더 가깝거나 더 잘 알려진 경쟁자들이 상위 위치를 차지한다.

지오그리드는 얼마나 자주 실행해야 하는가?

대부분의 비즈니스에는 주간 실행으로 충분하다. 새로운 리뷰나 수정된 비즈니스 카테고리 같은 중요한 변화 후 몇 주 뒤에 추가 그리드를 실행하여 강한 지역이 커졌는지 확인하라.

결론

로컬 순위는 숫자가 아니라 지도다. 지오그리드는 여러 지점에서 동일한 검색으로 그 지도를 측정하며, 세 가지 지표(ARP, ATRP, 로컬 음성 점유율)가 이를 요약한다. 그리드를 비즈니스에 중심을 맞추고, 실제 시장 규모에 맞게 설정하며, 실행 간에 고정하면, 로컬 비즈니스가 어디서 보이는지, 어디서 보이지 않는지, 그리고 그것이 변하고 있는지를 가장 직접적으로 확인하는 방법이 된다.

시작할 준비가 되셨나요?

205M개 이상의 IP, 195개 이상의 국가를 지원하는 Shifter의 레지덴셜 프록시를 $0.10/GB부터 이용해보세요.

시작하기