목차

  1. 들어가며

    1.1 데이터프로덕트그룹 소개

    1.2 Data(as a)Product 시리즈 소개

    1.3 Data Product Series #1 : SOPIA

  2. SOPIA 개발 과정

    2.1 개발 배경

    2.2 정차지 데이터 생성

    2.3 지역정보 추가

    2.4 POI 추가

  3. SOPIA를 이용한 정차지 분석

    3.1 정차지 분석예시와 유의사항

    3.2 SOPIA 사용 가이드

  4. 마치며



1. 들어가며

1.1 데이터프로덕트그룹 소개

데이터프로덕트그룹은 데이터사이언티스트와 데이터엔지니어가 모여 Data (as a) Product (이하 ‘데이터 제품’) 를 만드는 조직입니다. 데이터가 단순한 분석의 대상을 넘어 제품, 그리고 쏘카의 주요 자산으로서 서비스에 기여하는 것을 목표로 합니다.

1.2 Data Product 시리즈 소개

데이터는 비즈니스 의사결정에 필수적이지만, 처리에는 기술적 전문성과 도메인 지식이 필요합니다. 특히 쏘카의 복잡한 데이터는 전문 조직에 대한 급하고 빈번한 요청을 유발하며, 이로 인해 지속 가능한 시스템을 구축하는데 어려움이 있었습니다. 이 문제를 해결하기 위해 데이터를 다루는 과정을 지속 가능한 시스템으로 만들기로 하였고, 이를 “데이터 제품화(Data as a Product)”라고 정의했습니다. 데이터를 제품으로 취급하므로써, 생산자와 소비자는 일회성이 아닌 계속 발전하는 제품을 통해 소통하고 공동의 목표와 가치를 추구할 수 있습니다. 궁극적으로는 이러한 과정을 통해 쏘카 비즈니스의 가치를 극대화합니다.

이 시리즈에서는 데이터프로덕트그룹이 데이터 제품 개발을 통해 위와 같은 목표를 실체화 하는 여정을 소개할 예정입니다. 데이터 제품을 통한 비즈니스 문제 해결 사례, 데이터 인프라 구성, 데이터프로덕트 그룹이 일하는 방식 등 기술과 데이터로 이동의 혁신을 만들어 가는 과정들을 다루고자 합니다. 데이터로 더 나은 세상을 만들고자 고민하는 모든 분들과 이 시리즈를 통해 경험을 공유하고 싶습니다.

1.3 Data Product Series #1 : SOPIA

SOPIA(SOcar PoI App)는 쏘카의 차량 정차지 데이터 분석 플랫폼입니다. 차량의 정차 지점과 POI(Point of Interest, 관심지점)를 결합하여 고객의 쏘카 이용 목적을 분석하기 위한 데이터 제품입니다. SOPIA는 데이터셋과 애플리케이션으로 구성되어 있습니다.

<SOPIA를 이용한 분석 예시>

<지난해 쏘카 이용자가 가장 많이 찾은 단풍 명소는?>

1위 불국사 <출처 : 쏘카 보도자료>



2. SOPIA 개발 과정

2.1 개발 배경 : SOPIA는 어떻게 탄생하였나?

쏘카는 고객의 이동 전후의 맥락과 이동 사이의 경험 또한 디자인해 심리스(Seamless)한 이동경험 제공을 목표하는 서비스입니다. 고객의 쏘카 이용 목적을 안다면 고객에게 더 나은 이동경험을 제공할 수 있을 것이라고 생각했습니다. 하지만 쏘카는 고객의 전체 여정 중에서 차량이 필요한 경로의 이동 수단으로 이용됩니다. 우리에겐 무슨 목적으로 고객이 쏘카를 이용했을까? 라는 질문이 남게 됩니다.

기존에도 쏘카에서는 고객의 이용 목적을 추정하기 위한 여러 부서의 정차지 데이터 분석 시도가 있었습니다. 하지만 이 과정에서 일회성으로 제작되는 복잡한 쿼리들은 신뢰도가 낮아 이를 재확인하고 처리하는데 드는 불필요한 리소스가 매우 컸습니다. 가장 큰 문제는 정차지 데이터를 어떻게 해석하고 활용할 수 있을지에 대한 접근 방식이 정리되어 있지 않아 혼란스러운 분석 결과를 마주하게 되는 것이었습니다. 이를 해결하기 위해 데이터 프로덕트 그룹에서 만든 데이터 제품이 정차지분석플랫폼 SOPIA 입니다.

