[V_log] 서울시 위반 건축물 현황 분석 (1) - R

Blushed·2023년 12월 31일
1

V_log

목록 보기
3/3

10월 말에 참여한 이태원 1주기 특집 보도 이야기를 지금에서야 남기는... 잊고 싶지 않은 기억과 경험이라 이제라도 써 본다!

💡어떤 데이터?

https://news.sbs.co.kr/news/endPage.do?news_id=N1007399352

=> 요것도 한번 봐주시길 ㅎ


이태원 참사 1주기 관련 보도에 들어가기 위한 분석이었고, 현재 위반건축물 상황이 어떤지를 보는 게 목적이었다. 특히, 할로윈을 앞두고 경찰이 설정한 고밀집 위험 골목에는 위반건축물이 얼마나 있는지 알아보면 좋겠다고 말씀해주셔서 분석을 시작했다. 말씀해주신 것 말고도 궁금한 거 이것저것 들여다보았다.

  • 고밀집 위험 골목: 너비가 좁거나 경사가 가팔라, 인파가 몰릴 때 특별 관리가 필요한 마포, 강남, 용산 지역 16개 골목


분석에 활용한 데이터는, 아래 '건물통합정보_마스터 - 오픈마켓'의 9월 데이터였다. 분석 시작 시점에 10월 데이터가 나와있지 않았어서, 우선 9월로 진행하고 추후 개별 건축물대장에서 여전히 위반 건축물인지 확인하는 작업이 이루어졌다. (그게 아쉬웠어서, 포스팅할 때는 11/6에 등록된 데이터로 해봤다. 현 시점 최신 데이터는 12월 13일 자 등록 데이터!)

http://data.nsdi.go.kr/dataset/12623 (대용량 건축물 대장)

💡어떤 데이터?

(1) 데이터를 어떻게 써야 하는가?

늘 익숙하게 쓰던 csv, xlsx 파일이 아니었기 때문에, 뭘 어떻게 봐야 하는지도 공부가 필요했다. 건물통합정보 마스터에서 데이터를 딱 다운받으면, 아래 사진과 같이 구성되어 있다.

shp & shx & dbf 는 꼭 같이 다녀야 하는 세트인데, 간단히 각 파일 형식에 대해 설명을 해보자면 아래와 같다.

  • shp : 도형(geometry) 정보가 담긴 파일
  • shx : 각 도형에 대한 인덱스가 담긴 파일
  • dbf : 각 도형의 속성 정보가 담긴 파일

shp 파일은 지도 시각화 툴인 QGIS에 바로 올려서 (아래 그림처럼) 도형으로 나타나도록 하는 형태라면, dbf는 R에서 흔히 사용하는 데이터프레임의 형태라고 보면 된다! 우선 R로 전체 상황을 파악하려 하기 때문에, dbf를 불러올 것이다.

#install.packages('foreign')
library(foreign)

#공간정보
bldg_seoul_re <- read.dbf('이태원/F_FAC_BUILDING_서울_1106/F_FAC_BUILDING_11_202311.dbf', as.is = TRUE)

그냥 read_csv 나 read_xlsx로는 읽을 수 없어서! foreign 패키지를 깔고 read.dbf 함수로 읽어준다. 데이터는 준비 끝!

(2) 그래서 전체적으로 어떻게 변했나?

