본문 바로가기
IT & 코딩

공간 데이터의 이해 - 법정동과 행정동

by 에일라거 2020. 10. 1.

지난 시간에 QGIS를 이용한 데이터의 시각화를 하면서, 아래의 기사를 인용하면서 법정동과 행정동의 차이에 대해서 잠깐 언급했었다.

 

 

'한 동네, 두 이름'…헷갈리는 행정동·법정동 | 연합뉴스

'한 동네, 두 이름'…헷갈리는 행정동·법정동, 김광호기자, 정치뉴스 (송고시간 2018-05-22 07:43)

www.yna.co.kr

오늘은 이유가 뭐가 됐건 법정동과 행정동이 차이가 난다는 전제 하에, 이를 매칭하는 코드를 소개하려고 한다.

 

 

법정동과 행정동?

지난 글에서 위의 기사를 인용했었지만, 아래의 기사가 좀 더 간단 명료하게 정리되어 있는 것 같아서 링크를 공유한다.

 

 

 

법정동과 행정동은 무슨 차이인가요?

법정동과 행정동은 무슨 차이인가요?

www.simin24.com

기사를 요약하면 아래와 같다.

 

* 법정동은 법률행위의 기초가 되는 지역의 단위이다. 즉, 공부 (토지대장 등) / 지적도 / 등기부 / 필지 구획 / 재산권 행사 등의 근거가 된다.

* 행정동은 쉽게 말해, "주민센터" 가 설치된 동의 단위이다. 행정 편의를 위해 별도로 만들었으며, 수시로 변경된다.

* 법정동은 예전부터 내려오던 동의 명칭을 그대로 사용하여 인구 수 및 면적 등에 차이가 클 수 있어, 이를 행정적으로 알맞게 배분한 것이 행정동이다.

* "배분"에 초점이 있으므로, 몇 개의 법정동이 하나의 행정동이 되기도 하며, 하나의 법정동이 여러 개의 행정동으로 쪼개지기도 한다.

 

서울특별시 송파구의 법정동과 행정동

위 지도를 예로 들면, 송파구의 경우 대체로 법정동이 크므로, 이를 가락본동/가락1동/가락2동 과 같이 여러 개의 행정동으로 쪼개는 형태로 분배하였다.

 

왜 알아야 하는 거지

공공데이터에서 볼 수 있는 대부분의 통계가 "행정동" 중심으로 제공되는 반면, 행정안전부에서 제공하는 지적 경계 정보(공간 데이터)는 법정동 단위로 제공되기 때문에, 공간 데이터에 여러가지 통계를 입히기 위해서는 이를 매칭할 필요가 있다. 아래 둘 중에 하나의 방법으로 할 수 있겠다.

 

* 행정동 기준으로 공간 데이터를 변경하든지

* 행정동-법정동 매칭 정보를 이용해서 통계를 변경하든지

 

행정동 기준으로 공간 데이터를 변경하는 것은, 위의 송파구 예에서도 알겠지만 하나의 법정동이 여러 개의 행정동으로 쪼개지는 경우가 있기 때문에 이를 모두 자동적으로 반영하는 것은 쉽지 않다. 송파구 하나라면야 노가다로 하면 되지만 전국 단위로 한다고 생각하면...

 

거북이가 되어보자

거북이로 변하기 전에 얼른 두번째 방법을 선택해 보자. 행정동-법정동 매칭 정보를 이용해서 통계를 바꾸는 작업으로 고고씽

 

법정동 - 행정동 매칭 정보를 얻자

일하는 행안부여

행정안전부에서는 법정동 지적 경계 정보도 제공하지만, 법정동을 행정동으로 매칭할 수 있는 정보도 함께 제공한다.

 

 

 

행정안전부> 업무안내> 지방자치분권실> 주민등록,인감,행정사> 주민등록,인감,행정사

행정안전부 홈페이지에 오신것을 환영합니다.

www.mois.go.kr

위 링크에 들어가면 아래와 같은 게시판을 볼 수가 있다.

 

