국가데이터처 MDIS에서 개방하는 국내 인구이동통계에 대해서는 이 웹사이트에서 여러차례 다룬 바 있다. 처음에 읍면동 단위의 상세한 OD 데이터를 보고 설레였던 것도 벌써 9년 전이다.
어디서 오고 어디로 가는가 : 인구이동 2015
전국적으로 한 해에 약 600만 건 정도의 이사를 한다 2015년 기준으로 전국에는 약 5100만 명의 사람들이 1950만 가구를 이루어 살고 있었다. 그리고 한 해 동안 그 중 약 1070만 명이 거주지를 옮겼다.
www.vw-lab.com
Previously, 인구 이동 시각화...
지난 회차 복기 버젼처럼 조금 언급해보자면....

우리는 이사하면서 전입신고를 하는데 이 데이터는 전수가 통계청 MDIS에서 한 해에 한번씩 개방된다. 물론 상세주소는 아니고 읍면동 단위다.

데이터를 받아보면 암호 같다. 첫 줄을 해석해보면 "2025년 1월 2일에 서울특별시 도봉구 방학제3동에서 종로구 청운동으로 73세의 세대주 남성이 주거환경의 이유로 전입하였다"는 의미다.
3500개가 넘는 읍면동 간의 이동을 선 하나하나로 이어보면 아래와 같다.

좌측 그림은 모두 그린 것인데 수도권을 기종점으로 한 이동이 지배적임을 볼 수 있다. 우측 그림은 그래서 수도권 기종점만 모두 걷어버렸다. 지방 대도시를 중심으로 오가는 이동들이 보인다. 마치 꽃잎처럼 오고가는 인구가 대도시 주변으로 펼쳐져 있다.
이 데이터에 애정이 많았는지 이렇게 저렇게 만들어 봤었다. 유튜브에도 영상을 하나 올려놓았다.
선은 그냥 선이 아니다. 하나하나가 사람 한명 한명이다. 아래 영상의 40초 즈음에서 그걸 확인할 수 있다.
New Episode : Flowring
이번에는 2001년부터 2025년까지 25년치 데이터를 AWS S3에 올려놓고 조회하면서 볼 수 있는 뷰어를 만들었다.
시각화 프로토타입도 새로 고안했는데 이름은 'Flow-ring'이라고 붙였다.

데이터 & 아키텍쳐
데이터는 parquet 형식으로 정리했다.
flow 폴더에는 원본을 빠짐 없이 형식만 변경하여 넣었고, netflow 폴더에는 한해 동안의 읍면동간 순이동을 성별과 5세 연령별로 집계해서 넣었다. csv 원본 같은 경우 500메가 가량 되는데 자체 압축 방식을 사용하면서 컬럼 방향으로 빠르게 연산할 수 있는 parquet은 거의 10%의 크기로 줄어든다.

parquet을 AWS S3에 올리면 AWS Athena를 통해 select 쿼리로 조회할 수 있다. 자체 인덱스가 약간 있어 쿼리를 보냈을 때 모든 데이터를 훑지 않고 일부분만 읽어서 응답한다.
다음과 같이 아키텍쳐를 구성했다.

두 데이터 모두 S3에 넣고 Athena로 조회한다. 클라이언트에서는 Lambda에 변수 값들만 보내서 요청하면 람다에서 쿼리 구문을 완성해서 아테나로 보낸다. 즉 S3는 직접 노출하지 않고 받을 수 있는 데이터의 형식을 람다에서 필터링할 수 있게 했다.
읍면동 단위로 조회하게 되면 60MB의 데이터를 받아야 할 경우도 생기는데 람다에서 버텨내지 못했다. 따라서 이 경우는 다시 S3에 일정 기간만 살아있는 파일로 떨구고 링크를 전달하여 클라이언트에서 직접 다운받을 수 있게 했다.
배경 지도는 과금 걱정 없는 MapLibre로. 거기에 deck.gl의 조합으로 행정구역 지도를 그렸다.
Flowring이라 이름 붙인 라이브러리에서는 d3.js의 svg로 표현하게 된다.
Flowring : 이동의 방향성과 양을 한 눈에 가늠할 수 있는 prototype
flowring의 프로토타입 개발과정은 재작년에 올린 바 있다.
OD 시각화 6 : OD 시각화 프로토타입
od 시각화는 계속 진행 중인 시각화의 탐구 주제다.최근 참여했던 프로젝트에서 지도상의 OD데이터 표현 방식에 있어 새로운 프로토타입을 개발해봤다. OD데이터는 출발지와 목적지가 모두 여러
www.vw-lab.com
역시 약간을 복기해 보자면,
아래처럼 파워포인트에 그려서 초안을 잡았다.

