코로나를 뚫고 달려보자
“코로나 확찐자” 라는 말을 들어본 적이 있는가? 네이버 오픈 사전에 따르면 “코로나19 감염 우려로 외출을 자제하면서 집안에서만 생활을 하다 보니 활동량이 급감해 살이 확 찐 사람을 낮잡아 이르는 말”로 설명한다[1]. 이 신조어가 보여주는 것처럼 COVID-19바이러스의 전 세계적 유행 (이하 ‘코로나’, ‘코로나 사태’로 칭함)으로 인하여 달라진 세태는 바이러스 감염을 통한 직접적인 신체적 위협뿐만 아니라 활동량 부족과 사회적 소외로부터 발생하는 간접적인 위협을 촉발했다. 이러한 간접적인 위협들은 동네 산책이나 짧은 달리기로 해결할 수 있지만, 코로나 사태는 이마저도 쉽지 않게 만든다.
따라서 이번 SDP Tech Insight에서는 인구 밀집 지역을 회피하는 개인화된 러닝 루트를 추천하여 데이터 사이언스적 방법론으로 이 문제를 해결하려는 노력에 대해서 다루고자 한다.
인구 밀집도 예측
코로나 사태 이후의 대표적인 키워드인 재택근무, 외출 자제, 사회적 거리두기는 모두 바이러스 감염 확률을 줄이기 위해 인구 밀집도를 낮추려는 노력을 보여준다. 이처럼 코로나와 인구밀집도는 높은 관련성이 있기 때문에 러닝 루트를 추천하기에 앞서 인구 밀집 지역을 정확하게 예측하고 이를 고려하여 러닝 루트를 추천해야 한다.
인구 밀집지역을 예측하기 위하여 기존에 구축된 데이터를 통계적 관점과 도시공학적 관점으로 재해석하였다. 예측에 사용한 데이터는 서울시에서 제공하는 유동인구 측정 데이터[2]로서, 서울시 내의 10,000개 지점에 대해서 요일별 / 시간대별 유동인구 측정치를 제공한다. 지역별 유동인구는 요일과 시간대뿐만 아니라 날씨나 휴일과 같은 수많은 변수들로 인해 변화하므로 정확한 예측이 어렵다. 따라서 요일과 시간대를 주요 변수로 보아 데이터 분석에 활용하고 다른 변수들은 추후 연구를 위하여 남겨둔다.
이 프로젝트에서 유동인구를 예측하는 방법은 전통적 교통 수요 예측을 활용한 지역 단위 유동인구 예측과 데이터 히트맵을 사용한 세부단위 예측이다.
먼저 전통적 교통 수요예측 방법론에 기반하여 데이터를 산출한다. 우선 도로망을 기준으로 서울시 내 지역을 구획으로 나눈다.
그림 2 도로망 기준 지역단위 예시
그림2는 도로 구조를 바탕으로 지역 단위를 나누는 예시이다. 이렇게 구성한 그래프 구조를 바탕으로 (1) 구획 내 통행 발생 예측 및 보행교통 수요 변환, (2) 구획 간의 인구 유출입 통행 분포 예측, (3) 이동 수단 선택, (4) 노선 배정 예측을 통한 수요 분산 시뮬레이션 단계를 거쳐 각 구획에 대하여 유동인구를 예측할 수 있다.
그림 3 서울시 내 도로망 교통수요
이를 통하여 그림 3과 같이 구획단위의 유동인구 산출이 가능하다.
그러나 이 방법은 실제 유동인구가 아니라 자동차 통행량을 기반으로 하고, 국지도로나 보행로와 같은 작은 단위에 대해서는 예측이 어렵다는 단점이 있다. 따라서 유동인구 데이터 포인트를 이용하여 히트맵을 생성하여 보완할 수 있다.
그림 4시간별 유동인구 히트맵
그림 4는 유동인구 데이터를 활용하여 시각화한 유동인구 히트맵이다. 앞서 산출한 교통 수요예측 데이터와는 다르게 유동인구의 분포가 연속적이고 세부적인 것을 확인할 수 있다. 이러한 방식은 구나 동 단위의 유동인구 분포와 이동은 예측하기 어렵지만 작은 국지도로나 보행로에 대한 예측에서는 강점을 가진다. 따라서 앞서 분석한 전통적 교통 수요예측 방법론에 더하여 데이터 히트맵을 사용한다면 서울시 내의 전반적인 유동인구 발생을 반영하면서 작은 단위인 국지도로와 보행로의 유동인구를 비교적 정확하게 예측할 수 있다. 이 데이터를 활용하면 실시간 인구 밀집 지역을 피하여 러닝 루트를 추천할 수 있다.
러닝 루트 추천
실제 유동인구를 예측한 후, 예측한 데이터를 활용하여 러닝 루트를 찾는 것은 또 다른 문제가 된다. 러닝 루트를 찾는 것은, 유동인구 히트맵을 활용해 얻어낸 인구이동 데이터를 그래프로 모델링 하는 문제, 모델링 된 그래프에서 러닝 루트를 찾는 문제로 나눌 수 있다.
해당 프로젝트에서 그래프(Graph)를 모델링 한다는 것의 의미는, 실제 위치를 나타낼 수 있는 정점(vertex), 그 정점들을 잇고 있는 간선(edge)으로 구성한다는 의미와 같다. 이 때 정점은 실제 좌표와 일정한 면적을 갖는 속성이 되고, 간선은 그러한 정점들 간에 연결되는 도로가 있는 경우 생성되는 것으로 생각할 수 있다.
비슷한 기능을 구현한 프로젝트 중, 배달의 민족에서 제공하는
길 찾기 기능[3]을
참고할 수 있었다. 해당 프로젝트의 그래프는 특정 좌표를 기준 좌표로 하여, 육각형 꼴의 범위를 갖는 정점을 이어 붙이는 식으로 정의한다. 다음으로, 정점들 사이에 이동을 제한하는 구조물(강, 건물 등)이 있는 경우가 아니라면,
인접한 정점으로 움직일 수 있게 간선을 구성하였다. 이를 참고하여 그래프를 모델링 할 수
있다.
그림 5. 모델링한 그래프 시각화
그림 5는 위에서 설명한 그래프를 모델링하여 시각화한 내용이다. 이동이 제한되는 정점은 빨간색으로 표시된다. 이렇게 모델링 된 그래프에서 적절한 러닝 루트를 찾아야 한다.
길을 찾는 알고리즘에는 다양한 알고리즘이 있으나, 프로그램이 대상으로 하는 범위가 크지 않기 때문에 널리 알려진 다익스트라(Dijkstra) 알고리즘을 활용하여 러닝 루트를 추천한다. 실제로 요청이 매우 많은 프로그램에선 A*(A star)라는 알고리즘이 사용된다. 해당 알고리즘이 다익스트라 알고리즘에 비해 더 효율적으로 동작하지만, 임의로 휴리스틱(heuristics)한 거리의 정의를 내려야 하기 때문에 직접 사용하는 데 어려움이 있다. 일반적인 다익스트라 알고리즘은 단순히 두 정점 간 최단 경로를 찾아주는 알고리즘이지만, 간선의 가중치에 적절하게 유동인구를 배치하여, 실제 이동 거리와 그 사이의 유동 인구 밀집까지 고려하는 러닝 루트를 제공해 줄 수 있다.
그림 6. 추천 러닝루트 시각화.
그림 6과 같이 러닝 루트로 추천할 수 없는 지역(건물, 도로가 없는 곳 등)을 제외한 구역에서 러닝 루트를 추천할 수 있다. 그림 6에서 시작점은 중앙의 회색 점이고, 도착 지점은 짙은 회색으로 표시되어 있다. 해당 기능을 구현해주는 함수를 활용해 사용자가 출발점, 도착점을 입력하면 러닝 루트를 추천해줄 수 있다.
아쉽게도 해당 프로젝트를 배포, 상용화하는 데에는 이르지는 못했으나, 여전히 발전 여지가 매우 많은 프로젝트라고 생각된다. 가능하다면 빠른 시일 내에 베타 버전을 만들어 학회에서 테스트 후 여러 피드백을 받아 상용화할 수 있었으면 하는 바람이다.
Comments
Post a Comment