-
[Python] KB 부동산 데이터 수집하기Programming 2022. 10. 3. 00:42
하락장에는 공부하는 것이 진리!!
선배가 추천해준 '파이썬을 활용한 부동산 데이터 분석' 책을 사두고 꽤 오래 방치했었는데 다시 시작해보려한다.
(하고 싶은 것과 해야할 것들... 너어어어무 많다~ 시간이 부족해 🫠🫠🫠)
책을 살펴보면 앞장에는 파이썬을 활용하는 방법들을 주로 설명해두었고,
2장에서는 KB부동산에서 제공하는 데이터를 시각화하는 방법들을 설명해두었다.
2019년에 출판된 책인데 현재는 절판되었고, 그래서 그런지 책에서 설명하는 데이터 수집 루트가 변경되어 사용할 수 없었다.
그래서 업데이트된 루트를 통해, 필요한 데이터를 먼저 수집하는 작업이 필요했다.
API 가 따로 지원되지 않는 것 같아 크롤링으로 데이터를 수집하는 코드를 작성했고, 전부는 아니지만 하나의 예제를 통해 수집 방식을 공유하려 한다.
(페이지별로 URL 따고, 개별적인 처리가 조금씩은 필요한 터라 나도 아직 미완성🥲🥲)
1. KB 부동산 데이터 허브 (https://data.kbland.kr/)
- KB 부동산에서 데이터 수집을 위한 API 를 따로 제공하는 것 같지는 않다. (혹시 가능하다면 댓글로 알려주세요!!🙏🏻)
- 다양한 데이터들을 모두 모아 데이터 허브에서 따로 관리하고 있는 모양이다.
- 가격에 관련된 데이터는 KB 통계 - 주택가격동향조사 에서 확인할 수 있다.
KB부동산 주택가격동향조사 페이지
2. 제공하는 데이터 항목 및 구조 살펴보기
- 현재 제공되고 있는 데이터가 무엇인지, 그 중에서 분석을 위해 필요한 항목들이 무엇인지 추리기 위해 우선 구조를 살펴보았다.
- 기본적으로 가격 데이터와 소득 데이터는 주택가격동향조사 탭에서 확인할 수 있고, 아래 표와 같은 정보들을 제공한다.
- 다른 탭에서 추가적인 미분양, 인구 등에 대한 정보를 제공하는 듯하다. 이 부분은 추후에 분석할 때 필요하면 추가로 수집할까 한다.
주택가격
동향조사가격지수 주간 아파트 매매(전세)가격지수 / 월간 아파트 매매(전세) 가격지수 / 단독 매매(전세) 가격지수 / 연립 매매(전세) 가격지수 / 주택종합 매매(전세)가격지수 / KB선도아파트 50 지수 가격지수증감률 주간 아파트 매매(전세)가격지수 증감률 / 월간 아파트 매매(전세) 가격지수 증감률 / 단독 매매(전세) 가격지수 증감률 / 연립 매매(전세) 가격지수 증감률 전세가격비율 아파트(단독/연립/주택종합) 매매가격대비 전세가격비율 시장동향/설문조사 주간(월간) 매수우위지수 / 주간(월간) 매매거래활발지수 / 주간(월간) 전세수급지수 / 주간(월간) 전세거래활발지수 / 월간 매매가격전망지수 / 월간 전세가격전망지수 면적별 가격지수 주간(월간) 아파트 전용면적별 매매(전세)가격지수 / 단독(연립) 전용면적별 매매(전세)가격지수 / 주택종합 전용면적별 매매(전세)가격지수 평균가격 (or m2당 평균가격, 5분위 평균가격, 면적별 평균가격, 중위가격) - 소득연계 PIR / J-PIR / 주택구매력지수 / KB아파트주택담보대출 PIR
3. 크롤링하고자 하는 페이지 URL 찾기
- Chrome 개발자 도구(F12) - Network 를 살펴보면, priceIndex 라고 시작하는 부분을 찾을 수 있다. 해당 URL 을 클릭해서 보면 좌측 데이터 테이블을 구성하는 데이터를 확인해볼 수 있다.
주택종합 매매가격지수 URL - URL 로 들어가보면 아래와 같이 json 형태로 데이터가 구성되어 있는 것을 알 수 있다. 이 중 우리는 'dataBody', '데이터리스트', '날짜리스트' 부분이 필요하다.
- 그리고 데이터 기간은 2년 / 5년 / 10년 / 전체 중 선택할 수 있는데 URL 을 살펴보면 아래와 같이 차이가 있는 걸 알 수 있다. 일단은 전체 기간 데이터를 수집해두려 한다.
기간에 따른 URL 차이 - 추가로 데이터를 살펴보다보면, 아래와 같이 상위지역 / 하위지역 정보가 나눠지는 지역들이 있다.
- 위에서 살펴본 URL 들은 상위지역에 대한 기본적인 URL 이기 때문에, 하위지역에 대한 URL 을 추가적으로 동일한 방식으로 확인한다.
상위지역 / 하위지역 - 하위지역은 전체 데이터 URL 끝에 '1A0000' 이라는 지역 코드가 추가로 붙는다. (1A0000 은 하나의 예시)
- 상위지역에 대한 기본적인 URL 에서 각 지역별 코드와 지역명, 하위지역존재여부를 확인할 수 있는데 하위지역이 존재한다면 해당 지역코드를 URL 에 붙여 동일하게 크롤링을 진행해주면 된다.
상위 / 하위지역 URL 차이 - 그리고 매매지수와 전세지수도 URL 일부만 다르기 때문에 코드 작성에 참고하면 간결하게 코드를 짤 수 있다.
(매매는 '01' 코드, 전세는 '02' 코드를 사용)
상위/하위, 매매/전세 URL 차이
4. 크롤링 코드 작성하기
- 위의 작업들을 거치고 나서 아래와 같이 코드를 작성할 수 있다.
- 데이터를 stack 된 형태로 가지고 올 것인지, flatten 된 형태로 가지고 올 것인지는 취향에 따라 작성하면 될 듯하다.
- 나는 웹페이지에서 제공하는 형태와 유사하게 데이터 프레임을 만드는 형식으로 작성했다.
import pandas as pd import numpy as np import requests ## 상위/하위 지역에 따른 URL 변경 def return_url(region_code): if region_code == '' : url = 'https://data-api.kbland.kr/bfmstat/weekMnthlyHuseTrnd/priceIndex?title=%EC%A3%BC%ED%83%9D%EC%A2%85%ED%95%A9+%EB%A7%A4%EB%A7%A4%EA%B0%80%EA%B2%A9%EC%A7%80%EC%88%98&%EB%A7%A4%EB%A7%A4%EC%A0%84%EC%84%B8%EC%BD%94%EB%93%9C=01&%EB%A7%A4%EB%AC%BC%EC%A2%85%EB%B3%84%EA%B5%AC%EB%B6%84=98&%EC%9B%94%EA%B0%84%EC%A3%BC%EA%B0%84%EA%B5%AC%EB%B6%84%EC%BD%94%EB%93%9C=01&type=true&apiFlag=priceIndex&%EB%A9%94%EB%89%B4%EC%BD%94%EB%93%9C=1&%EB%8B%A8%EC%9C%84=(%EA%B8%B0%EC%A4%80:2022.1+%3D+100.0)' else: url = 'https://data-api.kbland.kr/bfmstat/weekMnthlyHuseTrnd/priceIndex?title=%EC%A3%BC%ED%83%9D%EC%A2%85%ED%95%A9+%EB%A7%A4%EB%A7%A4%EA%B0%80%EA%B2%A9%EC%A7%80%EC%88%98&%EB%A7%A4%EB%A7%A4%EC%A0%84%EC%84%B8%EC%BD%94%EB%93%9C=01&%EB%A7%A4%EB%AC%BC%EC%A2%85%EB%B3%84%EA%B5%AC%EB%B6%84=98&%EC%9B%94%EA%B0%84%EC%A3%BC%EA%B0%84%EA%B5%AC%EB%B6%84%EC%BD%94%EB%93%9C=01&type=true&apiFlag=priceIndex&%EB%A9%94%EB%89%B4%EC%BD%94%EB%93%9C=1&%EB%8B%A8%EC%9C%84=(%EA%B8%B0%EC%A4%80:2022.1+%3D+100.0)&%EC%A7%80%EC%97%AD%EC%BD%94%EB%93%9C={}'.format(region_code) return url ## json 형태를 dataframe 형태로 변경 def make_dataframe(data, cols, num): # num 은 json 내에 실제 데이터 외 추가로 붙는 데이터를 끊어내기 위한 index tmp_df = pd.DataFrame.from_dict(data, orient='index') region_name = tmp_df.loc['지역명'] transpose_df = pd.DataFrame(tmp_df.loc['dataList'].values[0][:num]).transpose() transpose_df.columns = cols transpose_df.index = region_name return transpose_df ## 상위지역/하위지역 데이터 수집 def data_gathering(total_json, num): df_list = [] cols = total_json['dataBody']['data']['날짜리스트'] for data in total_json['dataBody']['data']['데이터리스트']: tmp_df = make_dataframe(data, cols, num) tmp_df['상위지역'] = np.nan df_list.append(tmp_df) if data['하위지역존재'] == 1: sub_url = return_url(data['지역코드']) sub_region_json = requests.get(sub_url).json() for sub_data in sub_region_json['dataBody']['data']['데이터리스트']: sub_tmp_df = make_dataframe(sub_data, cols, num) sub_tmp_df['상위지역'] = data['지역명'] df_list.append(sub_tmp_df) return pd.concat(df_list) #%% 예제로 전체 매매가격지수 데이터 크롤링 url = return_url('') html = requests.get(url).json() total_sales_df = data_gathering(html, -3)
5. 수집된 데이터 확인
- 수집된 데이터는 1986/01월 데이터부터 최근 2022/09월까지 데이터이다.
- 지역명에 따라 상위지역이 있으면 상위지역 정보가 포함되어 있고, 상위지역이 따로 없으면 np.nan 값으로 채워줬다.
수집된 데이터 형태
우선은 가격 데이터를 먼저 수집해서 plotting 해보면서 데이터 파악을 먼저 해보려 한다.
매수/매도 시점을 대변하는 저평가/고평가 measure 를 한 번 찾아보고 싶은데, 잘 될지는 모르겠다. 일단 해보는 거지 뭐 😁😁
그 외에도 기존 하락장과 비교해보고 앞으로 하락폭이 어느 정도일지도 분석해봐야겠다.
역시 하고 싶은 건 많은데 시간이 부족한 게 한이지...🥹'Programming' 카테고리의 다른 글
[Python] 네이버 부동산 매물 크롤링 (1) 2022.11.05 [Python] 지역별 부동산 데이터 시각화 (9) 2022.10.07 [Python] 퀀트 투자 기법 적용 결과 (한국편) (1) 2022.09.17 [Python] naver finance 에서 원하는 정보 긁어오기 Part 2. (한국편) (0) 2022.09.15 [Python] naver finance 에서 원하는 정보 긁어오기 Part 1. (한국편) (2) 2022.09.09