본문 바로가기

코딩분석활용

전국 지역별 건축년도별 아파트 가격 변동(2022년 9월, 파이썬)

반응형

2022년 9월 거래된 아파트의 실거래 가격이 8월에 비교해서 가격 변동이 어떻게 되었는지 확인해 보도록 하겠습니다.

실거래 데이터는 공공데이터포털에 있는  국토교통부_아파트매매 실거래자료API를 이용했습니다.

실거래 데이터에서 아파트의 전용면적과 거래된 거래 금액을 계산해서 전용면적의 m2당 거래금액을 만들고

전국 및 각 시군구의 평균값을 구해 8월과 9월의 변동량을 확인했습니다.

아래의 항목들에 대한 데이터를 보실수 있습니다.

 

1. 전국 8월대비 9월 가격 변동

2. 시도별 8월대비 9월 변동

3. 시군구별 8월대비 9월 변동 및 상위 30위, 하위 30위 확인

4. 아파트 건축 경과 년도별 8월대비 9월 변동(전국)

5. 아파트 건축 경과 년도별 8월대비 9월 변동(시도별)

 

각 데이터는 파이썬으로 구현해서 확인한 데이터입니다. 실제 사용한 코드를 이 포스팅에 마지막 부분에 

남겨드리니 참고하실분들은 참고 부탁드립니다.

 

그럼 데이터 확인을 시작해보겠습니다.

 

1. 전국 8월대비 9월 가격 변동

전국 8월, 9월 아파트 실거래가로 계산한 결과를 보여드리겠습니다.

좌측의 거래년월을 보시면 2022년08월과 2022년 09월 데이터가 있는것을 알수 있고

우측위를 보시면 전용면적m2당 금액과 변동량이 있는것을 알수있습니다.

전용면적 m2당 금액은 거래금액/전용면적(m2)으로 나눈 데이터입니다.

2022년 8월은 전국 평균 381만원이고, 9월은 373만원이 되겠습니다.

변동량은 8월대비 9월의 변동량으로 "전용면적 m2당 금액(9월)/전용면적 m2당금액(8월)-1"의 계산이 되겠습니다.

8월보다 2%가격이 하락해서 -2%의 변동이 있네요. 

 

2. 시도별 8월대비 9월 변동

그럼 전국 시도별의 변동량은 어떻게 될까요. 확인해보겠습니다.

 

전국 평균은 -2%였는데 플러스인 지역도 있고, 마이너스인 지역도 있는데, 역시나 마이너스의 지역이 많네요.

충청북도, 부산광역시, 대전광역시, 제주도, 경상북도가 8월대비 9월 실거래가가 플러스인 지역입니다.

수치로 확인해볼까요.

충청북도, 부산, 대전은 8월대비 +5% 이상이고, 대구, 서울 강원도, 전라남도는 -5%이하인데

전라남도가 -7.48%로 하락폭이 가장 크네요.

전국 평균이 마이너스이고 시도 별로도 마이너스인 지역이 많다는 것을 확인할 수 있습니다.

그럼 다음에는 시도의 하위 행정구역인 시군구의 경우를 보겠습니다.

 

3. 시군구별 8월대비 9월 변동 및 상위 30위, 하위 30위 확인

시군구의 경우 많이 오른지역이 서울 양천구 부산 중구 등인 것을 알수 있는데

160개의 지역이다 보니 한눈에는 모든 지역의 파악이 어렵습니다.

그래서 상위 20위과 하위 20위로 나누어 알아보겠습니다.

 

시군부 상위 20위의 결과 입니다.

상위권에 서울, 경기, 부산이 보이는데 서울같은 경우는 시도별 순위에서 하위 3위였는데

시군구에서 상위권에 있는 것을 보면 서울 시내에서 상승, 하락의 편차가 크다는 것을 예상할 수 있겠습니다.

부산은 시군구 상위순위  2위로 역시 여러 구가 보이는 것을 알수 있습니다.

 

다음으로는 하위 20위의 결과 입니다.

서울에서는 영등포구, 중구 부산에서는 동구의 하락폭이 큰 것을 확인 할수 있습니다.

