[서울시 지하철 시간대별 데이터 2015~2019] 지하철 시간별 승객 승하차 데이터 EDA - (2)

2020. 11. 24. 20:01Project/지하철 데이터를 활용한 서울 상가거래 예측

 이 데이터 EDA과정은 앞의 과정과 연결되어있다. 그렇기에 앞에 과정을 보고 참고하길 권장한다. 

todayisbetterthanyesterday.tistory.com/87

 

[국토교통부 지하철 데이터 2015~2019] 지하철 시간별 승객 승하차 데이터 EDA - (1)

plot_station(df = subway, name = '홍대입구', line = 2, type_ = '승차') ※ 데이터는 전처리 후 사용했기에 현재 압축시 약 60MB정도 됩니다. 2015~2019 서울 1~8호선 시간대별 승하차 승객수를 나타내는 데이..

todayisbetterthanyesterday.tistory.com


※ 데이터 준비과정은 위의 링크를 통해 확인하길 부탁드립니다. 또한 데이터셋은 개인적인 전처리과정을 진행후 EDA를 진행하기에 댓글을 통해 메일을 남겨주면 보내주겠습니다.

지하철 유동인구의 전체 추이 확인

  • 일별 sum()
  • 시계열의 일별 추세가 존재하는지 확인. 즉, 년도에 따른 특정 역의 증/감을 확인
  • 계절성이 존재한다면 계절성을 확인
  • 5년동안 지하철 유동인구 변화를 보았을 때(1~8호선, 신규역 X), 지하철의 년도단위의 추세(시기에 따른평균이 변화)를 파악하기 애매함
  • 계절성이 존재한다면, 뚝섬/석촌/길음과 같은 주거지의 경우 상대적으로 여의도/홍대/종로3가보다 계절성이 강함
# 전체데이터 summation을 통한 추세 및 계절성 plot function 

import matplotlib 
matplotlib.rc('xtick', labelsize=25) 
matplotlib.rc('ytick', labelsize=25)

def plot_total(df1,df2,name):
    plt.figure(figsize=(40,10))
    
    plt.subplot(211)
    plt.title('승차')
    plt.plot(df1[df1['역명'] == name].drop('역명',axis=1).T.sum(),'k')
    plt.plot(df1[df1['역명'] == name].drop('역명',axis=1).T.sum().resample('Q').mean(),'r')
    plt.tight_layout()

    plt.figure(figsize=(40,10))
    plt.subplot(212)
    plt.title('하차')
    plt.plot(df2[df2['역명'] == name].drop('역명',axis=1).T.sum(),'k')
    plt.plot(df2[df2['역명'] == name].drop('역명',axis=1).T.sum().resample('Q').mean(),'r')
    plt.tight_layout()

 

분해시계열

  • 일별 데이터(모든 시간대 sum)를 통해 보았을 때, Trend는 보이는 경우가 발생
  • 계절요인, 불규칙 요인이 있다고 판단하기가 힘듦
  • 데이터셋이 너무 많아 시각화가 제대로 안되었을 가능성도 존재
# 시계열 decomposition&plotting function

from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose

matplotlib.rc('xtick', labelsize=5) 
matplotlib.rc('ytick', labelsize=5)


def adfuller_seasonal_decompose(df1, df2, name ,period) : 
    
    print("1. 승차 / 2. 하차")
    series1 = df1[df1['역명'] == name].drop('역명',axis=1).T.sum()
    series2 = df2[df2['역명'] == name].drop('역명',axis=1).T.sum()
    
    adfuller(series1)

    result1 = seasonal_decompose(series1, period = period)
    result1.plot()
    
    adfuller(series2)

    result2 = seasonal_decompose(series2, period = period)
    result2.plot()

 위의 function은 승차 dataframe과 하차 dataframe을 모두 input으로 준 다음, 지하철역명을 name parameter로 넣는다.

 그리고 시계열 분해를 진행하기 위한 period를 설정해준다. period가 짧을 경우 데이터셋이 너무 많기에 시각화 과정에서 정보가 뭉개지는 현상이 크게 발생한다.

 그렇기에 년단위로 시계열 decomposition분석을 진행하였으며, 이는 수정해서 사용가능하다.  

# 홍대입구역 시계열 decomposition

adfuller_seasonal_decompose(take_sum_line,off_sum_line,'홍대입구',365)

홍대입구역 승차
홍대입구역 하차

# 여의도역 시계열 decomposition

adfuller_seasonal_decompose(take_sum_line,off_sum_line,'여의도',365)

여의도역 승차
여의도역 하차

# 길음역 시계열 decomposition

adfuller_seasonal_decompose(take_sum_line,off_sum_line,'길음',365)

길음역 승차
길음역 하차

 

 위 두 종류의 추세 및 계절성 분석 시각화 결과를 보면, 주변이 주거지인 특성이 강한경우 계절성이 더 크게 나타나는 것처럼 보인다. 하지만, 전반적으로 계절성 요인 부분에 있어서는 데이터 전반적으로 계절성이 존재한다고 파악하기 힘들다. 하지만, 지하철(대중교통)데이터의 경우 충분히 계절성이 존재할 수 있다고 가정할 수 있다. 

 실제로 시간대별 데이터의 경우 하루단위의 계절성은 더 분명하게 존재한다.

 또한, 길음역과 같은 서울 외곽지역의 추세선은 '-'형태를 띄고 있다. 이는 시계열의 t가 지남에따라 해당 시기의 평균이 감소한다는 뜻이다. 반면 서울의 핫플레이스의 대표적인 지역인 홍대입구역같은 경우 추세선은 '+' 형태를 띈다. 이는 반대로 점점 유동인구가 증가하는 추세를 나타낸다.  

 


 전반적인 지하철 데이터의 EDA를 끝마치고 서울 상업업무용 부동산의 EDA를 거친다음, 이 두 가지 데이터를 결합하여 Neural Network 계열의 Deep learning 모델을 생성하여 부동산의 특징 or 가격 or 거래발생지역을 예측하는 모델을 만들어보고자 한다.