📗 개인 프로젝트/🚲 공유 자전거 수요 예측

🚲 공유 자전거 수요 예측 | 1️⃣ EDA

Lento_ 2025. 4. 21. 11:36

👀 INTRO

배경 :

자전거 공유 시스템은 도시에서 효율적이고 친환경적인 교통수단을 제공하며, 대여 수요 예 측은 차량 관리와 사용자 경험 향상에 필수적이다. 이 프로젝트는 과거 대여 데이터를 기반으 로 다양한 환경적 및 시간적 요인을 고려하여 자전거 대여 수를 예측하는 모델을 구축하게 되 었다.

 

목적 : 

목표는 머신러닝 기법을 사용하여 시간대별 총 자전거 대여 수(count)를 예측하는 것이다. 데이터셋에는 날씨 조건, 계절성, 사용자 유형 등 대여 수요에 영향을 미치는 다양한 요인이 포함되어 있다. 이 데이터를 활용하여 보이지 않는 테스트 데이터에 잘 일반화할 수 있는 견고한 모델을 구축하는 것을 목표로 한다.

 

데이터 설명 : 

컬럼명 데이터 타입 설명
datetime datetime 자전거 대여 기록의 날짜 및 시간. 예시: 2011-01-01 00:00:00
season int 계절 (1: 봄, 2: 여름, 3: 가을, 4: 겨울)
holiday int 공휴일 여부 (0: 평일, 1: 공휴일)
workingday int 근무일 여부 (0: 주말/공휴일, 1: 근무일)
weather int 날씨 상황 (1: 맑음, 2: 구름낌/안개, 3: 약간의 비/눈, 4: 폭우/폭설)
temp float 실측 온도 (섭씨)
atemp float 체감 온도 (섭씨)
humidity int 습도 (%)
windspeed float 풍속 (m/s)
casual int 등록되지 않은 사용자의 대여 수
registered int 등록된 사용자의 대여 수
count int 총 대여 수 (종속 변수)

📊 EDA

☑️ 상관관계

(특성들 간의 상관관계)

< hour ↔ count (0.4) >

: 시간(hour)이 증가할수록 자전거 대여량(count)이 증가하는 경향이 있음.

: 보통 출퇴근 시간(아침, 저녁)에 대여량이 증가할 가능성이 높음. 

< temp ↔ count (0.39) >

: 기온이 올라갈수록 자전거 대여량이 증가하는 경향이 있음.

: 날씨가 따뜻할수록 사람들이 더 많이 자전거를 이용한다고 볼 수 있음.

< atemp ↔ temp (0.98) >

: 체감 온도와 온도는 거의 똑같다는 사실을 알 수 있음.

 

 

 

('count'컬럼과의 상관관계)

< count ↔ registered (0.97) >

: 회원 수 증가가 자전거 대여량 증가에 가장 큰 영향을 미침.

< count ↔ casual (0.69) ) >

: 비회원 이용도 중요한 요인이지만, 회원 대여량이 더 큰 영향을 미침.

< count ↔ hour (0.4) >

: 시간대가 자전거 이용에 영향을 줌. 출퇴근 시간의 패턴을 분석하면 대여량을 예측하는 데 도움이 될 수 있음.

< count ↔ humidity (-0.32) >

: 습도가 높아질수록 자전거 대여량이 감소하는 경향이 있음.

: 습도가 높으면 불쾌지수가 상승하고, 사람들이 야외 활동을 줄이는 것으로 추측

 

 

 

(특정 시간대에 따른 자전거 대여 수)

근무일 휴일
: 출퇴근 시간(07시~09시, 17시~19시) 수요 급증
: 출퇴근 시간대의 수요 증가는 근무일과 강한 연관성을 가짐
: 정오 오후(11시~18시) 수요 높음
: 근무일과 달리 출퇴근 시간의 피크타임이  나타나지 않음
: 이는 여가 활동을 위해 자전거 대여를 이용하는 것으로 해석 가능

 

