본문 바로가기
개발/데이터시각화

[데이터시각화] 전용면적별, 연도별 서울 아파트 가격 변동 그래프

by ▶ Carpe diem ◀ 2023. 11. 5.

[데이터시각화] 전용면적별, 연도별 서울 아파트 가격 변동 그래프

공공데이터포털에서 제공하는 API를 이용하여 아파트 매매 실거래가를 가지고 오는 방법에 대해 알아보았습니다.

2023.10.20 - [개발] - [Pandas] 아파트 매매 실거래가

 

[Pandas] 아파트 매매 실거래가

이전 글([Pandas] 법정동코드 조회하기)에서 법정동이란 무엇인지에 대해 알아보았고, 법정동코드를 조회하는 방법에 대해 알아보았습니다. 2023.10.14 - [개발] - [Pandas] 법정동코드 조회하기 [Pandas]

wide-shallow.tistory.com

 

이를 이용하여 서울 아파트의 실거래가를 그래프로 표시하는 방법에 대해 알아보겠습니다.

 

자치구와 연도를 선택하여 아파트 매매 실거래가 조회하기

먼저, 자치구와 연도를 선택하여 아파트 매매 실거래가를 공공데이터포털에서 가지고 오겠습니다.

자치구와 계약연도를 이용하여 조회하는 화면
자치구와 계약연도를 이용하여 조회하는 화면

 

위 화면을 구성하기 위해 아래와 같은 코드를 작성합니다.

  with st.container():
      service_key = st.text_input('Service Key', value=pa.get_service_key(), type='password')
      if not pa.is_existed_service_key() and not service_key:
          st.warning('Please set the service key for public api first')


      col1, col2 = st.columns(2)
      with col1:
          sub_category = st.selectbox(
              '시/군/구',
              ('시/군/구', ) + tuple(sorted(category[main_category])))

      with col2:
          contract_date = st.text_input('계약년도', '2015')

      search = st.button('조회하기')
      if search:
          st.session_state.deals = []
          location_code = lawd.get_lawd_code(main_category + ' ' + sub_category)
          for month in range(1, 13):
              request = pa.make_request(location_code, contract_date + '{:02d}'.format(month), service_key)
              res = requests.get(request)
              st.session_state.deals.extend(get_items(res))

 

연도별로 실거래가를 조회하는 API가 존재하지 않아 1월부터 12월까지 12번의 실거래가를 조회하여 하나로 관리합니다. 이때 데이트 관리를 위해 st.session_state를 이용하는데, 한번 조회한 자치구 내의 아파트의 실거래가를 보여줄 때, 아파트별로 실거래가를 조회하지 않고 이전에 조회했던 데이터를 이용하여 보여주기 위함입니다.

 

이렇게 만들어진 데이터는 아래와 같이 list 형태로 st.session_state.deals 변수에 저장됩니다.

[
  {
    "거래금액": "197,500",
    "거래유형": "중개거래",
    "건축년도": "1987",
    "년": "2023",
    "등기일자": "23.05.16",
    "법정동": "신정동",
    "아파트": "목동신시가지10",
    "월": "1",
    "일": "3",
    "전용면적": "127.21",
    "중개사소재지": "서울 양천구",
    "지번": "311",
    "지역코드": "11470",
    "층": "8",
    "해제사유발생일": "",
    "해제여부": ""
  },
  {
    "거래금액": "110,000",
    "거래유형": "중개거래",
    "건축년도": "1988",
    "년": "2023",
    "등기일자": "23.04.06",
    "법정동": "신정동",
    "아파트": "목동신시가지14",
    "월": "1",
    "일": "6",
    "전용면적": "74.19",
    "중개사소재지": "경기 의왕시, 서울 양천구",
    "지번": "329",
    "지역코드": "11470",
    "층": "7",
    "해제사유발생일": "",
    "해제여부": ""
  },
  ...
]

 

