GIL's LAB

지역별 학교 데이터 본문

데이터사이언스/공공데이터

지역별 학교 데이터

GIL~ 2022. 11. 26. 19:42

 

정제 방향

이번 포스팅에서는 읍면동별 학교 데이터를 정리해보겠습니다. 

각 읍면동마다 초등학교, 중학교, 고등학교 수는 몇 개이고 또 어느 학교가 있는지를 정리하겠습니다. 

즉, 아래의 스키마를 갖는 데이터로 정리하겠습니다.

  • 시도
  • 시군구
  • 읍면동
  • 초등학교 수
  • 중학교 수
  • 고등학교 수
  • 초등학교 목록
  • 중학교 목록
  • 고등학교 목록

여기서 각 학교 목록은 해당 읍면동에 포함되는 학교들을 세미콜론(;)으로 구분한 것입니다.

 


활용 데이터

활용하는 데이터와 그 출처는 다음과 같습니다.

 

전국초중고등학교위치표준데이터

https://www.data.go.kr/data/15021148/standard.do

 

전국초중등학교위치표준데이터

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

한국행정구역분류 

http://kssc.kostat.go.kr/ksscNew_web/kssc/common/CommonBoardList.do?gubun=1&strCategoryNameCode=019&strBbsId=kascrr&categoryMenu=014 

 

리스트

55 한국행정구역분류(2021.1.1.기준 및 2020.12.31.기준) 관리자 2020-12-31 1706

kssc.kostat.go.kr

한국행정구역분류는 글을 작성하는 2022년 11월 26일 기준 가장 최신 데이터인 전국초중등학교위치표준데이터-20221126.xlsx를 사용합니다. 

 


데이터 정제

먼저 시도, 시군구, 읍면동으로 구성된 데이터를 만들겠습니다. 

한국행정구역분류 항목표는 다음과 같이 생겼는데, 여기서 1.항목표라는 시트에서 시도, 시군구, 읍면동 컬럼만 불러오면 됩니다. 

 

파이썬 코드로 구현하면 다음과 같습니다.

import pandas as pd
df = pd.read_excel("한국행정구역분류_2022.10.1.기준_20221006123917.xlsx",
                   sheet_name = "1. 항목표",
                   header = 2,
                   usecols = ["시도", "시군구", "읍면동"])

여기서 시군구나 읍면동이 없는 경우는 읍면동 단위가 아니라 상위 단위(예: 서울특별시, 중구 등)이므로 dropna를 이용하여 해당 행을 제거해줍니다.

df = df.dropna()

 

다음으로 학교 위치 데이터를 다음과 같이 불러옵니다. 

school_loc_df = pd.read_csv("전국초중등학교위치표준데이터.csv",
                            usecols = ["학교명", "학교급구분", "소재지지번주소"],
                            encoding = "euc-kr")

인코딩을 설정해주지 않으면 한글이 깨지기 때문에, 인코딩을 euc-kr로 설정했습니다.

이처럼 공공 데이터는 제공기관마다 포맷이 다양하고 그에 따른 오류도 다양합니다.

또한, 결측과 중복을 제거해줍니다.

school_loc_df = school_loc_df.dropna().drop_duplicates()

마지막으로 df에 있는 지역을 기준으로 school_loc_df에서 필요한 값을 가져오겠습니다.

기본 아이디어는 지번주소에는 시도, 시군구, 읍면동이 모두 포함된다는 것입니다. 

간단한 for문을 이용해서 필요한 데이터를 가져오겠습니다. 

먼저 초등학교 목록, 중학교 목록, 고등학교 목록을 나타내는 리스트를 만듭니다. 

ele_school_list = []
mid_school_list = []
hig_school_list = []

위 리스트의 각 요소는 특정 읍면동에 속한 초등학교, 중학교, 고등학교를 세미콜론으로 연결한 값을 담는 리스트입니다. 이제 for문을 사용해서 데이터를 완성해보겠습니다.

for idx, row in df.iterrows():
    f_df = school_loc_df.loc[school_loc_df['소재지지번주소'].str.contains(row['시도'])]
    f_df = f_df.loc[f_df['소재지지번주소'].str.contains(row['시군구'])]
    f_df = f_df.loc[f_df['소재지지번주소'].str.contains(row['읍면동'])]
    
    ele_school = ';'.join(f_df.loc[f_df['학교급구분'] == "초등학교", "학교명"].tolist())
    mid_school = ';'.join(f_df.loc[f_df['학교급구분'] == "중학교", "학교명"].tolist())
    hig_school = ';'.join(f_df.loc[f_df['학교급구분'] == "고등학교", "학교명"].tolist())
    
    ele_school_list.append(ele_school)
    mid_school_list.append(mid_school)
    hig_school_list.append(hig_school)

df의 모든 row를 순회하면서 school_loc_df의 소재지지번주소 컬럼에 row의 시도, 시군구, 읍면동을 포함하는 데이터를 f_df로 저장합니다.

다음으로 학교급구분에 따른 학교명을 리스트로 변환한 뒤, 세미콜론으로 조인한 것을 각각 ele_school, mid_school, hig_school이라 정의하고 이들을 대응되는 리스트(예: ele_school_list)에 추가합니다.

 

이제 ele_school_list, mid_school_list, hig_school_list를 df의 컬럼으로 추가합니다.

df['초등학교 목록'] = ele_school_list
df['중학교 목록'] = mid_school_list
df['고등학교 목록'] = hig_school_list

이제 각 학교 목록을 바탕으로 학교 수가 얼마나 되는지를 계산하는 함수를 만들겠습니다.

def count_school(school_list):
    if len(school_list) == 0:
        return 0
    else:
        return school_list.count(';') + 1

이 함수를 초등학교 목록, 중학교 목록, 고등학교 목록 컬럼에 일괄 적용하여 초등학교 수, 중학교 수, 고등학교 수 컬럼을 만듭니다.

df['초등학교 수'] = df['초등학교 목록'].apply(count_school)
df['중학교 수'] = df['중학교 목록'].apply(count_school)
df['고등학교 수'] = df['고등학교 목록'].apply(count_school)

 


이것으로 읍면동별 학교 데이터가 만들어졌습니다. 

만들어진 데이터 일부는 아래와 같습니다.

이제 이 데이터를 저장하겠습니다.

df.to_csv("읍면동별_학교데이터.csv",
          encoding = "euc-kr",
          index = False)

 

이렇게 만든 데이터와 여기서 활용한 코드는 아래에서 다운로드받을 수 있습니다.

읍면동별_학교데이터.csv
0.20MB
읍면동별_학교데이터 정제.ipynb
0.01MB

 


 

도움이 되었다면 공감버튼 클릭부탁드립니다! 

정리하고 싶은 공공데이터가 있다면 댓글이나 이메일(gils_lab@naver.com)으로 연락부탁드립니다.

'데이터사이언스 > 공공데이터' 카테고리의 다른 글

아파트매매 실거래 데이터 수집  (0) 2022.11.28
Comments