Toy Project

2. 침수 흔적도로 침수된 건축물 정보 확인하기

soohey 2023. 12. 5. 01:28

 

 

저번 글에서는 건축물 대장 데이터로 용도, 지하층수, 사용승인일 등의 데이터를 확인할 수 있었다.

오늘은 침수 흔적도 데이터를 활용해 침수된 건축물의 데이터만 분류해서 확인해보려 한다.

 

이를 위해서 서울시 침수 흔적도 데이터에서 서초구 서초동 데이터만 분류하고

엑셀파일로 export한 뒤, 쥬피터노트북을 통해 건축물 대장 데이터와 통합할 예정이다.

 

위 과정을 위해 사용한 프로그램과 데이터는 다음과 같다.

 

1) JupyterNotebook
2) QGIS
3) 침수흔적도 데이터
4) 건축물대장 표제부 데이터

 

 

 


0. 침수 흔적도 데이터 다운로드받기

침수 흔적도 데이터 링크

서울시 열린 데이터 광장에서 침수 흔적도 데이터를 다운 받는다. 

나는 제일 최신인 2022년도 데이터를 다운받았다.

 

 

zip 파일을 열어보면 6개의 파일이 있는 것을 확인할 수 있다.

shp, dbf, shx 파일을 QGIS 프로그램을 통해 편집할 예정이다.

 

 

오늘 QGIS에서 열어서 사용할 파일은 shp 파일이지만

실제로 GIS 프로그램에서 shp파일을 열기 위해 필수적인 파일은 shp, shx, dbf 이다.

 

각 파일 형식의 의미가 뭘까? 🤔

shp는 shape(도형의 모양)의 줄임말로 도형과 그 위치, 속성을 다루는 파일들로 구성된다.

  • shp : 쉐이프 포맷이며 벡터형식의 도형파일
  • shx : 쉐이프 인덱스 포맷이며 도형의 위치, 방향정보
  • dbf : 속성 포맷이며 각 도형의 속성정보, dBase 포맷
  • sbn, sbx : 도형의 공간 인덱스(공간 로딩 속도를 빠르게 해주는 부가적인 파일)
  • prj : 좌표정보

 

1. QGIS 프로그램 설치 및 세팅하기

QGIS 다운로드 링크

QGIS는 GIS 데이터 파일인 shp를 편집하고 시각화할 수 있는 무료 프로그램이다.

 

 

안정된 버전을 찾아서 다운로드 받았다.

프로그램을 실행시킨 뒤, 침수흔적도.shp 파일을 열어서 카카오 맵에서 시각화 해보자.

 

카카오맵을 사용하려면 플러그인을 설치해주어야 한다.

상위의 플러그인 탭을 클릭해서 설치해주자.

 

 

tms 를 검색해서 TMS for Korea 플러그인을 설치해주자.

 

 

설치한 뒤 웹 버튼 > TMS for Korea > Kakao Maps > Kakao Street 을 눌러서 맵을 시각화해주자.

다른 맵을 선택해도 상관없다.

 

 

QGIS에서 침수흔적도 파일 편집하기

 

이젠 shp파일을 프로그램 위에서 열어보자.

레이터 탭을 눌러서 추가해주어도 되고, 프로그램 내부로 파일을 끌어올려도 된다.

레이어 버튼을 누르면 벡터 레이어 추가 버튼을 누른뒤, shp 파일을 선택하면 된다.

파일 여러개를 올릴 경우엔 디렉토리를 선택해서 올리면 된다.

 

... 버튼 누르고 shp 파일 선택한 뒤 열기

 

shp 파일 열고나면, 카카오 맵 위에 흔적도가 올라가 있는 것을 확인할 수 있다.

 

 

해당 서울특별시 침수 흔적도에는 서울시 전체의 데이터가 올라가있다.

나는 서초구 서초동에 연관된 데이터만 뽑아서 필터링해보려고 한다.

 

shp 파일은 DB 테이블로처럼 데이터를 확인할 수 있다.

속성 테이블을 열어서 확인해보자.

 

 

 

열어보면 위처럼 주소와 다양한 데이터들이 있는 것을 확인할 수 있다.

우리는 주소 칼럼인 F_ZONE_NM 칼럼에서 서초구 서초동을 포함하는 데이터만 필터링 해보자.

 

서초동 서초구 데이터만 필터링하기

 

다시 서울특별시_2022 레이어에서 오른쪽 마우스 클릭 > 필터 설정 버튼을 눌러보자.

그러면 아래처럼 쿼리 편집기를 확인할 수 있다.

 

 

각 칼럼마다 들어가있는 데이터가 궁금하다면 왼쪽 화면에서 칼럼을 클릭한 뒤, 오른쪽 화면의 모두 또는 샘플 버튼을 누르면 데이터를 확인할 수 있다.

 

 

나는 GU_NAM에서 '서초구'만 필터링한 뒤, F_ZONE_NM에서 '서초구 서초동'으로 시작하는 데이터만 필터링하려 한다.

쿼리에 익숙하다면 직접 작성해도 되고, 아래에 있는 버튼들을 누르면서 작성해도 된다!

내가 작성한 쿼리는 아래와 같다.

 

적당히 쿼리를 만든 뒤, [테스트] 버튼을 누르면 필터링된 데이터 수를 알려준다.

 