od 데이터의 경우 근거리 이동이 항상 많기 때문에 이동량을 선의 굵기로 표현하면 가까운 곳들은 모두 엉켜서 알아볼 수 없게 되어버린다. 그래서 목적지까지 직선으로 잇고, 인위적으로 그린 바깥의 원에 투영시켜 이동량을 표현하였다.

물론 실제 데이터의 경우 같은 방향으로 겹치는경우가 많기 때문에 적절하 간격으로 벌어지도록 코드를 작성했다.

그래서 완성된 것은 흰색의 알파 버젼. 되도록 파워포인트 그대로 표현하려고 했는데, 쌍선으로 된 연장선은 굳이 필요없는 것 같아 지우고 최종 마무리했다.

'순이동전체'와 '이동전체' 탭에서 데이터를 조회하면 직접 해 볼 수 있다.
국내 인구이동 시각화
시도/시군구/읍면동 단위의 국내 인구이동을 지도 위에서 탐색합니다.
domig.vw-lab.com
flowring은 라이브러리로 만들어서 공개했다.
GitHub - vuski/flowring: FlowRing — Radial flow map for visualizing origin-destination movements
FlowRing — Radial flow map for visualizing origin-destination movements - vuski/flowring
github.com
시군구별 20대 인구의 순유출 (2020~2024년)
20대 인구의 이동을 살펴봤다.
2020년부터 2024년까지의 5년동안 20대 인구의 시군구별 순유출을 집계한 결과를 탐색해보자.

강남구의 20대는 어디로 순유출될까. 멀리 가지 않는다. 인근 송파구로 25%가 순유출되는데, 다른 곳들도 성남하남과천 정도다. 1위부터 12위까지 표현하면 원의 둘레가 대부분 가득찬다. 이렇게 표현되는 까닭은 대부분의 지역이 강남구로 순유입되기 때문이다.

관악구도 사정은 비슷하다. 관악구에서 순유출한 지역은 20개 지역이 채 안되는데, 나머지 230개 시군구에서 서울 관악구로 순유입해오고 있다는 얘기다. 1위부터 12위까지로 원이 거의 가득찬다.

강동구에서 순유출된 인구는 하남에 집중되었다. 전체 원을 구성하는 붉은 호들 하나가 연속적으로 크게 둘러치는 형태로 드러난다. 사실 이런 극단적 편중은 신축 아파트의 입주 시기와 맞물려 있을 가능성이 크다.

강동구나 노원구는 인근 경기도로도 순유출되는데, 화성과 평택으로도 많이 간다. 20대를 보내는동안에는 학교와 직장이 변화하므로 이를 따라가면서 거주지를 한 번 이상 이동하는 경우가 많다. 붉은 원을 보면 이동의 방향성은 그래도 고른 편이다.

인천 서구는 서울로도 유출되지만 화성, 평택, 수원 등으로도 많이 간다. 바다쪽에 치우쳐 있으므로 당연히 이동의 방향성은 동쪽/동남쪽이다.



부산의 강서구, 부산진구, 수영구를 한데 모아봤다. 일부 같은 부산 안에서 움직이는 경우도 있지만, 서울이나 화성 평택으로 향하는 방향성이 대단히 뚜렷하게 보인다. 1위부터 12위까지의 이동도 전체의 절반을 차지하는 것을 볼 수 있다. 부산의 경우 젊은 인구의 서울/수도권 유출이 심각한 문제로 다뤄지고 있다.

사실 그런데 부산만의 문제는 아니다. 20대 인구의 수도권 집중은 다른 대도시들도 마찬가지다. 위의 그림은 대구 동구.
화성과 평택은 삼성전자와 삼성전자가 형성하는 산업 생태계로 인해 일자리가 많다. 물론 현대기아도 한 몫 한다.

대전의경우 인근 도시 세종으로의 20대 유출이 1위이긴 하지만 세종을 제해도 수도권으로 절반가량 된다.