(날씨, 계절에 따른 자전거 대여 수요량)

: 날씨가 맑을수록 자전거 대여 수요가 증가하는 경향이 있음.
: 여름(Summer)과 가을(Fall)에서 대여량이 가장 높음.

봄(Spring)은 대체로 낮은 편, 특히 비나 눈이 오는 날(Spring에서 가장 낮은 막대) 은 확연히 적음.

맑은 날(Sunny)만큼은 아니지만 흐린 날(Cloudy)에도 대여량이 많음.
겨울(Winter)은 다른 계절보다 전체적으로 대여량이 적음.

 

(온도에 따른 자전거 대여 수요량)

☑️ 결측치 / 중복값 / 이상치

(결측치)

➡️ train, test 데이터 둘 다 결측치 없음.(NULL = 0)

 

(중복값)

➡️ train 데이터, test 데이터 둘 다  중복값 또한 없음.

 

(이상치)

train(좌) / test(우) 데이터

train 데이터 test 데이터
: windspeed, casual, registered, count의 경우 이상치가 존재할 수 있는 그래프 개형 :windspeed의 경우 이상치가 존재할 수 있는 그래프 개형
✔  습도의 경우, 0 또는 100에 근접한다면, 사막, 고산지대이거나 열대우림, 바다 한가운데인 경우이기에 이상치일 가능성이 높다.
✔  풍속의 경우, 20m/s이상만 되어도 걸어다닐 수 없을 정도로 강한 바람이기에 20m/s 이상은 이상치일 가능성이 높다.

 

(히스토그램과 Q-Q Plot 그래프를 동시에 그리는 함수 정의)

 

('windspeed'컬럼의 이상치 처리)

'windspeed' 컬럼 이상치 처리 전

: windspeed가 20m/s 이상인 것부터 처리를 하면 데이터 손실이 있을 것 같아 30m/s이상인 값들을 windspeed 컬럼들 값의 평균값으로 대체했다.

'windspeed' 컬럼 이상치 처리 후

('count'컬럼의 이상치 처리)

'count' 컬럼 이상치 처리 전

: 히스토그램에서 자전거 대여량 데이터는 정규성을 따르지 않으며, 오른쪽으로 긴 꼬리를 가진 분포 (Right-Skewed Distribution) 분포를 보인다.

: QQ Plot 좌측 하단과 우측 상단에 몇 개의 극단적인 이상치가 존재한다.

➡️ 'count' 컬럼의 이상치는 노이즈가 아닌 실제 수요일 가능성이 있기에 제거하지 않았다.(의미 있는 신호)

 

(등록의 유무에 따른 시간별 이상치 확인)

등록되지 않은 사용자의 대여 수의 이상치

 

: casual 컬럼에 대한 이상치 경우, 점심시간대와 출퇴근 시간 이외의 시간대에서의 이상치가 의심스럽다.

 

(등록된 사용자의 대여 수애 따른 이상치 확인)

: registered 컬럼에 대한 이상치 경우, 출퇴근 시간대라는 근거가 명확해보인다.

 

(IQR 를 활용해, 특정 조건에서의 'casual' 이상치 확인)

: 이상치 탐색을 위해 casual(비회원 대여량) 컬럼의 3사분위(Q3) 값이 116.5임을 확인하고, 밤 9시 이후(hour ≥ 21) 데이터를 출력한 결과, 해당 데이터는 모두 7월 4일(공휴일)이었다. 공휴일에는 야외 활동이 활발해 자전거 대여량이 증가할 수 있으므로, 이를 이상치가 아닌 정상 데이터로 판단하였다. 따라서, 해당 데이터를 삭제하지 않고 유지하기로 결정하였다.

 

(데이터 변환)

: 시간에 따른 수요 변동을 확인하고 모델에 반영하기 위해 object(문자열)을 datetime 타입으로 변환 후, (연도, 월, 일, 시간)을 추출하여 각각의 컬럼을 생성했다.