관리 메뉴

솜씨좋은장씨

[Python]지난 2년간의 추석 귀경길 도시 구간별 소요시간 파이썬으로 데이터 받아보기 본문

Programming/Python

[Python]지난 2년간의 추석 귀경길 도시 구간별 소요시간 파이썬으로 데이터 받아보기

솜씨좋은장씨 2019. 9. 14. 19:24
728x90
반응형
 

[Python]과거의 데이터로 최적의 추석 귀경시간 추측해보기(feat, matplotlib)

2년의 데이터를 가지고 도출한 최적의 귀경시간 본 표에 적혀있는 시간은 그저 받아온 데이터를 그래프로 그리고 눈으로 확인해보며 선정한 시간입니다. 만약에 보시게 된다면 재미로 참고만 하시기 바랍니다~ 출..

somjang.tistory.com

아래의 과정을 바탕으로 위의 결과를 만들어 보았습니다.

 

오늘은 목, 금, 토 2019년 추석연휴의 마지막 날!

자소서 쓰는건 재미없고, 뭔가 재밌는걸 해볼까 고민하다가 귀경길이 시작되었다는 기사를 보고

 

관련 데이터를 모아보고 그 데이터를 pandas의 Dataframe으로도 만들어보기도하고 그래프도 그려보면 어떨까 싶어

 

검색을 하기 시작했습니다.

 

검색을 하던 중 고속도로 공공데이터 포털이라는 홈페이지에 대해서 알게되었습니다.

 

고속도로 공공데이터 포털

 

data.ex.co.kr

어떠한 데이터들을 제공해주는지 둘러보던 중

 

OpenAPI목록 중에

 

특송기간 교통분석 서비스-도시간 소요시간이라는 항목을 발견하였습니다.

들어가서 상세정보를 확인하여보니

연말연시, 추석, 설날에

 

00~23시까지 1시간마다 서울에서 각 도시로  귀성할때 걸리는 소요시간

 

00~23시까지 1시간마다 각 도시에서 서울로  귀경할때 걸리는 소요시간

 

이 두 가지 데이터를 받아올 수 있었습니다.

 

추석의 마지막인날인만큼 귀경에 걸리는 소요시간 데이터를 받아와 보고자 했습니다.

API를 설명하는 페이지를 보면 

 

request를 요청할때 사용하는 URL은 http://data.ex.co.kr/openapi/specialAnal/intercityLeadTime  

 

요청 시 받을 수 있는 데이터의 형식은 XML과 JSON

 

요청 시 필수로 주어야하는 요청변수의 값은 발급받은 인증키, 검색결과 포맷, 기준년도였습니다.

위 처럼 예제 실행하기를 들어가면 아래와 같은 창이 나옵니다.

 

이렇게 변수 값을 넣어서 URL보기 > 예제 실행하기를 눌러주면

 

아래 예제 실행결과에 값이 나오게 됩니다.

 

자세하게 보고싶다면 상세를 클릭하여 보면 됩니다.

상세 페이지로 들어가게 되면 조금 전 페이지에서 URL보기를 클릭하여 만들었던 URL을 볼 수 있고

 

그 아래로 XML데이터를 확인할 수 있습니다.

 

저는 이 페이지를 켜두고 주소창에서 numOfRows, pageNo의 값을 변경해가면서 어떠한 데이터가 나오는지 확인해보았습니다.

 

numOfRows와 pageNo의 값 변경은

 

데이터가 각 구간별 00시~23시까지 24개의 데이터씩 제공되므로

 

한 페이지에 제공되는 데이터의 개수를 24

 

pageNo는 1, 2, 3, 4이렇게 하나씩 올려가며 보았습니다.

 

처음에는 이렇게 한페이지에 24개씩 데이터를 받아오면

 

받아온 데이터를  데이터 처리 시 더 편하게 할 수 있겠다!

 

싶었으나 중간중간 일부 구간에서 데이터가 누락되어 데이터의 개수가 24개가 되지않는 구간들도 있었기에 

 

그냥 한 번에 다 받아오는 것으로 구현하기로 하였습니다.

 

하면서 알게된 점은 위에서 3번째 줄에 나오는 <count> 5166 </count> 이 값이 전체 데이터의 개수라는 것을 알 수 있었습니다.

 

2010년부터 2018년까지의 8년정도의 데이터를 가지고 오고 싶었지만

 

조금 전 말했던 방법을 활용하여 쭉 탐색해 본 결과 이 api는 2016년부터 데이터가 제공되며

 

특히 지금 제가 원하는 추석의 귀성길, 귀경길 데이터는 2016년에는 제공되지 않았고

 

2017년부터 제공되는 것을 알 수 있었습니다.

 

19년 9월 14일 기준 2019년은 추석 전날 이 코드속에서는 D(추석)-1까지 제공하고 있었습니다.

 

서두가 길었지만 받아와 DataFrame도 만들고 그래프도 그려 볼 데이터는

 

2017년 ~ 2018년 총 2년 간의 추석 1일후 , 2일 후 귀경길에 걸리는 소요시간으로 정했습니다.

 

2017년과 2018년의 데이터는 각각 다음과 같은 순서로 추석에 관련된 데이터를 제공해 줍니다.

 

표에 numOfRows와 pageNo는 한 번에 많은 양의 데이터를 받아오려면 오래 걸리니

 

requests시 필요한 데이터만 받아올 수 있게 요청 변수를 구해 적어 둔 것입니다.

 

2017년

