공공 데이터를 활용해 서울시 606번, 420번 저상버스의 정류장별 **탑승 가능 확률(0~1)**을 예측하는 머신러닝 프로젝트입니다.
실시간 저상버스 위치와 과거 혼잡도 데이터를 기반으로, 특정 정류장에서의 탑승 가능 확률을 예측하여 교통약자의 이동 편의를 돕습니다.
- 언어: Python
- 데이터 수집: requests, python-dotenv, APScheduler
- 데이터 분석: pandas, numpy, matplotlib, seaborn, plotly
- 모델링: XGBoost, scikit-learn, SHAP
| 데이터 |
출처 |
설명 |
| 버스 노선/정류장 정보 |
공공데이터포털 (서울시 버스 API) |
실시간 노선, 정류장, 도착, 위치 정보 |
| 승하차 인원 통계 |
서울시 열린데이터광장 |
노선별 정류장별 시간대별/일별 승하차 인원 |
| 날씨 |
기상자료개방포털 (ASOS) |
시간별 기온, 강수량, 풍속 |
| 공휴일 |
직접 정리 |
2025.08~2026.01 법정 공휴일 |
newbie_final/
├── data/
│ ├── raw/ # 원본 데이터 (.gitignore, holidays/weather만 포함)
│ ├── filtered/ # 606/420번 필터링된 데이터
│ │ ├── hourly_boarding_606_420.csv
│ │ └── daily_boarding_606_420.csv
│ └── processed/ # 정제된 데이터
│ ├── hourly_boarding_clean.csv
│ ├── daily_boarding_clean.csv
│ └── weather_clean.csv
├── notebooks/
│ ├── 2-1_cleaning_review.ipynb # 정제 결과 확인 노트북
│ └── 2-3_EDA.ipynb # 탐색적 데이터 분석 노트북
├── clean_data.py # 데이터 정제 스크립트
├── collect_route_info.py # 노선 기본 정보 API 조회 스크립트
├── filter_route_data.py # 전체 데이터에서 606/420번 필터링
├── project_outline.md # 프로젝트 상세 기획서
├── CLAUDE.md
├── requirements.txt
├── .env # API 키 (git 제외)
└── .gitignore
| 단계 |
작업 |
상태 |
| 1-1 |
노선 기본 정보 파악 (API) |
API 키 활성화 대기 중 |
| 1-2 |
API 및 데이터 소스 검증 |
대기 |
| 1-3 |
과거 데이터 수집 (6개월) |
완료 |
| 1-4 |
실시간 데이터 수집 시작 |
대기 |
| 단계 |
작업 |
상태 |
| 2-1 |
결측치/이상치 처리 |
완료 — hourly 1,321개, daily 428개 capping, 날씨 NaN→0 |
| 2-2 |
혼잡도 지표 정의 및 계산 |
대기 |
| 2-3 |
EDA (탐색적 데이터 분석) |
완료 — 시간대/요일/월별/날씨/정류장별 분석 |
| 2-4 |
피처 엔지니어링 |
대기 |
| 분석 항목 |
결과 |
| 시간대별 패턴 |
606/420번 모두 8시, 17~18시 출퇴근 피크 |
| 요일별 패턴 |
606번 주말 35% 감소, 420번 주말 24.5% 감소 |
| 월별 패턴 |
9월, 11월 피크. 10월 하락 (추석 연휴 영향) |
| 날씨 영향 |
비 오면 소폭 감소, 기온 상관 약함 (< 0.12) |
| 혼잡 정류장 TOP 3 |
606: 경복궁역, 마포구청역, 광화문역 / 420: 강남역, 동대문역사문화공원역, 청량리역 |
| 단계 |
작업 |
상태 |
| 3-1 |
XGBoost 모델 학습 |
대기 |
| 3-2 |
하이퍼파라미터 튜닝 |
대기 |
| 3-3 |
평가 및 모델 버전 관리 |
대기 |
pip install -r requirements.txt
.env 파일에 공공데이터포털 API 키를 설정해야 합니다:
SEOUL_BUS_API_KEY=your_api_key_here