반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

블로그

[모델링] 장애인 콜택시 대기시간 예측 본문

공부

[모델링] 장애인 콜택시 대기시간 예측

beenu 2024. 4. 2. 02:24
반응형
목표
  • 당일 콜택시 운행이 종료되었을 때, 다음 날의 콜택시 대기시간을 예측

 

데이터
  • open_data.csv : 장애인 콜택시 운행 정보
  • weather.csv : 날씨 데이터

 

데이터 기본 탐색

 

  • 주기별 분석을 위해 날짜 변수 추가
df['Date'] = pd.to_datetime(df['Date'])

df['Day'] = df['Date'].dt.day
df['Weekday'] = df['Date'].dt.weekday # 요일 숫자(weekday_name으로 주면 요일 이름 반환)
df['Week'] = df['Date'].dt.isocalendar().week # 주차
df['Month'] = df['Date'].dt.month
df['Year'] = df['Date'].dt.year

 

  • 주기별 분석

1) 일별 (차량 운행 수, 접수건, 탑승건, 탑승률, 대기시간, 운임, 이동거리)

 - 탑승률, 운임은 일별 차이가 크지 않음

 

2) 요일별  (차량 운행 수, 접수건, 탑승건, 탑승률, 대기시간, 운임, 이동거리)

 - 요일별 차량 운행 수, 접수건, 탑승건, 대기시간, 운임, 이동거리에 유의미한 차이가 보임 (평일 주말 차이 뚜렷) 

 - 주말에 접수건, 탑승건 모두 적고 탑승률은 평일, 주말 비슷함

 

3) 월별 (차량 운행 수, 접수건, 탑승건, 탑승률, 대기시간, 운임, 이동거리)

 - 탑승률, 운임, 이동거리를 제외하고는 유의미한 차이가 보임

 - 계절별로 묶어보면 확실한 차이가 있을까?

 

 

4) 연도별 (차량 운행 수, 접수건, 탑승건, 탑승률)

 - 2020년도 이후 차랑 운행 수가 증가

 - 2020년도 접수건, 탑승건 급감

 

 

 

데이터 구조 만들기
  • 날짜 관련 변수 추가 : 요일, 월, 계절, 연도
data['weekday'] = data['Date'].dt.day_name()
data['weekday'] = pd.Categorical(data['weekday'], categories=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'])
data['month'] = data['Date'].dt.month

data['season'] = np.where(data['month'].isin([3,4,5]), 'Spring',
                          np.where(data0['month'].isin([6,7,8]), 'Summer',
                          np.where(data0['month'].isin([9,10,11]), 'Fall', 'Winter')))

data['season'] = pd.Categorical(data['season'], categories=['Spring','Summer','Fall','Winter'])
                                     
data['year'] = data['Date'].dt.year

 

  • 공휴일 피처 추가
# 방법1 : workalendar 패키지 설치 후, 대한민국 공휴일 정보 가져오기
# !pip install workalendar

from workalendar.asia import SouthKorea
cal = SouthKorea()
holiday = pd.DataFrame(cal.holidays(YEAR))

# 방법2 : 공공데이터 포털 한국천문연구원_특일 정보 api 사용하기
# !pip install xmltodict
import requests
import pandas as pd
import xmltodict

REST_API_KEY = 'YOUR_DECODE_SERVICE_KEY'
url = 'http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/{INPUT_METHOD}'
params = {'serviceKey':REST_API_KEY, 'solYear':YEAR, 'numOfRows':60}
response = requests.get(url, params=params)
holiday = pd.DataFrame(xmltodict.parse(response.text)['response']['body']['items']['item'])

 

  • 7일 이동 평균 시간

- 2022년 데이터를 예측해야 하는데, 학습데이터와 예측할 데이터의 값 차이가 큼 

- 연도를 분리해서 학습 및 예측해보려고 했는데 성능은 좋지 않았음

data['mv7_Wait_Time'] = data['Average_Wait_Time'].rolling(7).mean()

# 이동 평균선
plt.figure(figsize = (18,6))
sns.lineplot(x='Date', y='mv7_Wait_Time', data=data)
plt.ylim(0,100)
plt.grid()
plt.show()

 

 

 

탐색적 데이터 분석

 

  • 단변량 분석
    • 평균 운임과 평균 거리는 매우 연관이 있을 것이다.
    • 평균대기시간과 이의 파생 변수들도 모두 연관이 있을 것으로 보인다.
    • 탑승률은 정규분표 형태를 띔
  • 이변량 분석
    • target과 탑승률, 전날의 대기시간 => 선형관계가 있는 것으로 보이지만, target 자체가 대기시간 데이터로 만들어낸 데이터이기 때문에 관계가 있을 수밖에 없음
    • 날씨 요소에는 큰 영향을 받지 않는 것으로 보임
    • 습도에서 아주아주 약한 선형관계를 볼 수 있었음
    • 휴일(공휴일+주말)간의 target값에 유의미한 차이가 있었다
    • 요일간에도 차이가 있었음 -> anova 결과를 봤을 때도 유의미한 차이가 있는 것으로 나옴
    • 계절간에도 유의미한 차이가 있음
    • covid 컬럼을 생성해서 2020, 2021년에 해당하는 행에 1을 부여했는데, covid간에도 유의미한 차이가 있었음

[강한 관계의 변수]

- 7일 이동평균, 전날 평균대기시간

 

[중간(약한) 관계의 변수]

- 탑승률, 접수건, 탑승건, 요일

 

[(거의) 관계가 없는 변수]

- 운행 차량 수, 평균운임, 평균 이동거리

 

 

 

모델링 결과

 

나 전 날 콜택시 정보가 무슨 상관인가 싶어서 그냥 예측할 날의 요일, 계절, 공휴일(주말) 여부 세 피처만 가지고 모델링에 들어갔다.

Linear Regression이 가장 좋은 성능을 보였다.

( MAE: 4.229672594408698,  MAPE: 0.1019432598355691,  R2: 0.10603561498610015 )

 

 

그래프 모양 진짜 오바죠 ? 

 

날짜 파생변수 외에 만들 수 있는게 있나 싶었는데 불쾌지수나 장애인의 날 등 이벤트 관련해서 새로운 피처를 만들 수 있다는 걸 배웠다.

이것저것 만져보고 피처도 만들어보고 해야되는데 안한다 ^.^ 좀 해라!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

 

728x90
반응형