본문 바로가기
개발

[Pandas] 법정동코드 조회하기

by ▶ Carpe diem ◀ 2023. 10. 14.

[Pandas] 법정동코드 조회하기

이전 글(아파트 매매 실거래가 데이터 조회하기)에서 LAWD_CD 이야기를 하면서 행정표준관리시스템(https://www.code.go.kr)에서 법정코드 이야기를 했었습니다.

2023.10.13 - [개발] - 아파트 매매 실거래가 데이터 조회하기

 

아파트 매매 실거래가 데이터 조회하기

아파트 매매 실거래가 데이터 조회하기 아파트 매매 실거래가 데이터를 이용하기 위해서는 먼저 공공데이터포털에서 API 활용 신청을 해야 합니다. 공공데이터포털 API 활용 신청 공공데이터포

wide-shallow.tistory.com

 

Pandas와 Streamlit을 이용하여 원하는 지역의 법정동코드를 조회할 수 있는 Streamlit app 을 작성하기 전에 법정동, 법정동 코드에 대해 먼저 알아보겠습니다.

 

법정동이란?

법정동은 법률로 정한 행정구역의 명칭입니다. 1914년 행정구역 통폐합에 따라 정해진 법정동은 100년 넘게 사용된 명칭으로 신용카드나 신분증, 재산권을 나타내는 모든 법적 서류에 사용하는 명칭입니다. 반면 행정동은 행정기관들이 주민의 수나 면적 등을 고려해 단순히 행정 편의를 위해 설정한 행정구역으로 통상 동사무소로 불리는 행정기관이 1곳씩 있는 곳의 명칭입니다.

 

법정동을 숫자로 표현한 것이 법정동코드인데, 총 10자리 수로 구성됩니다.

  • 시도(2자리) + 시군구(3자리) + 읍면동(3자리) + 리(2자리)

 

Streamlit app 화면 구성

작성된 Streamlit app의 화면은 아래와 같습니다.

예제 페이지 화면
예제 페이지 화면

 

 

코드 설명

아래 첨부된 법정동코드 전체자료는 2023년 10월 14일 다운로드 받은 데이터입니다. 최신 자료는 행정표준관리시스템에서 법정동코드 전체자료를 다운로드 받을 수 있습니다.

법정동코드 전체자료.txt
2.08MB

 

행정표준관리시스템에서 다운로드 받은 txt 파일을 Pandas를 이용해서 DataFrame 객체로 변환해보겠습니다. '법정동코드 전체자료.txt'을 'lawd_cd_raw_data.txt'로 이름을 변경하여 사용하고 있습니다.

raw_data = pd.read_csv('./data/lawd_cd_raw_data.txt', sep = '\t', encoding = 'cp949')

st.dataframe(raw_data)

read_csv 함수에서 사용된 파라미터에 대해 알아보면 다음과 같습니다. 

  • sep = '\t'
    한 행에서 컬럼 데이터 간 구분을 tab 기호로 사용했다는 걸 알려줍니다.
  • encoding = 'cp949'
    글자를 읽어올 때 어떤 방식으로 encoding 되어 있는지 알려줍니다.
    (MS office를 이용해서 생성된 파일을 읽을 때는 일반적으로 'cp949'로 지정하면 됩니다.)

위 코드를 실행하면 아래와 같이 전체 데이터를 확인할 수 있습니다.

법정동코드를 Pandas를 이용하여 보여준 화면
법정동코드를 Pandas를 이용하여 보여준 화면

 

원하는 지역의 법정동코드를 바로 찾기 어려우니 법정동명(시/도, 시/군/구)과 폐지여부 조건을 이용해서 찾을 수 있도록 코드를 작성해보겠습니다.

 

폐지여부 조회하기

폐지여부 조건을 이용해서 현재 존재하는 법정동과 존재하지 않는 법정동으로 구분할 수 있도록 라디오 버튼을 이용하였습니다.

exist_or_not = st.radio('폐지여부', options = ['존재', '폐지'])

st.dataframe(raw_data[raw_data['폐지여부'] == exist_or_not], use_container_width = True)

 

코드를 실행한 화면은 아래와 같습니다.

폐지여부를 선택하기 위한 화면
폐지여부를 선택하기 위한 화면

 

폐지여부에서 폐지를 선택하면 아래와 같이 폐지된 법정동 정보가 출력되는 것을 확인할 수 있습니다.

폐지된 법정동 정보를 보여주는 화면
폐지된 법정동 정보를 보여주는 화면

 

Streamlit에서 radio 함수를 이용하면 가로가 아니라 세로로 라디오 버튼들이 생성되는데, 아래 실행화면에서는 라디오 버튼이 가로로 배치되어 있습니다. 블로그에서 다루는 예제들을 실행하는 Streamlit app(wide-shallow.streamlit.app)을 확인하면 전체 실행 코드를 확인할 수 있습니다.

 

'시/도'와 '시/군/구'로 조회하기

법정동코드 데이터를 보면 '법정동명'으로 '시/도'와 '시/군/구'가 구분되어 있지 않습니다. 법정동명을 이용하여 '시/도'와 '시/군/구'를 구분하기 위한 코드는 아래와 같습니다.

def extract_category(area):
    try:
        first, remain = area.split(' ', 1)
    except ValueError:
        return area, ''
    return first, remain

main_category = ''
sub_category = ''

category = dict()
category['시/도'] = tuple()
for area_name in raw_data['법정동명']:
    main, remain = extract_category(area_name)
    if not remain:
        continue
    sub, remain = extract_category(remain)
    if main not in category:
        category[main] = set()
    category[main].add(sub)

법정동명을 ' '를 이용하셔 split 해서 첫번째 데이터는 '시/도', 두번째 데이터는 '시/군/구'로 저장합니다. 예를 들면, '서울특별시 종로구 청운동'은 ' '를 이용해서 split 하면 ['서울특별시', '종로구', '청운동']으로 구분되게 됩니다. 첫번째 데이터인 '서울특별시'는 '시/도', 두번째 데이터인 '종로구'는 '시/군/구'에 저장되게 됩니다.

 

사용자가 '시/도'와 '시/군/구'를 선택할 수 있도록 st.selectbox를 이용하여 아래 화면을 구성하였습니다.

'시/도', '시/군/구' 선택 화면
'시/도', '시/군/구' 선택 화면

 

아래 코드를 이용하여 조건에 맞는 데이터(선택된 '시/도', '시/군/구')만 보여질 수 있도록 하였습니다.

if main_category != '시/도':
    searched = main_category
if sub_category != '시/군/구':
    searched += ' ' + sub_category
is_searched = raw_data['법정동명'].str.contains(searched)
st.dataframe(raw_data[is_searched], use_container_width = True)

 

 

'시/도'에 '서울특별시', '시/군/구'에 '강남구'를 선택한 경우는 아래와 같이 보여집니다.

서울특별시 강남구를 선택한 경우 보여지는 화면
서울특별시 강남구를 선택한 경우 보여지는 화면

 

이렇게 원하는 지역의 법정동코드를 확인할 수 있는 방법을 확인해보았고, 위 예제 전체 동작을 확인할 수 있도록 Streamlit app으로 제공하고 있습니다. 실제 동작이나 전체 코드가 궁금하신 분은 '[Pandas] 법정동코드 조회하기' 예제 사이트를 참고해보시면 좋을 것 같습니다.