[KT AIVLE 4기] 2차 미니 프로젝트 - 2

리니·2023년 10월 30일
4

KT AIVLE

목록 보기
9/22
post-thumbnail

📌 2차 미니 프로젝트

⭐ 장애인 이동권 개선을 위한 장애인 콜택시 대기시간 예측
💡목표
장애인 콜택시를 이용하는 고객들의 불편사항을 개선하고 서비스의 품질을 높이기 위해 콜택시 운행이 종료된 시점에 다음 날의 기상 예보를 바탕으로 기상 상황에 따른 장애인 콜택시의 평균 대기 시간을 예측하고 예상 대기 시간을 제공할 수 있는 모델을 완성하여 교통약자의 이동 편의 증진에 기여한다.


1. 데이터 전처리

  • 목표: 전날 저녁, 다음날 평균 대기시간을 예측
# 익일의 대기시간(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
  • 장애인 이동 데이터를 기준으로 날씨 데이터 merge
    data = pd.merge(data, weather, on='Date', how='inner')

새로운 feature 생성

  • 날짜와 관련된 변수 추가 - 요일, 월, 계절, 연도
# 월을 기반으로 계절 분류
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 : 데이터프레임을 이 기준으로 정렬할건지
  • 공휴일 정보
    • workalender 패키지로 대한민국 공휴일 정보 추가
    • 실제로 휴무일에 해당하지만 라이브러리에 없는 날짜 추가
      • 주말 추가!
# 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']


2. 탐색적 데이터 분석(EDA)

target = 'waiting_time'

숫자 feature → Target

farecar_cntrequest_cnt

target과 feature의 산점도를 확인했을 때, 두 종류로 나뉘는 듯이 분포가 나왔다. 이 점에 대해 팀원들과 논의하고 확인한 결과, 쉬는 날과 일하는 날로 나뉘기 때문인 것으로 밝혀졌다.


범주 feature → Target

holidayseason
monthweekday

변수 정리

  • 강한 관계
    • 7days_mean, ride_rate
  • 중간 관계
    • request_cnt, car_cnt
  • 약한 관계
    • 그 외

3. 모델링

  • 'year', 'season', 'month', 'weekday', 'holiday'에 대해 가변수화 진행
  • r2 score
holidayseason
DecisionTreeRegressor 7.004DecisionTreeRegressor 7.356
yearmonth
DecisionTreeRegressor 7.201DecisionTreeRegressor 6.931

딥러닝

`loss: 12.8256` 단순하게 쌓았다고 생각했는데, 이게 맞나 싶긴하다.
profile
😊

0개의 댓글