본문 바로가기

API

[아파트 실거래가 API] 월간 가격상승 Top 및 거래량 Top확인하기

반응형

공공데이터 포털 API의 아파트 실거래가 API를 이용해서 8월 -> 9월의 월간 가격상승을 많이 한 아파트와

거래량 및 거래량 상승비율이 높은 아파트들을 확인해보겠습니다.

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

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

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

 

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

 

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

 

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

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

지역코드리스트(LAWD_CD)를 가져오겠습니다.

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

import requests
import math
import pandas as pd
from IPython.display import display
import xmltodict
import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font', family='NanumGothic') 
plt.rcParams['axes.unicode_minus']=False

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['locate'] = region_df['locate_lv1'] + ' ' + region_df['locate_lv2']

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

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

region_df

전체 데이터(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)

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

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

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

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

 

 

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

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

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

전체코드 남겨드립니다.

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

for i, LAWD_CD in enumerate(LAWD_CD_list):
    print(str(i), LAWD_CD)
    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:
                if type(result['response']['body']['items']['item'])==dict:
                    trade_list=trade_list + [result['response']['body']['items']['item']]
                else:
                    trade_list=trade_list + result['response']['body']['items']['item']
    
trade_df = pd.DataFrame(trade_list)

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)
df['거래년월']=df['년'].astype('string')+df['월'].astype('string').str.zfill(2)

전체 지역에 대한 LAWD_CD의 unique 값만을 LAWD_CD_list에 저장합니다.

LAWD_CD_list에 저장된 Code로 각 지역별 아파트 실거래 상세 자료를 가져오게 됩니다.

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

전체 지역(LAWD_CD_list)에 대해 2022년 8월, 9월의 데이터를 한 번씩 실행하게 됩니다.

for i, LAWD_CD in enumerate(LAWD_CD_list):
    print(str(i), LAWD_CD)
    for YMD in YMDs:
        DEAL_YMD=str(YMD)

실제 API를 호출하는 부분이고, 응답이 '00' 정상 응답의 경우만 trade_list에 저장했습니다.

apikey는 본인의 데이터가 필요합니다.

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:
        if type(result['response']['body']['items']['item'])==dict:
            trade_list=trade_list + [result['response']['body']['items']['item']]
        else:
            trade_list=trade_list + result['response']['body']['items']['item']

list인 trade_list의 결과를 DataFrame의 형태로 변환했습니다.

trade_df = pd.DataFrame(trade_list)

 

 

4. 월간 가격상승 아파트 및 거래량 상위 확인

 

법정동 코드의 DataFrame과 아파트 실거래 상세 DataFrame을 병합합니다.

이후 '전용면적m2당금액' 정보와 '거래년월' 정보를 추가합니다.

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)
df['거래년월']=df['년'].astype('string')+df['월'].astype('string').str.zfill(2)

 

동별 8월 -> 9월의 가격변동 데이터를 만들었습니다.

거래년월, locatadd_nm, 아파트, 전용면적m2당금액 정보를 가져와서 거래년월, locatadd_nm, 아파트 기준으로

group을 하고 전용면적m2당금액 의 평균값을 구했습니다.

여기서 locatadd_nm은 시군구 및 동이름의 정보가 있는 column입니다.

#동별

df_price=df[['거래년월','locatadd_nm','아파트','전용면적m2당금액']]. \
    groupby(['locatadd_nm','아파트','거래년월']).mean().sort_values('거래년월')
df_price=df_price.reset_index()
df_price['동_아파트']=df_price['locatadd_nm'] + ' ' + df_price['아파트']

df_pricepv=df_price.pivot_table(index='동_아파트',columns='거래년월',values='전용면적m2당금액')
df_pricepv['가격변동비율']=df_pricepv['202209']/df_pricepv['202208']-1
df_pricepv=df_pricepv.sort_values('가격변동비율', ascending=False)
df_pricepv

아파트별 8월 -> 9월의 거래가격 변동비율이 높은순으로 표시가 됩니다.

8월 또는 9월의 거래 실적이 없는 경우는 NaN으로 나오게 됩니다.

 

다음으로는 거래량 및 거래량 변동비율을 확인해보도록 하겠습니다.

가격 확인에서는 groupby를 mean으로 했는데 거래량을 구하기 위해 count로 집계했습니다.

#동별 거래량 변동비율

df_count=df[['거래년월','locatadd_nm','아파트','전용면적m2당금액']]. \
    groupby(['locatadd_nm','아파트','거래년월']).count().sort_values('거래년월')
df_count=df_count.rename(columns={'전용면적m2당금액':'거래량'})
df_count=df_count.reset_index()
df_count['동_아파트']=df_count['locatadd_nm'] + ' ' + df_count['아파트']

df_countpv=df_count.pivot_table(index='동_아파트',columns='거래년월',values='거래량')
df_countpv['거래량변동비율']=df_countpv['202209']/df_countpv['202208']-1
df_countpv=df_countpv.sort_values('거래량변동비율', ascending=False)
df_countpv

8월과 9월의 거래량 및 거래량 변동비율이 확인됩니다.

 

아파트 가격변동 비율 상위 30위를 그래프로 확인하겠습니다.

df_pricepv_top30 = df_pricepv.iloc[:30,].sort_values('가격변동비율')

plt.figure(figsize=(8,7))
plt.barh(df_pricepv_top30.index, df_pricepv_top30['가격변동비율'])
plt.title('전국 아파트 가격변동비율(9월) Top30')

 

다음으로는 거래량 상위 30위를 보겠습니다.

df_countpv_30 = df_countpv.sort_values('202209',ascending=False).iloc[:30,].sort_values('202209')

plt.figure(figsize=(8,7))
plt.barh(df_countpv_30.index, df_countpv_30['202209'])
plt.title('전국 아파트 거래량(9월) Top30')

 

 

마지막으로 거래량 변동비율 상위 Top30입니다.

df_countpv_top30 = df_countpv.iloc[:30,].sort_values('거래량변동비율')

plt.figure(figsize=(8,7))
plt.barh(df_countpv_top30.index, df_countpv_top30['거래량변동비율'])
plt.title('전국 아파트 거래량변동비율(9월) Top30')

 

 

이상으로  8월 -> 9월의 월간 가격 및 거래량 상승이 많은 아파트들을 알아봤습니다.

반응형