본문 바로가기

API

[아파트 실거래가 API] 지역별 아파트 가격정보 비교 및 월별 트렌드 확인

반응형

공공데이터 포털 API의 아파트 실거래가 API를 이용해서 서울내의 각 구별 아파트 가격정보와

월별 트렌드를 확인해보겠습니다.

이용하는 API는 아래의 2가지가 되겠습니다.

행정안전부_행정표준코드_법정동코드

국토교통부_아파트매매 실거래자료

 

가입 및 API 사용에 대한 방법에 대해 필요하신분은 아래 참고 부탁드립니다.

 

1. 가입 및 API 사용법(Skip가능)

2. 행정안전부_행정표준코드_법정동코드 데이터 확인

3. 국토교통부_아파트매매 실거래자료 데이터 확인

4. 구별 아파트 가격정보와 월별 트렌드 확인

 

1. 가입 및 API 사용법(Skip가능)

https://yenpa.tistory.com/35

 

[공공데이터포털 API] 가입하기 및 인증키(APPKey) 발급, 확인

1. 공공데이터포털(data.go.kr) 가입 2. 인증키(APPKey) 발급 3. 인증키(APPKey) 확인 1. 공공데이터포털(data.go.kr) 가입 공공데이터포털 사이트에 접속합니다. https://www.data.go.kr/ 공공데이터 포털 국가에..

yenpa.tistory.com

https://yenpa.tistory.com/36

 

[공공데이터포털 API] 데이터 가져오기 기초

공공데이터 포털 API를 이용해서 데이터를 가져오는 방법을 알아보겠습니다. API를 이용하려면 가입과 API Key신청이 되어 있어야 합니다. 아래 참고하신분은 참고 부탁드립니다. 있으신분은 Skip하

yenpa.tistory.com

 

2. 행정안전부_행정표준코드_법정동코드 데이터 확인

행정안전부 행정표준코드 법정동 코드에서 아파트 매매 실거래가API에서 사용할

지역코드리스트(LAWD_CD)를 만들고, 여기서 사용할 서울특별시 정보만 따로 저장하겠습니다.

코드는 아래와 같습니다.

import requests
import math
import pandas as pd

numofrows=1000

# while문을 전체 페이지수와 일치시 break하기 위해 사용
totalpageno=0
pageno=1
rows=[]
while True:
    
    print(str(totalpageno),str(pageno))
    
    url = 'http://apis.data.go.kr/1741000/StanReginCd/getStanReginCdList'
    params ={'serviceKey' : apikey, 'pageNo' : pageno, 
             'numOfRows' : '1000', 'type' : 'json' }

    response = requests.get(url, params=params)
    region = response.json()['StanReginCd']
    row = region[1]['row']
    rows = rows + row #결과를 하나의 rows의 list로 합침
    
    totalcount=region[0]['head'][0]['totalCount']
    totalpageno=math.ceil(totalcount/numofrows)
    
    if pageno==totalpageno:
        break
        
    pageno=pageno+1

#rows를 dataframe으로 변환
region_df=pd.DataFrame(rows)


region_df['locate_lv1']=region_df['locatadd_nm'].str.split(' ').str[0]
region_df['locate_lv2']=region_df['locatadd_nm'].str.split(' ').str[1] 

region_df=region_df.loc[region_df['locate_lv1']=='서울특별시']
region_df['LAWD_CD']=region_df['region_cd'].str[:5] #아파트 매매 실거래가 API호출시 사용

#필요 column만 저장
region_df=region_df[['locate_lv1','locate_lv2','LAWD_CD','locatadd_nm','locallow_nm']]

전체 데이터(totalcount) 20550개가 검색이 되는데 한번에 호출할수 있는 최대치(numOfRows)가 1000개입니다.

1000개씩 21번의 loop를 돌기 위한 코드입니다.

# while문을 전체 페이지수와 일치시 break하기 위해 사용
totalpageno=0
pageno=1
rows=[]
while True:
    ...중략...
    if pageno==totalpageno:
        break
        
    pageno=pageno+1

각 loop별 호출 결과를 row에 저장하고 전체 결과를 rows에 합칩니다.

response = requests.get(url, params=params)
region = response.json()['StanReginCd']
row = region[1]['row']
rows = rows + row #결과를 하나의 rows의 list로 합침

결과 rows를 dataframe으로 변환합니다.

#rows를 dataframe으로 변환
region_df=pd.DataFrame(rows)

서울특별시의 정보 column(locate_lv1)과 서울시내의 각 구의 정보(locate_lv2)를 생성합니다.

결과를 서울특별시만 따로 저장합니다.

LAWD_CD는 아파트매매 실거래가 API에서 요청인자로 사용될 데이터 입니다.

region_df['locate_lv1']=region_df['locatadd_nm'].str.split(' ').str[0]
region_df['locate_lv2']=region_df['locatadd_nm'].str.split(' ').str[1] 

