[2022 공간빅데이터 경진대회] 4-2. 반지하 주택 분석

Bob Park·2022년 9월 29일
1

이번 글은

분석 요약

  • 서울 내 건물은 총 595,336개, 주택은 436,981개(73.4%), 반지하 주택은 225,639개(37.9%)이다.
    • 단, 아파트는 연구 목적에 부합하지 않아서 반지하 주택에서 제외한다.
  • 지역(자치구)별 통계에 따르면, 반지하 주택의 개수와 비율은 관악구가 제일 많다.
  • 반지하 주택의 세부 주택용도는 단독주택 > 다가구주택 > 다세대주택 > 연립주택 > 다중주택 순이다.
  • 반지하 주택은 대체로 25년 이상 노후되어 2000년 이전에 지어졌다.
  • 반지하 주택은 업무, 상업 지역보다 주거지역에 밀집하여 분포한다.

DB 연결

import psycopg2

conn = psycopg2.connect(
  'host=localhost port=5432 dbname=postgres user=postgres password=postgres',
  options='-c search_path=sbd'
)
conn.set_session(autocommit=True)
cur = conn.cursor()

건축물대장 표제부

import pandas as pd

cur.execute(
  f'''
  select
    pnu,
    building_pk,
    address,
    use_name,
    use_detail,
    floor_count,
    under_floor_count,
    approval_date,
    extract('year' from now()) - left(approval_date,4)::int building_age
  from building_dong
  '''
)
bld_dong = pd.DataFrame(
  cur.fetchall(),
  columns=[col[0] for col in cur.description]
)

주택 분석

len(bld_dong)

  • 총 건축물 595,336개
((bld_dong['use_name'] == '단독주택') | (bld_dong['use_name'] == '공동주택')).value_counts()

436_981/595_336*100

  • 주택(단독주택, 공동주택)은 총 436,981개로 전체의 73.4%
house_dong = bld_dong[((bld_dong['use_name'] == '단독주택') | (bld_dong['use_name'] == '공동주택'))]
print((house_dong.under_floor_count > 0).value_counts())
print((house_dong.under_floor_count > 0).value_counts()/len(house_dong))

  • 주택 중 지하층이 있는 경우는 272,935개로 62.5%에 달하는 높은 비율
  • 단, 실제 지하층이 주거용도로 사용되는 경우인지, 주차장이나 기계실 등으로 사용되는 경우인지 층별용도를 확인할 필요가 있음

지역(자치구) 단위 통계

house_dong['sigungu_code'] = [
  pnu[0:5]
  for pnu
  in house_dong.pnu
]
house_dong['sigungu_name'] = [
  address.split(' ')[1]
  for address
  in house_dong.address
]
sigungu_house = pd.DataFrame(
  [
    (
      id1,
      id2,
      len(tbl),
      len(tbl[tbl.under_floor_count > 0]),
      round(len(tbl[tbl.under_floor_count > 0]) / len(tbl) * 100, 1)
    )
    for (id1, id2), tbl
    in house_dong[['sigungu_code', 'sigungu_name', 'under_floor_count']].groupby(['sigungu_code', 'sigungu_name']).__iter__()
  ],
  columns=['sigungu_code', 'sigungu_name', 'bld_count', 'under_floor_bld_count', 'under_floor_bld_ratio']
)
sigungu_house.sort_values('bld_count', ascending=False)

  • 주택 개수 : 성북구 > 은평구 > 관악구 > 중랑구 > 강북구 > 동작구 > ...
sigungu_house.bld_count.mean()

  • 지역별 개수 평균 : 17,479개
sigungu_house.sort_values('under_floor_bld_count', ascending=False)

  • 지하층 있는 주택 개수 : 관악구 > 은평구 > 중랑구 > 성북구 > 강북구 > ...
sigungu_house.under_floor_bld_count.mean()

  • 지역별 개수 평균 : 10,917개
sigungu_house.sort_values('under_floor_bld_ratio', ascending=False)

  • 지하층 있는 주택 비율 : 관악구 > 금천구 > 강남구 > 중랑구 > 도봉구 > 양천구 > ...
sigungu_house.under_floor_bld_ratio.mean()

  • 지역별 비율 평균 : 62.2%

건축물대장 층별개요

  • 건축물대장 표제부에서 추려낸 주택에 대해서만 살펴본다.
    cur.execute(
      f'''
      select
        pnu,
        building_pk,
        address,
        road_address,
        floor_type_name,
        floor_no,
        use_code,
        use_name,
        area
      from building_floor
      where
        pnu in ('{"','".join(house_dong.pnu)}') and
        floor_type_name = '지하'
      '''
    )
    bld_under_floor = pd.DataFrame(
      cur.fetchall(),
      columns=[col[0] for col in cur.description]
    )

