버스 데이터
서울시 버스 정류소 위치 및 노선별 정류장 승하차 데이터 가이드
1. 데이터 개요
| 카테고리 | DB 테이블 | 건수 규모 | 상태 |
|---|---|---|---|
| 버스 정류소 위치 | bus_stop | ~10,000건 | 등록완료 |
| 노선별 승하차 | bus_ridership_logs | ~1,000,000건+ | 등록완료 |
| 정류소 유형 코드 | bus_stop_type | 8건 | 등록완료 |
정류소 마스터: 연 1회 수준 (신규 정류소 추가/폐지 시)
승하차 데이터: 월 단위 CSV 추가 (전월 데이터 공개 후)
관리 페이지: /0xadmin/bus-stop, /0xadmin/bus-ridership
2. 정류소 유형 코드 (bus_stop_type)
| 코드 | 유형명 | 설명 |
|---|---|---|
0 | 일반차로 | 일반 도로변에 위치한 기본 정류소 |
1 | 중앙차로 | 중앙버스전용차로 정류소 (간선버스 등) |
2 | 일반중앙차로 | 일반차로와 중앙차로를 겸하는 정류소 |
3 | 가로변전일 | 가로변에 위치, 전일 운영 |
4 | 가로변시간 | 가로변에 위치, 시간제 운영 |
5 | 마을버스 | 마을버스 전용 정류소 |
6 | 가상정류장 | 물리적 시설 없이 좌표만 존재하는 정류장 |
7 | 한강선착장 | 한강 수상버스 선착장 |
3. 버스 정류소 (bus_stop)
| 컬럼명 | 타입 | 설명 | 예시 |
|---|---|---|---|
nodeId | VARCHAR(20) PK | 표준 버스 정류장 ID (고유 식별자) | 100000001 |
arsId | VARCHAR(10) | ARS 안내번호 (정류장에 표시된 5자리 번호) | 01001 |
stationNm | VARCHAR(100) | 정류소 이름 | 종로5가.동대문종합시장 |
xCoord | DECIMAL(10,7) | X좌표 (경도, WGS84) | 126.9996690 |
yCoord | DECIMAL(10,7) | Y좌표 (위도, WGS84) | 37.5709330 |
stationType | VARCHAR(2) | 정류소 유형 코드 (bus_stop_type과 JOIN) | 0, 1, 5 ... |
createdAt | DATETIME | DB 등록 시각 | 2026-02-27 10:00:00 |
| 인덱스명 | 컬럼 | 용도 |
|---|---|---|
| PRIMARY | nodeId | 정류장 고유 ID로 조회 |
| idx_arsId | arsId | ARS 번호로 검색 (사용자 안내 시) |
| idx_stationType | stationType | 유형별 필터링 (중앙차로만 등) |
| 구분 | 형식 | 용도 |
|---|---|---|
| nodeId | 9자리 숫자 (100000001) | 시스템 내부 식별자. 승하차 데이터와 JOIN하는 기준 키 |
| arsId | 5자리 숫자 (01001) | 정류장 표지판에 표시된 안내번호. 사용자가 인식하는 ID |
승하차 데이터(bus_ridership_logs)에는 두 ID가 모두 포함되어 있어 어느 쪽으로든 JOIN 가능합니다.
4. 노선별 정류장 승하차 (bus_ridership_logs)
| 컬럼명 | 타입 | 설명 | 예시 |
|---|---|---|---|
id | BIGINT (PK) | 자동 증가 ID | 1, 2, 3... |
nodeId | VARCHAR(20) | 표준 버스 정류장 ID (bus_stop와 JOIN) | 100000001 |
arsNo | VARCHAR(10) | ARS 안내번호 | 01001 |
rteNo | VARCHAR(20) | 노선 번호 | 140, 371, N37 |
rteNm | VARCHAR(100) | 노선명 (기점~종점) | 140번(도봉산역~강남역) |
stationNm | VARCHAR(100) | 역명 (지하철 환승역인 경우) | 강남역, null |
| 핵심 데이터 | |||
useYmd | DATE | 사용일자 (승하차 집계일) | 2026-02-23 |
gtonCount | INT | 승차 총 승객수 (해당 노선, 해당 정류장, 해당 일자) | 342 |
gtoffCount | INT | 하차 총 승객수 | 289 |
| 메타 정보 | |||
regYmd | VARCHAR(8) | 등록일자 (서울시 원본) | 20260225 |
createdAt | DATETIME | DB 저장 시각 | 2026-02-27 10:00:00 |
| 인덱스명 | 컬럼 | 용도 |
|---|---|---|
| idx_nodeId_useYmd | nodeId, useYmd | 특정 정류장의 기간별 승하차 조회 |
| idx_rteNo_useYmd | rteNo, useYmd | 특정 노선의 기간별 승하차 조회 |
| idx_useYmd | useYmd | 일자별 전체 집계 |
5. 참고 및 주의사항
서울시에는 약 10,000개의 버스 정류장이 등록되어 있지만, 이 중 광고 매체가 설치된 정류장은 일부에 해당합니다. 정류장 데이터는 모든 정류장의 위치/승하차 정보를 담고 있으므로, 광고 집행 시에는 실제 광고 매체 보유 여부를 별도로 확인해야 합니다.
광고 가능 여부 판별: dukplace-srv의 product 테이블에 등록된 매체만 광고 집행이 가능합니다. 정류장 데이터에 있다고 해서 모두 광고 매체가 있는 것은 아닙니다.
가상정류장 (유형코드 6): 물리적 시설이 없는 좌표만 존재하는 정류장으로, 광고 매체 설치 불가
활용 방법: 주변 정류장 승하차 데이터로 유동인구 규모를 파악한 뒤, product 테이블의 광고 매체 목록과 교차 확인하여 최종 매체 선정
승하차 수 ≠ 대기 인구: 승하차 데이터는 버스를 실제로 탑승/하차한 인원이며, 정류장 앞을 지나가는 보행 유동인구와는 다릅니다.
노선별 집계: 같은 정류장이라도 노선마다 별도 행으로 기록됩니다. 정류장 전체 승하차를 구하려면 해당 nodeId의 모든 노선을 합산해야 합니다.
일별 데이터: 시간대별 데이터는 포함되지 않습니다 (하루 단위 총합). 시간대별 패턴이 필요하면 실시간 유동인구 데이터를 병행 활용하세요.
6. 활용 시나리오
광고 매체 위치나 특정 역의 좌표(xCoord, yCoord)를 기준으로 반경 내 버스 정류장 목록을 조회할 수 있습니다.
입력: 기준 좌표 (예: 강남역 127.0276, 37.4979) + 반경 (예: 500m)
결과: bus_stop의 xCoord/yCoord로 거리 계산 → 반경 내 정류장 리스트 + 각 정류장의 승하차 합산
버스정류장 광고 매체 주변의 실제 버스 유동인구를 산출하는 데 활용됩니다.
위 방법으로 주변 정류장을 찾은 뒤, 해당 정류장들의 nodeId로 bus_ridership_logs를 조회하면 그 위치를 지나가는 모든 버스 노선(rteNo, rteNm)을 알 수 있습니다.
입력: 주변 정류장의 nodeId 목록
결과: 해당 정류장을 경유하는 노선 번호 + 노선명 + 노선별 일 평균 승하차 수
특정 지역을 경유하는 노선의 승객 규모를 파악하여 버스 랩핑 광고 등의 매체 선정에 활용할 수 있습니다.
특정 지역(예: 역삼동) 내 모든 정류장의 승하차 합계를 구하면, 해당 지역의 버스 기반 유동인구 규모를 추정할 수 있습니다.
입력: 지역 범위 (좌표 영역 또는 반경)
결과: 영역 내 정류장 목록 → 일 평균 승차/하차 합산 → 지역별 버스 유동인구 비교
옥외광고 매체가 밀집된 지역의 버스 이용객 규모를 비교하여 매체 가치를 평가할 수 있습니다.
정류장 좌표를 기존 지역 분석의 areaCd와 매칭하면, 실시간 유동인구 + 버스 승하차를 결합한 종합 분석이 가능합니다.
실시간 인구
해당 지역에 현재 있는 사람 수
버스 승하차
해당 지역 버스 이용객 수
생활이동
구 간 인구 흐름 방향/규모
세 가지 데이터를 결합하면 "이 지역에 누가, 어디서, 어떻게 오는지"를 종합적으로 파악할 수 있습니다.