region_df=region_df.loc[region_df['locate_lv1']=='서울특별시']
region_df['LAWD_CD']=region_df['region_cd'].str[:5] #아파트 매매 실거래가 API호출시 사용

필요한 column만 다시 저장합니다.

#필요 column만 저장
region_df=region_df[['locate_lv1','locate_lv2','LAWD_CD','locatadd_nm','locallow_nm']]

DataFrame의 내용입니다.

 

반응형

 

 

 

3. 국토교통부_아파트매매 실거래자료 데이터 확인

2번에서 수집한 데이터(지역정보)를 가지고 아파트매매 실거래가 데이터를 만들어보겠습니다.

LAWD_CD 정보로 실거래가 API의 정보를 검색후 저장하는 순서입니다.

전체코드 남겨드립니다.

import xmltodict

LAWD_CD_list=region_df['LAWD_CD'].unique()
trade_list=[]
YMDs=list(range(202101,202113))

for LAWD_CD in LAWD_CD_list:
    
    for YMD in YMDs:
        DEAL_YMD=str(YMD)

        url = 'http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade'
        params ={'serviceKey' : apikey, 
                 'LAWD_CD' : LAWD_CD, 'DEAL_YMD' : DEAL_YMD }

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

        result = xmltodict.parse(response.content)

        resultCode = result['response']['header']['resultCode']

        if resultCode == '00':
            if str(result['response']['body']['items'])=='None':
                continue
            else:
                trade_list=trade_list + result['response']['body']['items']['item']
            
trade_df = pd.DataFrame(trade_list)

LAWD_CD_list에는 서울특별시의 각 구의 코드정보가 있고 실거래가에서 사용하기 위해 따로 저장합니다.

trade_list는 전체 결과가 저장될 list이고, YMDs는 202101~202112 월까지의 확인하기 위한 변수입니다.

LAWD_CD_list=region_df['LAWD_CD'].unique()
trade_list=[]
YMDs=list(range(202101,202113))

LAWD_CD_list(서울 각구별)로 for loop를 돌리고,

각 구별로 202101~202112의 데이터를 구하기 위해 또다른 for loop를 넣었습니다.

for LAWD_CD in LAWD_CD_list:
    
    for YMD in YMDs:
        DEAL_YMD=str(YMD)

결과를 받아서 xml -> json으로 변환후에 result['response']['body']['items']['item']가 정상적으로 있는 데이터만

trade_list에 저장했습니다.

response = requests.get(url, params=params)
result = xmltodict.parse(response.content)
resultCode = result['response']['header']['resultCode']

if resultCode == '00':
    if str(result['response']['body']['items'])=='None':
        continue
    else:
        trade_list=trade_list + result['response']['body']['items']['item']

list -> dataframe으로 변환했습니다.

trade_df = pd.DataFrame(trade_list)

 

4. 구별 아파트 가격정보와 월별 트렌드

 

두개의 data를 병합하고, 거래금액의 column type을 int64로 전용면적을 float64, 월을 int64로 변경합니다.

전용면적당 아파트 금액을 계산합니다.

df=pd.merge(left=trade_df, right=region_df, how='left', left_on=['지역코드','법정동'], right_on=['LAWD_CD','locallow_nm'])
df['거래금액']=df['거래금액'].str.replace(',','')
df=df.astype({'거래금액':'int64','전용면적':'float64','월':'int64'})
df['전용면적m2당금액']=(df['거래금액']/df['전용면적']).round(0)

2021년 구단위로 전용면적m2당 금액의 평균값을 저장합니다.

dfgu=df[['locate_lv2','전용면적m2당금액']].groupby(['locate_lv2']).mean().sort_values('전용면적m2당금액',ascending=False)
display(dfgu)

단위는 천만원 단위가 되겠습니다.

전용면적으로 계산해서 일반적인 계산법인 공급면적당 금액보다는 높게 나오는데

금액 비교 및 트렌드를 보기위한 데이터로 참고 부탁드립니다.

그래프로 확인하면

import matplotlib.pyplot as plt
plt.rc('font', family='NanumGothic') 

plt.figure(figsize=(8,2))
plt.bar(dfgu.index,dfgu['전용면적m2당금액'])
plt.xticks(rotation=90)
plt.title('2021년 구단위 전용면적m2당 금액')
plt.show()

이런 순으로 나오는 것을 알수 있습니다.

 

월별 전용면적m2당 금액 평균 데이터를 확인하겠습니다.

dfmomth=df[['월','전용면적m2당금액']].groupby(['월']).mean()
dfmomth

그래프로 보겠습니다.

plt.figure(figsize=(8,2))
plt.bar(dfmomth.index,dfmomth['전용면적m2당금액'])
plt.xticks(rotation=90)
plt.title('2021년 서울시 월별 전용면적m2당 금액')
plt.show()

 

이상으로 서울내의 각 구별 아파트 정보와 월별 트렌드를 확인해봤습니다.

동별 데이터 및 2021년 이외의 데이터를 변형해서 확인해 보셔도 좋을것 같습니다.

반응형