💡 쏘카 이용 목적을 쉽게 확인할 수 있도록 우리가 직접 정차지 데이터를 만들어서 관리하면 어떨까?

2.2 정차지 데이터 생성 : 쏘카 차량이 어디로 갔지?

쏘카가 가진 다양한 데이터 중에 고객 이용 목적을 가장 잘 대변하는 정보는 차량의 방문 지점이라고 생각했습니다. 하지만 방문을 추정할 수 있는 ‘정차’데이터가 구비되어 있는 상태는 아니었습니다. 차량에서 발생하는 로그 데이터는 비전문가가 다루기가 매우 까다로운 정보였습니다. 사용자의 데이터 접근성을 낮추는 장애 요인을 명확히 파악해 정리하여 손쉽게 활용 가능한 정차 데이터셋을 구성하고자 했습니다.

먼저 기본적으로 쏘카 차량이 언제, 어디로갔는지 알기 위해서는, 차량의 엔진상태, 위치, 이동거리, 주행정보 등이 필요합니다. 특히, 언제에 해당하는 차량 엔진이 꺼지는 시점과 어디에 해당하는 위치 데이터가 필수적으로 필요했습니다.

차량 상태 정보 테이블
- 엔진상태, 위치(위경도) 정보 → 어디에

차량 운행 정보 테이블
- 차량 엔진이 켜지고 꺼지는 시점 사이를 하나의 운행(trip)으로 기록  → 언제

차량이 언제, 어디로 갔는지에 대한 데이터는 차량 상태 정보 테이블과 차량 운행 정보 테이블에서 각각 얻을 수 있습니다. 하지만 데이터 구조상 단순히 ID를 통해서 두 개의 테이블을 연결할 순 없었습니다. 따라서, 차량 운행 정보의 정차(시동이 꺼진) 시점을 기준으로 특정 시간 범위의 차량 상태 정보를 스캔해서, 그 중 정차 시점과 시차가 가장 적은 시점의 차량 상태 정보에 기록된 위치를 차량의 정차 위치로 간주하였습니다.

마지막으로 해당 정차를 발생시킨 차량의 쏘카존ID, 쿠폰 등의 정보도 추가하기 위해 쏘카 예약 정보 테이블을 마지막으로 JOIN 해서 위와 같은 최종적인 차량 정차지 테이블을 완성하게 되었습니다.

쏘카 차량이 어디로 갔는지를 다시 생각해보자

우리는 앞서 쏘카 차량이 어디에 정차하였고, 얼마나 머물렀는지를 쉽게 알 수 있는 데이터를 만들었습니다. 하지만 여기서 어디 에가 아직 발목을 붙잡았습니다.

우리가 앞서 만든 데이터에서 정차지의 위치 정보는 위경도인데, 이 위경도가 대한민국 어디에 있는지(지역정보), 어떤 장소(POI)인지 알 수 없었습니다.

위경도 X :126.573296, Y :33.2447222 → 주소 제주 서귀포시 칠십리로214번길 37 → POI 정방폭포

따라서, 분석에 사용 가능한 정차지 데이터가 완성되려면 아래 2가지가 추가되어야 했습니다.

  1. 우선 정차지의 위치 정보를 위경도 뿐만 아니라 사람이 인식할 수 있는 지역 정보로도 남겨야 했습니다.
  2. 관심지역(POI)을 기준으로 적절한 고객의 방문을 정의하여 쏘카 차량이 정말 어디를 갔는지를 분석 가능하게 해야했습니다.

2.3 지역정보 추가 : 정차지의 지역 정보를 남기자

위경도 데이터를 통해 지역 정보를 얻기 위해 아래 두가지 방법을 고려하였습니다.

  • Reverse Geocoding API: 구글에서 제공하는 API 를 활용하여 위경도 좌표를 행정동, 도로명 주소로 변환
  • 행정구역경계 polygon 데이터: 통계지리정보서비스(SGIS) 에서 제공하는 각 행정동의 polygon 데이터를 활용하여 위경도 좌표의 위치를 특정
Reverse Geocoding API 행정 구역 경계 polygon 데이터
장점
위경도의 정확한 주소 확인 가능 지역구분정보만 미리 적재되어 있으면 간단한 쿼리로 지역 정보 확인 가능
단점
하루의 수만건의 운행 정보를 처리할 수 있어야 해서 상대적으로 큰 리소스와 비용 소모 위경도의 시/도, 시/군/구, 읍/면/동 수준의 지역 구분 정보만 확인 가능

