subway-live 작업기 3부. 데이터 전처리
0. 들어가며
다음으로는 데이터를 수집하고 처리하여 최종적으로 역별 시간표
와 열차별 시간표
이 두 가지를 생성하는 과정을 거쳤다.
1. 카카오맵 API에서 역 ID 찾기
iPhone 카카오맵 앱에서 출발지점을 바꿔가며 역 ID를 찾아내었는데, 대부분 연속된 숫자라 찾기 그렇게 어렵지는 않았다. 다만 새로 개통한 1호선 다대포해수욕장 연장구간, 동해선 태화강 연장구간, 동해선 부산원동역 이 세 가지는 다소 변칙적이었다.
- 1호선
- 신평~노포:
PSS101
~PSS134
- 동매~다대포해수욕장:
PSS1M159
~PSS1M164
- 신평~노포:
- 2호선
- 장산~양산:
PSS201
~PSS243
- 장산~양산:
- 3호선
- 수영~대저:
PSS301
~PSS317
- 수영~대저:
- 4호선
- 미남~안평:
PSS401
~PSS414
- 미남~안평:
- 부산김해경전철
- 사상~가야대:
PSS1001
~PSS1021
- 사상~가야대:
- 동해선
- 부전~일광 (부산원동 제외):
PSS11M144
~PSS11M157
- 부산원동:
PSS11M226
- 좌천~태화강:
PSS11M248
~PSS11M255
- 부전~일광 (부산원동 제외):
이 데이터를 최종적으로 stations.json
에 저장하였다.
2. 전체 역 시간표 만들기
이 파트가 전체 모든 과정 중 가장 애를 먹였는데, 처음에는 코드만 잘 짜놓으면 쉽게 넘어갈 수 있다고 생각했으나 예상치 못했던 변수가 너무 많았기 때문이다. 근본적으로는 raw data 자체에 문제가 많았기 때문이라고 볼 수 있다.
2-1. raw data 찾기
총 4가지의 raw data를 찾을 수 있었는데, 그 중 완벽한 데이터는 없었다. 문제점 중 골치 아프지만 해결이 불가능하지는 않은 것은 ⚠️, 해결 자체가 불가능한 것은 ❌로 표시하였다.
- 카카오맵 내부 API
- https://api.kakao.com/subway/station/timetable.json (실제 링크는 아님) 뒤 역 ID를 입력하여 요청을 보내면 JSON 포맷으로 가공되어 데이터가 나오기 때문에 매우 쉽게 처리가 가능하다.
- 문제점
- ❌ 열차번호 정보가 없다. 이 데이터로 역별 시간표는 만들 수 있지만, 열차별 시간표는 만들 수 없다.
- ❌ 종착역에 도착하는 열차의 도착시간 정보가 없다.
- 공공데이터포털/레일포털 운행정보
- 공공데이터포털에 부산교통공사에서 제공하는 부산도시철도 운행 정보라는 csv 파일이 있다. 이 파일에는 열차별 & 역별 도착 및 출발시각이 모두 들어있다.
- 조사를 좀 더 해보니 레일포털에서는 부산교통공사뿐만 아니라 김해경전철, 코레일 등 전체 운영기관의 xlsx 파일을 제공한다.
- 문제점
- ❌ 부산김해경전철 파일에서 평일, 토요일, 휴일 시간표를 모두 같게 해놨다.
- ❌ 동해선 파일에서 역별 도착, 출발 시간이 표시되어 있지 않다.
- ⚠️ 역별 도착 및 출발시각이 분 단위로 있어, 초 단위 정보는
방법 1
로 얻어야 한다. 이때 대부분의 경우 표기된 시각이 초 시각을 버림한 경우이지만, 일부 열차에서는 초 시각을 반올림하여 시간이 맞지 않은 경우가 있다. 이 경우 오류가 나는 경우를 csv에서 일일이 찾아서 파일을 수정해야 한다.
- 레일블루
- 개인이 운영하는 철도 정보 관련 웹사이트이다. 이 중 전철노선시간표에 들어가 정보를 입력하면 열차별 & 역별 도착 및 출발시각이 조회 가능하다.
- 문제점
- ❌ 부산김해경전철의 열차번호가 후술할 레일포털에서 제공하는 표준데이터의 열차번호와 다르다.
- ❌ 부산김해경전철 토⋅일⋅공휴일의 가야대행 막차 직전 열차의 정보가 없다. 추측컨대 예전에 없다가 최근에 새로 생긴 듯한데, 아직 레일블루에 업데이트되지 않았다.
- ❌ 동해선 전철노선시간표에 재송역이 빠져 있다.
- ⚠️ 4호선 (전)동부산대학역이 아직 (현)윗반송역으로 업데이트되지 않았다. 이로 인해 윗반송역 시간표가 텅 비어있다.
- ⚠️ 동해선 일광~태화강 구간의 일부 열차에서 카카오맵 API와 다르게 표시되어 있다.
- 레일포털 Open API
- 국토교통부에서 제공하는 Open API 중 열차별 운행시각표가 있다. 본인인증을 하고 활용신청을 하니 얼마 지나지 않아 메일로
serviceKey
를 받을 수 있었다. - 요일 코드(
dayCd
)는 토요일이7
, 평일이8
, 휴일이9
이다. - 노선 코드(
lnCd
), 운영기관 코드(railOprIsttCd
), 역 코드(stinCd
) 정보는 자료실에서 엑셀 파일로 제공한다. - 문제점
- ⚠️ 도착시간은 제대로 표시되어 있지만, 출발시간을 도착시간과 동일하게 표시해놓았다. 이는
방법 1
과 병용하면 해결이 가능하다. - ⚠️ 1~4호선, 김해경전철 일부 열차에서 시간이 카카오맵 API와 다르게 표시되어 있다.
- ⚠️ 일부 열차에서 시각이
방법 1
과 다르게 표기되어 있어 문제가 되는 부분을 수동으로 수정해야 한다.
- ⚠️ 도착시간은 제대로 표시되어 있지만, 출발시간을 도착시간과 동일하게 표시해놓았다. 이는
2-2. 데이터 전처리 방법 계획하기
⭐️ 전제: raw data간 시간이 서로 달라 충돌하는 경우, 항상 방법 1
의 시간을 취한다.
아래에 정리된 바와 같이, 방법 2
, 방법 3
, 방법 4
모두 결점이 있어서 방법 1
과의 비교를 통해 보완을 해야 했다.
- (
방법 2
) 공공데이터포털/레일포털 운행정보- ⚠️ 부산교통공사 관할 1~4호선: 오류가 나는 열차에 대해 일일이 csv에서 수정해줘야 한다.
- ❌ 부산김해경전철: 토요일 및 휴일 시간표가 없다.
- ❌ 동해선: 역별 도착, 출발 시간이 표시되어 있지 않다.
- (
방법 3
) 레일블루- ⚠️ 부산교통공사 관할 1~4호선: 4호선 윗반송역 시간표가 텅 비어있는데, 이를 채우기엔 다소 까다롭다.
- ❌ 부산김해경전철: 열차번호가 표준이 아니며, 토⋅일⋅공휴일의 가야대행 막차 직전 열차의 정보가 없다.
- ❌ 동해선: 재송역 열차시간이 존재하지 않는다.
- (
방법 4
) 레일포털 Open API- ⚠️ 부산교통공사 관할 1~4호선: 일부 열차에서 시간이 다르게 표시되어 있어 직접 수정이 필요하다.
- ⚠️ 김해경전철: 마찬가지 문제가 있다.
- ✅ 동해선: 별다른 문제가 없다.
처음에는 부산교통공사 관할 1~4호선에서는 방법 2
를, 나머지 노선들에 대해서는 방법 4
를 이용하였는데, 방법 2
에서 문제가 있는 데이터가 너무 많아(방법 2
의 문제점 iii
) 방법 4
로 통일하였다.
2-3. 데이터 전처리 하기
이제 본격적으로 데이터를 전처리해보겠다. 전처리의 각 과정에 등장하는 코드의 설명까지 일일이 달기에는 문서 양이 너무 방대해져, 코드의 주요 부분에 주석으로 설명을 단 뒤 Github 링크를 걸어두도록 하겠다.
- 코드 정보를 받아와서 전처리 후
codes.csv
파일로 저장 1-save_arrival.py
실행 →arrival_original.json
으로 저장
- 이 코드는
방법 1
과방법 4
에서 열차번호, 종착역, 출발시각, 도착시각 정보를 가져와arrival_original.json
에 저장한다. 방법 1
과방법 4
간 시간이 맞지 않은 부분이 몇 개 있어 열차번호가 모두 채워지지 않는데(방법 4
의문제점 ii
), 이러한 문제가 발생하는 경우를 모두 정리하여 if문으로 예외처리하였다.
2-fill_end_station.py
실행 →arrival.json
으로 저장
- 이 코드는
방법 4
를 통해 종착역에 도착하는 열차 정보를 가져옴으로써방법 1
의문제점 ii
를 해결한다.arrival_original.json
에서 종착역이 없는 열차들을 채워arrival.json
에 저장한다.
환경변수는 env_variables.py
, 파일경로는 paths.py
, 재사용하는 함수들은 utils.py
에 넣어 필요할 때 불러와 사용하였다.
3. 개별 열차 시간표 파일 생성
3-save_traintable.py
실행 →traintable
폴더에 열차별 시간표 생성
4. 개별 역 시간표 파일 생성
4-save_timetable.py
실행 →timetable
폴더에 역별 시간표 생성arrival.json
중 부산교통공사(BTC)의 출발·도착시간 부분을 hh:mm에서 hh:mm:ss으로 업데이트