Applied Data

[부동산 데이터 수집] 아파트 매매 실거래가 조회하기(파이썬)

레디코 2024. 1. 7. 01:59

아파트 실거래가 API 조회



부동산 데이터를 수집해서 의사결정을 빠르게 내리고 싶을 때가 있어서

아파트 매매 실거래가를 API로 조회하는 방법을 Python으로 해보았습니다.

 

1. 공공데이터 포털 가입 후 활용 신청하기

1) 공공데이터 포털에 접속하고 가입

https://www.data.go.kr/

공공데이터 포털에 들어가서 가입합니다.

네이버나 카카오 연동 가입도 가능합니다.

공공데이터 포털

 

 

2) 아파트 매매 실거래가 자료 검색

공공데이터포털에 들어가서 실거래 상세 자료를 입력합니다.

상세가 아닌 일반 API도 존재하는데 컬럼 갯수가 더 단순한 편입니다.

 

3) 활용 신청 후 API 키 확인

 

해당 페이지로 들어가보면 우측 상단에 활용신청 버튼이 있습니다.

활용목적과 활용내용을 작성하라고 되어있는데

저의 경우, 웹 사이트 개발과 부동산 가격 이해로 작성하여 승인이 되었습니다.

 

승인된 후의  API 키는 일반 인증키로 표시됩니다.

 



4) 해당 API를 어떻게 활용할 수 있을까요?

(1) 넣어 줘야하는 값

 

(2) 가지고 올 수 있는 값

 

5) 미리보기를 클릭하여 API 결과가 어떻게 나오는지 볼 수 있습니다.

위의 테이블에 나온 컬럼들이 실제 API를 호출하면 어떤 형태로 나타나는지는

아래 미리보기를 사용해서 간단히 볼 수 있습니다.

 

2. 파이썬으로 API 호출하기

1) API 간단 호출

# 1) 본인의 인증키(Decoding 버전)
serviceKey = 'API KEY 입력'

# 2) 서비스 URL
url ="http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev?"

# 3) API 요청변수(Request Parameter)
pageNo = '1'
numOfRows = '5'
DEAL_YMD = "202001" # 필요한 데이터의 연도 + 월
LAWD_CD = '11110' # 법정동 코드 앞자리 5글자 = 법정 구코드 (서울특별시 종로구)

payload = "serviceKey=" + serviceKey + "&" + \
          "pageNo=" + pageNo + "&" + \
          "numOfRows=" + numOfRows + "&" \
          "LAWD_CD=" + LAWD_CD + "&" + \
          "DEAL_YMD=" + DEAL_YMD + "&"       
                      
# 4) 호출
res = requests.get(url + payload)
data = json.loads(json.dumps(xmltodict.parse(res.text)))
print(data)

 

 

2) 호출 함수화하기