>```python
bld_under_floor = bld_under_floor.merge(
  house_dong[['building_pk']],
  how='inner',
  on='building_pk'
)
len(bld_under_floor)

  • 주택 중 지하층 정보는 337,673개, 전체의 77.3%
under_floor_use_count = bld_under_floor.use_name.value_counts().reset_index()
under_floor_use_count.columns = ['use_name', 'count']
under_floor_use_count['ratio'] = round(under_floor_use_count['count'] / under_floor_use_count['count'].sum() * 100, 1)
under_floor_use_count[0:10]

  • 주택 외 용도는 분석 대상에서 제외
  • 지하층 용도 중 주택은 단독주택(29.6%) > 다가구주택(26.2%) > 다세대주택(13.4%) > 아파트(7.6%) > 연립주택(2.5%) > 다중주택(2.1%)
  • 주택의 지하층 합계시 81.4%가 주택 용도로 사용되고 있음
  • 단, 아파트의 경우 재해위험성이 낮아 반지하 주택 분석에서 제외함
house_under_floor = bld_under_floor[
  [
    use_name in ('단독주택', '다가구주택', '다세대주택', '연립주택', '다중주택')
    for use_name
    in bld_under_floor.use_name
  ]
]
house_under_floor = house_under_floor.sort_values('floor_no').drop_duplicates('building_pk')
house_under_floor

print('주택 중', 225_639 / 436_981)
print('건물 중', 225_639 / 595_336)

  • 반지하 주택 개수는 225,639개로 전체 주택의 51.6%이고 전체 건물의 37.9%

공간 분석용 반지하 주택 데이터 만들기

house_under_floor = house_under_floor.rename(columns={'use_name':'floor_use_name'})
house_dong_with_under_floor = house_dong.merge(
  house_under_floor[['building_pk', 'floor_type_name', 'floor_no', 'floor_use_name']],
  how='left',
  on='building_pk'
)
house_dong_with_under_floor.info()

  • 숫자형 데이터도 object 타입이라 변형이 필요함(floor_count, under_floor_count, floor_no)

반지하 주택의 노후도 분포

import matplotlib.pyplot as plt

plt.figure(figsize=(10,6))
plt.hist(
  house_dong_with_under_floor[
    [
      not pd.isna(floor_use_name)
      for floor_use_name
      in house_dong_with_under_floor.floor_use_name
    ]
  ].building_age,
  bins=range(0,60)
)
plt.show()

  • 반지하 주택은 대체로 25년 이상 노후되어 2000년 이전에 지어졌음을 알 수 있음

표제부, 층별개요 Join 테이블 업로드

house_dong_with_under_floor.info()

house_dong_with_under_floor['floor_count'] = pd.to_numeric(house_dong_with_under_floor.floor_count)
house_dong_with_under_floor['under_floor_count'] = pd.to_numeric(house_dong_with_under_floor.under_floor_count)
house_dong_with_under_floor['building_age'] = pd.to_numeric(house_dong_with_under_floor.building_age)
house_dong_with_under_floor['floor_no'] = pd.to_numeric(house_dong_with_under_floor.floor_no)
from sqlalchemy import create_engine

econn = create_engine(
  'postgresql://postgres:postgres@localhost:5432/postgres'
)
house_dong_with_under_floor.to_sql(
  'house_dong_with_under_floor',
  econn,
  schema='sbd',
  index=None,
  if_exists='replace'
)
  • 업로드 완료

공간적 분포 확인

  • DB에 업로드 한 주택(+반지하 주택 여부) 데이터를 QGIS에서 공간데이터와 함께 분석함

주택 분포(436,981개)

  • 서울 전역에 고르게 분포함

반지하 주택 분포(225,639개)

  • 서울 전역에 분포하고 있으나 업무지역과 아파트 밀집지역에서 적게 관측됨

지역(자치구)별 반지하 주택 분포 확인

  • 지역별 반지하 주택 분포가 침수 위험 주택을 선별하는 데 필요함

강남구

  • 업무와 상업 용도의 건물이 많아서 반지하 주택의 비율이 높지 않음

강서구

  • 반지하 주택의 비중이 높음
profile
가치를 만드는 데이터 분석가

1개의 댓글

comment-user-thumbnail
2023년 9월 7일

좋은 글 잘 읽었습니다!

답글 달기