광주도 비슷하다. 일부 한 두 지역을 제외하면 1위부터 12위까지는 서울을 향하고 있음이 시각화를 통해 뚜렷하게 드러난다. 물론 그냥 화살표를 이어도 방향성은 잘 보일 수 있지만, Flowring의 장점은 이동량을 부채처럼 펼쳐서 구분할 수 있다는 점이다.

그런데 광역시급 대도시 뿐만 아니라 다른 곳들도 사정은 비슷하다. 원주의 20대 역시 그러하다.



마우스를 움직이며 탐색해 보았더니 경북 상주, 경북 의성, 경남 산청 정도는 이동의 방향성이 남으로 향하고 있다. 상주와 의성의 경우 김천, 구미 대구로, 산청의 경우 진주로 20대의 23%가 이주했다.
읍면동의 상세한 탐색

읍면동 단위의 이동도 탐색해 볼 수 있다. 끊김 없이 방향성과 막대 그래프가 업데이트 된다. EDA 시각화에서는 생각의 흐름이 끊기지 않게 시각화 역시 연속적으로 빠르게 반응하도록 하면 좋다.
시군구 단위의 순이동에서 '경향'을 볼 수 있다면 읍면동은 비교적 동질적 집단의 특성을 관찰할 수 있다. 10대 자녀의 교육 문제로 이사를 고려하고 있다면 이 사이트에 들어가서 우리동네 사람들이 최근 몇년간 어디로 이사를 주로 갔는지 찾아볼 수 있다. 물론 다른 연령도 각각의 사정에 빗대어 지역적 동질 집단의 이동을 찾아볼 수 있겠다.
행정 구역 경계와 시계열 데이터의 문제
눈썰미가 매서운 사람이라면 위의 시각화에서 칠해져야 되는 면들이 조금씩 비어있던 것을 발견했을지도 모른다.
인구이동은 읍면동 단위로 개방되는데, 행정구역은 계속 바뀐다.
개인적으로 지도를 그리느라 필요해서 거의 10년전부터 행정구역 경계를 계속 수정하며 관리하고 있다. github에 공유중인데, 한 줄 한 줄 기록해 놓은 변경 이력을 보면 정말 많은 행정구역이 변경되었다는 사실을 실감할 수 있다.

행정구역이 바뀌면 실질적으로는 집계 단위가 바뀌는 셈이고, 이름만 바꿔도 코드가 바뀌는 탓에 시계열 데이터를 다루기가 무척 난감해진다.
그나마 강원특별자치도, 전북특별자치도, 제주특별자치도의 경우 시도 코드만 바꿔주면 거의 무리 없이 매핑이 되는데, 읍면동의 분동 및 합동, 부천처럼 시군구와 읍면동을 오락가락 하는 경우, 행정구역 경계를 미세하게 서로 주고받으면서 조정하는 경우들은 대응하기가 거의 불가능하다.
2020년~2024년의 5년치 데이터로 순이동을 구했는데 그 안에 행정구역 변경이 있으면 제대로 계산되지 않는다. 실질적으로는 같은 지역이지만 다른 지역으로 다뤄지게 되어 합쳐지지 않는다. 지도 역시 2024년의 경계로 그려져 있으므로 어떤 데이터는 시야에서 완전히 사라지게 되어버린다.
대안이 있다면...
지금 드는 생각 중에 가장 좋은 방법은, 100m 정도의 상세한 격자 단위로 데이터를 개방하고, 변화되는 시점의 행정구역마다 격자 매핑 테이블을 만들어 같이 공개하는 방법이다. 그렇다면 특정 시점을 중심으로 데이터들을 모두 재편할 수 있다.
그런데 개인정보 등의 문제로 상세한 격자를 개방하게 되면 별표처리되는 데이터들도 많아진다. 이런저런 문제로 인해 분석 입장에서 감사함을 느끼도록 데이터를 준비해서 개방하는 사례는 못 본 것 같다.
다른 방법은 매년 과거 시점까지의 데이터를 새로운 주소에 맞춰 갱신 개방하는 것이다. 그런데 여기엔 치명적인 문제가 있다. 현재 실거래가 데이터가 이런 식으로 개방되는데, 과거 데이터를 남겨두지 않고 덮어써버린다. 예를 들어 2008년부터 2020년까지 존재했던 주거지가 있다고 할 때, 2026년의 갱신된 주소로 해당 주거지를 덮어써서 개방하면 현재 시점에서는 존재하지 않으므로 실재했던 시기의 흔적을 찾아내기가 어려워진다. 쉽게 말해 한 예로 지도 상에 찍을 좌표를 찾기가 매우 난감해진다는 말이다.
그렇다고 해서 격자 단위의 데이터가 만사 오케이는 아니다.

