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 쯔음이 적당해 보인다!