이 중에, "주민등록 주소 코드 변경" 어쩌구 하는 글 중 가장 최신 글로 들어간다.

 

그러면 첨부파일이 이거저거 있는데, 이 중에 말소코드가 포함되지 않은 zip파일로 다운받자. 말소된 거까지 싹 다 들어가 있으면 정신사나우니까 일단 이렇게 해보자.

 

압축을 풀면 6개의 파일이 나타나는데 다 필요없고 KIKmix 어쩌구 하는 엑셀 파일을 열자.

 

가장 오른쪽에 있는 말소일자 컬럼은 무시하자. 아무 내용도 없다. (말소 내역 제외된 걸로 받았으니까) 말소일자 부분을 삭제하고, csv 파일로 저장하자.

 

 

이때 엑셀의 csv 저장 옵션을 이용해서 저장하게 되면 한글 인코딩이 UTF-8 이 아니므로 파이썬으로 불러오기가 귀찮아지니까, 지금 조금 귀찮더라도 별도의 에디터 (서브라임 텍스트, Notapad++ 등) 에 내용만 복사해서 csv 형태로 편집해서 저장해 주자.

 

서브라임 텍스트로 csv화 하는 중

 

추가 내용을 진행하기 전에, 서울시 공공데이터로 들어가서 행정동별 서울생활인구 (내국인) 을 다운받자.

 

 

 

행정동별 서울생활인구(내국인)

데이터 이용하기-행정동별 서울생활인구(내국인)

data.seoul.go.kr

아래에서 8월 통계를 다운받자.

 

이 자료는 행정동별 서울생활인구인데, 이걸 법정동별 서울생활인구라고 하는 통계로 산술적으로 변형시킨 후에, 이를 지적 경계에 입혀보려고 한다. 다운받은 후에 압축을 풀면 LOCAL_PEOPLE_DONG_202008.csv 파일이 나오는데, 이를 아까 제작한 행정동-법정동 매칭 파일 (KIKmix.20200814.csv 로 저장했다) 과 한 폴더에 두고 다음으로 가자.

 

파이썬을 이용한 변환 작업

일단 완성된 코드를 보자

 

#-*- coding:utf-8 -*-

import pandas as pd
import numpy as np

# 행정동과 법정동을 매칭시켜주는 파일을 불러옴
df_match = pd.read_csv('D:/파일경로/KIKmix.20200814.csv', \
                       encoding='utf-8')

# 서울시, 종로구 등 시군구 단위까지만 있는 것은
# 값이 없기 때문에 결측치로 처리됨 : 해당 결측치 제거
df_match = df_match.dropna()

# 행정동/법정동 코드는 현행 8자리이나, 
# 행안부 홈페이지에서 받은 자료는 10자리로 되어 있음
# 현행에 맞게 변경 (미래를 위해서 해둔건가?)
df_match['행정동코드'] = (df_match['행정동코드']/100).astype(np.int64)
df_match['법정동코드'] = (df_match['법정동코드']/100).astype(np.int64)

# 하나의 행정동이 몇개의 법정동으로 이루어져 있는지를 추가.
# 10이면 10개의 법정동이 하나의 행정동을 이루고 있는 것
df_match = pd.merge(df_match, df_match[['행정동코드','법정동코드']] \
	.groupby('행정동코드').count() \
	.rename(columns={'법정동코드':'법정동갯수'}).reset_index(), how='left')


# 추가하고자 하는 통계치 파일을 불러옴
# 불러오기 전에 파일을 먼저 확인해보면,
# 데이터 열 갯수보다 제목 열 갯수가 하나 적음.
# 이러면 pandas에서 이상하게 불러와지므로
# 제목 열을 마지막에 아무 이름이나 하나 추가
df_stat = pd.read_csv('D:/파일경로/LOCAL_PEOPLE_DONG_202008.csv', \
                       encoding='utf-8', index_col=None)

# 아무 이름이나 추가한 마지막 열 삭제
df_stat = df_stat.iloc[:,:-1]

