본문 바로가기

API

[SK Open API] 여행지의 추정 여행자수 및 체류시간 구하기

반응형

SK Open API를 이용해서 검색 여행지의 월간 추정 여행자수와 체류시간을 구해보겠습니다.

API내의 국내여행의 여행지 목록, 추정여행자수, 체류시간을 이용하겠습니다.

이전포스팅인 월간 추정여행자수의 내용을 업그레이드 할예정이니 참고하실분은 참고하셔도 좋습니다.

 

1. 검색 지역의 월간 추정 여행자수 가져오기(참고하실분만)

2. 추정 여행자수 및 체류시간 구하기

 

1. 검색 지역의 월간 추정 여행자수 가져오기(참고하실분만)

https://yenpa.tistory.com/17

 

[SK Open API] 검색 지역의 월간 추정 여행자수 가져오기

SK Open API의 국내여행을 이용해 검색하는 지역의 월간 추정 여행자수를 구해보겠습니다. 1. API 가져 올 환경 확인하기 2. 월간 추정 여행자수 가져오기 1. API 가져 올 환경 확인하기 https://yenpa.tistor

yenpa.tistory.com

 

2. 추정 여행자수 및 체류시간 구하기

총 3가지 API를 사용하는데 사용 목적은 아래와 같습니다.

여행지 목록 : 시군구 및 동리 정보를 제공.

      입력 검색어에 대한 지역 코드(시군구, 동리)를 가져오기 위해 사용.

추정여행자수 : 시군구 단위로 월간 추정 여행자수 정보를 제공. 

      입력 지역코드(시군구)에 대한 추정 여행자수를 가져오기 위해 사용.

체류시간 : 동리 단위로 월간 체류시간 정보를 제공.

      입력 지역코드(동리)에 대한 체류시간을 가져오기 위해 사용.

 

코드를 확인해 보겠습니다.

위에서 확인한 각 API 3개를 3개의 함수로 만들었습니다.

#검색어의 여행자수 구해오기
import requests
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', family='NanumGothic') 

# 여행지 리스트 수집
def gettravellist(appkey,dongtype):
    url = "https://apis.openapi.sk.com/puzzle/travel?type=" + dongtype

    headers = {
        "accept": "application/json",
        "appkey": appkey
    }

    response = requests.get(url, headers=headers)

    result=response.json()

    return pd.DataFrame(result['contents'])


# 검색 지역의 월간 여행자수 구하기
def gettravelercount_bymonth(appkey,districtCode,districtName,yearmonth):
    url = "https://apis.openapi.sk.com/puzzle/traveler-count/raw/monthly/districts/" + \
        districtCode + "?" + "yearMonth=" + yearmonth + \
        "&gender=all&ageGrp=all&companionType=all"

    headers = {
        "accept": "application/json",
        "appkey": appkey
    }

    response = requests.get(url, headers=headers)
    
    #
    result=response.json()
    
    travelerCount=result['contents']['raw']['travelerCount']
    yearMonth=result['contents']['raw']['yearMonth']
    
    df=pd.DataFrame({'districtCode':[districtCode],'districtName':[districtName],
                     'yearMonth':[yearMonth],'travelerCount':[travelerCount]})
    
    df['date']=pd.to_datetime(df['yearMonth'], format='%Y%m')
    
    return(df.set_index('districtCode'))



# 검색 지역의 체류시간 구하기
def getvisitduration_bymonth(appkey,districtCode,districtName,yearmonth):
    url = "https://apis.openapi.sk.com/puzzle/visit-duration/raw/monthly/districts/" + \
        districtCode + "?" + "yearMonth=" + yearmonth

    headers = {
        "accept": "application/json",
        "appkey": appkey
    }

    response = requests.get(url, headers=headers)
    
    result=response.json()
    
    avgVisitDuration=result['contents']['raw']['avgVisitDuration']
    yearMonth=result['contents']['raw']['yearMonth']
    
    df=pd.DataFrame({'districtCode':[districtCode],'districtName':[districtName],
                     'yearMonth':[yearMonth],'avgVisitDuration':[avgVisitDuration]})
    
    df['date']=pd.to_datetime(df['yearMonth'], format='%Y%m')
    
    return(df.set_index('districtCode'))

여행지스트의 결과중 result['contents']만 DataFrame으로 만들었습니다.

return pd.DataFrame(result['contents'])

추정 여행자수의 결과 중 result['contents']['raw']['travelerCount'] 가 추정여행자수가 되겠습니다.

travelerCount=result['contents']['raw']['travelerCount']
yearMonth=result['contents']['raw']['yearMonth']

df=pd.DataFrame({'districtCode':[districtCode],'districtName':[districtName],
                 'yearMonth':[yearMonth],'추정여행자수':[travelerCount]})

체류시간의 결과 중 result['contents']['raw']['avgVisitDuration']가 동리별 체류시간이 되겠습니다.

avgVisitDuration=result['contents']['raw']['avgVisitDuration']
yearMonth=result['contents']['raw']['yearMonth']

