metropy는 이렇게 계산합니다
서울시가 공개한 혼잡도와 하차 인원으로 칸마다 앉을 가능성을 비교합니다.
무엇이 문제인가
지하철에서 체감하는 불편 중 하나는 앉을 수 있는가입니다.
그런데 대부분의 지하철 앱은 혼잡도, 빠른 하차, 환승처럼 내린 뒤의 편의를 다루고,
타고 가는 동안 앉는 경험은 직접 다루지 않습니다.
같은 열차를 탄다면 어느 칸에 타야 앉아서 가는 시간이 가장 길까.
metropy가 답하려는 질문은 이것 하나입니다.
지금 상태를 맞히는 문제가 아니라, 출발 전에 열 칸을 비교해 하나를 고르는 문제입니다.
예측이 아니라 비교
칸마다 앉을 수 있는지의 정답은 어디에도 없습니다. 칸별 착석률이나 칸별 하차 인원을
기록한 데이터가 없어서, 정답을 놓고 학습시키는 방식으로는 풀 수 없습니다.
그래서 예측이 아니라 비교를 합니다. 혼잡도, 하차 기록, 역 구조를 합쳐 10칸에 점수를
매기고 순서만 봅니다. 점수는 이동 시간 중 앉아서 가는 비율의 추정값입니다.
이렇게 씁니다
-
경로 입력
노선과 타는 역, 내리는 역, 탑승 시간을 고릅니다. 방향(2호선 내선·외선, 4호선 상행·하행)은 자동으로 정해집니다.
-
데이터 비교
역별 하차 패턴, 칸별 혼잡도, 출입구와 시설 위치를 합쳐 10량을 같은 기준으로 비교합니다.
-
추천 확인
앉아서 가기 유리한 칸을 결과 화면 맨 위에서 확인하고, 칸별 비교와 착석 예상은 자세히 보기에서 확인합니다.
왜 이 칸이 더 나을까요
- 하차 패턴경유역에서 사람이 많이 내리는 칸일수록 빈자리가 생길 가능성이 커집니다.
- 탑승 경쟁사람이 몰리는 칸은 빈자리가 생겨도 바로 앉기 어려워 점수를 낮춥니다.
- 역 구조출구, 계단, 에스컬레이터 위치를 함께 보고 줄이 길어지는 칸을 피합니다.
핵심은 빈자리와 경쟁의 균형입니다
빈자리가 자주 생기는 칸이어도 같은 자리를 노리는 사람이 많으면 앉기 어렵습니다.
metropy는 빈자리가 날 가능성과 그 자리를 잡을 가능성을 함께 계산해,
출근길에 체력을 덜 쓰는 선택을 돕습니다.
점수 = 경유역마다 자리가 날 가능성 × 남은 이동 시간
− 같은 자리를 노리는 사람 수
좌석 센서로 실시간 빈자리를 보는 것이 아닙니다.
공개된 혼잡도와 하차 기록으로 계산한 추정값이라 빗나갈 수 있습니다.
어떤 데이터를 쓰나
아래 표의 공공데이터를 합쳐 씁니다.
30분 단위 혼잡도
서울 열린데이터광장
12,324건
빠른환승 시설 정보
서울교통공사 API
450건
역간 거리
서울 열린데이터광장
52개 구간
실제 이동 시간
TMAP 대중교통 API
43개 구간
칸별 하차율
SK 지하철 혼잡도 API
2,451건
칸별 혼잡도
SK 지하철 혼잡도 API
2,451건
열차 혼잡도
SK 지하철 혼잡도 API
248건
역 하차 비율
혼잡도 데이터 가공
1,092건
시간대별 하차 인원
서울 열린데이터광장
6,000건
시설/POI 가중치
빠른환승 데이터 가공
361건
출구 통행량
SK Exit Statistics API
287건
4호선 칸별 혼잡도
공공데이터포털 15167486 (서울교통공사)
약 9천만 행 집계
건수는 4호선 행을 빼면 2호선 기준입니다.
이렇게 빗나갈 수 있습니다
- 어느 칸이 나은지 비교해 주는 도구이지, 앉을 수 있다고 보장하는 것이 아닙니다.
- 혼잡도는 30분 단위 역 전체 평균입니다. 지금 그 열차에 실제로 몇 명이 탔는지와는 차이가 납니다.
- 칸별 하차 인원은 통계와 시설 위치로 추정합니다. 그날 승객들이 어떻게 움직일지까지는 알 수 없습니다.
- 혼잡도를 얼마나 감점할지 같은 계수는 실측으로 정한 값이 아니라 조정한 값입니다. 앞으로 실제 탑승 결과가 쌓이면 다시 맞출 예정입니다.
- 점수는 이동 시간 중 앉아서 가는 비율의 추정값입니다. 실제 열차 상황에 따라 달라질 수 있습니다.
metropy를 만든 이야기
감으로 줄설 칸을 골라서 타던 습관을 데이터를 이용해서 엄밀하게 공식화해보고 싶어서 기획했습니다.
만들게 된 배경
저는 지하철을 기다릴때마다 앉아서 가고 싶다는 마음에 어디에 줄을 설지 몇칸으로 가야 앉아서 갈 수 있을지 고민합니다.
지하철에 타고 나서는 내 앞에 앉은 사람이 언제 내릴까 눈치를 살피곤 합니다.
“아 앉고 싶다.. 저 사람 언제 내리지..” 라는 생각 해본 적 없으신가요?
그런데 몇칸에 탈지는 매번 감으로 찍었습니다.
수백번 왔다갔다하는 출퇴근길은 대충 어디가 유리한지 알고 있지만, 몇번 타보지 않은 역에서나 초행길에서는
항상 줄이 짧은 칸에 냅다 서거나 포기하게 됩니다.
실제로 제가 기록해본 결과 같은 시간 같은 역에서 같은 요일에 타도 줄 뒤에서 타자마자 앉을때가 있고,
제일 먼저 타도 자리가 없어서 눈치껏 앉은 사람들의 관상을 살피며 어디에 서있을지 결정해야할 때가 있었습니다.
칸을 고를 때 흔히 듣는 말이 두 가지 있습니다. 계단 앞 칸은 붐비니 끝 칸으로 가라는 말과
다음 역에서 많이 내리는 칸 앞에 서라는 말입니다. 그런데 계단 앞 칸은 대개 많이 내리는 칸이기도 해서
두 말이 서로 부딪힙니다. 어느 쪽이 맞는지 공개 데이터로 확인해 보기로 했습니다.
2호선에서 확인한 것
2026년 1월 말 2호선부터 시작했습니다. 서울교통공사 빠른하차 정보(역마다 계단, 에스컬레이터와 가까운 문 위치)가
2호선에 450건, 본선 43개 역(지선까지 51개 역)으로 가장 많았고,
10량 고정 편성이라 칸끼리 비교하기 좋았습니다. 순환선이라 내선과 외선을 따로 볼 수 있고
수도권에서 가장 많이 타는 노선이기도 합니다.
칸마다 실제로 앉았는지를 기록한 정답 데이터는 없었습니다. 그래서 맞히는 대신 열 칸을 비교하기로 했습니다.
SK 지하철 혼잡도 API로 칸별 하차율과 칸별 혼잡도를 모았고,
TMAP 대중교통 API로 역 사이 실제 이동 시간을 받았습니다.
점수는 하차량, 남은 시간, 칸별 가중치, 시간대 배율, 탑승 경쟁도, 혼잡 감점 여섯 가지를 합쳐 냅니다.
3호차
10개 시나리오 중 5개에서 1위
4호차
10개 시나리오 중 3개에서 1위
1, 10호차
양 끝 칸은 일관되게 최하위
끝 칸으로 가라는 말은 2호선 데이터에서는 맞지 않았습니다.
끝 칸은 한산한 만큼 내리는 사람도 적어서 자리가 잘 나지 않았습니다.
가운데 칸(3~7호차)은 출구 시설이 몰려 있어 많이 내리고 자리가 빨리 비지만 타는 사람도 그만큼 몰립니다.
출구 시설 수와 칸별 하차율의 상관계수는 0.45로 생각보다 약했습니다.
빈자리가 나는 정도와 그 자리를 노리는 사람 수를 함께 봐야 했고, 이 균형이 점수 계산의 핵심이 됐습니다.
계산은 FastAPI 서버에 올리고 웹 화면을 만들었습니다.
열차 그림, 칸별 추천 이유, 노선도, PWA 설치는 그 뒤에 추가 구현했습니다.
4호선으로 넓혔습니다
2026년 9월 22일 서울교통공사가 4호선 신형 열차(2026년 6월 운행 시작)의 칸별 혼잡도를
공공데이터포털에 열었습니다. 서울교통공사가 칸별 혼잡도를 연 것은 처음이고 2호선 자료는 아직 없습니다.
2026년 6~7월 10초 간격 로그 약 9천만 행을 역, 시간, 요일, 호차별로 집계해 씁니다.
범위는 당고개~남태령 26역입니다.
칸 사이 비율은 실측이고, 수위는 서울교통공사 30분 혼잡도에 맞췄습니다.
4호선은 순환선이 아니라 상행과 하행으로 나뉘어 방향 처리를 다시 맞췄습니다.
노선 선택과 노선별 역 목록, 가까운 역 찾기를 추가했고 즐겨찾기와 기록, 피드백도 노선을 구분해 저장합니다.
타 보면서 고치는 중입니다
추천을 받고 실제로 탄 결과를 피드백으로 남겨 계산과 맞춰 봅니다.
2026년 9월 11일 금요일 밤 9시 40분 홍대입구에서 잠실 방향으로 탄 7호차는 화면에 93점이 떴는데
12개 역을 서서 갔습니다. 이동 시간 중 앉아서 간 비율은 42%였습니다.
원인 중 하나는 칸별 데이터를 월요일 것만 모아 둔 것이었습니다.
수집 비용 때문에 월요일만 모았고,
다른 평일은 역 단위 계수 하나만 곱해 계산했습니다. 그래서 금요일 밤 유흥가와 대학가 역이 더 붐비는 것을 계산에 넣지 못했습니다.
그 뒤로 금요일 밤에는 월요일 분포로 계산한다고 화면에 알리고, 인원은 “몇 명 안팎”처럼 범위로 말합니다.
한두 건에 맞춰 계수를 바로 옮기지는 않습니다. 9월 9일 실측 한 건에 맞춰 여유 안내를 띄우는 기준을 정했는데
11일에는 틀리게 떴고 14일에는 떠야 할 때 뜨지 않았습니다.
그 뒤로 실측이 30건 이상, 구간이 5개 이상 모이기 전에는 기준과 계수를 실측에 맞춰 바꾸지 않기로 정했습니다.
탄 칸과 앉은 시점을 알려 주시면 그 기록이 다음 수정의 근거가 됩니다.