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를 찾을 수 있었는데, 그 중 완벽한 데이터는 없었다. 문제점 중 골치 아프지만 해결이 불가능하지는 않은 것은 ⚠️, 해결 자체가 불가능한 것은 ❌로 표시하였다.

  1. 카카오맵 내부 API
  • https://api.kakao.com/subway/station/timetable.json (실제 링크는 아님) 뒤 역 ID를 입력하여 요청을 보내면 JSON 포맷으로 가공되어 데이터가 나오기 때문에 매우 쉽게 처리가 가능하다.
  • 문제점
    1. 열차번호 정보가 없다. 이 데이터로 역별 시간표는 만들 수 있지만, 열차별 시간표는 만들 수 없다.
    2. ❌ 종착역에 도착하는 열차의 도착시간 정보가 없다.
  1. 공공데이터포털/레일포털 운행정보
  • 공공데이터포털에 부산교통공사에서 제공하는 부산도시철도 운행 정보라는 csv 파일이 있다. 이 파일에는 열차별 & 역별 도착 및 출발시각이 모두 들어있다.
  • 조사를 좀 더 해보니 레일포털에서는 부산교통공사뿐만 아니라 김해경전철, 코레일 등 전체 운영기관의 xlsx 파일을 제공한다.
  • 문제점
    1. ❌ 부산김해경전철 파일에서 평일, 토요일, 휴일 시간표를 모두 같게 해놨다.
    2. ❌ 동해선 파일에서 역별 도착, 출발 시간이 표시되어 있지 않다.
    3. ⚠️ 역별 도착 및 출발시각이 분 단위로 있어, 초 단위 정보는 방법 1로 얻어야 한다. 이때 대부분의 경우 표기된 시각이 초 시각을 버림한 경우이지만, 일부 열차에서는 초 시각을 반올림하여 시간이 맞지 않은 경우가 있다. 이 경우 오류가 나는 경우를 csv에서 일일이 찾아서 파일을 수정해야 한다.
  1. 레일블루
  • 개인이 운영하는 철도 정보 관련 웹사이트이다. 이 중 전철노선시간표에 들어가 정보를 입력하면 열차별 & 역별 도착 및 출발시각이 조회 가능하다.
  • 문제점
    1. ❌ 부산김해경전철의 열차번호가 후술할 레일포털에서 제공하는 표준데이터의 열차번호와 다르다.
    2. ❌ 부산김해경전철 토⋅일⋅공휴일의 가야대행 막차 직전 열차의 정보가 없다. 추측컨대 예전에 없다가 최근에 새로 생긴 듯한데, 아직 레일블루에 업데이트되지 않았다.
    3. ❌ 동해선 전철노선시간표에 재송역이 빠져 있다.
    4. ⚠️ 4호선 (전)동부산대학역이 아직 (현)윗반송역으로 업데이트되지 않았다. 이로 인해 윗반송역 시간표가 텅 비어있다.
    5. ⚠️ 동해선 일광~태화강 구간의 일부 열차에서 카카오맵 API와 다르게 표시되어 있다.
  1. 레일포털 Open API
  • 국토교통부에서 제공하는 Open API 중 열차별 운행시각표가 있다. 본인인증을 하고 활용신청을 하니 얼마 지나지 않아 메일로 serviceKey를 받을 수 있었다.
  • 요일 코드(dayCd)는 토요일이 7, 평일이 8, 휴일이 9이다.
  • 노선 코드(lnCd), 운영기관 코드(railOprIsttCd), 역 코드(stinCd) 정보는 자료실에서 엑셀 파일로 제공한다.
  • 문제점
    1. ⚠️ 도착시간은 제대로 표시되어 있지만, 출발시간을 도착시간과 동일하게 표시해놓았다. 이는 방법 1과 병용하면 해결이 가능하다.
    2. ⚠️ 1~4호선, 김해경전철 일부 열차에서 시간이 카카오맵 API와 다르게 표시되어 있다.
    3. ⚠️ 일부 열차에서 시각이 방법 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 링크를 걸어두도록 하겠다.

  1. 코드 정보를 받아와서 전처리 후 codes.csv 파일로 저장
  2. 1-save_arrival.py 실행 → arrival_original.json으로 저장
  • 이 코드는 방법 1방법 4에서 열차번호, 종착역, 출발시각, 도착시각 정보를 가져와 arrival_original.json에 저장한다.
  • 방법 1방법 4 간 시간이 맞지 않은 부분이 몇 개 있어 열차번호가 모두 채워지지 않는데(방법 4문제점 ii), 이러한 문제가 발생하는 경우를 모두 정리하여 if문으로 예외처리하였다.
  1. 2-fill_end_station.py 실행 → arrival.json으로 저장
  • 이 코드는 방법 4를 통해 종착역에 도착하는 열차 정보를 가져옴으로써 방법 1문제점 ii를 해결한다. arrival_original.json에서 종착역이 없는 열차들을 채워 arrival.json에 저장한다.

환경변수는 env_variables.py, 파일경로는 paths.py, 재사용하는 함수들은 utils.py에 넣어 필요할 때 불러와 사용하였다.

3. 개별 열차 시간표 파일 생성

4. 개별 역 시간표 파일 생성

  • 4-save_timetable.py 실행 →
    1. timetable 폴더에 역별 시간표 생성
    2. arrival.json 중 부산교통공사(BTC)의 출발·도착시간 부분을 hh:mm에서 hh:mm:ss으로 업데이트