이번 글은
분석 요약
- 서울 내 건물은 총 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)

((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()

sigungu_house.sort_values('under_floor_bld_count', ascending=False)

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

sigungu_house.sort_values('under_floor_bld_ratio', ascending=False)

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

건축물대장 층별개요
- 건축물대장 표제부에서 추려낸 주택에 대해서만 살펴본다.
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개)
- 서울 전역에 분포하고 있으나 업무지역과 아파트 밀집지역에서 적게 관측됨
지역(자치구)별 반지하 주택 분포 확인
- 지역별 반지하 주택 분포가 침수 위험 주택을 선별하는 데 필요함
강남구
- 업무와 상업 용도의 건물이 많아서 반지하 주택의 비율이 높지 않음
강서구
좋은 글 잘 읽었습니다!