세종시는 행정구역이 시>구가 아니고 시>동이라 구와 같이 표시가 되어 시>동이 나왔는데 

집현동이 Nan으로 나온이유는 2022년 08월에는 거래 실적이 있지만, 09월에는 없어서 표시되었습니다.

 

다음으로 볼 데이터는 아파트 건축년도에서 올해 2022년까지 몇년이 경과되었는지를 계산하고

경과기간에 따른 변동량을 확인해보겠습니다.

기간은 건축년도기준 5년이하, 10년이하, 20년이하, 30년이하, 30년이상으로 분류했습니다.

전국 평균과 시도별 데이터의 순으로 보겠습니다.

 

4. 아파트 건축 경과 년도별 8월대비 9월 변동(전국)

전체적으로 마이너스인데 건축년도 기준 5년이하 10년이하의 아파트보다 10년이상의 아파트의

하락률이 크게 나타나네요.

수치로도 확인을 해볼까요.

5년, 10년이하의 아파트의 가격 변동은 1% 이하이지만

10년 이상의 아파트들이 2%이상 하락한 것을 알수 있습니다.

 

그럼 시도 별로는 어떻게 나타날까요

 

5. 아파트 건축 경과 년도별 8월대비 9월 변동(시도별)

숫자로는 한눈에 파악이 힘드네요

그래프로 보도록 하겠습니다.

파란색깔이 높은쪽, 빨간색깔이 낮은쪽의 변동으로

파란색이 진할수록 데이터 중에서 상승폭이 높은 데이터가 되겠고, 

빨간색이 진할수록 하락폭이 많은 데이터가 되겠습니다.

위 데이터에서는 5년이하 아파트의 대전광역시 0.18(18%), 제주특별자치도가 0.26(26%)의 상승이 확인됩니다.

30년이상 아파트에서는 대구광역시 -0.2(-20%), 전라북도 -0.2(-20%)로 하락폭이 컸습니다.

특이점으로는 30년이상 제주도 0.49(49%)상승과, 10년이하 서울 -0.25(-25%)가

다른 데이터랑 다르게 크게 보이는 것을 알수 있습니다.

 

이상으로 아파트 실거래가 8월대비 9월의 가격 변동에 대해서 알아봤습니다.

아래 파이썬 코드를 남겨드리니 실제 구현해보시고 싶은 분은 참고 하시길 바랍니다.

 

 

전체코드 관련된 이전 포스팅도 있으니 참고하셔도 좋습니다.

https://yenpa.tistory.com/37

 

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

공공데이터 포털 API의 아파트 실거래가 API를 이용해서 서울내의 각 구별 아파트 가격정보와 월별 트렌드를 확인해보겠습니다. 이용하는 API는 아래의 2가지가 되겠습니다. 행정안전부_행정표준

yenpa.tistory.com

 

전체코드

데이터 수집하는 코드로 apikey는 본인의 데이터 입력이 필요합니다.

import requests
import math
import pandas as pd
from IPython.display import display
import xmltodict

apikey='YOUR_APIKEY'

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=region_df.loc[region_df['locate_lv1']=='서울특별시']
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']]



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)

전국 평균확인

#전체평균 
df_total=df[['거래년월','전용면적m2당금액']].groupby(['거래년월']).mean().sort_values('거래년월')
df_total['변동량']=df_total.pct_change()
df_total[['전용면적m2당금액','변동량']]

시도별 데이터 확인

#시도별
df_sido=df[['거래년월','locate_lv1','전용면적m2당금액']].groupby(['locate_lv1','거래년월']).mean().sort_values('거래년월')
df_sido=df_sido.reset_index().rename(columns={'locate_lv1':'시도'})
df_sidopv=df_sido.pivot_table(index='시도',columns='거래년월',values='전용면적m2당금액')
df_sidopv['변동량']=df_sidopv['202209']/df_sidopv['202208']-1
df_sidopv=df_sidopv.sort_values('변동량', ascending=False)
df_sidopv

그래프

