데이터 정제 기술을 마스터했으니, 이제 많은 블로거가 탐내는 고단가 카워드이자 덩치가 큰 '국토교통부 아파트매매 실거래자료 API' 수집에 도전해 보겠습니다. 부동산 데이터는 구글 애드센스 광고 단가(CPC)가 높은 대표적인 금융/자산 니치(Niche) 영역입니다. 게다가 공공데이터포털에서 제공하는 부동산 실거래가 API는 전국 단위의 데이터 양이 매우 방대하여, 단순 수집을 넘어 나만의 통계 데이터를 가공하는 '고급 기술'을 연습하기에 완벽한 재료입니다.

다만, 이 API는 기존에 다루었던 날씨나 버스 데이터와 달리 행정구역을 다루는 방식과 날짜를 지정하는 규칙이 독특합니다. 처음 연동할 때 뼈대를 잘 잡지 않으면 아무리 호출해도 0건의 데이터만 돌아오는 빈 화면을 마주하게 됩니다. 오늘 아파트 실거래가 데이터를 정확하게 긁어와 지역별 평균 가격을 계산하는 실전 알고리즘을 제 노하우와 함께 풀어보겠습니다.

부동산 API 연동 시 통곡의 벽이 되는 2가지 파라미터 규칙

부동산 실거래가 API를 성공적으로 호출하려면 가이드 문서에 숨겨진 두 가지 파라미터 요구사항을 철저히 지켜야 합니다.

첫 번째는 '법정동코드 5자리(LAWD_CD)'입니다. API는 우리가 흔히 쓰는 "서울시 강남구" 또는 "부산시 해운대구" 같은 한글 지명을 인식하지 못합니다. 대한민국 모든 행정구역에 부여된 10자리의 고유 번호 중 앞 5자리(시군구 코드)를 찾아서 넣어주어야 합니다. 예를 들어 서울 강남구의 코드는 11680이고, 경기도 수원시 영통구는 41117입니다. 이 코드 역시 공공데이터포털에서 제공하는 행정표준코드 관리시스템이나 안내 문서 내 첨부파일을 통해 미리 조회해 두어야 합니다.

두 번째는 '계약월 6자리(DEAL_YMD)'입니다. 날씨 API는 하루 단위(YYYYMMDD)로 조회가 가능했지만, 부동산 실거래가 API는 연월 단위(YYYYMM)로만 조회가 가능합니다. 만약 2026년 7월의 실거래가를 보고 싶다면 202607을 입력해야 합니다. 일 단위 조회가 불가능하기 때문에, 특정 달의 전체 데이터를 한 번에 가져와 파이썬 내부에서 날짜별로 다시 쪼개는 필터링 작업이 수반되어야 합니다.

아파트 실거래가 수집 및 지역별 평균가 계산 실전 코드

아래 코드는 특정 지역과 특정 월을 기준으로 아파트 실거래가 데이터를 수집한 뒤, 문자로 되어 있는 거래 금액을 숫자로 변환하여 판다스로 지역별/금액별 평균 가격을 계산하는 고급 정제 코드가 포함된 전체 스크립트입니다.

Python
import requests
import pandas as pd

# 1. 국토교통부 아파트매매 실거래 상세 자료 API 주소 및 디코딩 인증키
url = "http://openapi.molit.go.kr:8081/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcAptTrade"
decoding_key = "여러분의_디코딩_인증키_입력"

# 2. 요청 파라미터 설정 (예시: 서울 강남구 2026년 5월 계약 데이터)
params = {
    'serviceKey': decoding_key,
    'LAWD_CD': '11680',   # 강남구 법정동코드 앞 5자리
    'DEAL_YMD': '202605'   # 계약연월 (YYYYMM)
}