2023년 양천구에서 1377건 거래가 진행된 것으로 조회됩니다. 조회된 데이터를 보면 '목동', '신월동', '신정동' 3개 법정동에 존재하는 모든 아파트들에 대한 거래 내용이 포함되어 있습니다. 관심있는 아파트의 전용면적만 선택해서 거래 내역을 그래프로 표시하도록 하겠습니다.

 

전용면적별 아파트 매매 실거래가를 그래프로 표시하기

위에서 조회한 데이터 중 특정 아파트의 매매만 보여주기 위해 아래와 같이 법정도, 아파트, 전용면적을 선택할 수 있도록 화면을 구성합니다.

전용면적별, 연도별 서울 아파트 가격 변동 그래프
전용면적별, 연도별 서울 아파트 가격 변동 그래프

 

위 화면을 구성하기 위한 코드는 아래와 같습니다.

  with st.container():
      if st.session_state.deals:
          df = pd.DataFrame(st.session_state.deals)

          df['월'] = df['월'].astype(int)
          df['거래금액'].replace(',','', regex=True, inplace=True)
          df['거래금액'] = df['거래금액'].astype(int)
          df['전용면적'] = df['전용면적'].astype(float)

          col1, col2, col3 = st.columns(3)
          with col1:
              beopjeongdong = st.selectbox(
                  '법정동',
                  tuple(sorted(list(set(df['법정동'].values.tolist())))))

          with col2:
              apartment = st.selectbox(
                  '아파트',
                  tuple(sorted(list(set(df[df['법정동'] == beopjeongdong]['아파트'].values.tolist())))))

          with col3:
              area = st.selectbox(
                  '전용면적',
                  tuple(sorted(list(set(df[(df['법정동'] == beopjeongdong) & (df['아파트'] == apartment)]['전용면적'].values.tolist())))))

'월', '거래금액', '전용면적' 값의 데이터 타입을 각각 int, int, float 형태로 변경하기 위해 아래와 같이 데이터 타입을 변경합니다. 거래금액이 string 형태로 저장되어 있는데, 10,000와 같이 ','를 가지고 있어 replace() 함수를 이용하여 ','를 제거 후 int로 변경합니다.

  • df['월'] = df['월'].astype(int)
  • df['거래금액'].replace(',','', regex=True, inplace=True)
  • df['거래금액'] = df['거래금액'].astype(int)
  • df['전용면적'] = df['전용면적'].astype(float)

 

실거래가를 차트에서 보여주기 위해 아래 코드를 작성하였습니다.

months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
...
         chart = (
              alt.Chart(df_selected)
              .mark_circle(size = 40)
              .encode(
                  x=alt.X('월:N', scale=alt.Scale(domain=months)),
                  y=alt.Y('거래금액:Q', scale=alt.Scale(domain=[0, df_selected['거래금액'].max() + 10000]))
              )
          )
          final_chart = chart + chart.transform_regression('월','거래금액').mark_line()

그래프의 x축은 1월부터 12월까지 고정적으로 보여주기 위하여 alt.Scale(domain=months)를 이용하였고, y축의 최대값은 해당 아파트 거래 최대금액에 1억원을 더한 값으로 설정하였습니다. 

그리고 실거래가들의 추세를 보여주기 위해 transform_regression() 함수를 이용하여 추세선을 보여주었습니다.

 

실행 화면

전용면적별, 연도별 서울 아파트 가격 변동 그래프 화면
전용면적별, 연도별 서울 아파트 가격 변동 그래프 화면

 

이렇게 원하는 연도의 전용면적별 서울의 아파트 매매 실거래가를 그래프로 보여주는 것에 대해  알아보았고, 위 예제 전체 동작을 확인할 수 있도록 Streamlit app으로 제공하고 있습니다. 실제 코드나 전체 코드가 궁금하신 분은 '[데이터시각화] 전용면적별, 연도별 서울 아파트 가격 변동 그래프' 예제 사이트를 참고해보시면 좋을 것 같습니다.