하루 수만 건의 데이터 처리에 따른 리소스와 비용 문제를 고려애햐 했고, 행정구역 만으로도 충분한 정보가 될 것이라는 논의를 통해 행정구역경계 polygon 데이터를 이용한 지역 구분 방식을 택했습니다.

위경도 좌표의 지역 정보를 찾는 쿼리

SELECT ...
FROM `정차지 테이블` as t
LEFT JOIN `행정구역경계 polygon 테이블` as a
ON ST_CONTAINS(ST_GEOGFROMTXT(a.geometry, make_valid => TRUE), ST_GEOPOINT(t.latitude, t.longitude))

지역정보까지 추가하면서 더욱 더 의미있는 정차지 데이터가 아래와 같이 만들어졌습니다!

2.4 관심지역(POI) 추가

행정구역경계 데이터를 이용해 정차지의 지역정보까지 얻어내는데 성공했습니다. 하지만, 쏘카 차량이 무슨 목적으로 정차를 하였는지 유의미한 분석이 가능하려면 의미 도출이 가능한 수준의 ‘어디’에 라는 정보가 필요했습니다.

사내 인터뷰를 통해 여러 팀들이 ‘대형마트’, ‘놀이동산’, ‘골프장’등 다양한 정보를 원하는 것을 확인했습니다. 우리는 이 정보를 전국 관심지역(POI)에 대한 데이터 수집을 통해 만들어 보기로 했습니다. POI를 지원하는 여러 API를 비교하여 우리의 요구에 가장 부합하는 API를 선정하여 사용하기로 하였습니다.

POI 수집을 위한 API 선정

API를 선정할 때 가장 우선해서 고려했던 점은 비용데이터 품질이였습니다. 최대한 적은 비용으로 POI 리스트를 얻어낼 수 있으면서 동시에 유의미한 데이터를 제공하는지가 중요하였습니다. 데이터 품질은 아래 항목을 중점적으로 비교하여 선정을 하였습니다.

A사
B사
C사
D사
비용적인 측면
O
O
X
X
POI 데이터 양
O
O
X
?
노이즈 측면
O
X
?
카테고리 검색 지원
O
O
X
?
필요한 POI 카테고리 보유 개수
X
?
호출당 POI 반환 갯수
O
O
?

좋음(O) 보통(△) 나쁨(X) 으로 표기하였습니다.

A사와 B사의 데이터 품질이 전반적으로 우수했습니다. 특히, 데이터 분석 시 ‘롯데 아울렛 고양점’이 아닌 ‘아울렛’ 수준의 카테고라이징된 정보가 필수적이었습니다. 데이터 양에 있어서는 ‘롯데 아울렛’이 아닌 ‘롯데 아울렛 1번 출구’, ‘롯데 아울렛 2번 출구’와 같은 너무 상세한 데이터도 결과물의 품질에 노이즈로 작용할 우려가 있었습니다. 이에 따라, API를 적절히 취사 선택하여 활용함으로써 데이터 품질을 유지하고자 했습니다.

최종적으로, ‘아울렛’이라는 카테고리로 검색 시에 신뢰할만한 POI가 올바르게 노출되도록 데이터를 수집하였습니다. 단, 이러한 POI 수집에도 해당 위치의 방문이 롯데아울렛을 방문한 것인지, 아니면 한 건물 안의 이케아를 방문한 것인지 고객의 상세한 목적을 특정하기 어려웠습니다. 이러한 한계를 인지하면서도 최대한 정확하고 유용한 정보로 수집 및 가공하고자 노력하였습니다. 또한 특수한 목적을 가진 관심지점의 분석을 위해 Custom POI 적재 양식을 별도로 제공하고 있습니다.

POI 추출

어떤 API를 사용할지는 선택했지만 어떻게 POI 추출하는지는 또 다른 문제였습니다. 보통 1번의 API 호출로는 특정 위치의 제한된 반경에서 제한된 갯수의 POI만 반환 받을 수 있었는데요, 전국 모든 곳의 POI 리스트를 받기 위해서는 어떻게 효율적으로 API 를 호출할 것인지에 대한 고민이 필요했습니다. 전국을 구역으로 나누어 API를 호출하는 방식을 생각했고, 격자 형태로 구역을 나누는 것이 효율적이라 판단하고 아래와 같은 작업을 수행했습니다.

  1. 대한민국국토를 일정 형태(격자)로 구역을 나눈다.
  2. 그려진 격자의 중심점을 기준으로 반경을 설정해, 해당 반경 내의 POI 를 수집한다.