df=pd.DataFrame({'districtCode':[districtCode],'districtName':[districtName],
                 'yearMonth':[yearMonth],'체류시간':[avgVisitDuration]})

 

appkey, keyword, yearmonth를 입력 받아 keyword에 대한 월간 시군구의 여행자수와

월간 동리의 체류시간을 구하는 함수를 만들었습니다.

def gettravelinfo(appkey,keywords,yearmonths):
    #여행지 리스트 가져오기
    df_list_sig=gettravellist(appkey,'sig') #시군구 리스트
    df_list_ri=gettravellist(appkey,'ri')   #동리 리스트
    
    #여행지가 여러개일 경우 하나의 DataFrame에 저장하기
    travelercount=pd.DataFrame() #시군구별 여행자수 
    visitduration=pd.DataFrame() #동리별 체류시간

    for keyword in keywords:
        #여행지에서 검색어를 포함한 지역들을 가져오기
        #keyword가 포함된 시군구 리스트
        districtName_sig=df_list_sig.loc[df_list_sig['districtName'].str.contains(keyword),:]
        #keyword가 포함된 동리 리스트
        districtName_ri=df_list_ri.loc[df_list_ri['districtName'].str.contains(keyword),:]

        for yearmonth in yearmonths:
            # 여행객 정보 가져오기
            for i, r in districtName_sig.iterrows():
                districtCode = r['districtCode']
                districtName = r['districtName']

                result_sig=gettravelercount_bymonth(appkey,districtCode,districtName,yearmonth)
                travelercount = pd.concat([travelercount,result_sig])

            # 체류시간 가져오기
            for i, r in districtName_ri.iterrows():
                districtCode = r['districtCode']
                districtName = r['districtName']

                result_ri=getvisitduration_bymonth(appkey,districtCode,districtName,yearmonth)
                visitduration = pd.concat([visitduration,result_ri])
                visitduration['dongri']=visitduration['districtName'].str.split(' ').str[-1]

    return travelercount, visitduration

여행자수는 시군구 단위, 체류시간은 동리 단위로 검색이 가능해서

각각의 여행리스트 데이터를 저장했습니다.

#여행지 리스트 가져오기
df_list_sig=gettravellist(appkey,'sig') #시군구 리스트
df_list_ri=gettravellist(appkey,'ri')   #동리 리스트

최종 결과를 저장할 DataFrame을 만듭니다.

#여행지가 여러개일 경우 하나의 DataFrame에 저장하기
travelercount=pd.DataFrame() #시군구별 여행자수 
visitduration=pd.DataFrame() #동리별 체류시간

keyword를 지역코드(districtCode)로 변환하기 위한 코드입니다.

#여행지에서 검색어를 포함한 지역들을 가져오기
#keyword가 포함된 시군구 리스트
districtName_sig=df_list_sig.loc[df_list_sig['districtName'].str.contains(keyword),:]
#keyword가 포함된 동리 리스트
districtName_ri=df_list_ri.loc[df_list_ri['districtName'].str.contains(keyword),:]

districtCode를 이용 여행자수 정보 및 체류시간을 구했습니다.

# 여행객 정보 가져오기
for i, r in districtName_sig.iterrows():
    districtCode = r['districtCode']
    districtName = r['districtName']

    result_sig=gettravelercount_bymonth(appkey,districtCode,districtName,yearmonth)
    travelercount = pd.concat([travelercount,result_sig])

# 체류시간 가져오기
for i, r in districtName_ri.iterrows():
    districtCode = r['districtCode']
    districtName = r['districtName']

    result_ri=getvisitduration_bymonth(appkey,districtCode,districtName,yearmonth)
    visitduration = pd.concat([visitduration,result_ri])
    visitduration['dongri']=visitduration['districtName'].str.split(' ').str[-1]

검색어는 속초, 2022년 09년 데이터를 불러오겠습니다.

appkey는 본인의 데이터 입력이 필요합니다.

appkey='YOUR_APPKEY'

keyword1='속초'
keywords=[keyword1]

yearmonths=['202209']

travelercount, visitduration = gettravelinfo(appkey,keywords,yearmonths)

display(travelercount)
display(visitduration)

2022년 9월의 강원도 속초시의 추정 여행자수(200329)와 속초시의 각 동별로

체류시간을 확인할 수 있습니다.

체류시간은 그래프로 확인해보겠습니다.

#그래프 작성
dongris=visitduration['dongri'].unique() 
plt.figure(figsize=(6,2))
for dongri in dongris:
    data=visitduration.loc[(visitduration['dongri']==dongri) ,:]
    plt.bar(data['dongri'],data['체류시간'],label=dongri)
    plt.xticks(rotation=90)

yearmonth=visitduration['yearMonth'].unique()[0]
plt.title(yearmonth + ' 동리별 체류시간')
plt.show()

다른 동에 비해 대포동, 설악동, 장사동의 체류시간이 많은 것이 확인됩니다.

 

이상으로 검색 여행지의 월간 추정 여행자수와 체류시간을 확인해봤습니다.

반응형