⭐ 장애인 이동권 개선을 위한 장애인 콜택시 대기시간 예측
💡목표
장애인 콜택시를 이용하는 고객들의 불편사항을 개선하고 서비스의 품질을 높이기 위해 콜택시 운행이 종료된 시점에 다음 날의 기상 예보를 바탕으로 기상 상황에 따른 장애인 콜택시의 평균 대기 시간을 예측하고 예상 대기 시간을 제공할 수 있는 모델을 완성하여 교통약자의 이동 편의 증진에 기여한다.
# 익일의 대기시간(waiting time)을 오늘의 데이터를 활용하여 예측 해야하는 대상(target)으로 설정
target = 'waiting_time'
data['waiting_time_1'] = data[target].shift(-1)
# target 변수에 NaN이 포함된 행 제거 -> 2022-12-31 행 제거
data.dropna(subset=['waiting_time_1'], axis=0, inplace=True)
# 익일의 실제 날씨 데이터를 전일에 발표된 예보데이터로 판단
weather['Date'] = weather['Date'].shift(1) # 2012-01-02 -> 2012-01-01
data = pd.merge(data, weather, on='Date', how='inner')
# 월을 기반으로 계절 분류
def assign_season(month):
if month in [12, 1, 2]:
return 'Winter'
elif month in [3, 4, 5]:
return 'Spring'
elif month in [6, 7, 8]:
return 'Summer'
else:
return 'Fall'
data['year'] = data['Date'].dt.year # 연도
data['season'] = data['Date'].dt.month.apply(assign_season) # 계절
# Object로 만드는 방법1
import calendar
data['month'] = data['Date'].dt.month # 월
data['month'] = data['month'].apply(lambda x: calendar.month_abbr[x]) # 월 이름으로 만들기 # Jan, Feb, ...
data['weekday'] = data['Date'].dt.weekday # 요일
data['weekday'] = data['weekday'].apply(lambda x: calendar.day_abbr[x]) # 요일 이름으로 만들기 # Mon, Tue, ...
# categorical로 만들기
data['season'] = pd.Categorical(data['season'], categories=['Spring', 'Summer', 'Fall', 'Winter'])
data['month'] = pd.Categorical(data['month'], categories=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
data['weekday'] = pd.Categorical(data['weekday'], categories = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']) # ordered=True : 데이터프레임을 이 기준으로 정렬할건지
# ex
from workalendar.asia import SouthKorea
cal = SouthKorea()
holiday = pd.DataFrame(cal.holidays(2023))
7일 이동평균 대기시간
data['waiting_time_MA7'] = data['waiting_time'].rolling(7, min_periods = 1).mean() # min_periods : 최소 데이터수
탑승률
data['ride_rate'] = data['ride_cnt'] / data['request_cnt']
target = 'waiting_time'
fare | car_cnt | request_cnt |
---|---|---|
target과 feature의 산점도를 확인했을 때, 두 종류로 나뉘는 듯이 분포가 나왔다. 이 점에 대해 팀원들과 논의하고 확인한 결과, 쉬는 날과 일하는 날로 나뉘기 때문인 것으로 밝혀졌다.
holiday | season |
---|---|
month | weekday |
---|---|
holiday | season |
---|---|
DecisionTreeRegressor 7.004 | DecisionTreeRegressor 7.356 |
year | month |
---|---|
DecisionTreeRegressor 7.201 | DecisionTreeRegressor 6.931 |
`loss: 12.8256` 단순하게 쌓았다고 생각했는데, 이게 맞나 싶긴하다.