격자데이터 생성

<국토정보플랫폼 격자 데이터(.shp)로 서울특별시에 *1km x 1km* 격자를 그린 모습>

먼저 국토를 일정 구역으로 나누기 위해 격자 데이터를 생성했습니다. 만약 전국을 1km 형태의 격자로 나누면 약 10만개 정도의 격자가 필요합니다. 격자의 갯수는 곧 API의 호출 횟수=비용을 의미하기 때문에 격자 크기를 적절하게 설정할 필요가 있었습니다.

<격자의 중심점에 7,500m 반경을 그린 모습>

국토정보 플랫폼을 통해 가져온 격자를 Q-GIS 지리정보 프로그램을 활용하여 각 격자 중심점의 위경도 좌표를 추출하였습니다. 추출한 위경도 좌표에 7,500m 반경을 주었을 때 위 그림이 나옵니다. 마트와 같은 밀도가 높은 시설물에는 1km x 1km 격자를 활용했고, 공항 같이 밀도가 낮은 시설물에 대해서는 10km x 10km 격자를 활용했습니다. 각 격자 중심점에서 생성된 반경마다 약간의 중첩을 둠으로써 빠짐없이 POI 리스트를 추출할 수 있게끔 구성하고 중복된 POI는 추후에 제거 처리했습니다.

POI 데이터 수집을 통해서 정차지 분석을 위해 필요한 데이터셋이 모두 준비 되었습니다.

SOPIA Architecture

지금까지 만든 정차지 분석 데이터셋의 전체 구조를 다시 한 번 정리하면 아래와 같습니다. 기적재되어 있는 쏘카의 차량/고객 데이터와 새로 적재한 외부 GIS 정보를 활용해 정차지 정보와 POI 정보를 생성했습니다. 최종적으로 사용자에게는 정차지 정보와 POI 정보 테이블 및 애플리케이션을 제공합니다.



3. SOPIA를 이용한 정차지 분석

3.1 정차지 분석 예시와 유의사항

정차지 분석을 위해 정차지 테이블POI 테이블을 생성했습니다. 이용자의 이해를 돕기 위해 지도 애플리케이션과 이용 가이드도 제공하였습니다. 하지만 여전히 이용 목적을 ‘추정’한다는 한계를 가진 데이터이기 때문에 이를 해석하는데 각별한 주의가 필요했습니다.

💡 만들어진 데이터로 어떻게 인사이트를 도출할까?

<사진 출처 : 네이버지도>

고객은 예약당 여러 정차 정보를 가지며, 각 정차는 여러 POI를 가질 수 있습니다. 따라서 수백만 고객 데이터를 다루는 쏘카에서는 모든 고객의 이용 목적을 추정하는 것은 머신러닝으로 처리되어야 합니다. 그러나 특정 차량의 정차 지점을 시각적으로 확인하거나 어떤 관심지점에 차량이 도착했는지를 카운트하는 것은 데이터 분석으로도 수행 가능합니다. 예약 정보를 통해 관심지점에 대한 방문을 고객의 특성별로도 확인할 수도 있습니다.

예시로 SOPIA를 활용해 아래 ‘쏘카 이용자가 가장 많이 방문한 호텔’과 같은 분석을 수행할 수 있습니다. 이는 정차를 시각적으로 확인할 수 있는 지도 어플리케이션과 카운트를 쉽게 수행할 수 있는 템플릿 쿼리의 주요 기능입니다.

하지만 정차지 데이터의 주요 피쳐들을 분석 목적에 맞춰 세심하게 설정하지 않으면 아래와 같은 잘못된 결과를 도출하게 됩니다. POI 레벨을 전국의 모든 숙박시설로 설정하면 이후 액션 아이템 도출이 불가능한 무의미하고 오염된 정보가 추출됩니다. 도심지 특성상 주변 시설을 너무 많이 포함하게 되는 넓은 정차 반경과 호텔이라는 시설 이용 특성에 맞지 않는 짧은 정차 시간 또한 잘못된 조건입니다. 일반적으로 분석 시에는 관심 지점이라는 고객의 이동 목적을 특정해 가설을 세우게 될 것이고, 분석가가 특정했던 목적(여기서라면 고객이 숙박한 인기 호텔)에 대한 정차를 추출했을 때 해당 정보가 활용이 가능한 레벨로 취합되는지 고민해야 합니다.