fig = plt.figure(figsize=(8,2))
ax1 = fig.add_subplot()
ax1.set_ylim(-0.1, 0.1)  
ax1.bar(df_sidopv.index,df_sidopv['변동량'], color='b')
ax1.set_ylabel('변동량')
plt.xticks(rotation=90)
plt.title('시도별 9월 m2당전용면적가격 변동량')

plt.show()

시군구별 데이터 확인

#시군구별
df_gusi=df[['거래년월','locate','전용면적m2당금액']].groupby(['locate','거래년월']).mean().sort_values('거래년월')
df_gusi=df_gusi.reset_index().rename(columns={'locate':'시군구'})
df_gusipv=df_gusi.pivot_table(index='시군구',columns='거래년월',values='전용면적m2당금액')
df_gusipv['변동량']=df_gusipv['202209']/df_gusipv['202208']-1
df_gusipv=df_gusipv.sort_values('변동량', ascending=False)
df_gusipv

상위 20위

print('상위 Top20')
df_gusipv.iloc[:20,:]

하위 20위

print('하위 Top20')
df_gusipv.iloc[-20:,:].sort_values('변동량')

건축경과년도 생성 및 전국의 경과년도별 데이터 확인

import datetime

df['경과년도']=datetime.datetime.now().year-df['건축년도'].astype('int')

def getyears(x):
    if x <= 5:
        return '5년이하'
    elif x <= 10:
        return '10년이하'
    elif x <= 20:
        return '20년이하'
    elif x <= 30:
        return '30년이하'
    else:
        return '30년이상'
    

df['경과년도단위'] = df['경과년도'].map(lambda x:getyears(x))


#전국
df_build_total=df[['거래년월','경과년도단위','전용면적m2당금액']].groupby(['경과년도단위','거래년월']).mean().sort_values('거래년월')
df_build_total=df_build_total.reset_index()
df_build_totalpv=df_build_total.pivot_table(index='경과년도단위',columns='거래년월',values='전용면적m2당금액')
df_build_totalpv['변동량']=df_build_totalpv['202209']/df_build_totalpv['202208']-1
df_build_totalpv=df_build_totalpv.sort_values('변동량', ascending=False)
df_build_totalpv

그래프

fig = plt.figure(figsize=(6,2))
ax1 = fig.add_subplot()
ax1.set_ylim(-0.05, 0.05)  
ax1.bar(df_build_totalpv.index,df_build_totalpv['변동량'], color='b')
ax1.set_ylabel('변동량')
ax1.set_xlabel('건축경과년도')
plt.xticks(rotation=90)
plt.title('전국 9월 건축경과년도별 m2당전용면적가격 변동량')

plt.show()

그래프

시도별 데이터 확인

#시도별 
df_build_total=df[['거래년월','경과년도단위','locate_lv1','전용면적m2당금액']].groupby(['경과년도단위','locate_lv1','거래년월']).mean().sort_values('거래년월')
df_build_total=df_build_total.reset_index()
df_build_totalpv=df_build_total.pivot_table(index=['locate_lv1','경과년도단위'],columns='거래년월',values='전용면적m2당금액')
df_build_totalpv['변동량']=df_build_totalpv['202209']/df_build_totalpv['202208']-1
#df_build_totalpv=df_build_totalpv.sort_values('변동량', ascending=False)
df_build_totalpv=df_build_totalpv.reset_index()
df_build_totalpv1=df_build_totalpv.pivot_table(index='locate_lv1',columns='경과년도단위',values='변동량')
df_build_totalpv1=df_build_totalpv1[['5년이하','10년이하','20년이하','30년이하','30년이상']]
df_build_totalpv1

그래프 확인

sns.heatmap(df_build_totalpv1, annot=True, cmap=sns.diverging_palette(20, 220, as_cmap=True))

 

 

이 글은 개인적으로 투자에 참고를 위해 분석한 내용으로 오류가 있을수 있으며, 투자 추천글이 아닙니다.

참고용으로만 사용을 부탁드리며 투자 책임은 100퍼센트 본인에게 있음을 알려드립니다.

반응형