데이터처에서 개방하는 100m 격자 인구도 주소를 기준으로 격자에 할당되기 때문에 아파트나 규모가 큰 집합 건물의 경우 한 좌표에 집중된다는 단점이 있다. 사실 모두 그러한 것 같지는 않은데, 위의 그림에서 대구의 한 지점에 막대가 가장 높게 솟아 있다. 100제곱미터 안에 데이터 상으로 무려 4000명이 거주한다.

서울의 경우도 마찬가지다. 서울대학교로 추정되는 장소의 한 격자에 무려 5472명이 거주한다.
쉬운 대안이 없어서 못 하고 있겠지만, 그래도 앞으로 데이터는 계속 쌓여갈 것인데, 시계열 분석을 가능하게 하는 데이터 설계는 매우매우 중요하다.
클라우드를 통한 데이터 관리
여기서 소개한 웹앱은 AWS S3에 데이터를 올려놓고 조회하는 방식을 사용하고 있다.
당연히 개인 PC에 데이터를 두고 분석하는 것이 가장 빠르고 저렴하다. 그럼에도 불구하고 클라우드는 연구실, 연구소, 회사 등 조직 단위에서 일관성 있게 데이터를 관리하기 위해 필요한 장치이기도 하다.
위에서 소개한 정도의 데이터를 올려놓고 개인적으로 분석하고 조회하는 용도로는 한 달에 2달러 과금되기도 어렵다.
물론 데이터 몇십 기가 이상을 올려놓고 수시로 다운로드해야 하는 상황이면 이야기가 달라지겠다. 그러니 데이터 관리에 정답은 없다. 비용과 성능과 유지보수는 트레이드오프 관계이므로 상황마다 적절한 최적해가 있을 뿐이다.
한 가지 팁이 있다면 상시 돌아가는 클라우드 인스턴스 서버를 두는 것보다는 Athena나 Lambda처럼 온디맨드로 과금되는 방식을 고려해볼 것을 권한다. 1회당 0.000O달러 수준이고 몇만회의 무료 티어도 있어서 실질적으로 돈 걱정 하지 않고 사용할 수 있다.
물론 AWS에 데이터를 올리고 람다 함수를 익혀서 코드를 작성하는 것도 대단히 시간이 드는 일이었지만, LLM 의 코딩 기능이 눈부시게 발전한 까닭에 개념만 잡고 있다면 문답형식으로 물어가면서 적절한 대안을 찾고 코드를 작성해서 운용할 수 있다.
'아이디어 및 기획'과 '실행'의 간극이 점점 사라지는 시대다.
목적하는 바가 있다면 수단은 얼마든지 AI의 도움을 얻을 수 있다.
단, 최소한 질문할 수 있을 정도로는 공부해야 한다.
게으른 자들도 편리해진 시대지만, 결국 부지런한 사람이 더 달려나가기 마련이다.
시각화 사이트
국내 인구이동 시각화
시도/시군구/읍면동 단위의 국내 인구이동을 지도 위에서 탐색합니다.
domig.vw-lab.com
시각화 라이브러리
GitHub - vuski/flowring: FlowRing — Radial flow map for visualizing origin-destination movements
FlowRing — Radial flow map for visualizing origin-destination movements - vuski/flowring
github.com
'Function' 카테고리의 다른 글
| Urban Density Profiler : 경계 너머 도시 들여다보기 (0) | 2026.04.02 |
|---|---|
| 1.7MB에 전국 100m 격자 인구 데이터 넣기 (0) | 2026.03.27 |
| Roaring Bitmap을 사용한 로컬데이터(localdata.kr) 브라우징 최적화 (1) | 2026.03.23 |
| OpenStreetMap과 GTFS 데이터를 이용한 도시 자원 접근성 분석 방법 (1) | 2025.03.27 |
| 전세계 기온 시각화 (2) | 2024.12.02 |