본문 바로가기
Programming/Project

[NYC 택시 수요 예측 PJT] 4. 데이터 EDA - 데이터 시각화 (Time Domain) - 2

by 최성현 2021. 7. 14.
320x100

지난 포스트에 이어 이번에도 데이터 시각화를 진행하고자한다.

 

5. 요일별 시간대별 Trip 수

현재 데이터프레임을 다시 한번 살펴보면 현재는 1월 1일부터 시간별 Trip의 수와 날짜만을 보여준다.

df.head(2)

현재 확인하고자 하는 요소들은 요일별 시간대별 Trip수이기때문에 요일, 시간 주차 정보를 추가로 데이터프레임에 추가한다.

df['weekday'] = df.index.weekday #요일을 숫자로 표기
df['hour'] = df.index.hour
df['weeknum'] = df.index.week #주차를 숫자로 표기
df.head()

datetime모듈의 weekday()함수는 날짜의 요일 정보를 숫자값으로 0(월요일)부터 6(일요일)까지 리턴해주며, weeknum()은 주차를 숫자로 리턴해준다. 위의 데이터에 대해 시간 단위로 Trip의 수를 나타내는 그래프를 보면 아래와 같다. 아래와 같은 방식은 빠르게 그래프를 확인하고 동적일 필요가 없는 경우 아래와 같은 방식도 용이하다.

 

 

df.groupby('hour')['cnt'].sum().plot(x='hour', y='cnt', kind='line', style="-o", figsize=(15,5));

시간 별 Trip 수

추가로 아래와 같은 코드를 입력하면 1장에서 했던 동적 그래프를 확인할 수 있다.

df.groupby(['hour'])[['cnt']].sum().iplot()

시간 별 Trip 수

그래프를 확인해보면 18~19시에 Peak, 5시에 Off-Peak인 것을 확인할 수 있다.

다음은 요일별 시간별 Trip수를 보여주는 데이터 프레임이다.

df.groupby(['hour', 'weekday'])['cnt'].mean().unstack()

 

다음은 요일 별로 어떤 트랜드가 있는지 확인하기 위해 'hour'과 'weekday'에 대한 수치의 평균을 그래프로 나타냈다.

df.groupby(['hour', 'weekday'])['cnt'].mean().unstack().iplot()

요일별 Trip 수 평균 그래프 (0,월요일 ~ 6,일요일)
요일별 Trip 수 평균 그래프 (0,월요일 ~ 4,금요일)
요일별 Trip 수 평균 그래프 (5,토요일 ~ 6,일요일)

 

위 그래프를 통해 아래와 같은 사실들을 확인할 수 있다.

 

1. 월요일(0)부터 금요일(4)까지 Trip수는 조금 차이가 있으나 비슷한 패턴을 보이고 있다. 

2. 주말의 경우 오전시간까지는 비슷한 패턴을 보이나 저녁시간부터는 차이가 발생한다. 토요일 오후부터는 Trip 수가 증가하는 추세를 보이나 일요일의 경우 점심시간 이후 Trip수가 줄어들며 다음날 출근을 하기 때문이라고 추측해볼 수 있다.

3. Trip 수가 많은 시간을 보면 평일의 경우 출근 시간인 8시경과 퇴근 시간인 19시 경임을 확인할 수 있다. 다만 금요일 저녁의 경우 주말이 시작되는 날이라 늦은 시간 Trip수가 높은 것을 볼 수 있다. (토요일도 마찬가지)

4. 주말인 토요일, 일요일 5시가 Off-Peak이며 토요일은 저녁시간이 Peak, 일요일 0시가 Peak임을 확인할 수 있다.

 

위의 그래프를 pivot_table 형식으로 표현하면 아래와 같으며, 결과는 동일한 그래프를 보여준다.

df[['cnt', 'hour', 'weekday']].pivot_table('cnt', index='hour', columns='weekday', aggfunc='mean').iplot(kind='scatter')

다음은 요일별 Trip수를 보여주는 그래프이다. 토요일에 가장 많은 Trip수, 월요일에 가장 적은 Trip수를 보여준다.

df.groupby('weekday')[['cnt']].mean().iplot(kind='bar')

weekday별 Trip 수

 

6. 평일/주말별 Trip 수

df['is_weekend'] = ((pd.DatetimeIndex(df.index).dayofweek) // 5 == 1).astype(int) #몫이 1이면 주말, 0이면 평일!

평일과 주말별 Trip수를 나타내기 위해 'is_weeked'부분을 추출하고 평일과 주말을 구분하기위해 Date.timeIndex(df.index).dayofweek를 5로 나누고 몫이 1이면 주말, 0이면 평일로 구분한다.

e.g, 4//5 = 0(금요일), 6//5 = 1(일요일)

 

평일/주말별 Trip 수를 그래프로 나타내면 아래와 같다.

df.groupby(['hour', 'is_weekend'])['cnt'].mean().unstack().iplot()

평일/주말별 Trip 수

 

300x250