NYC 택시 수요 예측 파이프라인 만들기 (3) 데이터 수집과 EDA
NYC TLC 공식 데이터를 직접 받아 스키마를 확인하고, 수요 예측에 필요한 패턴을 탐색한 과정을 정리했습니다.
이번 글에서 할 일
1편에서 프로젝트 설계를, 2편에서 개발환경 구성을 정리했습니다. 이번에는 파이프라인의 출발점인 데이터를 다룹니다.
- Yellow Taxi 데이터 1개월분 확보
- 스키마와 데이터 품질 확인
- 수요 예측 관점에서 EDA: 시간과 지역 패턴 찾기
데이터 가져오기: Kaggle 대신 공식 소스에서 직접
처음 설계할 때는 Kaggle 데이터셋을 쓸 생각이었는데, 확인해보니 NYC TLC(Taxi & Limousine Commission)가 공식 페이지에서 월별 Parquet 파일을 직접 배포하고 있었습니다. 그래서 Kaggle을 거치지 않고 공식 소스에서 바로 받는 것으로 변경했습니다.
이유는 세 가지입니다.
- 인증이 필요 없다: Kaggle API 토큰 설정 없이 URL로 바로 받을 수 있습니다.
- 월별 Parquet 파일: 이 프로젝트는 “1개월로 검증 → 여러 달로 확장” 계획인데, 월 단위 파일 구조가 정확히 맞습니다. 나중에 Airflow에서 URL 패턴으로 수집을 자동화하기도 쉽습니다.
- 최신 데이터: Kaggle 쪽 데이터셋은 오래된 연도의 대용량 CSV지만, 공식 소스는 최신 월까지 Parquet으로 제공합니다.
받은 파일은 두 개입니다.
1
2
3
4
5
# 2024년 1월 운행 기록 (Parquet, 약 48MB)
curl -O https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2024-01.parquet
# 지역 ID ↔ 지역명 매핑 테이블
curl -O https://d37ci6vzurychx.cloudfront.net/misc/taxi_zone_lookup.csv
둘 다 data/raw/에 두고, 데이터 파일은 Git에 올리지 않습니다.
스키마 확인
2024년 1월 한 달치가 2,964,624행 × 19컬럼, Parquet 기준 48MB입니다. CSV였다면 수백 MB였을 텐데, 컬럼 지향 압축 덕분에 노트북에서도 부담 없이 다룰 수 있는 크기입니다.
주요 컬럼은 다음과 같습니다.
| 컬럼 | 의미 |
|---|---|
tpep_pickup_datetime | 승차 시각 |
tpep_dropoff_datetime | 하차 시각 |
PULocationID | 승차 지역 ID |
DOLocationID | 하차 지역 ID |
passenger_count | 승객 수 |
trip_distance | 이동 거리 (마일) |
fare_amount | 기본 요금 |
total_amount | 총 결제 금액 |
이 중 수요 예측에 실제로 쓰는 것은 tpep_pickup_datetime과 PULocationID 두 개입니다. 나머지는 데이터 품질 확인과 이상치 필터링에 활용합니다.
taxi_zone_lookup.csv는 265개 지역의 LocationID를 자치구(Borough), 지역명(Zone)과 매핑해주는 테이블입니다. 1월 데이터에는 이 중 260개 지역이 등장합니다. 집계와 시각화 단계에서 “236번 지역”이 아니라 “Upper East Side North”로 읽을 수 있게 해줍니다.
데이터 품질 이슈
스키마만 확인했는데 벌써 하나 발견했습니다. 1월 데이터인데 tpep_pickup_datetime의 범위가 2002-12-31 ~ 2024-02-01로 나옵니다. 수집 기간을 한참 벗어난 행이 섞여 있다는 뜻이라, 집계 전에 기간 필터링이 필수입니다.
EDA: 수요 패턴 탐색
집계 단위가 PULocationID × 1시간이므로, EDA도 그 관점으로 진행했습니다.
시간대별 패턴
요일별 패턴
지역별 분포
관찰 정리와 다음 단계
다음 글에서는 이 관찰을 바탕으로 원본 운행 기록을 시간과 지역별로 집계해 학습용 Feature 테이블을 만듭니다.