try:
    # API 호출 (부동산 API는 응답 형식이 주로 XML이 기본값인 경우가 많습니다)
    response = requests.get(url, params=params, timeout=15)
    response.raise_for_status()
    
    # 데이터 응답 확인 및 BeautifulSoup을 이용한 XML 파싱
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(response.text, 'xml')
    
    # 정상 응답 여부 체크
    result_code = soup.find('resultCode').text if soup.find('resultCode') else "99"
    
    if result_code != '00':
        print(f"[서버 오류] 메시지: {soup.find('resultMsg').text}")
    else:
        items = soup.find_all('item')
        
        if not items:
            print("해당 조건의 거래 데이터가 존재하지 않습니다.")
        else:
            apt_trades = []
            for item in items:
                # 데이터 추출 및 공백 제거
                apt_name = item.find('아파트').text.strip()
                dong_name = item.find('법정동').text.strip()
                floor = item.find('층').text.strip() if item.find('층') else "0"
                area = item.find('전용면적').text.strip()
                
                # 금액 데이터 파싱의 핵심: 쉼표(,) 제거 후 숫자로 변환
                # 예: " 155,000 " -> 155000
                deal_amount_str = item.find('거래금액').text.strip().replace(',', '')
                deal_amount_int = int(deal_amount_str)
                
                apt_trades.append({
                    '법정동': dong_name,
                    '아파트명': apt_name,
                    '전용면적(㎡)': float(area),
                    '층': int(floor),
                    '거래금액(만원)': deal_amount_int
                })
            
            # 3. 판다스 데이터프레임 전환
            df = pd.DataFrame(apt_trades)
            
            print("=== 수집된 강남구 실거래가 원본 (상위 5건) ===")
            print(df.head())
            
            # 4. [고급 분석] 각 동(Neighborhood)별 아파트 평균 거래 금액 계산
            # groupby 연산을 사용하여 법정동별 평균가를 도출합니다.
            print("\n=== 법정동별 아파트 평균 거래 금액 (단위: 만원) ===")
            mean_by_dong = df.groupby('법정동')['거래금액(만원)'].mean().round(1).reset_index()
            # 평균 금액이 높은 순서대로 정렬
            mean_by_dong = mean_by_dong.sort_values(by='거래금액(만원)', ascending=False)
            print(mean_by_dong.to_string(index=False))
            
            # 5. 통계 결과 엑셀 파일로 저장
            mean_by_dong.to_excel("gangnam_apt_average_price.xlsx", index=False)
            print("\n[성공] 'gangnam_apt_average_price.xlsx' 파일로 통계 데이터가 저장되었습니다.")

except Exception as e:
    print(f"부동산 데이터 수집 중 오류가 발생했습니다: {e}")

초보자가 가장 많이 막히는 '데이터 타입 변환'과 단위 가공 노하우

부동산 API 데이터 가공을 시도할 때 백 퍼센트 에러를 마주하는 지점이 있습니다. 바로 '거래금액' 숫자를 다룰 때입니다.

오픈 API가 돌려주는 아파트 거래금액은 눈으로 보기에는 숫자 같지만, 텍스트 안에 쉼표가 섞여 있고 양옆에 공백이 들어간 '문자열(String)' 상태입니다(예: " 125,500 "). 이 상태에서 판다스로 평균값(.mean())을 구하라고 지시하면 파이썬은 문자를 어떻게 더하고 나누냐며 붉은색 TypeError를 발생시킵니다.

따라서 데이터 연산을 하기 전에 반드시 replace(',', '') 함수로 쉼표를 제거하고, strip()으로 양옆 공백을 날려버린 후 int() 명령어를 통해 순수한 정수형 숫자로 형변환을 해주는 단계를 거쳐야 합니다. 또한, 공공데이터의 부동산 금액 단위는 '만원' 기준이므로 이를 억 단위로 가동하고 싶다면 금액을 다시 10,000으로 나누어 "12억 5,500만원" 형태로 가공해 주는 텍스트 치환 로직을 덧붙여야 정보 수용자(독자)가 읽기 편한 고품질 콘텐츠로 승화될 수 있습니다.

핵심 요약

  • 국토교통부 부동산 실거래가 API는 법정동코드 앞 5자리와 계약연월(6자리)을 정확히 연계하여 파라미터로 넘겨주어야 데이터가 수집됩니다.

  • API 응답 내 거래금액은 문장 중간에 쉼표가 들어간 문자열 형태이므로, 쉼표 제거 후 정수형(int)으로 형변환을 마쳐야 통계 연산이 가능합니다.

  • 판다스의 groupby() 기능을 활용하면 복잡하게 나열된 로우 데이터를 동별, 평형별 평균 가격으로 순식간에 요약하여 고부가가치 정보로 가공할 수 있습니다.