"GU_NAM" = '서초구' AND "F_ZONE_NM" LIKE '서울특별시 서초구 서초동 %'

 

 

데이터가 잘 필터링 되었다면 [확인] 버튼을 누른 뒤, 화면에서도 확인해볼 수 있다.

나는 서초구_서초동_침수흔적도 데이터를 XLSX 파일로 다운로드 받은 뒤에 

건축물 데이터와 머지한 뒤 확인해볼 것이다.

 

서초구 서초도 침수흔적도 XLSX로 다운로드하기

 

필터링 완료한 서울시_2022 레이어에서 오른쪽 클릭 후 EXPORT 해주자.

파일 이름과 파일 확장자를 xlsx로 선택하고 export하면 끝이다

 

 

파일 이름 오른쪽의 ... 버튼을 눌러서 저장 위치도 지정해준 뒤, 확인 버튼으로 다운로드 받자.

엑셀 파일을 열어보면 데이터가 잘 뽑혔다는 것을 확인할 수 있다.

 

2. 건축물 대장 데이터와 침수 흔적도 데이터 통합하기

건축물 대장 데이터와 침수 흔적도를 확인해보니 머지할 때 기준 칼럼으로 사용할 만한 데이터는 주소였다.

건축물 대장 데이터의 "대지_위치" 칼럼과 침수 흔적도 데이터의 " F_ZONE_NM " 을 사용하려 한다.

 

하지만 F_ZONE_NM 은 확인해보니 뒤에 번지 또는 건물 이름이 들어가 있어서

이런 부분을 정제해 준 뒤 통합 작업을 진행할 것이다.

 

그리고 대지_위치 데이터에도 번지와 같은 문자열은 삭제해주어 통합할 예정이다.

건축물 대장의 주소 데이터

 

침수_흔적도의 주소 데이터

 

먼저 두개의 엑셀파일을 DF 형태로 변환해주자.

 

import pandas as pd

df1 = pd.read_excel('C:/Users/82104/k-pass/표제부_서초구.xlsx',engine='openpyxl')
df2 = pd.read_excel('C:/Users/82104/k-pass/서초구_침수흔적도.xlsx',engine='openpyxl')

print(df1.head())
print(df2.head())

 

표제부_서초구 엑셀파일은 건축물 대장 데이터고, 서초구_침수흔적도 파일은 침수흔적도 데이터다.

 

df1['대지_위치'] = df1['대지_위치'].str.replace('번지', '', regex=False)

 

  • 대지_위치 데이터에서 '번지' 문자열을 삭제해준다.

 

import re


# 번지수까지만 추출하는 함수 정의
def extract_address(address):
    match = re.search(r'서울특별시\s서초구\s\w+\s\d+(-\d+)?', address)
    if match:
        return match.group()
    else:
        return None

# 새로운 칼럼에 결과 적용
df2['Extracted_Address'] = df2['F_ZONE_NM'].apply(extract_address)

# 결과 확인
print(df2[['F_ZONE_NM', 'Extracted_Address']])

 

  • F_ZONE_NM 칼럼에서 번지수까지만 뽑는 작업을 진행한다.

 

merged_df = pd.merge(df1, df2, how='inner', left_on='대지_위치', right_on='Extracted_Address')
merged_df.to_excel('침수흔적도_서초구_머지.xlsx', index=False)

 

  • 두개의 df를 머지해준다.
  • to_excel로 엑셀 파일로 변경후 다운로드한다.

 

그런데 기획자님이 사용승인일을 구간별로 나누어서 보고 싶다고 요청했다.

그래서 구간 작업도 추가로 진행해보자.

 

사용승인일을 구간별로 나누기

 

먼저 표제부의 사용승인_일 칼럼 데이터를 확인해보니 "20231111"로 yyyymmdd의 형태로 들어가 있었다.

이 데이터를 10년 단위로 끊어서 구분해볼 예정이다.

 

# '사용승인일'을 날짜 형식으로 변환합니다.
merged_df['사용승인_일_date'] = pd.to_datetime(merged_df['사용승인_일'], format='%Y%m%d')

# 10년 단위 구간으로 나누는 함수를 정의합니다.
def categorize_year(date):
    year = date.year
    start_year = (year // 10) * 10
    end_year = start_year + 9
    return f'{start_year}-{end_year}'

# '사용승인일'을 10년 단위 구간으로 나눈 새로운 칼럼을 추가합니다.
merged_df['사용승인일_구간'] = merged_df['사용승인_일_date'].apply(categorize_year)

# 결과를 출력합니다.
print(merged_df)

 

  • 사용승인_일 데이터를 to_datetime 메소드로 datetime형태로 변경해준다.
  • 10년 단위 구간으로 나누는 함수를 작성하고 사용승인일_구간 칼럼으로 데이터를 추가한다.

 

출력해보면 아래처럼 구간이 잘 나눠져있음을 확인할 수 있다.

 

 

3. 통합된 데이터로 통계 확인

머지한 데이터를 기반으로 서초동_서초구의 침수된 건물 데이터는 총 363개인 것으로 판별되었다.

이 데이터와 서초동_서초구 전체 건축물 데이터를 비교해서 여러가지 통계를 냈더니 아래처럼 나왔다.

(정확한 자료가 아님)