유통 · 리테일 · 사례

주문은 몰리는데 어느 매장의 15분 도달권에도 들지 않는 구역이, 지도 위에 뜬다

예시 · 가설 시나리오읽는 데 5분Consilience Team

이걸로 되는 일주소로만 적혀 있던 매장·고객·경쟁점을 좌표로 바꿔 지도에 올리고, 매장별 15분 도달권과 주문 핫스팟을 겹쳐 어느 매장도 닿지 못하는 빈 상권을 찾은 뒤, 그 구역을 클릭해 주문 뒤의 고객으로 되짚는다.

월요일 아침 출점 회의. 한 리테일 기업의 전략 담당자 앞에 엑셀 세 개가 열려 있다. 매장 목록, 최근 1년 고객 주문, 경쟁점 현황. 세 시트 모두 '주소' 칸은 가득 차 있고 좌표 칸은 비어 있다. 오늘 답해야 할 질문은 하나다. '다음 매장은 어디에 내야 하나.' 주소가 적힌 줄만 들여다봐서는 어느 동네가 비어 있는지 보이지 않는다.

먼저 밝혀둔다. 이 글의 회사와 숫자는 실제 고객 사례가 아니라, 지도 캔버스의 쓰임을 보여주려고 설계한 가상 데이터 기반의 예시이자 가설 시나리오다. '이런 일이라면 이렇게 풀 수 있지 않을까'를 가짜 데이터로 실험해 본 기록이라고 보면 된다. 다만 고충은 가상이 아니다. 매장도 고객도 경쟁점도 데이터에는 '주소'로만 존재하고, 위치로 묻는 질문은 주소를 좌표로 바꿔 지도에 올리기 전까지 답이 서지 않는다. 그리고 그 변환을 사람은 보통 손으로 한다.

엑셀 세 개, 주소 칸은 가득 차 있고 좌표 칸은 비었다

이 회사의 데이터는 이미 잘 정리되어 있다. 매장과 고객, 주문과 경쟁점이 워크스페이스의 지식그래프 안에서 서로 연결된 엔티티로 놓여 있다. 어떤 고객이 어느 매장에서 얼마를 샀는지, 어떤 경쟁점이 어느 상권에 있는지까지 관계로 이어져 있다. 딱 하나가 빠졌다. 그 모든 장소가 지도 위 어디인지, 좌표다.

  • 매장 목록 엑셀 한 개. 주소 칸은 채워져 있고 좌표 칸은 비어 있다
  • 최근 1년 고객 주문 엑셀 한 개. 어떤 고객이 어느 매장에서 얼마를 샀는지가 들어 있다
  • 경쟁점 현황 엑셀 한 개. 어떤 경쟁점이 어느 상권에 있는지가 적혀 있다
  • 세 시트의 매장·고객·주문·경쟁점은 이미 지식그래프 안에 서로 연결된 엔티티로 놓여 있다. 새로 모을 데이터는 없다
  • 지도에 올려야 할 주소는 수백 개다. 전부 주소 문자열이고 좌표는 하나도 없다

좌표가 없으면 위치로 묻는 질문이 막힌다. '반경 2km 안에 우리 매장이 없는 주문이 가장 많은 동네는?' '각 매장이 15분 안에 닿는 범위는 어디까지고, 그 사이에 뚫린 빈틈은 어디인가?' 이런 물음의 답은 어느 한 줄에도 적혀 있지 않다.

주소를 하나씩 찍고, 직선거리로 어림했다

기존 방식은 단순하지만 고됐다. 주소를 지도 서비스에 하나씩 붙여넣어 핀을 찍고, 화면을 캡처해 회의 자료에 붙인다. 수백 개 주소를 이렇게 옮기다 보면 시간이 녹고, 오타 하나에 엉뚱한 동네가 찍히기도 한다.

거리도 어림이었다. 두 점 사이를 자로 잰 직선거리로 '가깝다, 멀다'를 가늠했지만, 실제 사람은 직선으로 움직이지 않는다. 강을 건너야 하거나 큰길을 돌아야 하면 직선으로 2km라도 차로는 한참이다. 도달권을 직선 원으로 그리는 순간 커버리지 판단은 이미 틀어진다.

가장 아쉬운 건 이렇게 만든 지도가 데이터와 끊겨 있다는 점이다. 캡처 이미지 속 핀을 클릭해도 그 고객이 누구인지, 어떤 주문에서 나왔는지로 돌아갈 수 없다. 지도는 회의 자료에 붙는 이미지로 끝났고, 거기서 다시 질문할 수는 없었다.

그리지 말고, 채팅에서 지도를 요청한다

준비는 새 데이터를 모으는 게 아니라, 이미 그래프에 있는 장소에 좌표를 입히는 일이다. 앱 어디에도 지도 버튼이나 사이드바 아이콘이 없다. 지도는 에이전트가 채팅 턴 중에 그려서 생겨난다.

