본문 바로가기
개발/데이터시각화

[데이터시각화] 연도별 서울 자치구 인구 데이터 시각화하기

by ▶ Carpe diem ◀ 2023. 10. 23.

연도별 서울 자치구 인구 수를 시각화하는 것을 하기 위해 먼저 자치구의 인구 데이터가 필요하니, 먼저 인구 데이터를 받을 수 있는 방법에 대해 설명하겠습니다.

 

[데이터시각화] 연도별 서울 자치구 인구 데이터 시각화하기

서울시 자치구별 인구 데이터

서울시 공공데이터를 제공하는 사이트인 '서울 열린데이터 광장'에서 자치구별 인구 데이터를 구할 수 있습니다.

 

사이트에서 '서울시 인구밀도 (구별) 통계'를 검색하면 아래와 같은 화면을 확인할 수 있습니다.

서울시 인구밀도 (구별) 통계 화면
서울시 인구밀도 (구별) 통계 화면

 

서울시 인구밀도 (구별) 통계는 2007년부터 2022년까지 자치구별 인구, 면적, 인구밀도 정보를 제공하고 있는데, 자치구별 인구 데이터를 시각화하기 위해 필요한 정보만 선별적으로 다운로드하였습니다. 아래 첨부된 파일에는 2023년 8월 29일 업데이트된 2007년부터 2022년까지 자치구별 인구 데이터를 포함하고 있습니다. 

population_seoul_20230829.csv
0.00MB

 

위에서 다운로드 받은 데이터를 확인해보면 아래와 같이 불필요한 데이터들이 포함되어 있습니다.

불필요한 데이터가 존재하는 데이터
불필요한 데이터가 존재하는 데이터

 

위에서 표시한 데이터를 제거하기 위해 아래와 같이 pandas의 drop함수를 아래와 같이 이용하였습니다.

df.drop(df.index[[0,1]], inplace=True)

 

서울시 지도 표시하기

인구 수를 서울시의 자치구별로 시각화하기 위해서 먼저 서울시 지도를 Streamlit app에 표시해야 합니다. 이를 위해 Folium을 사용하였고, Streamlit app으로 보여주기 위해 streamlit-folium 라이브러리를 이용하여 아래와 같이 지도를 표시하였습니다.  Folium 은 leaflet.js 기반으로 만들어진 Python 지도 시각화 라이브러리로 자세한 내용은 홈페이지를 참고하시면 좋을 것 같습니다. 

서울시 지도
서울시 지도

 

위와 같이 지도를 표시하기 위한 코드는 아래와 같습니다. 경도 위도는 지도의 가운데에 위치할 지역의 좌표이고, 여기에서는 서울의 중심 좌표를 넣었습니다. 

center = [37.541, 126.986]
m = f.Map(location=center, zoom_start=10)

st_data = st_folium(m, use_container_width=True)

 

지도에 자치구별 인구 수 시각화하기

자치구별 인구 수를 시각화하기 위해 등치 지역도로 표시합니다. 등치 지역도(단계구분도)는 음영, 색조 또는 패턴을 사용하여 특정 값이 특정 지리 또는 지역을 기준으로 어떻게 다른지 표시하는 것으로, 밝게(덜 자주 또는 더 낮음)부터 어둡게(더 다주 또는 더 높음)까지 다양한 음영으로 상대적 차이를 표시합니다.

 

서울의 자치구별 인구 수를 등치 지역도를 이용해 표시하면 아래와 같이 표시할 수 있습니다.

자치구별 인구 수 시각화 화면
자치구별 인구 수 시각화 화면

 

인구 수를 등치 지역도로 보여주기 위해서는 자치구를 표시할 수 있는 공간 정보가 필요합니다. 자치구별 공간 정보는 South Korea Github seoul_municipalities_geo_simple.json파일에서  확인할 수 있습니다.

 

공간정보에 대해 국가공간정보포털에서 다음과 같이 정의하고 있습니다.

공간정보란?

지도 및 지도 위에 표현이 가능하도록 위치, 분포 등을 알 수 있는 모든 정보로 일상생활이나 특정한 상황에서 행동이나 태도를 결정하는 중요한 기초 정보와 기준을 제시한다. 인류가 출현한 이래 사냥감은 어디 있는지, 먹을거리는 어디 있는지, 주변 마을은 어디에 있는지를 나타내는 각종 공간정보는 인간의 생존에 꼭 필요한 요소였다. 특히 인류가 사회를 형성하고 농업이나 목축을 시작하면서 지형과 도로 같은 지리적 정보를 비롯하여, 경작지의 경계나 농작물의 현황 같은 재산관계에 대한 정보, 물이나 초목의 위치나 상태와 같은 자원에 대한 정보들이 사회관계를 유지하기 위해 무엇과도 바꿀 수 없는 중요한 가치로 인식되었다.

 

위에서 생성했던 서울시의 지도에 자치구별 인구 수의  등치 지역도를 그리기 위해 Folium에서 제공하는 Choropleth() 함수를 이용할 수 있습니다. 자치구의 공간 정보를 가지고 있는 파일의 경로를 geo_data 변수에 할당하고, 자치구, 인구 수의 정보를 가지고 있는 dataframe을 argument로 전달합니다. 

  geo_data = 'https://raw.githubusercontent.com/southkorea/seoul-maps/master/kostat/2013/json/seoul_municipalities_geo_simple.json'
  center = [37.541, 126.986]
  m = f.Map(location=center, zoom_start=11)
  f.Choropleth(
      geo_data=geo_data,
      data=df,
      columns=('동별(2)', '2022'),
      key_on='feature.properties.name',
      fill_color='BuPu',
      legend_name='인구수',
  ).add_to(m)
  st_data = st_folium(m, use_container_width=True)

Choropleth() 함수에서 사용된 parameter에 대해 더 자세히 알아보면 아래와 같습니다.

  • geo_data: GeoJSON 도형에 대한 URL, 파일 경로 또는 데이터
  • data: GeoJSON에 바인딩할 데이터
  • columns: 데이터가 Pandas DataFrame인 경우 바인딩할 데이터 열 (열 1을 키로 전달하고 열 2에 값을 전달)
  • key_on: 데이터를 바인딩할 geo_data GeoJSON 파일의 변수
  • fill_color: 영역 채우기 색상, 기본값은 파란색 ('BuGn', 'BuPu', 'GnBu', 'OrRd', 'PuBu', 'PuBuGn' 등)
  • legend_name: 데이터 범례의 제목

더 자세한 API 설명은 Folium API reference를 참고하세요.

 

연도별 서울 자치구 인구 시각화 화면

연도별 서울 자치구 인구 시각화 화면
연도별 서울 자치구 인구 시각화 화면

 

이렇게 원하는 연도의 서울 자치구 인구 수를 시각화하는 방법에 대해  알아보았고, 위 예제 전체 동작을 확인할 수 있도록 Streamlit app으로 제공하고 있습니다. 실제 코드나 전체 코드가 궁금하신 분은 '[데이터시각화] 연도별 서울 자치구 인구 시각화' 예제 사이트를 참고해보시면 좋을 것 같습니다.