(출처: https://news.sbs.co.kr/news/endPage.do?news_id=N1007010590)

과거와의 비교가 필요하기 때문에, 선배가 작년 12월에 보도된 분석 결과를 보여주셨다. 2022년 12월 5일에 공개된 동일 데이터를 기준으로 했을 때, 위반 건축물의 수는 총 44,452건.

그럼 올해는 어떨까?

요 데이터프레임에는 건물의 층수, 건물 용도, 시군구 ID 등 여러 정보가 담겨 있는데, 그중 위반 건축물 여부를 나타내는 열은 VIOL_BD_YN이다. 이 값이 1이면 위반 건축물이라는 것이고, 0이면 아니라는 것이다.

그래서 서울시 전체 위반 건축물 수는 매우매우 간단하게 계산이 가능하다.

bldg_seoul_re %>% count(VIOL_BD_YN) %>% View()

VIOL_BD_YN == 1 인 건물은 총 44,760개. 작년 12월 데이터보다 308건 늘었다. 소폭 증가했지만, '증가했다'는 것만으로도 문제다. 그렇게 불법 건축물이 이슈가 돼도 줄긴 커녕 늘었다니.

(3) 구와 동별로 살펴보자면?

그럼 조금 더 자세하게, 구와 동 단위로 들어가보면 어떨까? 어느 구, 어느 동이 불법 건축물 비율이 가장 높을까?

건축물대장 데이터에 한글로 어느 구, 어느 동 쓰여있지 않고 코드로 쓰여 있기 때문에, 이를 해독할 수 있는 데이터를 다운받았다. 아래 링크 들어가면 검색과 데이터 다운 모두 가능하다!

https://www.code.go.kr/stdcode/regCodeL.do

건축물 대장 데이터에서 구에 대한 코드는 COL_ADM_SE 열에 담겨 있었다. 11110 은 서울 종로구, 11560은 서울 영등포구, 요런 식이다.

#기본 패키지 불러오기
library(tidyverse)
library(stringr)
library(readxl)

#법정동 조회자료 불러오기
code <- read_xls('이태원/법정동코드 조회자료.xls')

#구별로 그룹을 지어 전체 건축물 수 / 위반 건축물 수 / 위반 건축물 비율 찾기
bldg_gu_ratio <- bldg_seoul_re %>% group_by(COL_ADM_SE) %>%
  summarize(total = n(),
            viol = length(which(VIOL_BD_YN=="1")),
            ratio = viol/total) %>%
  arrange(desc(ratio))

#법정동 코드 파일에서 다섯자리 구 코드 & 구 이름만 똑 떼어오기
gu <- code %>% filter((str_sub(법정동코드,6,10)=="00000") & (str_sub(법정동코드,3,5)!="000")) %>%
  mutate(COL_ADM_SE = str_sub(법정동코드,1,5)) %>%
  select(-법정동코드) 

#두 데이터 합치고, 비율 높은 순으로 정렬하기
bldg_gu_ratio_name <- merge(bldg_gu_ratio, gu, by='COL_ADM_SE')
bldg_gu_ratio_name %>% arrange(desc(ratio)) %>% View()

법정동 코드 조회 자료가 요렇게 생겼는데, 우선은 '구' 자료만 필요하기 때문에

(1) 3~5번째 자리가 000이 아닌 놈 & (2) 6~10번째 자리가 00000인 놈

으로 필터를 걸어서 구 데이터만 쏘옥 골라왔다.

그렇게 정렬을 해보니, 광진구가 12.3%의 비율 (총 27,492개 건축물 중 3,380개의 위반 건축물) 로 서울시 전체 구 중 위반 건축물 비율 1등이었다. 이태원동이 있는 용산구는 6.3% (총 29,777개 건축물 중 1,877개의 위반 건축물) 로 9위. ㄴ.내가 사는 영등포구는 8.8% (총 27,627개 건축물 중 2,420개) 로 무려 4위!

비율이 아닌 개수로 보면, 광진구 1위, 영등포구 6위, 용산구 9위였다.

구는 좀 크니까, 이제 동(법정동)으로 들어가보자. 건축물 대장 데이터에서 법정동 코드는, 동만 예쁘게 딱 나와 있지 않다. 이걸 찾느라 초반에 애를 좀 먹었는데.. 필지고유번호가 적혀 있는 PNU 열에 포함돼 있었다.

필지 고유번호는 19자리로 구성되어 있는데, 구성은 아래 사진과 같다.
업로드중..

업로드중..
아까 얘를 다시 보면, 서울특별시 종로구 청운동의 경우 11(서울시)+110(종로구)+101(청운동) 이런 식인 것!

bldg_dong_ratio <- bldg_seoul_re %>% mutate(detail = str_sub(PNU, 1, 8)) %>%
  group_by(detail) %>%
  summarize(total = n(),
            viol = length(which(VIOL_BD_YN=="1")),
            ratio = viol/total)

dong <- code %>% filter((str_sub(법정동코드,6,10)!="00000")) %>%
  mutate(detail = str_sub(법정동코드,1,8)) %>%
  select(-법정동코드)

bldg_dong_ratio_name <- merge(bldg_dong_ratio, dong, by='detail')
write_csv(bldg_dong_ratio_name, 'bldg_dong_ratio_name.csv')

코드는 비슷하다. 다만 이번에는 PNU에서도 1~8번째 자리만 쏙 뽑고, 법정동 조회 파일에서도 6~10번째 자리가 00000이 아닌 놈을 골라서 1~8번째 자리만 쏙 뽑았다.

동별로 따져보면, 중구 다동이 25.2%의 비율 (총 111개 건축물 중 28개의 위반 건축물) 로 서울시 전체 동 중 위반 건축물 비율 1등이었다. 줄세워놓고 보니 종로구와 중구가 상위권을 차지했다. 용산구 이태원동은 7.9% (총 35,47개 건축물 중 283개의 위반 건축물) 로 145위. 내가 사는 동네는 300등대였다.


이태원 참사 이후 발의된 법안들을 살펴봤을 때, 본회의 통과된 건 아무것도 없었고, 특히 불법건축물 관련 법안은 마땅히 발의된 것조차 없었다. 이번 건축물 데이터를 살펴봤을 때 위반 건축물 수가 작년에 비해 늘어난 것을 보고, 씁쓸하면서도 '아 뉴스에 데이터 활용할 수 있겠다' 싶어 약간은 안도했던 내 자신이 좀 별로였다.

QGIS 활용한 건 2편에 -

profile
데이터로 전하는 사람 이야기

0개의 댓글