<사진 출처 : 아고다>

정차지를 분석할 때는 아래와 같은 기본적인 조건 설정이 필수적입니다.

  • 해석 가능하고 유의미하게 활용될 수 있는 수준의 POI 선정
  • POI 특성에 따른 정차 시간, 정차 반경 설정

💡 액션 가능한 인사이트를 도출하기 위해서는, 집계의 기준이되는 POI 정보를 분석 목적에 맞춰 해석 가능한 수준의 데이터로 재구성할 수 있어야 합니다.

3.2 SOPIA 사용 가이드

SOPIA는 데이터분석가 뿐만 아니라 정차 데이터를 활용하려는 모든 사용자를 대상으로 합니다. 하지만 정차지 분석에는 많은 사전 지식이 필요하며, 사용자의 관점과 의도에 따라 결과가 크게 달라질 수 있습니다. 이에 따른 일반적인 오류와 개별 쿼리 제작의 비효율성을 방지하기 위해 템플릿 쿼리 제작, 제품 설명 및 이용 가이드 배포, 제품 설명 세션 등을 진행했습니다.

그럼에도 정차지 분석에 어려움을 겪는 사용자들을 위해 개별 데이터 분석 지원을 제공하고, 발생한 문제를 백로그로 모아 제품 개선 계획에 반영하고 있습니다

<적재된 POI의 정차수를 카운트하는 템플릿 쿼리 예시>

SET `최소 정차 시간`
SET `정차 반경 범위`
SET `trip 조회 시작일자`
SET `trip 조회 종료일자`

WITH
-- 관심 지역 정보
poi as (
SELECT *
  FROM `POI 정보`
 WHERE poi = "호텔"                 
),
-- 정차지 정보
trip as (
SELECT *
  FROM `정차지 정보`
 WHERE `정차 시간` >= [`최소 정차 시간`]
   AND `정차 일시` between [`trip 조회 시작일자`] and [`trip 조회 종료일자`]
),
-- 관심 지역 방문 정보
poi_trip as (
SELECT *
  FROM (SELECT *
             , st_distance(`정차 지점`, `POI 지점`) as distance
          FROM poi
         CROSS JOIN trip)
 WHERE distance <= [`정차 반경 범위`]
)

SELECT poi
     , count(`정차지 정보`) as cnt -- POI별 방문횟수
  FROM poi_trip
 GROUP BY poi


4. 마치며

SOPIA는 쏘카 고객의 이동 목적을 파악해 더 나은 이동 경험을 제공하기 위해 개발되었습니다. 데이터 제품으로서 SOPIA는 데이터셋(정차지 테이블, POI 테이블), 애플리케이션(정차 지도, POI 지도, 템플릿 쿼리)등의 구성요소를 가지고 있습니다. 현재 배포된 SOPIA v1.0은 쏘카 스테이와 같은 신사업의 전략적 의사결정 자료, 보도 자료, 타켓 쿠폰 푸쉬, 타사와의 데이터 결합 및 사업 협력, 지역 제휴 사업의 근거 자료 등 쏘카 비즈니스 성장을 위해 다방면으로 활용되고 있습니다.

앞으로의 개선 방향은 두 가지입니다. 먼저, POI의 정보성을 강화하여 해석 가능한 유의미한 데이터를 추출하는 것입니다. 현재 수집된 POI는 선정된 카테고리 내의 전국 모든 관심지점의 데이터로 결과 해석에 불필요한 정보가 꽤 섞여있습니다. 유의미한 결론을 도출할 수 있는 의미 단위로 POI 카테고리를 재구성하고, 지점 당 POI의 중첩이 있는 경우 POI 간 우선순위를 설정할 필요가 있습니다. 두번째는 POI 데이터를 정비한 후 머신러닝을 활용하여 전체 쏘카 이용고객의 이동 목적을 파악하는 것입니다. 이를 통해 각 고객에게 최적화된 통합 이동 서비스를 추천할 수 있을 것이라 기대합니다.

SOPIA의 개발 여정 소개를 여기서 마치겠습니다. 이 글을 통해 쏘카 데이터프로덕트그룹이 제안하는 데이터 제품란 무엇인지 조금이나마 전달이 되었기를 바랍니다. 다음 시리즈인 ‘Data Product (2) AI(데이터)로 실제 운영 효율화가 가능할까? - AI 세차 도입기’로 흥미로운 글 가지고 다시 찾아 뵙겠습니다.