//////
Search
🚌

버스 놓치기 싫어요

다중 선택
2월
상태
발표
이름
김성우
태그

Background

저는 수원 - 강남 통근러입니다
매주 출근일이면, 편도 1시간 40분이 걸리는 거리를 통근해요
아주 춥던 어느 날, 퇴근 버스를 놓쳤어요
저는 3000번 버스를 타는데, 광역 버스는 입석이 안되더라구요,,
그것도 제 앞앞에서 끊김
그래서 시작했음!
목표: 몇 시에 퇴근해야 버스를 놓칠 위험이 낮아질까?

Data Collection

모으고자 한 데이터
3000번 버스의 스냅샷 데이터
최대한 짧은 주기로 스냅샷 데이터를 모아보면, 잔여 좌석이 언제 동나는 지 판단할 수 있겠다!
수집 방법
공공 데이터 포털의 OPEN API + N8N(자동화 툴)
수집한 데이터 컬럼 명세
1.
스냅샷 데이터: 매 주기(4분)마다 3000번 버스의 위치 및 잔여좌석 정보 수집
column name
description
example
plateNo
버스 번호판
경기70사1642
remainSeatCnt
잔여 좌석
35
stationId
정류장 번호
220000137
stationSeq
정류장 순서
52
timestamp
데이터 수집 시간
2025-02-08 16:12:36
2.
정류장 정보: stationId → stationName 매핑을 위한 테이블
column name
description
example
stationId
정류장 번호
220000137
stationName
정류장 이름
선바위역2번출구(광역)
stationSeq
정류장 순서
52

Data Preprocessing

1.
스냅샷 데이터에 정류장 이름을 매핑해주자!
2.
(중요 & 트러블 슈팅) 각 운행의 고유한 번호를 붙여주자!
a.
번호판이 경기70사1642인 버스는 하루에도 n번씩 운행 함
b.
안그러면, 막히는 시간대에 같은 정류장에 같은 버스가 여러 번 찍힐 수 있음(스냅샷의 단점ㅜㅜ)
c.
따라서 경기70사1642 버스가 해당 일자에 몇 번째 운행인지 trip_id를 달아줘야 함!
트러블 슈팅
3.
이제 특정 시간대, 잔여좌석수별로 unique한 trip_id를 count할 수 있다!

Analysis & Visualization

시각화는 간단하다!
특정 정류장으로 필터링하고
5분 단위로 aggregation 한 뒤, unique한 trip_id로 aggregation 하면 된다!
총 버스의 수와 잔여좌석이 5석 이하인 버스를 unique하게 집계 한 후, line chart로 간단히 뿌려보자!
데이터 수집/전처리/시각화 한 결과물이 아까우니 stremlit으로 배포해주자
이제 숫자를 살펴보면,
당연하겠지만, 퇴근 시간대에 ‘잔여좌석 5석 이하 버스 수’가 많아진다
더 자세히, Zoom In해서 보면,
18:35분(그림 상 1)과 19:00(그림 상 2)가 위험해 보인다.
특히, 18:35분에 타면 100% 확률로 잔여좌석 5석 이하가 남아버린다…

결론

엥간하면 18:35에는 집에 가지 말자..
19:00도 마찬가지
그 언저리에 집에 가려면 18:40 쯔음이 적당해 보인다!