# 테스트코드이므로, 임시로 작은 DataFrame을 제작
df_small = df_stat.loc[(df_stat['기준일ID']==20200801) \
                       & (df_stat['시간대구분']==14),:]
df_small = df_small.iloc[:,2:]

# 행정동-법정동 매칭 정보와 통계치를 붙임 : PK = 행정동코드
df = pd.merge(df_match, df_small, how='left')
df = df.dropna()

# 붙인 테이블에서 통계치에 해당하는 열 범위를 리스트로 지정
# 통계치 조정 루프용
col = list(df.columns)[8:] 

# 행정동-법정동 매칭하면서 통계치를 같이 변동시켜주는 루프
# 행정동 통계치를 법정동 갯수로 나눔
# 하나의 행정동에 인구가 1000명이고 
# 이 행정동이 10개의 법정동으로 되어 있으면
# 1000/10을 해서 각 법정동에 해당하는 인구를 100명으로 추정
for c in col:
    df[c] = df[c]/df['법정동갯수']

del df['법정동갯수'] # 이녀석은 용도를 다했으니 버리고
# 법정동 한글 이름은 법정동 코드랑 같이 따로 뽑아둔다.
df_info = df[['법정동코드','시도명','시군구명','동리명']] \
            .groupby('법정동코드').first().reset_index() 

# 마지막으로 하나의 법정동이 여러개의 행정동으로
# 이루어진 경우도 있어서 법정동 코드 별로 값을 전부 더함
df = df.groupby('법정동코드').sum().reset_index()

# 위처럼 하면 법정동 한글명이 사라지기 때문에,
# 앞서 미리 뽑아두었던 법정동 한글명이랑 붙인다
df = pd.merge(df_info, df, how='left')
df = df.dropna()

# 마지막으로, 파일로 저장
df[['법정동코드','동리명','총생활인구수']] \
  .to_csv('D:/파일경로/LOCAL_PEOPLE_법정동_202008.csv', \
           encoding='utf-8')

 

긴데, 주석을 달아놨으니 하나하나 따라가 보면서 하면 된다. 중간 중간에 DataFrame을 출력해보면 어떤 식으로 돌아가는지 알 수 있다. 결국 이 코드가 해 주는 일은

 

1. 아래의 통계를

 

2. 매칭 정보를 이용하여

 

3. 아래와 같이 변경해준다

코드는 아래 파일로 첨부했다. 용량이 너무 작아서 0 MB로 뜨네...

 

행정동 to 법정동 통계 변환.py
0.00MB

 

QGIS에서 공간 정보를 입혀 보자

서울시 법정동 생활인구통계 (내국인)

서울시에서 행정동 기준으로 제공하던 정보를 행정안전부에서 제공하는 매칭 정보를 이용해 법정동 통계로 바꾼 후에, 이를 QGIS에 불러와서 공간 정보에 입힌 후에 시각화했다. QGIS에 불러와서 작업하는 내용은 지난 글에 있으니 이를 참조하자.

 

 

공간 데이터의 이해 - QGIS를 이용한 시각화

지난 시간에 이어서 QGIS를 이용한 시각화를 좀 더 들여다보자. 지난 글 공간 데이터의 이해 - QGIS를 써 보자 공간이란 무엇일까? 보통 3차원 공간이라는 얘기를 많이 하는걸로 봐서는, 우리가 딛��

guzene.tistory.com

 


 

원래 이번 글에서, 내추럴 브레이크까지 한꺼번에 얘기하려고 했으나 내용이 길어지기도 했고, 주제가 갈라지면 산만해질까봐 다음 글로 넘긴다. 

 

 

 

관련글

1. 공간 데이터의 이해 - 공간 데이터란 무엇일까?

2. 공간 데이터의 이해 - QGIS를 써보자

3. 공간 데이터의 이해 - QGIS를 이용한 시각화

4. 공간 데이터의 이해 - 법정동과 행정동

댓글