날짜 도시 순서 numOfRows pageNo
추석 3일전 (D-3) 귀성길 대전, 대구, 부산, 광주, 강릉 목포 24 1 ~ 6
추석 3일전 (D-3) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 7 ~ 12
추석 2일전 (D-2) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 13 ~ 18
추석 2일전 (D-2) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 19 ~ 25
추석 1일전 (D-1) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 25 ~ 30
추석 1일전 (D-1) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 30 ~ 36
추석 당일 (D) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 36 ~ 42
추석 당일 (D) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 42 ~ 48
추석 1일후 (D+1) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 48 ~ 54
추석 1일후 (D+1) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 54 ~ 60
추석 2일후(D+2) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 60 ~ 66
추석 2일후(D+2) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 66 ~ 72
추석 2일후(D+3) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 72 ~ 78
추석 2일후(D+3) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 78 ~ 84

 

2018년

날짜 도시 순서 numOfRows pageNo
추석 3일전 (D-3) 귀성길 대전, 대구, 부산, 광주, 강릉 목포 24 132 ~ 138
추석 3일전 (D-3) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 138 ~ 144
추석 2일전 (D-2) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 144 ~ 150
추석 2일전 (D-2) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 150 ~ 156
추석 1일전 (D-1) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 156 ~ 162
추석 1일전 (D-1) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 162 ~ 168
추석 당일 (D) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 168 ~ 174
추석 당일 (D) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 174 ~ 180
추석 1일후 (D+1) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 180 ~ 186
추석 1일후 (D+1) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 186 ~ 192
추석 2일후(D+2) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 192 ~ 198
추석 2일후(D+2) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 198 ~ 204
추석 2일후(D+3) 귀성길 대전, 대구, 부산, 광주, 강릉, 목포 24 204 ~ 210
추석 2일후(D+3) 귀경길 대전, 대구, 부산, 광주, 강릉, 목포 24 210 ~ 216

 

데이터를 받아오는 코드를 작성해보았습니다.

def getReturnTimeData(startPageNo, endPageNo, Year):
  info_df_daegeon = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
  info_df_daegu = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
  info_df_busan = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
  info_df_gwangju = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
  info_df_ganglung = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])
  info_df_mockpo = pd.DataFrame(columns=["출발지", "기준시간", str(Year)+"소요시간"])

  daegeon = 0
  daegu = 0
  busan = 0
  gwangju = 0
  ganglung = 0
  mockpo = 0



  for pageNo in range(startPageNo, endPageNo):
    startPoints = []
    stdTimes = []
    timeTOGOs = []

    url = 'http://data.ex.co.kr/openapi/specialAnal/intercityLeadTime'
    parameters = {"key":"발급받은키", "type":"xml", "numOfRows":"24", "pageNo":str(pageNo), "iYear":str(Year)}
    req = requests.get(url, params=parameters)

    xml_data = xmltodict.parse(req.text)
    infomations = xml_data['data']['intercityLeadTimeLists']

    for info in infomations:
      if info['dirNm'] == '귀경방향':
        if info['stUnitNm'] == "대전":
          info_df_daegeon.loc[daegeon] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
          daegeon = daegeon + 1
        elif info['stUnitNm'] == "대구":
          info_df_daegu.loc[daegu] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
          daegu = daegu + 1
        elif info['stUnitNm'] == "부산":
          info_df_busan.loc[busan] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
          busan = busan + 1
        elif info['stUnitNm'] == "광주":
          info_df_gwangju.loc[gwangju] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
          gwangju = gwangju + 1
        elif info['stUnitNm'] == "강릉":
          info_df_ganglung.loc[ganglung] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
          ganglung = ganglung + 1
        elif info['stUnitNm'] == "목포":
          info_df_mockpo.loc[mockpo] = [info['stUnitNm'], info['stdHour'], float(info['trtm'][0:5])]
          mockpo = mockpo + 1
  return (info_df_daegeon, info_df_daegu, info_df_busan, info_df_gwangju, info_df_ganglung, info_df_mockpo)

위의 코드를 활용하여 데이터를 받아옵니다.

 

만약 이 코드를 복사해가서 사용하려고 한다면 API키는 본인이 발급받아 적용하기 바랍니다.

 

2017년 추석 1일 후 귀경길에 걸리는 소요시간

data_2017_plus1 = getReturnTimeData(54, 60, 2017)

2017년 추석 2일 후 귀경길에 걸리는 소요시간

data_2017_plus2 = getReturnTimeData(66, 73, 2017)

 

2018년 추석 1일 후 귀경길에 걸리는 소요시간

data_2018_plus1 = getReturnTimeData(186, 192, 2018)

2018년 추석 2일 후 귀경길에 걸리는 소요시간

data_2018_plus2 = getReturnTimeData(198, 204, 2018)

 

그럼 getReturnTimeData에서 return되는 값은

( 대전, 대구, 부산, 광주, 강릉, 목포 ) 각 도시의 소요시간 데이터를 가지는 Dataframe들이 담겨있는 Set입니다.

 

각각의 data 접근은

 

2017년 추석 2일 후 대전에서 서울로 오는 소요시간을 예로 들면 아래의 코드와 같다.

data_2017_plus2[0]

기준시간은 1시간 단위로 00시 ~ 23시 사이의 값이며

 

소요시간은 분 단위 입니다.

 

위처럼 보면 한눈에 보기 어려움이 있으므로 DataFrame을 그래프로 그려줍니다.

 

그래프로 만들어주는 코드는 아래와 같습니다.

선그래프

data_2017_plus2[0].plot.line()

막대그래프

data_2017_plus2[0].plot.bar()

 

 

그래프를 보면 2017년 추석 2일 후 대전에서 서울로 귀경하는데 걸리는 시간은 7시에서 9시 사이에 가장 적게 걸렸다는 것을 볼 수 있습니다.

 

 

 

Comments