def getRTMSDataSvcAptTradeDev(pageNo,numOfRows,LAWD_CD,DEAL_YMD,serviceKey): 
    url="http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTradeDev?" 


    payload =   "serviceKey=" + serviceKey + "&" + \
                "pageNo=" + pageNo + "&" + \
                "numOfRows=" + numOfRows + "&" \
                "LAWD_CD=" + LAWD_CD + "&" + \
                "DEAL_YMD=" + DEAL_YMD + "&"   

    xml = req.urlopen(url+payload)
    result = xml.read()

    soup = BeautifulSoup(result, 'lxml-xml')    

    items = soup.findAll("item")
    aptTrade = pd.DataFrame()

    for item in items:
        try:
            년                  = item.find("년").text
            월                  = item.find("월").text
            일                  = item.find("일").text
            도로명              = item.find("도로명").text
            법정동              = item.find("법정동").text
            아파트              = item.find("아파트").text
            건축년도            = item.find("건축년도").text
            층                  = item.find("층").text
            거래금액            = item.find("거래금액").text
            도로명건물본번호코드 = item.find("도로명건물본번호코드").text
            도로명건물부번호코드 = item.find("도로명건물부번호코드").text
            도로명시군구코드     = item.find("도로명시군구코드").text
            도로명일련번호코드   = item.find("도로명일련번호코드").text
            도로명지상지하코드   = item.find("도로명지상지하코드").text
            도로명코드           = item.find("도로명코드").text
            법정동본번코드       = item.find("법정동본번코드").text
            법정동부번코드       = item.find("법정동부번코드").text
            법정동시군구코드     = item.find("법정동시군구코드").text
            법정동읍면동코드     = item.find("법정동읍면동코드").text
            법정동지번코드       = item.find("법정동지번코드").text
            일련번호             = item.find("일련번호").text
            전용면적             = item.find("전용면적").text
            지번                 = item.find("지번").text
            지역코드             = item.find("지역코드").text

        except:
            items_data = None
            temp.append(items_data)
            


            

        temp = pd.DataFrame(([[년,월,일,도로명,법정동,아파트,건축년도,층,거래금액,도로명건물본번호코드,도로명건물부번호코드,도로명시군구코드,도로명일련번호코드,도로명지상지하코드,도로명코드
                                 ,법정동본번코드,법정동부번코드,법정동시군구코드,법정동읍면동코드,법정동지번코드,일련번호,전용면적,지번,지역코드]])
                         ,columns=["년","월","일","도로명","법정동","아파트","건축년도","층","거래금액","도로명건물본번호코드","도로명건물부번호코드","도로명시군구코드","도로명일련번호코드","도로명지상지하코드","도로명코드"
                                     ,"법정동본번코드","법정동부번코드","법정동시군구코드","법정동읍면동코드","법정동지번코드","일련번호","전용면적","지번","지역코드"]) 

        aptTrade = pd.concat([aptTrade,temp])
        aptTrade = aptTrade.reset_index(drop=True)

    return aptTrade
serviceKey = "API KEY 입력"
pageNo = '1'
numOfRows = '5'
DEAL_YMD = "202001" # 필요한 데이터의 연도 + 월
LAWD_CD = '11470' # 법정동 코드의 앞자리 5글자 = 법정 구코드 (서울특별시 양천구)

aptTrade = getRTMSDataSvcAptTradeDev(pageNo,numOfRows,LAWD_CD,'202311',serviceKey)

 

3. 실거래가 데이터 활용하기

제 경우에는 기간 별로 조회하는 함수도 작성하여

필요한 지역인 서울 양천구 지역에 대해서 원하는 기간인 23.10 ~ 23.12월 동안의 아파트 실거래가를 가지고 왔습니다.

목동 신시가지 단지로 임장을 다녀오면서 실거래가를 한번 살펴보았습니다.

 

1) 서울특별시 양천구 실거래가 데이터 조회하기

 

2) 목동 신시가지 단지 아파트의 평당 실거래가 금액 구하기

# 거래금액 컬럼 type 변경
asset.dtypes
asset['거래금액']  = asset['거래금액'].str.replace(",", "")
asset = asset.astype({'거래금액':int})
asset = asset.astype({'전용면적':float})

# 전용면적 평으로 변경
asset['전용면적_평'] = asset['전용면적']/3.3

# 평당 거래금액 min, mean, max 
asset_max = asset[['법정동','거래금액']].groupby('법정동').max()
asset_min = asset[['법정동','거래금액']].groupby('법정동').min()
asset_avg = asset[['법정동','거래금액','아파트','전용면적','전용면적_평']].groupby(['법정동','아파트','전용면적','전용면적_평']).mean()

asset_avg_r = asset_avg.reset_index()
asset_avg_r['평당_실거래가'] = asset_avg_r['거래금액']/asset_avg_r['전용면적_평']

 

전용면적(m)을 평으로 바꾸어 실거래가에 대해 통계량을 구했습니다.

 

keyword = '신시가지'
asset_avg_r_key = asset_avg_r[asset_avg_r.아파트.str.contains(keyword)]
asset_avg_r_key.sort_values(by=['평당_실거래가'], axis=0, ascending=False)

 

양천구의 모든 아파트가 나오는데 이중 목동 신시가지 아파트로 한정하였습니다.

 

 

평균거래금액과 평균 평당 실거래가를 볼 수 있었습니다.