주소를 지도로 올리는 순서

  1. 채팅에서 공간 질문을 던진다

    "매장과 최근 1년 주문을 지도에 올려 줘." 에이전트가 지식그래프 속 매장·고객·경쟁점 엔티티를 읽어 그 주소를 처리 대상으로 잡는다.

  2. "장소 지오코딩" 카드가 주소를 좌표로 바꾼다

    지오코딩은 주소를 좌표로 바꾸는 일이다. 여기엔 원칙이 하나 있다. 좌표는 모델이 지어내지 않는다. 지오코딩·거리·도달권 같은 공간 계산은 전부 결정론적 서비스와 라이브러리가 맡고, 너무 모호해 확신이 서지 않는 주소는 짐작하는 대신 그렇다고 말한다.

  3. "지도 작성 완료" 카드 아래에 지도가 인라인으로 뜬다

    에이전트가 상황에 맞는 레이어를 골라 저작한다. 주문이 몰리는 곳은 히트맵으로 핫스팟을 드러내고, 권역별 매출은 점을 구역으로 집계해 코로플레스(값에 따라 지역을 색칠한 지도)로 칠한다. 이때 색은 날것의 건수가 아니라 정규화한 비율로 칠한다. 넓은 동네가 무조건 더 '뜨겁게' 보이는 착시를 막기 위해서다.

  4. 매장별 15분 도달권을 겹쳐 달라고 한다

    각 매장에서 15분 안에 닿는 등시선(실제 도로망 위에서 계산한 이동시간 도달 폴리곤)을 그린다. 주문 핫스팟 위에 이 도달권을 겹치면, 어느 도달권에도 들지 않는 주문이 어디에 쌓여 있는지가 드러난다.

  5. "크게 보기"로 전체 화면 탭을 연다

    채팅이 왼쪽 사이드바로 붙어서 지도를 보며 계속 물을 수 있다. 범례는 전체 화면 전용이라, 코로플레스 구간과 레이어 색이 여기서 펼쳐진다.

지도 위에서 묻고, 그래프로 되짚는다

채팅에 이렇게 묻고, 돌아오는 지도를 읽는다
"각 매장이 15분 안에 닿는 범위는 어디까지고, 그 사이에 뚫린 빈틈은 어디인가?"
→ 매장별 15분 도달권이 그려지고, 주문 핫스팟이 그 위에 겹친다.
   핫스팟은 분명한데 어느 매장의 도달권에도 들지 않는 구역이 남는다.
   수요는 있는데 우리가 닿지 못하는 빈 상권이다.

"반경 2km 안에 우리 매장이 없는 주문이 가장 많은 동네는?"
→ 줄로는 보이지 않던 구역이 지도 위 한 자리로 뜬다.
   그 구역을 클릭하면 "선택됨: {라벨}" 알약이 뜨고,
   엔티티에 묶인 마크라면 "그래프에서 보기" 버튼이 함께 나타난다.
   한 번 누르면 그 주문이 어느 고객에서 나왔는지로 곧장 건너간다.

"이 후보지 반경 2km 안의 경쟁점은?"
→ 다시 찍을 필요 없이 그 자리에서 답이 온다.
   지도에 오른 장소는 그 좌표를 그래프에 기억해 두기 때문이다.

이 답이 되는 이유는 계산을 누가 하느냐에 있다. 모델은 무엇을 그릴지 정하고, 좌표와 도달권은 결정론적 서비스와 라이브러리가 계산한다. 그래서 지도에 보이는 빈 구역은 모델이 짐작한 자리가 아니라 실제 이동시간 위에서 떨어진 결과다. 출점 후보지를 고르는 회의에서는 이 구역이 근거와 함께 후보로 오른다.

여기서 지도는 그림으로 끝나지 않는다. 마크를 클릭하면 채팅 작성창에 @멘션 칩이 생기고, 그 피처의 속성과 좌표가 다음 메시지에 함께 실려 간다. 어느 점을 말하는지 설명할 필요가 없다. 지도에서 '어디'를 찾고, 그래프에서 '누구·무엇'으로 잇는다. 다만 육각 집계나 등시선처럼 계산으로 만든 결과물은 뒤에 엔티티가 없어서 "그래프에서 보기"가 붙지 않는다.

무엇이 달라지나

예전지금
주소를 지도 서비스에 하나씩 붙여넣어 핀을 찍고 화면을 캡처한다. 수백 개를 옮기다 오타 하나에 엉뚱한 동네가 찍힌다그래프에 이미 있는 매장·고객·경쟁점의 주소를 에이전트가 한꺼번에 좌표로 바꿔 지도에 올린다. 확신이 서지 않는 주소는 짐작하지 않고 그렇다고 말한다
도달 범위를 직선거리 원으로 어림한다. 강 건너나 큰길 우회는 계산에 없다각 매장의 15분 도달권을 실제 이동시간으로 그리고, 어느 도달권에도 들지 않는 주문이 어디에 쌓였는지를 본다
캡처 이미지 속 핀을 클릭해도 그 고객이 누구인지, 어떤 주문에서 나왔는지로 돌아갈 수 없다마크를 클릭하면 "선택됨" 알약에 "그래프에서 보기"가 붙고, 한 번 눌러 그 엔티티로 건너간다
다음 공간 질문이 생길 때마다 주소를 처음부터 다시 찍는다지도에 오른 장소는 좌표를 그래프에 기억해, '이 후보지 반경 2km 안의 경쟁점은?'을 다시 찍지 않고 답한다

예전에는 주소 줄을 눈으로 훑으며 '아마 여기쯤' 하고 어림했고, 핀을 손으로 찍고 직선으로 거리를 쟀다. 지금은 도달권과 핫스팟이 지도 위에서 계산되고, 사람은 그 결과를 보고 어디에 낼지 판단한다.

주문은 몰리는데 어느 매장의 15분 도달권에도 들지 않는 구역이, 지도 위에 뜬다 · Consilience